@agentrhq/webcmd 0.1.2 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +196 -219
- package/cli-manifest.json +16205 -34869
- 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/delete.js +14 -6
- package/clis/twitter/delete.test.js +74 -1
- 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/timeline.js +3 -1
- package/clis/twitter/timeline.test.js +4 -0
- 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/bridge-readiness.test.js +1 -1
- package/dist/src/browser/bridge.d.ts +1 -0
- package/dist/src/browser/bridge.js +6 -4
- package/dist/src/browser/cdp.d.ts +1 -0
- package/dist/src/browser/daemon-client.d.ts +2 -0
- package/dist/src/browser/daemon-client.js +108 -51
- package/dist/src/browser/daemon-client.test.js +135 -47
- package/dist/src/browser/daemon-transport.js +3 -19
- package/dist/src/browser/errors.js +11 -0
- package/dist/src/browser/page.d.ts +2 -1
- package/dist/src/browser/page.js +5 -1
- package/dist/src/browser/profile.d.ts +9 -0
- package/dist/src/browser/profile.js +18 -7
- package/dist/src/browser/profile.test.js +44 -0
- package/dist/src/browser/protocol.d.ts +3 -0
- package/dist/src/browser/runtime/local-cloak/actions.js +24 -10
- package/dist/src/browser/runtime/local-cloak/session-manager.d.ts +1 -0
- package/dist/src/browser/runtime/local-cloak/session-manager.js +3 -0
- package/dist/src/browser/runtime/local-cloak/session-manager.test.js +87 -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 +24 -19
- package/dist/src/cli.test.js +59 -59
- package/dist/src/commanderAdapter.test.js +19 -19
- package/dist/src/commands/daemon.test.js +13 -13
- package/dist/src/constants.d.ts +2 -3
- package/dist/src/constants.js +3 -10
- 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.js +1 -5
- package/dist/src/daemon.test.js +10 -1
- package/dist/src/doctor.js +19 -1
- package/dist/src/doctor.test.js +38 -4
- 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 +7 -3
- 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.js +19 -1
- package/dist/src/external.test.js +39 -18
- 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 -6
- package/dist/src/manifest-types.d.ts +1 -1
- package/dist/src/node-network.test.js +5 -5
- 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.d.ts +1 -0
- package/dist/src/release-notes.test.js +61 -0
- package/dist/src/runtime-identity.test.js +0 -8
- package/dist/src/runtime.d.ts +2 -0
- package/dist/src/runtime.js +1 -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 +5 -2
- 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/browser/profile.test.d.ts} +0 -0
- /package/dist/src/{weixin-download.test.d.ts → generate-release-notes-cli.test.d.ts} +0 -0
package/clis/gemini/utils.js
CHANGED
|
@@ -23,7 +23,7 @@ const GEMINI_RESPONSE_NOISE_PATTERNS = [
|
|
|
23
23
|
/Google Privacy Policy/gi,
|
|
24
24
|
/Opens in a new window/gi,
|
|
25
25
|
];
|
|
26
|
-
const GEMINI_TRANSCRIPT_CHROME_MARKERS = ['gemini', '
|
|
26
|
+
const GEMINI_TRANSCRIPT_CHROME_MARKERS = ['gemini', 'My content', 'conversation', 'google terms', 'google privacy policy'];
|
|
27
27
|
const GEMINI_COMPOSER_SELECTORS = [
|
|
28
28
|
'.ql-editor[contenteditable="true"]',
|
|
29
29
|
'.ql-editor[role="textbox"]',
|
|
@@ -265,7 +265,7 @@ function extractGeminiTranscriptLineCandidate(transcriptLine, promptText) {
|
|
|
265
265
|
// Some transcript snapshots flatten "prompt + answer" into a single line.
|
|
266
266
|
// Recover the answer only when the line starts with the current prompt.
|
|
267
267
|
if (candidate.startsWith(prompt)) {
|
|
268
|
-
const tail = candidate.slice(prompt.length).replace(/^[\s
|
|
268
|
+
const tail = candidate.slice(prompt.length).replace(/^[\s::,,-]+/, '').trim();
|
|
269
269
|
return tail ? sanitizeGeminiResponseText(tail, '') : '';
|
|
270
270
|
}
|
|
271
271
|
return sanitized;
|
|
@@ -281,8 +281,8 @@ function getStateScript() {
|
|
|
281
281
|
const href = node.getAttribute('href') || '';
|
|
282
282
|
return text === 'sign in'
|
|
283
283
|
|| aria === 'sign in'
|
|
284
|
-
|| text === '
|
|
285
|
-
|| aria === '
|
|
284
|
+
|| text === 'Log in'
|
|
285
|
+
|| aria === 'Log in'
|
|
286
286
|
|| href.includes('accounts.google.com/ServiceLogin');
|
|
287
287
|
});
|
|
288
288
|
|
|
@@ -309,8 +309,8 @@ function readGeminiSnapshotScript() {
|
|
|
309
309
|
const aria = (node.getAttribute('aria-label') || '').trim().toLowerCase();
|
|
310
310
|
return text === 'stop response'
|
|
311
311
|
|| aria === 'stop response'
|
|
312
|
-
|| text === '
|
|
313
|
-
|| aria === '
|
|
312
|
+
|| text === 'Stop response'
|
|
313
|
+
|| aria === 'Stop response';
|
|
314
314
|
});
|
|
315
315
|
const turns = ${getTurnsScript().trim()};
|
|
316
316
|
const transcriptLines = ${getTranscriptLinesScript().trim()};
|
|
@@ -593,8 +593,8 @@ function submitComposerScript() {
|
|
|
593
593
|
});
|
|
594
594
|
}
|
|
595
595
|
|
|
596
|
-
const excludedPattern = /main menu
|
|
597
|
-
const submitPattern = /send
|
|
596
|
+
const excludedPattern = /main menu|localized text|microphone|localized text|upload|localized text|mode|mode|tools|tools|settings|Temporary chat|new chat|New chat/i;
|
|
597
|
+
const submitPattern = /send|Send|Send|submit|Submit/i;
|
|
598
598
|
let bestButton = null;
|
|
599
599
|
let bestScore = -1;
|
|
600
600
|
|
|
@@ -665,10 +665,10 @@ function clickNewChatScript() {
|
|
|
665
665
|
return isVisible(node) && (
|
|
666
666
|
text === 'new chat'
|
|
667
667
|
|| aria === 'new chat'
|
|
668
|
-
|| text === '
|
|
669
|
-
|| aria === '
|
|
670
|
-
|| text === '
|
|
671
|
-
|| aria === '
|
|
668
|
+
|| text === 'Start new chat'
|
|
669
|
+
|| aria === 'Start new chat'
|
|
670
|
+
|| text === 'New chat'
|
|
671
|
+
|| aria === 'New chat'
|
|
672
672
|
);
|
|
673
673
|
});
|
|
674
674
|
|
|
@@ -684,7 +684,7 @@ function clickNewChatScript() {
|
|
|
684
684
|
function openGeminiToolsMenuScript() {
|
|
685
685
|
return `
|
|
686
686
|
(() => {
|
|
687
|
-
const labels = ['tools', 'tool', 'mode', '
|
|
687
|
+
const labels = ['tools', 'tool', 'mode', 'research', 'deep research', 'deep-research', 'tools'];
|
|
688
688
|
const normalize = (value) => (value || '').replace(/\\s+/g, ' ').trim().toLowerCase();
|
|
689
689
|
const matchesLabel = (value) => {
|
|
690
690
|
const text = normalize(value);
|
|
@@ -973,7 +973,7 @@ function getGeminiConversationListScript() {
|
|
|
973
973
|
`;
|
|
974
974
|
}
|
|
975
975
|
|
|
976
|
-
// Gemini collapses the sidebar's "
|
|
976
|
+
// Gemini collapses the sidebar's "Recent" / "Recents" section by default, so the
|
|
977
977
|
// /app/<id> conversation anchors are not present in the DOM (or are hidden)
|
|
978
978
|
// until that section is expanded. The script below opens the sidebar if it is
|
|
979
979
|
// collapsed and expands the Recents toggle, returning true if it likely
|
|
@@ -999,16 +999,16 @@ function expandGeminiRecentScript() {
|
|
|
999
999
|
// 1. Open the sidebar if it is collapsed (button only renders when closed).
|
|
1000
1000
|
const openSidebar = buttons.find((b) => {
|
|
1001
1001
|
const label = normalize(b.getAttribute('aria-label') || '');
|
|
1002
|
-
return
|
|
1002
|
+
return /Open sidebar|open sidebar|open navigation|Expand sidebar/i.test(label);
|
|
1003
1003
|
});
|
|
1004
1004
|
if (openSidebar) { openSidebar.click(); changed = true; }
|
|
1005
1005
|
|
|
1006
|
-
// 2. Expand the "
|
|
1006
|
+
// 2. Expand the "Recent" / "Recents" toggle if it is currently collapsed.
|
|
1007
1007
|
const recentToggle = buttons.find((b) => {
|
|
1008
1008
|
const label = normalize(b.getAttribute('aria-label') || '');
|
|
1009
1009
|
const expanded = (b.getAttribute('aria-expanded') || '').toLowerCase();
|
|
1010
|
-
return
|
|
1011
|
-
|
|
1010
|
+
return /Recent|recent/i.test(label) && (
|
|
1011
|
+
/Expand|Collapse|expand|collapse|toggle|show|hide/i.test(label)
|
|
1012
1012
|
|| expanded === 'false'
|
|
1013
1013
|
|| expanded === 'true'
|
|
1014
1014
|
);
|
|
@@ -1016,7 +1016,7 @@ function expandGeminiRecentScript() {
|
|
|
1016
1016
|
if (recentToggle) {
|
|
1017
1017
|
const label = normalize(recentToggle.getAttribute('aria-label') || '');
|
|
1018
1018
|
const expanded = (recentToggle.getAttribute('aria-expanded') || '').toLowerCase();
|
|
1019
|
-
const explicitExpandLabel =
|
|
1019
|
+
const explicitExpandLabel = /Expand|Show|expand|show/i.test(label) && !/Collapse|collapse|hide/i.test(label);
|
|
1020
1020
|
if (expanded === 'false' || (expanded !== 'true' && explicitExpandLabel)) {
|
|
1021
1021
|
recentToggle.click();
|
|
1022
1022
|
changed = true;
|
|
@@ -1138,7 +1138,7 @@ export async function startNewGeminiChat(page) {
|
|
|
1138
1138
|
export async function getGeminiConversationList(page) {
|
|
1139
1139
|
await ensureGeminiPage(page);
|
|
1140
1140
|
let rows = [];
|
|
1141
|
-
// Gemini collapses the sidebar "
|
|
1141
|
+
// Gemini collapses the sidebar "Recent"/Recents section by default, hiding
|
|
1142
1142
|
// the conversation anchors. Retry extraction after expanding it.
|
|
1143
1143
|
for (let attempt = 0; attempt < 3; attempt += 1) {
|
|
1144
1144
|
const raw = requireGeminiArrayResult(await page.evaluate(getGeminiConversationListScript()), 'Gemini conversation list');
|
|
@@ -1440,11 +1440,11 @@ function exportGeminiDeepResearchReportScript(maxWaitMs) {
|
|
|
1440
1440
|
(async () => {
|
|
1441
1441
|
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
1442
1442
|
const labels = {
|
|
1443
|
-
actionMenu: ['open menu for conversation actions', 'conversation actions', '
|
|
1444
|
-
share: ['share & export', 'share and export', 'share/export', '
|
|
1445
|
-
shareConversation: ['share conversation', '
|
|
1446
|
-
export: ['export', '
|
|
1447
|
-
exportDocs: ['export to docs', 'export to google docs', 'export to doc', '
|
|
1443
|
+
actionMenu: ['open menu for conversation actions', 'conversation actions', 'localized text'],
|
|
1444
|
+
share: ['share & export', 'share and export', 'share/export', 'Share and export', 'Share and export', 'Share and export', 'Share and export'],
|
|
1445
|
+
shareConversation: ['share conversation', 'Share conversation', 'Share conversation'],
|
|
1446
|
+
export: ['export', 'Export'],
|
|
1447
|
+
exportDocs: ['export to docs', 'export to google docs', 'export to doc', 'Export to docs', 'Export to Docs', 'Export to google docs'],
|
|
1448
1448
|
};
|
|
1449
1449
|
|
|
1450
1450
|
const recorderKey = '__webcmdGeminiExportUrls';
|
|
@@ -1547,15 +1547,15 @@ function exportGeminiDeepResearchReportScript(maxWaitMs) {
|
|
|
1547
1547
|
};
|
|
1548
1548
|
const isKindMatch = (kind, combined, targetLabels) => {
|
|
1549
1549
|
if (includesAny(combined, targetLabels)) return true;
|
|
1550
|
-
if (kind === 'share') return hasTokens(combined, ['share', 'export']) || hasTokens(combined, ['
|
|
1551
|
-
if (kind === 'export') return hasTokens(combined, ['export']) || hasTokens(combined, ['
|
|
1550
|
+
if (kind === 'share') return hasTokens(combined, ['share', 'export']) || hasTokens(combined, ['Share', 'Export']);
|
|
1551
|
+
if (kind === 'export') return hasTokens(combined, ['export']) || hasTokens(combined, ['Export']);
|
|
1552
1552
|
if (kind === 'export-docs') {
|
|
1553
1553
|
return hasTokens(combined, ['export', 'docs'])
|
|
1554
|
-
|| hasTokens(combined, ['
|
|
1555
|
-
|| hasTokens(combined, ['
|
|
1554
|
+
|| hasTokens(combined, ['Export', 'Docs'])
|
|
1555
|
+
|| hasTokens(combined, ['Export', 'docs']);
|
|
1556
1556
|
}
|
|
1557
1557
|
if (kind === 'action-menu') {
|
|
1558
|
-
return hasTokens(combined, ['conversation', 'action']) || hasTokens(combined, ['
|
|
1558
|
+
return hasTokens(combined, ['conversation', 'action']) || hasTokens(combined, ['localized text', 'localized text']);
|
|
1559
1559
|
}
|
|
1560
1560
|
return false;
|
|
1561
1561
|
};
|
|
@@ -1868,11 +1868,11 @@ function openModelPickerForThinkingScript() {
|
|
|
1868
1868
|
const VERSION_LABEL_RE = /\\d+\\.\\d+/;
|
|
1869
1869
|
|
|
1870
1870
|
const MODE_SELECTOR_PATTERNS = [
|
|
1871
|
-
|
|
1871
|
+
/Mode selector/i,
|
|
1872
1872
|
/mode[\\s-]*selector/i,
|
|
1873
1873
|
/model[\\s-]*selector/i,
|
|
1874
1874
|
/model[\\s-]*picker/i,
|
|
1875
|
-
|
|
1875
|
+
/Select model/i,
|
|
1876
1876
|
/select[\\s-]+model/i,
|
|
1877
1877
|
/choose[\\s-]+model/i,
|
|
1878
1878
|
/switch[\\s-]+model/i,
|
|
@@ -1921,7 +1921,7 @@ function openModelPickerForThinkingScript() {
|
|
|
1921
1921
|
|
|
1922
1922
|
// Method 4: Fallback — look for any element with model-related attributes.
|
|
1923
1923
|
const attrEls = Array.from(
|
|
1924
|
-
document.querySelectorAll('[data-model-selector], [aria-label*="model" i], [aria-label*="
|
|
1924
|
+
document.querySelectorAll('[data-model-selector], [aria-label*="model" i], [aria-label*="mode" i]')
|
|
1925
1925
|
).filter(isVisible);
|
|
1926
1926
|
if (attrEls.length > 0) return attrEls[0];
|
|
1927
1927
|
|
|
@@ -1942,7 +1942,7 @@ function openModelPickerForThinkingScript() {
|
|
|
1942
1942
|
}
|
|
1943
1943
|
|
|
1944
1944
|
/**
|
|
1945
|
-
* Browser evaluate script that clicks the "
|
|
1945
|
+
* Browser evaluate script that clicks the "Thinking level" / "Thinking level"
|
|
1946
1946
|
* toggle inside an already-open model-picker menu to expand thinking options.
|
|
1947
1947
|
* Returns true if the toggle was found and clicked.
|
|
1948
1948
|
*/
|
|
@@ -1995,7 +1995,7 @@ function clickThinkingToggleInMenuScript() {
|
|
|
1995
1995
|
|
|
1996
1996
|
const thinkingToggle = menuItems.find((item) => {
|
|
1997
1997
|
const text = (item.textContent || '').replace(/\\s+/g, ' ').trim();
|
|
1998
|
-
return
|
|
1998
|
+
return /Thinking level|thinking level|thinking mode/i.test(text);
|
|
1999
1999
|
});
|
|
2000
2000
|
|
|
2001
2001
|
if (thinkingToggle) {
|
|
@@ -2020,8 +2020,8 @@ function selectThinkingInMenuScript(thinkingValue) {
|
|
|
2020
2020
|
const normalizedValue = String(thinkingValue || '').trim().toLowerCase();
|
|
2021
2021
|
if (!normalizedValue) return '(() => "")';
|
|
2022
2022
|
const labelMap = JSON.stringify({
|
|
2023
|
-
standard: ['standard', '
|
|
2024
|
-
extended: ['extended', '
|
|
2023
|
+
standard: ['standard', 'standard', 'standard'],
|
|
2024
|
+
extended: ['extended', 'extended', 'extended', 'extended'],
|
|
2025
2025
|
});
|
|
2026
2026
|
return `
|
|
2027
2027
|
(() => {
|
|
@@ -2125,7 +2125,7 @@ function selectThinkingInMenuScript(thinkingValue) {
|
|
|
2125
2125
|
* Multi-step approach matching modelsCommand.func:
|
|
2126
2126
|
* 1. Open the model-picker menu.
|
|
2127
2127
|
* 2. Wait for React to render the menu.
|
|
2128
|
-
* 3. Click the "
|
|
2128
|
+
* 3. Click the "Thinking level"/"Thinking level" toggle to expand thinking options.
|
|
2129
2129
|
* 4. Wait for the expanded items to render.
|
|
2130
2130
|
* 5. Select the requested thinking level.
|
|
2131
2131
|
* 6. Close the menu.
|
|
@@ -2198,11 +2198,11 @@ function getCurrentGeminiModelScript() {
|
|
|
2198
2198
|
const VERSION_LABEL_RE = /\\d+\\.\\d+/;
|
|
2199
2199
|
|
|
2200
2200
|
const MODE_SELECTOR_PATTERNS = [
|
|
2201
|
-
|
|
2201
|
+
/Mode selector/i,
|
|
2202
2202
|
/mode[\\s-]*selector/i,
|
|
2203
2203
|
/model[\\s-]*selector/i,
|
|
2204
2204
|
/model[\\s-]*picker/i,
|
|
2205
|
-
|
|
2205
|
+
/Select model/i,
|
|
2206
2206
|
/select[\\s-]+model/i,
|
|
2207
2207
|
/choose[\\s-]+model/i,
|
|
2208
2208
|
/switch[\\s-]+model/i,
|
|
@@ -2251,7 +2251,7 @@ function getCurrentGeminiModelScript() {
|
|
|
2251
2251
|
|
|
2252
2252
|
// Method 4: Fallback — look for any element with model-related attributes.
|
|
2253
2253
|
const attrEls = Array.from(
|
|
2254
|
-
document.querySelectorAll('[data-model-selector], [aria-label*="model" i], [aria-label*="
|
|
2254
|
+
document.querySelectorAll('[data-model-selector], [aria-label*="model" i], [aria-label*="mode" i]')
|
|
2255
2255
|
).filter(isVisible);
|
|
2256
2256
|
if (attrEls.length > 0) return attrEls[0];
|
|
2257
2257
|
|
|
@@ -57,10 +57,10 @@ describe('collectGeminiTranscriptAdditions', () => {
|
|
|
57
57
|
expect(collectGeminiTranscriptAdditions(before, current, prompt)).toBe('Soft spring rain arrives');
|
|
58
58
|
});
|
|
59
59
|
it('keeps a reply line that quotes the prompt inside the answer body', () => {
|
|
60
|
-
const prompt = '
|
|
60
|
+
const prompt = 'Please reply only:OK';
|
|
61
61
|
const before = ['baseline'];
|
|
62
|
-
const current = ['baseline', '
|
|
63
|
-
expect(collectGeminiTranscriptAdditions(before, current, prompt)).toBe('
|
|
62
|
+
const current = ['baseline', 'About"Please reply only:OK",here is an explanation.'];
|
|
63
|
+
expect(collectGeminiTranscriptAdditions(before, current, prompt)).toBe('About"Please reply only:OK",here is an explanation.');
|
|
64
64
|
});
|
|
65
65
|
});
|
|
66
66
|
describe('gemini send strategy', () => {
|
|
@@ -78,8 +78,8 @@ describe('gemini send strategy', () => {
|
|
|
78
78
|
.mockResolvedValueOnce({ ok: true })
|
|
79
79
|
.mockResolvedValueOnce({ hasText: true })
|
|
80
80
|
.mockResolvedValueOnce('button');
|
|
81
|
-
const result = await sendGeminiMessage(page, '
|
|
82
|
-
expect(nativeType).toHaveBeenCalledWith('
|
|
81
|
+
const result = await sendGeminiMessage(page, 'hello');
|
|
82
|
+
expect(nativeType).toHaveBeenCalledWith('hello');
|
|
83
83
|
expect(nativeKeyPress).not.toHaveBeenCalled();
|
|
84
84
|
expect(result).toBe('button');
|
|
85
85
|
});
|
|
@@ -94,8 +94,8 @@ describe('gemini send strategy', () => {
|
|
|
94
94
|
.mockResolvedValueOnce({ hasText: false })
|
|
95
95
|
.mockResolvedValueOnce({ hasText: true })
|
|
96
96
|
.mockResolvedValueOnce('enter');
|
|
97
|
-
const result = await sendGeminiMessage(page, '
|
|
98
|
-
expect(nativeType).toHaveBeenCalledWith('
|
|
97
|
+
const result = await sendGeminiMessage(page, 'hello');
|
|
98
|
+
expect(nativeType).toHaveBeenCalledWith('hello');
|
|
99
99
|
expect(nativeKeyPress).toHaveBeenCalledWith('Enter');
|
|
100
100
|
expect(evaluate).toHaveBeenCalledTimes(5);
|
|
101
101
|
expect(result).toBe('enter');
|
|
@@ -110,8 +110,8 @@ describe('gemini send strategy', () => {
|
|
|
110
110
|
.mockResolvedValueOnce({ ok: true })
|
|
111
111
|
.mockResolvedValueOnce({ hasText: true })
|
|
112
112
|
.mockResolvedValueOnce('button');
|
|
113
|
-
const result = await sendGeminiMessage(page, '
|
|
114
|
-
expect(nativeType).toHaveBeenCalledWith('
|
|
113
|
+
const result = await sendGeminiMessage(page, 'hello');
|
|
114
|
+
expect(nativeType).toHaveBeenCalledWith('hello');
|
|
115
115
|
expect(result).toBe('button');
|
|
116
116
|
});
|
|
117
117
|
it('retries composer preparation until a slow-loading composer appears', async () => {
|
|
@@ -125,7 +125,7 @@ describe('gemini send strategy', () => {
|
|
|
125
125
|
.mockResolvedValueOnce({ ok: true })
|
|
126
126
|
.mockResolvedValueOnce({ hasText: true })
|
|
127
127
|
.mockResolvedValueOnce('button');
|
|
128
|
-
const result = await sendGeminiMessage(page, '
|
|
128
|
+
const result = await sendGeminiMessage(page, 'hello');
|
|
129
129
|
expect(result).toBe('button');
|
|
130
130
|
expect(wait.mock.calls.filter(([value]) => value === 1)).toHaveLength(3);
|
|
131
131
|
});
|
|
@@ -141,42 +141,42 @@ describe('gemini send strategy', () => {
|
|
|
141
141
|
.mockResolvedValueOnce({ ok: true })
|
|
142
142
|
.mockResolvedValueOnce({ hasText: true })
|
|
143
143
|
.mockResolvedValueOnce('button');
|
|
144
|
-
const result = await sendGeminiMessage(page, '
|
|
144
|
+
const result = await sendGeminiMessage(page, 'hello');
|
|
145
145
|
expect(result).toBe('button');
|
|
146
146
|
expect(wait.mock.calls.filter(([value]) => value === 1)).toHaveLength(4);
|
|
147
147
|
});
|
|
148
148
|
it('avoids innerHTML in the fallback insertion path for trusted types pages', () => {
|
|
149
|
-
expect(__test__.insertComposerTextFallbackScript('
|
|
150
|
-
expect(__test__.insertComposerTextFallbackScript('
|
|
149
|
+
expect(__test__.insertComposerTextFallbackScript('hello')).not.toContain('innerHTML');
|
|
150
|
+
expect(__test__.insertComposerTextFallbackScript('hello')).toContain('replaceChildren');
|
|
151
151
|
});
|
|
152
152
|
it('keeps a button submit path in the generated submit script', () => {
|
|
153
153
|
expect(__test__.submitComposerScript()).toContain('.click()');
|
|
154
154
|
});
|
|
155
155
|
it('matches the Traditional Chinese send label in the generated submit script', () => {
|
|
156
|
-
expect(__test__.submitComposerScript()).toContain('
|
|
156
|
+
expect(__test__.submitComposerScript()).toContain('Send');
|
|
157
157
|
});
|
|
158
158
|
it('supports localized new chat labels in the generated new-chat script', () => {
|
|
159
|
-
expect(__test__.clickNewChatScript()).toContain('
|
|
159
|
+
expect(__test__.clickNewChatScript()).toContain('Start new chat');
|
|
160
160
|
});
|
|
161
161
|
});
|
|
162
162
|
describe('gemini turn normalization', () => {
|
|
163
163
|
it('collapses only adjacent duplicate turns so identical replies across rounds remain visible', () => {
|
|
164
164
|
const turns = [
|
|
165
|
-
{ Role: 'User', Text: '
|
|
166
|
-
{ Role: 'User', Text: '
|
|
165
|
+
{ Role: 'User', Text: 'You said\n\nPlease reply only:OK' },
|
|
166
|
+
{ Role: 'User', Text: 'Please reply only:OK' },
|
|
167
167
|
{ Role: 'Assistant', Text: 'OK' },
|
|
168
168
|
{ Role: 'Assistant', Text: 'OK' },
|
|
169
|
-
{ Role: 'User', Text: '
|
|
170
|
-
{ Role: 'User', Text: '
|
|
169
|
+
{ Role: 'User', Text: 'You said\n\nPlease reply only:OK' },
|
|
170
|
+
{ Role: 'User', Text: 'Please reply only:OK' },
|
|
171
171
|
{ Role: 'Assistant', Text: 'OK' },
|
|
172
172
|
{ Role: 'Assistant', Text: 'OK' },
|
|
173
173
|
];
|
|
174
174
|
expect(__test__.collapseAdjacentGeminiTurns(turns)).toEqual([
|
|
175
|
-
{ Role: 'User', Text: '
|
|
176
|
-
{ Role: 'User', Text: '
|
|
175
|
+
{ Role: 'User', Text: 'You said\n\nPlease reply only:OK' },
|
|
176
|
+
{ Role: 'User', Text: 'Please reply only:OK' },
|
|
177
177
|
{ Role: 'Assistant', Text: 'OK' },
|
|
178
|
-
{ Role: 'User', Text: '
|
|
179
|
-
{ Role: 'User', Text: '
|
|
178
|
+
{ Role: 'User', Text: 'You said\n\nPlease reply only:OK' },
|
|
179
|
+
{ Role: 'User', Text: 'Please reply only:OK' },
|
|
180
180
|
{ Role: 'Assistant', Text: 'OK' },
|
|
181
181
|
]);
|
|
182
182
|
});
|
|
@@ -204,7 +204,7 @@ describe('gemini evaluate result boundaries', () => {
|
|
|
204
204
|
changed: false,
|
|
205
205
|
clicks: 0,
|
|
206
206
|
});
|
|
207
|
-
expect(runExpandRecentScript('<button aria-label="
|
|
207
|
+
expect(runExpandRecentScript('<button aria-label="Collapse recent">Recent</button>')).toEqual({
|
|
208
208
|
changed: false,
|
|
209
209
|
clicks: 0,
|
|
210
210
|
});
|
|
@@ -426,9 +426,9 @@ describe('openModelPickerForThinkingScript — picker detection', () => {
|
|
|
426
426
|
expect(result).toEqual({ ok: true });
|
|
427
427
|
});
|
|
428
428
|
|
|
429
|
-
it('Method 1: detects picker by aria-label "
|
|
429
|
+
it('Method 1: detects picker by aria-label "Mode selector"', () => {
|
|
430
430
|
const { window } = createPickerDom(`
|
|
431
|
-
<button aria-label="
|
|
431
|
+
<button aria-label="Mode selector">localized text</button>
|
|
432
432
|
`);
|
|
433
433
|
const result = evalScript(window, __test__.openModelPickerForThinkingScript);
|
|
434
434
|
expect(result).toEqual({ ok: true });
|
|
@@ -442,9 +442,9 @@ describe('openModelPickerForThinkingScript — picker detection', () => {
|
|
|
442
442
|
expect(result).toEqual({ ok: true });
|
|
443
443
|
});
|
|
444
444
|
|
|
445
|
-
it('Method 1: detects picker by aria-label "
|
|
445
|
+
it('Method 1: detects picker by aria-label "Select model"', () => {
|
|
446
446
|
const { window } = createPickerDom(`
|
|
447
|
-
<button aria-label="
|
|
447
|
+
<button aria-label="Select model">localized text</button>
|
|
448
448
|
`);
|
|
449
449
|
const result = evalScript(window, __test__.openModelPickerForThinkingScript);
|
|
450
450
|
expect(result).toEqual({ ok: true });
|
|
@@ -550,9 +550,9 @@ describe('selectGeminiModelScript — picker detection parity', () => {
|
|
|
550
550
|
});
|
|
551
551
|
|
|
552
552
|
describe('getCurrentGeminiModelScript — picker detection parity', () => {
|
|
553
|
-
it('Method 1: detects picker by aria-label "
|
|
553
|
+
it('Method 1: detects picker by aria-label "Mode selector"', () => {
|
|
554
554
|
const { window } = createPickerDom(`
|
|
555
|
-
<button aria-label="
|
|
555
|
+
<button aria-label="Mode selector">2.5 Flash</button>
|
|
556
556
|
`);
|
|
557
557
|
const result = window.eval(__test__.getCurrentGeminiModelScript());
|
|
558
558
|
expect(result).toBe('2.5-flash');
|
package/clis/geogebra/utils.js
CHANGED
|
@@ -140,7 +140,7 @@ export async function ggbEval(page, cmd) {
|
|
|
140
140
|
const afterCount = collectNames().length;
|
|
141
141
|
const dialogText = [...document.querySelectorAll('[role="dialog"], .gwt-DialogBox')]
|
|
142
142
|
.map(node => node.textContent?.trim() || '')
|
|
143
|
-
.find(text => /error|unknown command
|
|
143
|
+
.find(text => /error|unknown command|error|unknown command/i.test(text)) || '';
|
|
144
144
|
return {
|
|
145
145
|
ok: label !== '' || afterCount > beforeCount,
|
|
146
146
|
label,
|
|
@@ -6,13 +6,13 @@ cli({
|
|
|
6
6
|
site: 'google-scholar',
|
|
7
7
|
name: 'search',
|
|
8
8
|
access: 'read',
|
|
9
|
-
description: 'Google Scholar
|
|
9
|
+
description: 'Google Scholar scholar search',
|
|
10
10
|
domain: 'scholar.google.com',
|
|
11
11
|
strategy: Strategy.PUBLIC,
|
|
12
12
|
browser: true,
|
|
13
13
|
args: [
|
|
14
|
-
{ name: 'query', positional: true, required: true, help: '
|
|
15
|
-
{ name: 'limit', type: 'int', default: 10, help: '
|
|
14
|
+
{ name: 'query', positional: true, required: true, help: 'Search keyword' },
|
|
15
|
+
{ name: 'limit', type: 'int', default: 10, help: 'Number of results to return (max 20)' },
|
|
16
16
|
],
|
|
17
17
|
columns: ['rank', 'title', 'authors', 'source', 'year', 'cited', 'url'],
|
|
18
18
|
func: async (page, kwargs) => {
|
package/clis/grok/delete.js
CHANGED
|
@@ -38,7 +38,7 @@ cli({
|
|
|
38
38
|
return [{ status: 'dry-run (pass --yes to actually delete)', id }];
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
const result = await clickConversationMenuItem(page, id, ['
|
|
41
|
+
const result = await clickConversationMenuItem(page, id, ['localized text', 'delete']);
|
|
42
42
|
if (!result || !result.ok) {
|
|
43
43
|
const detail = result?.detail ? ` ${result.detail}` : '';
|
|
44
44
|
throw new CommandExecutionError(`${result?.reason || 'Failed to click delete menu item.'}${detail}`, SESSION_HINT);
|
package/clis/grok/export-all.js
CHANGED
|
@@ -66,7 +66,7 @@ async function collectHistory(page, { offset, limit, maxScrolls }) {
|
|
|
66
66
|
};
|
|
67
67
|
const hasHistoryEntry = Boolean(document.querySelector('a[href^="/c/"]'));
|
|
68
68
|
const hasHistoryLauncher = Array.from(document.querySelectorAll('button, [role="button"]'))
|
|
69
|
-
.some((node) => isVisible(node) && /^(
|
|
69
|
+
.some((node) => isVisible(node) && /^(localized text|show all|view all)$/i.test((node.textContent || '').trim()));
|
|
70
70
|
const signInCta = Array.from(document.querySelectorAll('button, a'))
|
|
71
71
|
.some((node) => isVisible(node) && /^(sign in|log in)$/i.test((node.textContent || '').trim()));
|
|
72
72
|
if (signInCta && !hasHistoryEntry && !hasHistoryLauncher) {
|
|
@@ -76,7 +76,7 @@ async function collectHistory(page, { offset, limit, maxScrolls }) {
|
|
|
76
76
|
const clickAllHistory = () => {
|
|
77
77
|
const buttons = Array.from(document.querySelectorAll('button, [role="button"]'))
|
|
78
78
|
.filter((node) => node instanceof HTMLElement && isVisible(node));
|
|
79
|
-
const target = buttons.find((node) => /^(
|
|
79
|
+
const target = buttons.find((node) => /^(localized text|show all|view all)$/i.test((node.textContent || '').trim()));
|
|
80
80
|
if (!target) return false;
|
|
81
81
|
target.click();
|
|
82
82
|
return true;
|
package/clis/grok/export.js
CHANGED
|
@@ -62,7 +62,7 @@ export const grokExportCommand = cli({
|
|
|
62
62
|
};
|
|
63
63
|
const hasHistoryEntry = Boolean(document.querySelector('a[href^="/c/"]'));
|
|
64
64
|
const hasHistoryLauncher = Array.from(document.querySelectorAll('button, [role="button"]'))
|
|
65
|
-
.some((node) => isVisible(node) && /^(
|
|
65
|
+
.some((node) => isVisible(node) && /^(localized text|show all|view all)$/i.test((node.textContent || '').trim()));
|
|
66
66
|
const signInCta = Array.from(document.querySelectorAll('button, a'))
|
|
67
67
|
.some((node) => isVisible(node) && /^(sign in|log in)$/i.test((node.textContent || '').trim()));
|
|
68
68
|
if (signInCta && !hasHistoryEntry && !hasHistoryLauncher) {
|
|
@@ -72,7 +72,7 @@ export const grokExportCommand = cli({
|
|
|
72
72
|
const clickAllHistory = () => {
|
|
73
73
|
const buttons = Array.from(document.querySelectorAll('button, [role="button"]'))
|
|
74
74
|
.filter((node) => node instanceof HTMLElement && isVisible(node));
|
|
75
|
-
const target = buttons.find((node) => /^(
|
|
75
|
+
const target = buttons.find((node) => /^(localized text|show all|view all)$/i.test((node.textContent || '').trim()));
|
|
76
76
|
if (!target) return false;
|
|
77
77
|
target.click();
|
|
78
78
|
return true;
|
package/clis/grok/pin.js
CHANGED
|
@@ -61,8 +61,8 @@ function defineToggle(name, accessLabels) {
|
|
|
61
61
|
});
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
-
// Grok's context menu shows EITHER "
|
|
64
|
+
// Grok's context menu shows EITHER "localized text" OR "localized text" depending on the
|
|
65
65
|
// current pin state, never both. We register two commands that bind to
|
|
66
66
|
// the matching label so callers can use whichever they want.
|
|
67
|
-
defineToggle('pin', ['
|
|
68
|
-
defineToggle('unpin', ['
|
|
67
|
+
defineToggle('pin', ['localized text', 'pin']);
|
|
68
|
+
defineToggle('unpin', ['localized text', 'unpin']);
|
package/clis/grok/utils.js
CHANGED
|
@@ -108,12 +108,12 @@ export async function getCurrentSessionId(page) {
|
|
|
108
108
|
|
|
109
109
|
// Model picker trigger has stable id="model-select-trigger". Use that as the
|
|
110
110
|
// primary selector — aria-label localizes (e.g. "Model select" in English,
|
|
111
|
-
// "
|
|
111
|
+
// "Model selection" in Chinese, etc.) and is unreliable across browser locales.
|
|
112
112
|
const MODEL_TRIGGER_SELECTORS = [
|
|
113
113
|
'#model-select-trigger',
|
|
114
114
|
'button[aria-label="Model select"]',
|
|
115
|
-
'button[aria-label="
|
|
116
|
-
'button[aria-label="
|
|
115
|
+
'button[aria-label="Model selection"]',
|
|
116
|
+
'button[aria-label="モデルlocalized text"]',
|
|
117
117
|
];
|
|
118
118
|
|
|
119
119
|
export async function getModelLabel(page) {
|
|
@@ -245,10 +245,10 @@ export async function startNewChat(page) {
|
|
|
245
245
|
// matches one of the localized labels. Returns whether the click happened.
|
|
246
246
|
//
|
|
247
247
|
// Menu items observed on grok.com (2026-05-31):
|
|
248
|
-
// "
|
|
249
|
-
// "
|
|
250
|
-
// "
|
|
251
|
-
// "
|
|
248
|
+
// "Open in new tab"
|
|
249
|
+
// "Rename"
|
|
250
|
+
// "Pin" or "Unpin"
|
|
251
|
+
// "Delete"
|
|
252
252
|
//
|
|
253
253
|
// Grok's delete action takes effect IMMEDIATELY — no confirmation dialog —
|
|
254
254
|
// so callers must enforce their own --yes / dry-run gating.
|
|
@@ -319,10 +319,10 @@ export function getPinStateFromMenuLabels(labels) {
|
|
|
319
319
|
const normalized = (Array.isArray(labels) ? labels : [])
|
|
320
320
|
.map((label) => String(label || '').trim().toLowerCase())
|
|
321
321
|
.filter(Boolean);
|
|
322
|
-
if (normalized.some((label) => label === '
|
|
322
|
+
if (normalized.some((label) => label === 'unpin')) {
|
|
323
323
|
return 'pinned';
|
|
324
324
|
}
|
|
325
|
-
if (normalized.some((label) => label === '
|
|
325
|
+
if (normalized.some((label) => label === 'pin')) {
|
|
326
326
|
return 'unpinned';
|
|
327
327
|
}
|
|
328
328
|
return '';
|
|
@@ -535,12 +535,12 @@ export async function sendMessage(page, prompt) {
|
|
|
535
535
|
// Prefer data-testid (locale-independent); fall back to aria-label per
|
|
536
536
|
// language. As of 2026-05-31 Grok renders button[data-testid="chat-submit"]
|
|
537
537
|
// once the composer has content. The aria-label varies: "Submit" (en),
|
|
538
|
-
// "
|
|
538
|
+
// "Submit" (zh-CN), and presumably other locales.
|
|
539
539
|
const submitSelectors = [
|
|
540
540
|
'button[data-testid="chat-submit"]',
|
|
541
541
|
'button[aria-label="Submit"]',
|
|
542
|
-
'button[aria-label="
|
|
543
|
-
'button[aria-label="
|
|
542
|
+
'button[aria-label="Submit"]',
|
|
543
|
+
'button[aria-label="Send"]',
|
|
544
544
|
];
|
|
545
545
|
let submit = null;
|
|
546
546
|
for (let attempt = 0; attempt < 12; attempt += 1) {
|
package/clis/grok/utils.test.js
CHANGED
|
@@ -105,12 +105,12 @@ describe('grok normalizeBooleanFlag', () => {
|
|
|
105
105
|
describe('grok getPinStateFromMenuLabels', () => {
|
|
106
106
|
it('detects pinned state from unpin labels without substring collisions', () => {
|
|
107
107
|
expect(__test__.getPinStateFromMenuLabels(['Open in new tab', 'Unpin', 'Delete'])).toBe('pinned');
|
|
108
|
-
expect(__test__.getPinStateFromMenuLabels(['
|
|
108
|
+
expect(__test__.getPinStateFromMenuLabels(['Rename', 'Unpin', 'Delete'])).toBe('pinned');
|
|
109
109
|
});
|
|
110
110
|
|
|
111
111
|
it('detects unpinned state from pin labels', () => {
|
|
112
112
|
expect(__test__.getPinStateFromMenuLabels(['Open in new tab', 'Pin', 'Delete'])).toBe('unpinned');
|
|
113
|
-
expect(__test__.getPinStateFromMenuLabels(['
|
|
113
|
+
expect(__test__.getPinStateFromMenuLabels(['Rename', 'Pin', 'Delete'])).toBe('unpinned');
|
|
114
114
|
});
|
|
115
115
|
|
|
116
116
|
it('returns empty string when neither state label is visible', () => {
|
|
@@ -155,7 +155,7 @@ describe('indeed adapter — URL builders', () => {
|
|
|
155
155
|
describe('indeed adapter — DOM normalizers', () => {
|
|
156
156
|
it('dedupeTags drops the salary duplicate and trims', () => {
|
|
157
157
|
const tags = ['$50 - $100 an hour', 'Contract', 'Hourly pay', 'Flexible schedule', 'Contract'];
|
|
158
|
-
expect(dedupeTags(tags, '$50 - $100 an hour')).toBe('Contract
|
|
158
|
+
expect(dedupeTags(tags, '$50 - $100 an hour')).toBe('Contract \u00b7 Hourly pay \u00b7 Flexible schedule');
|
|
159
159
|
});
|
|
160
160
|
|
|
161
161
|
it('dedupeTags handles empty / no-salary input', () => {
|
|
@@ -184,7 +184,7 @@ describe('indeed adapter — DOM normalizers', () => {
|
|
|
184
184
|
company: 'Somos, Inc.',
|
|
185
185
|
location: 'Remote',
|
|
186
186
|
salary: '$150,000 - $179,000 a year',
|
|
187
|
-
tags: 'Full-time
|
|
187
|
+
tags: 'Full-time \u00b7 401(k)',
|
|
188
188
|
url: `${INDEED_ORIGIN}/viewjob?jk=a0021a1886f32d09`,
|
|
189
189
|
});
|
|
190
190
|
});
|
|
@@ -270,7 +270,7 @@ describe('indeed adapter — search runtime', () => {
|
|
|
270
270
|
company: 'Acme',
|
|
271
271
|
location: 'Remote',
|
|
272
272
|
salary: '$180,000 a year',
|
|
273
|
-
tags: 'Full-time
|
|
273
|
+
tags: 'Full-time \u00b7 401(k)',
|
|
274
274
|
url: `${INDEED_ORIGIN}/viewjob?jk=dccc07ac5a6a3683`,
|
|
275
275
|
}]);
|
|
276
276
|
});
|