@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/doubao/utils.js
DELETED
|
@@ -1,1156 +0,0 @@
|
|
|
1
|
-
import { CommandExecutionError } from '@agentrhq/webcmd/errors';
|
|
2
|
-
|
|
3
|
-
export const DOUBAO_DOMAIN = 'www.doubao.com';
|
|
4
|
-
export const DOUBAO_CHAT_URL = 'https://www.doubao.com/chat';
|
|
5
|
-
export const DOUBAO_NEW_CHAT_URL = 'https://www.doubao.com/chat/new-thread/create-by-msg';
|
|
6
|
-
const DOUBAO_COMPOSER_SELECTORS = [
|
|
7
|
-
'textarea[data-testid="chat_input_input"]',
|
|
8
|
-
'[data-testid="chat_input"] textarea',
|
|
9
|
-
'.chat-input textarea',
|
|
10
|
-
'.chat-input [contenteditable="true"]',
|
|
11
|
-
'.chat-editor textarea',
|
|
12
|
-
'.chat-editor [contenteditable="true"]',
|
|
13
|
-
'textarea[placeholder*="发消息"]',
|
|
14
|
-
'textarea[placeholder*="Message"]',
|
|
15
|
-
'[contenteditable="true"][placeholder*="发消息"]',
|
|
16
|
-
'[contenteditable="true"][placeholder*="Message"]',
|
|
17
|
-
'[contenteditable="true"][aria-label*="发消息"]',
|
|
18
|
-
'[contenteditable="true"][aria-label*="Message"]',
|
|
19
|
-
'textarea',
|
|
20
|
-
'[contenteditable="true"]',
|
|
21
|
-
];
|
|
22
|
-
function buildDoubaoComposerLocatorScript() {
|
|
23
|
-
return `
|
|
24
|
-
const isVisible = (el) => {
|
|
25
|
-
if (!(el instanceof HTMLElement)) return false;
|
|
26
|
-
const style = window.getComputedStyle(el);
|
|
27
|
-
if (style.display === 'none' || style.visibility === 'hidden') return false;
|
|
28
|
-
const rect = el.getBoundingClientRect();
|
|
29
|
-
return rect.width > 0 && rect.height > 0;
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
const composerSelectors = ${JSON.stringify(DOUBAO_COMPOSER_SELECTORS)};
|
|
33
|
-
const findComposer = () => {
|
|
34
|
-
for (const selector of composerSelectors) {
|
|
35
|
-
const node = Array.from(document.querySelectorAll(selector)).find(isVisible);
|
|
36
|
-
if (node) return node;
|
|
37
|
-
}
|
|
38
|
-
return null;
|
|
39
|
-
};
|
|
40
|
-
`;
|
|
41
|
-
}
|
|
42
|
-
function getTranscriptLinesScript() {
|
|
43
|
-
return `
|
|
44
|
-
(() => {
|
|
45
|
-
const clean = (value) => (value || '')
|
|
46
|
-
.replace(/\\u00a0/g, ' ')
|
|
47
|
-
.replace(/\\n{3,}/g, '\\n\\n')
|
|
48
|
-
.trim();
|
|
49
|
-
|
|
50
|
-
const root = document.body.cloneNode(true);
|
|
51
|
-
const removableSelectors = [
|
|
52
|
-
'[data-testid="flow_chat_sidebar"]',
|
|
53
|
-
'[data-testid="chat_input"]',
|
|
54
|
-
'[data-testid="flow_chat_guidance_page"]',
|
|
55
|
-
];
|
|
56
|
-
|
|
57
|
-
for (const selector of removableSelectors) {
|
|
58
|
-
root.querySelectorAll(selector).forEach((node) => node.remove());
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
root.querySelectorAll('script, style, noscript').forEach((node) => node.remove());
|
|
62
|
-
|
|
63
|
-
const stopLines = new Set([
|
|
64
|
-
'豆包',
|
|
65
|
-
'新对话',
|
|
66
|
-
'内容由豆包 AI 生成,请仔细甄别',
|
|
67
|
-
'AI 创作',
|
|
68
|
-
'云盘',
|
|
69
|
-
'更多',
|
|
70
|
-
'历史对话',
|
|
71
|
-
'手机版对话',
|
|
72
|
-
'快速',
|
|
73
|
-
'超能模式',
|
|
74
|
-
'Beta',
|
|
75
|
-
'PPT 生成',
|
|
76
|
-
'图像生成',
|
|
77
|
-
'帮我写作',
|
|
78
|
-
'请仔细甄别',
|
|
79
|
-
'下载电脑版',
|
|
80
|
-
]);
|
|
81
|
-
|
|
82
|
-
const noisyPatterns = [
|
|
83
|
-
/^window\\._SSR_DATA/,
|
|
84
|
-
/^window\\._ROUTER_DATA/,
|
|
85
|
-
/^\{"namedChunks"/,
|
|
86
|
-
/^在此处拖放文件/,
|
|
87
|
-
/^文件数量:/,
|
|
88
|
-
/^文件类型:/,
|
|
89
|
-
];
|
|
90
|
-
|
|
91
|
-
const transcriptText = clean(root.innerText || root.textContent || '')
|
|
92
|
-
.replace(/新对话/g, '\\n')
|
|
93
|
-
.replace(/内容由豆包 AI 生成,请仔细甄别/g, '\\n')
|
|
94
|
-
.replace(/在此处拖放文件/g, '\\n')
|
|
95
|
-
.replace(/文件数量:[^\\n]*/g, '')
|
|
96
|
-
.replace(/文件类型:[^\\n]*/g, '');
|
|
97
|
-
|
|
98
|
-
return clean(transcriptText)
|
|
99
|
-
.split('\\n')
|
|
100
|
-
.map((line) => clean(line))
|
|
101
|
-
.filter((line) => line
|
|
102
|
-
&& line.length <= 400
|
|
103
|
-
&& !stopLines.has(line)
|
|
104
|
-
&& !noisyPatterns.some((pattern) => pattern.test(line)));
|
|
105
|
-
})()
|
|
106
|
-
`;
|
|
107
|
-
}
|
|
108
|
-
function getStateScript() {
|
|
109
|
-
return `
|
|
110
|
-
(() => {
|
|
111
|
-
const routerData = window._ROUTER_DATA?.loaderData?.chat_layout;
|
|
112
|
-
const placeholderNode = document.querySelector(
|
|
113
|
-
'textarea[data-testid="chat_input_input"], textarea[placeholder], [contenteditable="true"][placeholder], [aria-label*="发消息"], [aria-label*="Message"]'
|
|
114
|
-
);
|
|
115
|
-
return {
|
|
116
|
-
url: window.location.href,
|
|
117
|
-
title: document.title || '',
|
|
118
|
-
isLogin: typeof routerData?.userSetting?.data?.is_login === 'boolean'
|
|
119
|
-
? routerData.userSetting.data.is_login
|
|
120
|
-
: null,
|
|
121
|
-
accountDescription: routerData?.accountInfo?.data?.description || '',
|
|
122
|
-
placeholder: placeholderNode?.getAttribute('placeholder')
|
|
123
|
-
|| placeholderNode?.getAttribute('aria-label')
|
|
124
|
-
|| '',
|
|
125
|
-
};
|
|
126
|
-
})()
|
|
127
|
-
`;
|
|
128
|
-
}
|
|
129
|
-
function getTurnsScript() {
|
|
130
|
-
return `
|
|
131
|
-
(() => {
|
|
132
|
-
const clean = (value) => (value || '')
|
|
133
|
-
.replace(/\\u00a0/g, ' ')
|
|
134
|
-
.replace(/\\n{3,}/g, '\\n\\n')
|
|
135
|
-
.trim();
|
|
136
|
-
|
|
137
|
-
const isVisible = (el) => {
|
|
138
|
-
if (!(el instanceof HTMLElement)) return false;
|
|
139
|
-
const style = window.getComputedStyle(el);
|
|
140
|
-
if (style.display === 'none' || style.visibility === 'hidden') return false;
|
|
141
|
-
const rect = el.getBoundingClientRect();
|
|
142
|
-
return rect.width > 0 && rect.height > 0;
|
|
143
|
-
};
|
|
144
|
-
|
|
145
|
-
const getRole = (root) => {
|
|
146
|
-
if (
|
|
147
|
-
root.matches('[data-testid="send_message"], [class*="send-message"]')
|
|
148
|
-
|| root.querySelector('[data-testid="send_message"], [class*="send-message"]')
|
|
149
|
-
|| root.matches('[class*="bg-g-send-msg-bubble"]')
|
|
150
|
-
||
|
|
151
|
-
root.querySelector('[class*="bg-g-send-msg-bubble"]')
|
|
152
|
-
|| root.querySelector('[data-foundation-type="send-message-action-bar"]')
|
|
153
|
-
) {
|
|
154
|
-
return 'User';
|
|
155
|
-
}
|
|
156
|
-
if (
|
|
157
|
-
root.matches('[data-testid="receive_message"], [data-testid*="receive_message"], [class*="receive-message"]')
|
|
158
|
-
|| root.querySelector('[data-testid="receive_message"], [data-testid*="receive_message"], [class*="receive-message"]')
|
|
159
|
-
|| root.matches('[class*="bg-g-receive-msg-bubble"]')
|
|
160
|
-
||
|
|
161
|
-
root.querySelector('[class*="bg-g-receive-msg-bubble"]')
|
|
162
|
-
|| root.querySelector('[data-foundation-type="receive-message-action-bar"]')
|
|
163
|
-
) {
|
|
164
|
-
return 'Assistant';
|
|
165
|
-
}
|
|
166
|
-
// 2026-05 Doubao DOM refactor: no more receive-message / bg-g-receive-msg-bubble
|
|
167
|
-
// markers on assistant turns. Wrappers are now [class*="inner-item-"] /
|
|
168
|
-
// [class*="top-item-"] and the only reliable assistant signal is the
|
|
169
|
-
// .flow-markdown-body / .md-box-root content container WITHOUT any
|
|
170
|
-
// send-bubble marker.
|
|
171
|
-
if (
|
|
172
|
-
(root.matches('[class*="inner-item-"], [class*="top-item-"]')
|
|
173
|
-
|| root.closest('[class*="inner-item-"], [class*="top-item-"]'))
|
|
174
|
-
&& (root.matches('.flow-markdown-body, .md-box-root, [class*="md-box-root"]')
|
|
175
|
-
|| root.querySelector('.flow-markdown-body, .md-box-root, [class*="md-box-root"]'))
|
|
176
|
-
&& !root.matches('[class*="bg-g-send-msg-bubble"]')
|
|
177
|
-
&& !root.querySelector('[class*="bg-g-send-msg-bubble"]')
|
|
178
|
-
) {
|
|
179
|
-
return 'Assistant';
|
|
180
|
-
}
|
|
181
|
-
return '';
|
|
182
|
-
};
|
|
183
|
-
|
|
184
|
-
const messageTextSelectors = [
|
|
185
|
-
'[data-testid="message_text_content"]',
|
|
186
|
-
'[data-testid="message_content"]',
|
|
187
|
-
'[data-testid*="message_text"]',
|
|
188
|
-
'[data-testid*="message_content"]',
|
|
189
|
-
'[class*="message-text"]',
|
|
190
|
-
'[class*="message-content"]',
|
|
191
|
-
'[class*="bg-g-send-msg-bubble"]',
|
|
192
|
-
'[class*="bg-g-receive-msg-bubble"]',
|
|
193
|
-
'.flow-markdown-body',
|
|
194
|
-
'.md-box-root',
|
|
195
|
-
'[class*="md-box-root"]',
|
|
196
|
-
'[class*="bubble"]',
|
|
197
|
-
];
|
|
198
|
-
const messageImageSelector = messageTextSelectors.map((s) => s + ' img').join(', ');
|
|
199
|
-
|
|
200
|
-
const extractTextChunks = (root) => {
|
|
201
|
-
const chunks = [];
|
|
202
|
-
const seen = new Set();
|
|
203
|
-
for (const selector of messageTextSelectors) {
|
|
204
|
-
const nodes = Array.from(root.querySelectorAll(selector))
|
|
205
|
-
.filter((el) => isVisible(el))
|
|
206
|
-
.map((el) => clean(el.innerText || el.textContent || ''))
|
|
207
|
-
.filter(Boolean);
|
|
208
|
-
|
|
209
|
-
for (const nodeText of nodes) {
|
|
210
|
-
if (seen.has(nodeText)) continue;
|
|
211
|
-
seen.add(nodeText);
|
|
212
|
-
chunks.push(nodeText);
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
if (chunks.length > 0) break;
|
|
216
|
-
}
|
|
217
|
-
return chunks;
|
|
218
|
-
};
|
|
219
|
-
|
|
220
|
-
const extractImageLines = (root) => Array.from(root.querySelectorAll(messageImageSelector))
|
|
221
|
-
.filter((el) => el instanceof HTMLImageElement && isVisible(el))
|
|
222
|
-
.map((el) => {
|
|
223
|
-
const width = el.naturalWidth || el.width || 0;
|
|
224
|
-
const height = el.naturalHeight || el.height || 0;
|
|
225
|
-
if (width > 0 && height > 0 && width <= 48 && height <= 48) return '';
|
|
226
|
-
const url = clean(el.currentSrc || el.src || '');
|
|
227
|
-
return /^https?:\\/\\//i.test(url) ? 'Image: ' + url : '';
|
|
228
|
-
})
|
|
229
|
-
.filter((line, index, items) => Boolean(line) && items.indexOf(line) === index);
|
|
230
|
-
|
|
231
|
-
const extractText = (root) => {
|
|
232
|
-
const chunks = extractTextChunks(root);
|
|
233
|
-
const text = chunks.length > 0 ? clean(chunks.join('\\n')) : clean(root.innerText || root.textContent || '');
|
|
234
|
-
const imageLines = extractImageLines(root);
|
|
235
|
-
if (imageLines.length === 0) return text;
|
|
236
|
-
return text ? text + '\\n' + imageLines.join('\\n') : imageLines.join('\\n');
|
|
237
|
-
};
|
|
238
|
-
|
|
239
|
-
const itemSelectors = [
|
|
240
|
-
// 2026-05 Doubao DOM refactor wrappers (prepended; outer ones win via
|
|
241
|
-
// ancestor-keep dedup below).
|
|
242
|
-
'[class*="inner-item-"]',
|
|
243
|
-
'[class*="top-item-"]',
|
|
244
|
-
'[class*="item-kDun2N"]',
|
|
245
|
-
'[data-testid="union_message"]',
|
|
246
|
-
'[data-testid="message-block-container"]',
|
|
247
|
-
'[data-message-id]',
|
|
248
|
-
'[class*="bg-g-send-msg-bubble"]',
|
|
249
|
-
'[class*="bg-g-receive-msg-bubble"]',
|
|
250
|
-
];
|
|
251
|
-
|
|
252
|
-
const messageLists = Array.from(document.querySelectorAll('[class*="message-list-"], .container-PvPoAn, .scroll-view-OEiNXD, [data-testid="message-list"]'))
|
|
253
|
-
.filter((el) => isVisible(el));
|
|
254
|
-
if (messageLists.length === 0) return [];
|
|
255
|
-
|
|
256
|
-
const allRoots = [];
|
|
257
|
-
const seen = new Set();
|
|
258
|
-
for (const messageList of messageLists) {
|
|
259
|
-
for (const sel of itemSelectors) {
|
|
260
|
-
messageList.querySelectorAll(sel).forEach((el) => {
|
|
261
|
-
if (!seen.has(el)) {
|
|
262
|
-
seen.add(el);
|
|
263
|
-
allRoots.push(el);
|
|
264
|
-
}
|
|
265
|
-
});
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
const roots = allRoots
|
|
269
|
-
.filter((el) => isVisible(el) && !el.closest('script, style, noscript'))
|
|
270
|
-
.filter((el, index, items) => !items.some((other, otherIndex) => otherIndex !== index && other.contains(el)));
|
|
271
|
-
|
|
272
|
-
const turns = roots
|
|
273
|
-
.map((el) => {
|
|
274
|
-
const role = getRole(el);
|
|
275
|
-
const text = extractText(el);
|
|
276
|
-
return { el, role, text };
|
|
277
|
-
})
|
|
278
|
-
.filter((item) => (item.role === 'User' || item.role === 'Assistant') && item.text);
|
|
279
|
-
|
|
280
|
-
turns.sort((a, b) => {
|
|
281
|
-
if (a.el === b.el) return 0;
|
|
282
|
-
const pos = a.el.compareDocumentPosition(b.el);
|
|
283
|
-
return pos & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1;
|
|
284
|
-
});
|
|
285
|
-
|
|
286
|
-
const deduped = [];
|
|
287
|
-
const dedupedSeen = new Set();
|
|
288
|
-
for (const turn of turns) {
|
|
289
|
-
const key = turn.role + '::' + turn.text;
|
|
290
|
-
if (dedupedSeen.has(key)) continue;
|
|
291
|
-
dedupedSeen.add(key);
|
|
292
|
-
deduped.push({ Role: turn.role, Text: turn.text });
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
if (deduped.length > 0) return deduped;
|
|
296
|
-
return [];
|
|
297
|
-
})()
|
|
298
|
-
`;
|
|
299
|
-
}
|
|
300
|
-
function prepareDoubaoComposerScript() {
|
|
301
|
-
return `
|
|
302
|
-
(() => {
|
|
303
|
-
${buildDoubaoComposerLocatorScript()}
|
|
304
|
-
const composer = findComposer();
|
|
305
|
-
|
|
306
|
-
if (
|
|
307
|
-
!(composer instanceof HTMLTextAreaElement)
|
|
308
|
-
&& !(composer instanceof HTMLInputElement)
|
|
309
|
-
&& !(composer instanceof HTMLElement)
|
|
310
|
-
) {
|
|
311
|
-
return { ok: false, reason: 'Could not find Doubao input element' };
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
try {
|
|
315
|
-
composer.focus();
|
|
316
|
-
|
|
317
|
-
if (composer instanceof HTMLTextAreaElement || composer instanceof HTMLInputElement) {
|
|
318
|
-
const length = composer.value.length;
|
|
319
|
-
composer.setSelectionRange(0, length);
|
|
320
|
-
} else {
|
|
321
|
-
const selection = window.getSelection();
|
|
322
|
-
const range = document.createRange();
|
|
323
|
-
range.selectNodeContents(composer);
|
|
324
|
-
selection?.removeAllRanges();
|
|
325
|
-
selection?.addRange(range);
|
|
326
|
-
}
|
|
327
|
-
} catch (error) {
|
|
328
|
-
return {
|
|
329
|
-
ok: false,
|
|
330
|
-
reason: error instanceof Error ? error.message : String(error),
|
|
331
|
-
};
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
return { ok: true };
|
|
335
|
-
})()
|
|
336
|
-
`;
|
|
337
|
-
}
|
|
338
|
-
function composerStateScript() {
|
|
339
|
-
return `
|
|
340
|
-
(() => {
|
|
341
|
-
${buildDoubaoComposerLocatorScript()}
|
|
342
|
-
const composer = findComposer();
|
|
343
|
-
|
|
344
|
-
if (composer instanceof HTMLTextAreaElement || composer instanceof HTMLInputElement) {
|
|
345
|
-
return { hasText: !!composer.value.trim(), text: composer.value };
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
if (composer instanceof HTMLElement) {
|
|
349
|
-
const text = (composer.innerText || '').trim() || (composer.textContent || '').trim();
|
|
350
|
-
return {
|
|
351
|
-
hasText: !!text,
|
|
352
|
-
text,
|
|
353
|
-
};
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
return { hasText: false, text: '' };
|
|
357
|
-
})()
|
|
358
|
-
`;
|
|
359
|
-
}
|
|
360
|
-
function syncComposerAfterNativeTypeScript() {
|
|
361
|
-
return `
|
|
362
|
-
(() => {
|
|
363
|
-
${buildDoubaoComposerLocatorScript()}
|
|
364
|
-
const composer = findComposer();
|
|
365
|
-
|
|
366
|
-
if (composer instanceof HTMLTextAreaElement || composer instanceof HTMLInputElement) {
|
|
367
|
-
const value = composer.value;
|
|
368
|
-
composer.dispatchEvent(new InputEvent('beforeinput', { bubbles: true, data: value, inputType: 'insertText' }));
|
|
369
|
-
composer.dispatchEvent(new InputEvent('input', { bubbles: true, data: value, inputType: 'insertText' }));
|
|
370
|
-
composer.dispatchEvent(new Event('change', { bubbles: true }));
|
|
371
|
-
return { hasText: !!value.trim(), text: value };
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
if (composer instanceof HTMLElement) {
|
|
375
|
-
const text = (composer.innerText || '').trim() || (composer.textContent || '').trim();
|
|
376
|
-
composer.dispatchEvent(new InputEvent('beforeinput', { bubbles: true, data: text, inputType: 'insertText' }));
|
|
377
|
-
composer.dispatchEvent(new InputEvent('input', { bubbles: true, data: text, inputType: 'insertText' }));
|
|
378
|
-
composer.dispatchEvent(new Event('change', { bubbles: true }));
|
|
379
|
-
return { hasText: !!text, text };
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
return { hasText: false, text: '' };
|
|
383
|
-
})()
|
|
384
|
-
`;
|
|
385
|
-
}
|
|
386
|
-
function fillComposerScript(text) {
|
|
387
|
-
return `
|
|
388
|
-
((inputText) => {
|
|
389
|
-
${buildDoubaoComposerLocatorScript()}
|
|
390
|
-
const composer = findComposer();
|
|
391
|
-
|
|
392
|
-
if (!composer) throw new Error('Could not find Doubao input element');
|
|
393
|
-
|
|
394
|
-
composer.focus();
|
|
395
|
-
|
|
396
|
-
if (composer instanceof HTMLTextAreaElement || composer instanceof HTMLInputElement) {
|
|
397
|
-
const proto = composer instanceof HTMLTextAreaElement
|
|
398
|
-
? window.HTMLTextAreaElement.prototype
|
|
399
|
-
: window.HTMLInputElement.prototype;
|
|
400
|
-
const setter = Object.getOwnPropertyDescriptor(proto, 'value')?.set;
|
|
401
|
-
setter?.call(composer, inputText);
|
|
402
|
-
composer.dispatchEvent(new InputEvent('beforeinput', { bubbles: true, data: inputText, inputType: 'insertText' }));
|
|
403
|
-
composer.dispatchEvent(new InputEvent('input', { bubbles: true, data: inputText, inputType: 'insertText' }));
|
|
404
|
-
composer.dispatchEvent(new Event('change', { bubbles: true }));
|
|
405
|
-
return { hasText: !!composer.value.trim(), mode: 'text-input', text: composer.value };
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
if (composer instanceof HTMLElement) {
|
|
409
|
-
composer.textContent = '';
|
|
410
|
-
const selection = window.getSelection();
|
|
411
|
-
const range = document.createRange();
|
|
412
|
-
range.selectNodeContents(composer);
|
|
413
|
-
range.collapse(false);
|
|
414
|
-
selection?.removeAllRanges();
|
|
415
|
-
selection?.addRange(range);
|
|
416
|
-
document.execCommand('insertText', false, inputText);
|
|
417
|
-
composer.dispatchEvent(new InputEvent('beforeinput', { bubbles: true, data: inputText, inputType: 'insertText' }));
|
|
418
|
-
composer.dispatchEvent(new InputEvent('input', { bubbles: true, data: inputText, inputType: 'insertText' }));
|
|
419
|
-
composer.dispatchEvent(new Event('change', { bubbles: true }));
|
|
420
|
-
return {
|
|
421
|
-
hasText: !!((composer.innerText || '').trim() || (composer.textContent || '').trim()),
|
|
422
|
-
mode: 'contenteditable',
|
|
423
|
-
text: (composer.innerText || '').trim() || (composer.textContent || '').trim(),
|
|
424
|
-
};
|
|
425
|
-
}
|
|
426
|
-
|
|
427
|
-
throw new Error('Unsupported Doubao input element');
|
|
428
|
-
})(${JSON.stringify(text)})
|
|
429
|
-
`;
|
|
430
|
-
}
|
|
431
|
-
function detectDoubaoVerificationScript() {
|
|
432
|
-
return `
|
|
433
|
-
(() => {
|
|
434
|
-
const isVisible = (el) => {
|
|
435
|
-
if (!(el instanceof HTMLElement)) return false;
|
|
436
|
-
const style = window.getComputedStyle(el);
|
|
437
|
-
if (style.display === 'none' || style.visibility === 'hidden') return false;
|
|
438
|
-
const rect = el.getBoundingClientRect();
|
|
439
|
-
return rect.width > 0 && rect.height > 0;
|
|
440
|
-
};
|
|
441
|
-
|
|
442
|
-
const challengeSelectors = [
|
|
443
|
-
'iframe[src*="captcha"]',
|
|
444
|
-
'iframe[src*="verify"]',
|
|
445
|
-
'input[placeholder*="验证码"]',
|
|
446
|
-
'input[aria-label*="验证码"]',
|
|
447
|
-
];
|
|
448
|
-
const selectorMatch = challengeSelectors.find((selector) => {
|
|
449
|
-
return Array.from(document.querySelectorAll(selector)).some((node) => isVisible(node));
|
|
450
|
-
});
|
|
451
|
-
if (selectorMatch) {
|
|
452
|
-
return { detected: true, reason: selectorMatch };
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
const phrasePattern = /人机验证|完成安全验证|异常访问|滑动验证|拖动滑块/i;
|
|
456
|
-
const candidateRoots = Array.from(
|
|
457
|
-
document.querySelectorAll('[role="dialog"], [aria-modal="true"], .semi-modal, .modal')
|
|
458
|
-
);
|
|
459
|
-
const match = candidateRoots.find((node) => {
|
|
460
|
-
if (!(node instanceof HTMLElement)) return false;
|
|
461
|
-
if (!isVisible(node)) return false;
|
|
462
|
-
const text = (node.innerText || node.textContent || '').trim();
|
|
463
|
-
if (!text || text.length > 400) return false;
|
|
464
|
-
return phrasePattern.test(text);
|
|
465
|
-
});
|
|
466
|
-
|
|
467
|
-
return {
|
|
468
|
-
detected: !!match,
|
|
469
|
-
reason: match ? ((match.innerText || match.textContent || '').trim().slice(0, 80) || 'challenge-ui') : '',
|
|
470
|
-
};
|
|
471
|
-
})()
|
|
472
|
-
`;
|
|
473
|
-
}
|
|
474
|
-
function clickSendButtonScript() {
|
|
475
|
-
return `
|
|
476
|
-
(() => {
|
|
477
|
-
${buildDoubaoComposerLocatorScript()}
|
|
478
|
-
const directSendButton = document.querySelector('button#flow-end-msg-send');
|
|
479
|
-
if (directSendButton instanceof HTMLElement && isVisible(directSendButton)) {
|
|
480
|
-
const disabled = directSendButton.getAttribute('disabled') !== null
|
|
481
|
-
|| directSendButton.getAttribute('aria-disabled') === 'true';
|
|
482
|
-
if (!disabled) {
|
|
483
|
-
directSendButton.click();
|
|
484
|
-
return true;
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
|
|
488
|
-
const composer = findComposer();
|
|
489
|
-
if (!(composer instanceof HTMLElement)) return false;
|
|
490
|
-
|
|
491
|
-
const composerRect = composer.getBoundingClientRect();
|
|
492
|
-
const rootCandidates = [
|
|
493
|
-
composer.closest('form'),
|
|
494
|
-
composer.closest('[role="form"]'),
|
|
495
|
-
composer.closest('[data-testid="chat_input"]'),
|
|
496
|
-
composer.closest('.chat-input'),
|
|
497
|
-
composer.parentElement,
|
|
498
|
-
composer.parentElement?.parentElement,
|
|
499
|
-
].filter(Boolean);
|
|
500
|
-
|
|
501
|
-
const seen = new Set();
|
|
502
|
-
const buttons = [];
|
|
503
|
-
for (const root of rootCandidates) {
|
|
504
|
-
root.querySelectorAll('button, [role="button"]').forEach((node) => {
|
|
505
|
-
if (!(node instanceof HTMLElement)) return;
|
|
506
|
-
if (seen.has(node)) return;
|
|
507
|
-
seen.add(node);
|
|
508
|
-
buttons.push(node);
|
|
509
|
-
});
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
const submitPattern = /send|发送|提交|发消息/i;
|
|
513
|
-
const excludedPattern = /新对话|new chat|快速|视频生成|深入研究|图像生成|帮我写作|音乐生成|更多|上传|upload|麦克风|microphone|模式|mode|工具|tools|设置|settings|云盘|history|历史/i;
|
|
514
|
-
let bestButton = null;
|
|
515
|
-
let bestScore = -Infinity;
|
|
516
|
-
|
|
517
|
-
for (const button of buttons) {
|
|
518
|
-
if (!isVisible(button)) continue;
|
|
519
|
-
const disabled = button.getAttribute('disabled') !== null
|
|
520
|
-
|| button.getAttribute('aria-disabled') === 'true';
|
|
521
|
-
if (disabled) continue;
|
|
522
|
-
|
|
523
|
-
const text = (button.innerText || button.textContent || '').trim();
|
|
524
|
-
const aria = (button.getAttribute('aria-label') || '').trim();
|
|
525
|
-
const title = (button.getAttribute('title') || '').trim();
|
|
526
|
-
const className = String(button.className || '');
|
|
527
|
-
const haystack = [text, aria, title].join(' ').trim();
|
|
528
|
-
if (excludedPattern.test(haystack)) continue;
|
|
529
|
-
|
|
530
|
-
const rect = button.getBoundingClientRect();
|
|
531
|
-
const dx = rect.left - composerRect.right;
|
|
532
|
-
const dy = Math.abs((rect.top + rect.height / 2) - (composerRect.top + composerRect.height / 2));
|
|
533
|
-
const distancePenalty = Math.abs(dx) + dy;
|
|
534
|
-
const isSubmitLike = submitPattern.test(haystack)
|
|
535
|
-
|| button.getAttribute('type') === 'submit'
|
|
536
|
-
|| className.includes('bg-dbx-text-highlight')
|
|
537
|
-
|| className.includes('bg-dbx-fill-highlight')
|
|
538
|
-
|| className.includes('text-dbx-text-static-white-primary');
|
|
539
|
-
if (!isSubmitLike) continue;
|
|
540
|
-
if (dx < -80 || dx > 280) continue;
|
|
541
|
-
if (dy > 140) continue;
|
|
542
|
-
|
|
543
|
-
let score = -distancePenalty;
|
|
544
|
-
if (submitPattern.test(haystack)) score += 5000;
|
|
545
|
-
if (button.getAttribute('type') === 'submit') score += 1200;
|
|
546
|
-
if (button.closest('.chat-input-button')) score += 1200;
|
|
547
|
-
if (className.includes('bg-dbx-text-highlight')) score += 600;
|
|
548
|
-
if (className.includes('bg-dbx-fill-highlight')) score += 600;
|
|
549
|
-
if (className.includes('text-dbx-text-static-white-primary')) score += 400;
|
|
550
|
-
if (dx >= -40 && dx <= 240) score += 120;
|
|
551
|
-
if (rect.left >= composerRect.left - 40) score += 40;
|
|
552
|
-
|
|
553
|
-
if (score > bestScore) {
|
|
554
|
-
bestScore = score;
|
|
555
|
-
bestButton = button;
|
|
556
|
-
}
|
|
557
|
-
}
|
|
558
|
-
|
|
559
|
-
if (bestButton && bestScore >= 200) {
|
|
560
|
-
bestButton.click();
|
|
561
|
-
return true;
|
|
562
|
-
}
|
|
563
|
-
|
|
564
|
-
return false;
|
|
565
|
-
})()
|
|
566
|
-
`;
|
|
567
|
-
}
|
|
568
|
-
function clickNewChatScript() {
|
|
569
|
-
return `
|
|
570
|
-
(() => {
|
|
571
|
-
const isVisible = (el) => {
|
|
572
|
-
if (!(el instanceof HTMLElement)) return false;
|
|
573
|
-
const style = window.getComputedStyle(el);
|
|
574
|
-
if (style.display === 'none' || style.visibility === 'hidden') return false;
|
|
575
|
-
const rect = el.getBoundingClientRect();
|
|
576
|
-
return rect.width > 0 && rect.height > 0;
|
|
577
|
-
};
|
|
578
|
-
|
|
579
|
-
const labels = ['新对话', 'New Chat', '创建新对话'];
|
|
580
|
-
const buttons = Array.from(document.querySelectorAll('button, a, [role="button"]'));
|
|
581
|
-
|
|
582
|
-
for (const button of buttons) {
|
|
583
|
-
if (!isVisible(button)) continue;
|
|
584
|
-
const text = (button.innerText || button.textContent || '').trim();
|
|
585
|
-
const aria = (button.getAttribute('aria-label') || '').trim();
|
|
586
|
-
const title = (button.getAttribute('title') || '').trim();
|
|
587
|
-
const haystacks = [text, aria, title];
|
|
588
|
-
if (haystacks.some((value) => labels.some((label) => value.includes(label)))) {
|
|
589
|
-
button.click();
|
|
590
|
-
return text || aria || title || 'new-chat';
|
|
591
|
-
}
|
|
592
|
-
}
|
|
593
|
-
|
|
594
|
-
return '';
|
|
595
|
-
})()
|
|
596
|
-
`;
|
|
597
|
-
}
|
|
598
|
-
function normalizeDoubaoTabs(rawTabs) {
|
|
599
|
-
return rawTabs
|
|
600
|
-
.map((tab, index) => {
|
|
601
|
-
const record = (tab || {});
|
|
602
|
-
return {
|
|
603
|
-
index: typeof record.index === 'number' ? record.index : index,
|
|
604
|
-
url: typeof record.url === 'string' ? record.url : '',
|
|
605
|
-
title: typeof record.title === 'string' ? record.title : '',
|
|
606
|
-
active: record.active === true,
|
|
607
|
-
};
|
|
608
|
-
})
|
|
609
|
-
.filter((tab) => tab.url.includes('doubao.com/chat'));
|
|
610
|
-
}
|
|
611
|
-
async function selectPreferredDoubaoTab(page) {
|
|
612
|
-
const rawTabs = await page.tabs().catch(() => []);
|
|
613
|
-
if (!Array.isArray(rawTabs) || rawTabs.length === 0)
|
|
614
|
-
return false;
|
|
615
|
-
const tabs = normalizeDoubaoTabs(rawTabs);
|
|
616
|
-
if (tabs.length === 0)
|
|
617
|
-
return false;
|
|
618
|
-
const preferred = [...tabs].sort((left, right) => {
|
|
619
|
-
const score = (tab) => {
|
|
620
|
-
let value = tab.index;
|
|
621
|
-
if (/https:\/\/www\.doubao\.com\/chat\/[A-Za-z0-9_-]+/.test(tab.url))
|
|
622
|
-
value += 1000;
|
|
623
|
-
else if (tab.url.startsWith(DOUBAO_CHAT_URL))
|
|
624
|
-
value += 100;
|
|
625
|
-
if (tab.active)
|
|
626
|
-
value += 25;
|
|
627
|
-
return value;
|
|
628
|
-
};
|
|
629
|
-
return score(right) - score(left);
|
|
630
|
-
})[0];
|
|
631
|
-
if (!preferred)
|
|
632
|
-
return false;
|
|
633
|
-
await page.selectTab(preferred.index);
|
|
634
|
-
await page.wait(0.8);
|
|
635
|
-
return true;
|
|
636
|
-
}
|
|
637
|
-
export async function ensureDoubaoChatPage(page) {
|
|
638
|
-
let currentUrl = await page.evaluate('window.location.href').catch(() => '');
|
|
639
|
-
if (typeof currentUrl === 'string' && currentUrl.includes('doubao.com/chat')) {
|
|
640
|
-
await page.wait(1);
|
|
641
|
-
return;
|
|
642
|
-
}
|
|
643
|
-
const reusedTab = await selectPreferredDoubaoTab(page);
|
|
644
|
-
if (reusedTab) {
|
|
645
|
-
currentUrl = await page.evaluate('window.location.href').catch(() => '');
|
|
646
|
-
if (typeof currentUrl === 'string' && currentUrl.includes('doubao.com/chat')) {
|
|
647
|
-
await page.wait(1);
|
|
648
|
-
return;
|
|
649
|
-
}
|
|
650
|
-
}
|
|
651
|
-
await page.goto(DOUBAO_CHAT_URL, { waitUntil: 'load', settleMs: 2500 });
|
|
652
|
-
await page.wait(1.5);
|
|
653
|
-
}
|
|
654
|
-
export async function getDoubaoPageState(page) {
|
|
655
|
-
await ensureDoubaoChatPage(page);
|
|
656
|
-
return await page.evaluate(getStateScript());
|
|
657
|
-
}
|
|
658
|
-
export async function getDoubaoTurns(page) {
|
|
659
|
-
await ensureDoubaoChatPage(page);
|
|
660
|
-
const turns = await page.evaluate(getTurnsScript());
|
|
661
|
-
if (turns.length > 0)
|
|
662
|
-
return turns;
|
|
663
|
-
const lines = await page.evaluate(getTranscriptLinesScript());
|
|
664
|
-
return lines.map((line) => ({ Role: 'System', Text: line }));
|
|
665
|
-
}
|
|
666
|
-
export async function getDoubaoVisibleTurns(page) {
|
|
667
|
-
await ensureDoubaoChatPage(page);
|
|
668
|
-
return await page.evaluate(getTurnsScript());
|
|
669
|
-
}
|
|
670
|
-
export async function getDoubaoTranscriptLines(page) {
|
|
671
|
-
await ensureDoubaoChatPage(page);
|
|
672
|
-
return await page.evaluate(getTranscriptLinesScript());
|
|
673
|
-
}
|
|
674
|
-
export async function sendDoubaoMessage(page, text) {
|
|
675
|
-
await ensureDoubaoChatPage(page);
|
|
676
|
-
const normalizeComposerText = (value) => value.replace(/\r\n/g, '\n').trim();
|
|
677
|
-
const expectedText = normalizeComposerText(text);
|
|
678
|
-
const prepared = await page.evaluate(prepareDoubaoComposerScript());
|
|
679
|
-
if (!prepared?.ok) {
|
|
680
|
-
throw new CommandExecutionError(prepared?.reason || 'Could not find Doubao input element');
|
|
681
|
-
}
|
|
682
|
-
let hasText = false;
|
|
683
|
-
if (page.nativeType) {
|
|
684
|
-
try {
|
|
685
|
-
await page.nativeType(text);
|
|
686
|
-
await page.wait(0.2);
|
|
687
|
-
await page.evaluate(syncComposerAfterNativeTypeScript());
|
|
688
|
-
const nativeState = await page.evaluate(composerStateScript());
|
|
689
|
-
hasText = !!nativeState?.hasText && normalizeComposerText(nativeState?.text || '') === expectedText;
|
|
690
|
-
}
|
|
691
|
-
catch { }
|
|
692
|
-
}
|
|
693
|
-
if (!hasText) {
|
|
694
|
-
const fallbackState = await page.evaluate(fillComposerScript(text));
|
|
695
|
-
hasText = !!fallbackState?.hasText && normalizeComposerText(fallbackState?.text || '') === expectedText;
|
|
696
|
-
}
|
|
697
|
-
if (!hasText) {
|
|
698
|
-
throw new CommandExecutionError('Failed to insert text into Doubao composer');
|
|
699
|
-
}
|
|
700
|
-
let submittedBy = 'enter';
|
|
701
|
-
const clicked = await page.evaluate(clickSendButtonScript());
|
|
702
|
-
if (clicked) {
|
|
703
|
-
submittedBy = 'button';
|
|
704
|
-
}
|
|
705
|
-
else if (page.nativeKeyPress) {
|
|
706
|
-
try {
|
|
707
|
-
await page.nativeKeyPress('Enter');
|
|
708
|
-
}
|
|
709
|
-
catch {
|
|
710
|
-
await page.pressKey('Enter');
|
|
711
|
-
}
|
|
712
|
-
}
|
|
713
|
-
else {
|
|
714
|
-
await page.pressKey('Enter');
|
|
715
|
-
}
|
|
716
|
-
await page.wait(0.8);
|
|
717
|
-
const verification = await page.evaluate(detectDoubaoVerificationScript());
|
|
718
|
-
if (verification?.detected) {
|
|
719
|
-
throw new CommandExecutionError('Doubao blocked the request with a verification challenge', verification.reason
|
|
720
|
-
? `Detected challenge signal: ${verification.reason}`
|
|
721
|
-
: 'Please complete the challenge in the browser and try again.');
|
|
722
|
-
}
|
|
723
|
-
return submittedBy;
|
|
724
|
-
}
|
|
725
|
-
export async function waitForDoubaoResponse(page, beforeLines, beforeTurns, promptText, timeoutSeconds) {
|
|
726
|
-
const beforeTurnSet = new Set(beforeTurns
|
|
727
|
-
.filter((turn) => turn.Role === 'Assistant')
|
|
728
|
-
.map((turn) => `${turn.Role}::${turn.Text}`));
|
|
729
|
-
const sanitizeCandidate = (value) => value
|
|
730
|
-
.replace(promptText, '')
|
|
731
|
-
.replace(/内容由豆包 AI 生成/g, '')
|
|
732
|
-
.replace(/在此处拖放文件/g, '')
|
|
733
|
-
.replace(/文件数量:.*$/g, '')
|
|
734
|
-
.replace(/\{"namedChunks".*$/g, '')
|
|
735
|
-
.replace(/window\\._SSR_DATA.*$/g, '')
|
|
736
|
-
.trim();
|
|
737
|
-
const getCandidate = async () => {
|
|
738
|
-
const verification = await page.evaluate(detectDoubaoVerificationScript());
|
|
739
|
-
if (verification?.detected) {
|
|
740
|
-
throw new CommandExecutionError('Doubao blocked the request with a verification challenge', verification.reason
|
|
741
|
-
? `Detected challenge signal: ${verification.reason}`
|
|
742
|
-
: 'Please complete the challenge in the browser and try again.');
|
|
743
|
-
}
|
|
744
|
-
const turns = await getDoubaoVisibleTurns(page);
|
|
745
|
-
const assistantCandidate = [...turns]
|
|
746
|
-
.reverse()
|
|
747
|
-
.find((turn) => turn.Role === 'Assistant' && !beforeTurnSet.has(`${turn.Role}::${turn.Text}`));
|
|
748
|
-
const visibleCandidate = assistantCandidate ? sanitizeCandidate(assistantCandidate.Text) : '';
|
|
749
|
-
if (visibleCandidate)
|
|
750
|
-
return visibleCandidate;
|
|
751
|
-
const lines = await getDoubaoTranscriptLines(page);
|
|
752
|
-
const additions = collectDoubaoTranscriptAdditions(beforeLines, lines, promptText, sanitizeCandidate)
|
|
753
|
-
.split('\n')
|
|
754
|
-
.filter(Boolean);
|
|
755
|
-
const shortCandidate = additions.find((line) => line.length <= 120);
|
|
756
|
-
return shortCandidate || additions[additions.length - 1] || '';
|
|
757
|
-
};
|
|
758
|
-
const pollIntervalSeconds = 2;
|
|
759
|
-
const maxPolls = Math.max(1, Math.ceil(timeoutSeconds / pollIntervalSeconds));
|
|
760
|
-
let lastCandidate = '';
|
|
761
|
-
let stableCount = 0;
|
|
762
|
-
for (let index = 0; index < maxPolls; index += 1) {
|
|
763
|
-
await page.wait(index === 0 ? 1.5 : pollIntervalSeconds);
|
|
764
|
-
const candidate = await getCandidate();
|
|
765
|
-
if (!candidate)
|
|
766
|
-
continue;
|
|
767
|
-
if (candidate === lastCandidate) {
|
|
768
|
-
stableCount += 1;
|
|
769
|
-
}
|
|
770
|
-
else {
|
|
771
|
-
lastCandidate = candidate;
|
|
772
|
-
stableCount = 1;
|
|
773
|
-
}
|
|
774
|
-
if (stableCount >= 2 || index === maxPolls - 1) {
|
|
775
|
-
return candidate;
|
|
776
|
-
}
|
|
777
|
-
}
|
|
778
|
-
return lastCandidate;
|
|
779
|
-
}
|
|
780
|
-
export function isLikelyDoubaoUiNoise(value) {
|
|
781
|
-
const text = value.replace(/\s+/g, '');
|
|
782
|
-
if (!text)
|
|
783
|
-
return false;
|
|
784
|
-
const exactNoise = new Set([
|
|
785
|
-
'快速视频生成深入研究图像生成帮我写作音乐生成更多',
|
|
786
|
-
]);
|
|
787
|
-
return exactNoise.has(text);
|
|
788
|
-
}
|
|
789
|
-
function isAlwaysTranscriptUiNoise(value) {
|
|
790
|
-
const text = value.replace(/\s+/g, '');
|
|
791
|
-
if (!text)
|
|
792
|
-
return false;
|
|
793
|
-
const exactNoise = new Set([
|
|
794
|
-
'AI创作云盘更多历史对话',
|
|
795
|
-
]);
|
|
796
|
-
return exactNoise.has(text);
|
|
797
|
-
}
|
|
798
|
-
function isLikelyTranscriptUiNoise(rawValue, sanitizedValue, promptText) {
|
|
799
|
-
const normalizeWhitespace = (value) => value.replace(/\s+/g, ' ').trim();
|
|
800
|
-
const normalizedRaw = normalizeWhitespace(rawValue);
|
|
801
|
-
const normalizedPrompt = normalizeWhitespace(promptText);
|
|
802
|
-
if (!normalizedPrompt || !normalizedRaw.startsWith(normalizedPrompt))
|
|
803
|
-
return false;
|
|
804
|
-
const remainder = normalizedRaw.slice(normalizedPrompt.length).trim();
|
|
805
|
-
if (!remainder)
|
|
806
|
-
return true;
|
|
807
|
-
return isLikelyDoubaoUiNoise(remainder) || isLikelyDoubaoUiNoise(sanitizedValue);
|
|
808
|
-
}
|
|
809
|
-
export function collectDoubaoTranscriptAdditions(beforeLines, currentLines, promptText, sanitize = (value) => value.trim()) {
|
|
810
|
-
const normalizedBefore = new Set(beforeLines.map((line) => sanitize(line)).filter(Boolean));
|
|
811
|
-
return currentLines
|
|
812
|
-
.filter((line) => !beforeLines.includes(line))
|
|
813
|
-
.map((line) => ({ raw: line, sanitized: sanitize(line) }))
|
|
814
|
-
.filter(({ raw, sanitized }) => sanitized
|
|
815
|
-
&& sanitized !== promptText
|
|
816
|
-
&& !normalizedBefore.has(sanitized)
|
|
817
|
-
&& !isAlwaysTranscriptUiNoise(sanitized)
|
|
818
|
-
&& !isLikelyTranscriptUiNoise(raw, sanitized, promptText))
|
|
819
|
-
.map(({ sanitized }) => sanitized)
|
|
820
|
-
.join('\n');
|
|
821
|
-
}
|
|
822
|
-
function getConversationListScript() {
|
|
823
|
-
return `
|
|
824
|
-
(() => {
|
|
825
|
-
const sidebar = document.querySelector('[data-testid="flow_chat_sidebar"]');
|
|
826
|
-
if (!sidebar) return [];
|
|
827
|
-
|
|
828
|
-
const items = Array.from(
|
|
829
|
-
sidebar.querySelectorAll('a[data-testid="chat_list_thread_item"]')
|
|
830
|
-
);
|
|
831
|
-
|
|
832
|
-
return items
|
|
833
|
-
.map(a => {
|
|
834
|
-
const href = a.getAttribute('href') || '';
|
|
835
|
-
const match = href.match(/\\/chat\\/(\\d{10,})/);
|
|
836
|
-
if (!match) return null;
|
|
837
|
-
const id = match[1];
|
|
838
|
-
const textContent = (a.textContent || a.innerText || '').trim();
|
|
839
|
-
const title = textContent
|
|
840
|
-
.replace(/\\s+/g, ' ')
|
|
841
|
-
.substring(0, 200);
|
|
842
|
-
return { id, title, href };
|
|
843
|
-
})
|
|
844
|
-
.filter(Boolean);
|
|
845
|
-
})()
|
|
846
|
-
`;
|
|
847
|
-
}
|
|
848
|
-
export async function getDoubaoConversationList(page) {
|
|
849
|
-
await ensureDoubaoChatPage(page);
|
|
850
|
-
const raw = await page.evaluate(getConversationListScript());
|
|
851
|
-
if (!Array.isArray(raw))
|
|
852
|
-
return [];
|
|
853
|
-
return raw.map((item) => ({
|
|
854
|
-
Id: item.id,
|
|
855
|
-
Title: item.title,
|
|
856
|
-
Url: `${DOUBAO_CHAT_URL}/${item.id}`,
|
|
857
|
-
}));
|
|
858
|
-
}
|
|
859
|
-
export function parseDoubaoConversationId(input) {
|
|
860
|
-
const match = input.match(/(\d{10,})/);
|
|
861
|
-
return match ? match[1] : input;
|
|
862
|
-
}
|
|
863
|
-
function getConversationDetailScript() {
|
|
864
|
-
return `
|
|
865
|
-
(() => {
|
|
866
|
-
const clean = (v) => (v || '').replace(/\\u00a0/g, ' ').replace(/\\n{3,}/g, '\\n\\n').trim();
|
|
867
|
-
|
|
868
|
-
const messageList = document.querySelector('[data-testid="message-list"]');
|
|
869
|
-
if (!messageList) return { messages: [], meeting: null };
|
|
870
|
-
|
|
871
|
-
const meetingCard = messageList.querySelector('[data-testid="meeting-minutes-card"]');
|
|
872
|
-
let meeting = null;
|
|
873
|
-
if (meetingCard) {
|
|
874
|
-
const raw = clean(meetingCard.textContent || '');
|
|
875
|
-
const match = raw.match(/^(.+?)(?:会议时间:|\\s*$)(.*)/);
|
|
876
|
-
meeting = {
|
|
877
|
-
title: match ? match[1].trim() : raw,
|
|
878
|
-
time: match && match[2] ? match[2].trim() : '',
|
|
879
|
-
};
|
|
880
|
-
}
|
|
881
|
-
|
|
882
|
-
const unions = Array.from(messageList.querySelectorAll('[data-testid="union_message"]'));
|
|
883
|
-
const messages = unions.map(u => {
|
|
884
|
-
const isSend = !!u.querySelector('[data-testid="send_message"]');
|
|
885
|
-
const isReceive = !!u.querySelector('[data-testid="receive_message"]');
|
|
886
|
-
const textEl = u.querySelector('[data-testid="message_text_content"]');
|
|
887
|
-
const text = textEl ? clean(textEl.innerText || textEl.textContent || '') : '';
|
|
888
|
-
return {
|
|
889
|
-
role: isSend ? 'User' : isReceive ? 'Assistant' : 'System',
|
|
890
|
-
text,
|
|
891
|
-
hasMeetingCard: !!u.querySelector('[data-testid="meeting-minutes-card"]'),
|
|
892
|
-
};
|
|
893
|
-
}).filter(m => m.text);
|
|
894
|
-
|
|
895
|
-
return { messages, meeting };
|
|
896
|
-
})()
|
|
897
|
-
`;
|
|
898
|
-
}
|
|
899
|
-
export async function navigateToConversation(page, conversationId) {
|
|
900
|
-
const url = `${DOUBAO_CHAT_URL}/${conversationId}`;
|
|
901
|
-
const currentUrl = await page.evaluate('window.location.href').catch(() => '');
|
|
902
|
-
if (typeof currentUrl === 'string' && currentUrl.includes(`/chat/${conversationId}`)) {
|
|
903
|
-
await page.wait(1);
|
|
904
|
-
return;
|
|
905
|
-
}
|
|
906
|
-
await page.goto(url, { waitUntil: 'load', settleMs: 3000 });
|
|
907
|
-
await page.wait(2);
|
|
908
|
-
}
|
|
909
|
-
export async function getConversationDetail(page, conversationId) {
|
|
910
|
-
await navigateToConversation(page, conversationId);
|
|
911
|
-
const raw = await page.evaluate(getConversationDetailScript());
|
|
912
|
-
const messages = (raw.messages || []).map((m) => ({
|
|
913
|
-
Role: m.role,
|
|
914
|
-
Text: m.text,
|
|
915
|
-
HasMeetingCard: m.hasMeetingCard,
|
|
916
|
-
}));
|
|
917
|
-
return { messages, meeting: raw.meeting };
|
|
918
|
-
}
|
|
919
|
-
// ---------------------------------------------------------------------------
|
|
920
|
-
// Meeting minutes panel helpers
|
|
921
|
-
// ---------------------------------------------------------------------------
|
|
922
|
-
function clickMeetingCardScript() {
|
|
923
|
-
return `
|
|
924
|
-
(() => {
|
|
925
|
-
const card = document.querySelector('[data-testid="meeting-minutes-card"]');
|
|
926
|
-
if (!card) return false;
|
|
927
|
-
card.click();
|
|
928
|
-
return true;
|
|
929
|
-
})()
|
|
930
|
-
`;
|
|
931
|
-
}
|
|
932
|
-
function readMeetingSummaryScript() {
|
|
933
|
-
return `
|
|
934
|
-
(() => {
|
|
935
|
-
const panel = document.querySelector('[data-testid="canvas_panel_container"]');
|
|
936
|
-
if (!panel) return { error: 'no panel' };
|
|
937
|
-
|
|
938
|
-
const summary = panel.querySelector('[data-testid="meeting-summary-todos"]');
|
|
939
|
-
const summaryText = summary
|
|
940
|
-
? (summary.innerText || summary.textContent || '').trim()
|
|
941
|
-
: '';
|
|
942
|
-
|
|
943
|
-
return { summary: summaryText };
|
|
944
|
-
})()
|
|
945
|
-
`;
|
|
946
|
-
}
|
|
947
|
-
function clickTextNotesTabScript() {
|
|
948
|
-
return `
|
|
949
|
-
(() => {
|
|
950
|
-
const panel = document.querySelector('[data-testid="canvas_panel_container"]');
|
|
951
|
-
if (!panel) return false;
|
|
952
|
-
const tabs = panel.querySelectorAll('[role="tab"], .semi-tabs-tab');
|
|
953
|
-
for (const tab of tabs) {
|
|
954
|
-
if ((tab.textContent || '').trim().includes('文字')) {
|
|
955
|
-
tab.click();
|
|
956
|
-
return true;
|
|
957
|
-
}
|
|
958
|
-
}
|
|
959
|
-
return false;
|
|
960
|
-
})()
|
|
961
|
-
`;
|
|
962
|
-
}
|
|
963
|
-
function readTextNotesScript() {
|
|
964
|
-
return `
|
|
965
|
-
(() => {
|
|
966
|
-
const panel = document.querySelector('[data-testid="canvas_panel_container"]');
|
|
967
|
-
if (!panel) return '';
|
|
968
|
-
const textNotes = panel.querySelector('[data-testid="meeting-text-notes"]');
|
|
969
|
-
if (!textNotes) return '';
|
|
970
|
-
return (textNotes.innerText || textNotes.textContent || '').trim();
|
|
971
|
-
})()
|
|
972
|
-
`;
|
|
973
|
-
}
|
|
974
|
-
function normalizeTranscriptLines(text) {
|
|
975
|
-
return text
|
|
976
|
-
.split('\n')
|
|
977
|
-
.map(line => line.trim())
|
|
978
|
-
.filter(Boolean);
|
|
979
|
-
}
|
|
980
|
-
function containsLineSequence(haystack, needle) {
|
|
981
|
-
if (needle.length === 0)
|
|
982
|
-
return true;
|
|
983
|
-
if (needle.length > haystack.length)
|
|
984
|
-
return false;
|
|
985
|
-
for (let start = 0; start <= haystack.length - needle.length; start += 1) {
|
|
986
|
-
let matched = true;
|
|
987
|
-
for (let offset = 0; offset < needle.length; offset += 1) {
|
|
988
|
-
if (haystack[start + offset] !== needle[offset]) {
|
|
989
|
-
matched = false;
|
|
990
|
-
break;
|
|
991
|
-
}
|
|
992
|
-
}
|
|
993
|
-
if (matched)
|
|
994
|
-
return true;
|
|
995
|
-
}
|
|
996
|
-
return false;
|
|
997
|
-
}
|
|
998
|
-
export function mergeTranscriptSnapshots(existing, incoming) {
|
|
999
|
-
const currentLines = normalizeTranscriptLines(existing);
|
|
1000
|
-
const nextLines = normalizeTranscriptLines(incoming);
|
|
1001
|
-
if (nextLines.length === 0)
|
|
1002
|
-
return currentLines.join('\n');
|
|
1003
|
-
if (currentLines.length === 0)
|
|
1004
|
-
return nextLines.join('\n');
|
|
1005
|
-
if (containsLineSequence(currentLines, nextLines))
|
|
1006
|
-
return currentLines.join('\n');
|
|
1007
|
-
const maxOverlap = Math.min(currentLines.length, nextLines.length);
|
|
1008
|
-
for (let overlap = maxOverlap; overlap > 0; overlap -= 1) {
|
|
1009
|
-
let matched = true;
|
|
1010
|
-
for (let index = 0; index < overlap; index += 1) {
|
|
1011
|
-
if (currentLines[currentLines.length - overlap + index] !== nextLines[index]) {
|
|
1012
|
-
matched = false;
|
|
1013
|
-
break;
|
|
1014
|
-
}
|
|
1015
|
-
}
|
|
1016
|
-
if (matched) {
|
|
1017
|
-
return [...currentLines, ...nextLines.slice(overlap)].join('\n');
|
|
1018
|
-
}
|
|
1019
|
-
}
|
|
1020
|
-
return [...currentLines, ...nextLines].join('\n');
|
|
1021
|
-
}
|
|
1022
|
-
function clickChapterTabScript() {
|
|
1023
|
-
return `
|
|
1024
|
-
(() => {
|
|
1025
|
-
const panel = document.querySelector('[data-testid="canvas_panel_container"]');
|
|
1026
|
-
if (!panel) return false;
|
|
1027
|
-
const tabs = panel.querySelectorAll('[role="tab"], .semi-tabs-tab');
|
|
1028
|
-
for (const tab of tabs) {
|
|
1029
|
-
if ((tab.textContent || '').trim().includes('章节')) {
|
|
1030
|
-
tab.click();
|
|
1031
|
-
return true;
|
|
1032
|
-
}
|
|
1033
|
-
}
|
|
1034
|
-
return false;
|
|
1035
|
-
})()
|
|
1036
|
-
`;
|
|
1037
|
-
}
|
|
1038
|
-
function readChapterScript() {
|
|
1039
|
-
return `
|
|
1040
|
-
(() => {
|
|
1041
|
-
const panel = document.querySelector('[data-testid="canvas_panel_container"]');
|
|
1042
|
-
if (!panel) return '';
|
|
1043
|
-
const chapter = panel.querySelector('[data-testid="meeting-ai-chapter"]');
|
|
1044
|
-
if (!chapter) return '';
|
|
1045
|
-
return (chapter.innerText || chapter.textContent || '').trim();
|
|
1046
|
-
})()
|
|
1047
|
-
`;
|
|
1048
|
-
}
|
|
1049
|
-
function triggerTranscriptDownloadScript() {
|
|
1050
|
-
return `
|
|
1051
|
-
(() => {
|
|
1052
|
-
const panel = document.querySelector('[data-testid="canvas_panel_container"]');
|
|
1053
|
-
if (!panel) return { error: 'no panel' };
|
|
1054
|
-
|
|
1055
|
-
const downloadIcon = panel.querySelector('[class*="DownloadMeetingAudio"] span[role="img"]');
|
|
1056
|
-
if (!downloadIcon) return { error: 'no download icon' };
|
|
1057
|
-
|
|
1058
|
-
downloadIcon.click();
|
|
1059
|
-
return { clicked: 'icon' };
|
|
1060
|
-
})()
|
|
1061
|
-
`;
|
|
1062
|
-
}
|
|
1063
|
-
function clickTranscriptDownloadBtnScript() {
|
|
1064
|
-
return `
|
|
1065
|
-
(() => {
|
|
1066
|
-
const btn = document.querySelector('[data-testid="minutes-download-text-btn"]');
|
|
1067
|
-
if (!btn) return { error: 'no download text btn' };
|
|
1068
|
-
btn.click();
|
|
1069
|
-
return { clicked: 'transcript' };
|
|
1070
|
-
})()
|
|
1071
|
-
`;
|
|
1072
|
-
}
|
|
1073
|
-
export async function openMeetingPanel(page, conversationId) {
|
|
1074
|
-
await navigateToConversation(page, conversationId);
|
|
1075
|
-
const clicked = await page.evaluate(clickMeetingCardScript());
|
|
1076
|
-
if (!clicked)
|
|
1077
|
-
return false;
|
|
1078
|
-
await page.wait(2);
|
|
1079
|
-
return true;
|
|
1080
|
-
}
|
|
1081
|
-
export async function getMeetingSummary(page) {
|
|
1082
|
-
const result = await page.evaluate(readMeetingSummaryScript());
|
|
1083
|
-
return result.summary || '';
|
|
1084
|
-
}
|
|
1085
|
-
export async function getMeetingChapters(page) {
|
|
1086
|
-
await page.evaluate(clickChapterTabScript());
|
|
1087
|
-
await page.wait(1.5);
|
|
1088
|
-
return await page.evaluate(readChapterScript());
|
|
1089
|
-
}
|
|
1090
|
-
function scrollTextNotesPanelScript() {
|
|
1091
|
-
return `
|
|
1092
|
-
(() => {
|
|
1093
|
-
const panel = document.querySelector('[data-testid="canvas_panel_container"]');
|
|
1094
|
-
if (!panel) return 0;
|
|
1095
|
-
const textNotes = panel.querySelector('[data-testid="meeting-text-notes"]');
|
|
1096
|
-
if (!textNotes) return 0;
|
|
1097
|
-
|
|
1098
|
-
const scrollable = textNotes.closest('[class*="overflow"]')
|
|
1099
|
-
|| textNotes.parentElement
|
|
1100
|
-
|| textNotes;
|
|
1101
|
-
const maxScroll = scrollable.scrollHeight - scrollable.clientHeight;
|
|
1102
|
-
if (maxScroll > 0) {
|
|
1103
|
-
scrollable.scrollTop = scrollable.scrollHeight;
|
|
1104
|
-
}
|
|
1105
|
-
return maxScroll;
|
|
1106
|
-
})()
|
|
1107
|
-
`;
|
|
1108
|
-
}
|
|
1109
|
-
export async function getMeetingTranscript(page) {
|
|
1110
|
-
await page.evaluate(clickTextNotesTabScript());
|
|
1111
|
-
await page.wait(2);
|
|
1112
|
-
let merged = '';
|
|
1113
|
-
let stableRounds = 0;
|
|
1114
|
-
for (let i = 0; i < 10; i++) {
|
|
1115
|
-
await page.evaluate(scrollTextNotesPanelScript());
|
|
1116
|
-
await page.wait(1);
|
|
1117
|
-
const snapshot = await page.evaluate(readTextNotesScript());
|
|
1118
|
-
const nextMerged = mergeTranscriptSnapshots(merged, snapshot);
|
|
1119
|
-
if (nextMerged === merged && snapshot.length > 0) {
|
|
1120
|
-
stableRounds += 1;
|
|
1121
|
-
if (stableRounds >= 2)
|
|
1122
|
-
break;
|
|
1123
|
-
}
|
|
1124
|
-
else {
|
|
1125
|
-
stableRounds = 0;
|
|
1126
|
-
merged = nextMerged;
|
|
1127
|
-
}
|
|
1128
|
-
}
|
|
1129
|
-
return merged;
|
|
1130
|
-
}
|
|
1131
|
-
export async function triggerTranscriptDownload(page) {
|
|
1132
|
-
const iconResult = await page.evaluate(triggerTranscriptDownloadScript());
|
|
1133
|
-
if (iconResult.error)
|
|
1134
|
-
return false;
|
|
1135
|
-
await page.wait(1);
|
|
1136
|
-
const btnResult = await page.evaluate(clickTranscriptDownloadBtnScript());
|
|
1137
|
-
return !btnResult.error;
|
|
1138
|
-
}
|
|
1139
|
-
export const __test__ = {
|
|
1140
|
-
clickSendButtonScript,
|
|
1141
|
-
composerStateScript,
|
|
1142
|
-
detectDoubaoVerificationScript,
|
|
1143
|
-
getTurnsScript,
|
|
1144
|
-
getTranscriptLinesScript,
|
|
1145
|
-
};
|
|
1146
|
-
export async function startNewDoubaoChat(page) {
|
|
1147
|
-
await ensureDoubaoChatPage(page);
|
|
1148
|
-
const clickedLabel = await page.evaluate(clickNewChatScript());
|
|
1149
|
-
if (clickedLabel) {
|
|
1150
|
-
await page.wait(1.5);
|
|
1151
|
-
return clickedLabel;
|
|
1152
|
-
}
|
|
1153
|
-
await page.goto(DOUBAO_NEW_CHAT_URL, { waitUntil: 'load', settleMs: 2000 });
|
|
1154
|
-
await page.wait(1.5);
|
|
1155
|
-
return 'navigate';
|
|
1156
|
-
}
|