@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/dist/src/constants.js
CHANGED
|
@@ -1,16 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shared constants used across explore, synthesize, and pipeline modules.
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
5
|
-
/** Default daemon port for HTTP
|
|
6
|
-
export const DEFAULT_DAEMON_PORT =
|
|
7
|
-
export function unsupportedDaemonPortEnvMessage(value) {
|
|
8
|
-
const envName = `${ENV_PREFIX}_DAEMON_PORT`;
|
|
9
|
-
const suffix = value ? ` (received ${value})` : '';
|
|
10
|
-
return `${envName} is no longer supported${suffix}. ` +
|
|
11
|
-
`The ${PRODUCT_DISPLAY_NAME} Chrome extension can only connect to localhost:${DEFAULT_DAEMON_PORT}. ` +
|
|
12
|
-
`Unset ${envName} and rerun ${CLI_COMMAND}.`;
|
|
13
|
-
}
|
|
4
|
+
import { DAEMON_HEADER_NAME } from './brand.js';
|
|
5
|
+
/** Default daemon port for HTTP communication with the browser runtime. */
|
|
6
|
+
export const DEFAULT_DAEMON_PORT = 9777;
|
|
14
7
|
export { DAEMON_HEADER_NAME };
|
|
15
8
|
/** URL query params that are volatile/ephemeral and should be stripped from patterns */
|
|
16
9
|
export const VOLATILE_PARAMS = new Set([
|
|
@@ -244,7 +244,7 @@ function auditTypedErrorPatterns(command, source, sourcePath, projectRoot) {
|
|
|
244
244
|
details: { text: line.trim() },
|
|
245
245
|
});
|
|
246
246
|
}
|
|
247
|
-
const sentinel = /(?:\?\?|\|\|)\s*(['"])(unknown|Unknown|UNKNOWN|N\/A|n\/a|NA
|
|
247
|
+
const sentinel = /(?:\?\?|\|\|)\s*(['"])(unknown|Unknown|UNKNOWN|N\/A|n\/a|NA|-)\1/.exec(line);
|
|
248
248
|
if (sentinel) {
|
|
249
249
|
if (!isThrowMessageLine(line)) {
|
|
250
250
|
violations.push({
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createServer } from 'node:http';
|
|
2
2
|
import { DAEMON_HEADER_NAME, DEFAULT_DAEMON_PORT } from '../constants.js';
|
|
3
|
-
import { getResponseCorsHeaders } from '../daemon-utils.js';
|
|
3
|
+
import { buildCommandTimeoutFailure, getResponseCorsHeaders } from '../daemon-utils.js';
|
|
4
4
|
const MAX_BODY = 1024 * 1024;
|
|
5
5
|
const LOG_BUFFER_SIZE = 200;
|
|
6
6
|
function readBody(req) {
|
|
@@ -36,7 +36,7 @@ export function createDaemonServer(provider, opts) {
|
|
|
36
36
|
const port = opts.port ?? DEFAULT_DAEMON_PORT;
|
|
37
37
|
const host = opts.host ?? '127.0.0.1';
|
|
38
38
|
const logBuffer = [];
|
|
39
|
-
const pending = new
|
|
39
|
+
const pending = new Map();
|
|
40
40
|
let shutdownStarted = false;
|
|
41
41
|
function pushLog(level, msg) {
|
|
42
42
|
logBuffer.push({ level, msg, ts: Date.now() });
|
|
@@ -115,35 +115,40 @@ export function createDaemonServer(provider, opts) {
|
|
|
115
115
|
jsonResponse(res, 400, { ok: false, error: 'Missing command id' });
|
|
116
116
|
return;
|
|
117
117
|
}
|
|
118
|
-
|
|
119
|
-
|
|
118
|
+
const existing = pending.get(body.id);
|
|
119
|
+
if (existing) {
|
|
120
|
+
const result = await existing;
|
|
121
|
+
jsonResponse(res, result.ok ? 200 : result.errorCode === 'command_result_unknown' ? 408 : 400, result);
|
|
120
122
|
return;
|
|
121
123
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
+
const timeoutMs = typeof body.deadlineAt === 'number' && body.deadlineAt > 0
|
|
125
|
+
? Math.max(1000, body.deadlineAt - Date.now())
|
|
126
|
+
: (typeof body.timeout === 'number' && body.timeout > 0 ? body.timeout * 1000 : 120_000);
|
|
124
127
|
let timeoutId;
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
128
|
+
const commandPromise = Promise.race([
|
|
129
|
+
provider.dispatch(body),
|
|
130
|
+
new Promise((resolve) => {
|
|
131
|
+
timeoutId = setTimeout(() => {
|
|
132
|
+
const failure = buildCommandTimeoutFailure(body.action, timeoutMs);
|
|
133
|
+
resolve({
|
|
130
134
|
id: body.id,
|
|
131
135
|
ok: false,
|
|
132
|
-
errorCode:
|
|
133
|
-
error:
|
|
134
|
-
errorHint:
|
|
135
|
-
})
|
|
136
|
-
})
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
pushLog('warn', `Command ${body.id} failed: ${result.error ?? result.errorCode ?? 'unknown error'}`);
|
|
140
|
-
jsonResponse(res, result.ok ? 200 : result.errorCode === 'command_result_unknown' ? 408 : 400, result);
|
|
141
|
-
}
|
|
142
|
-
finally {
|
|
136
|
+
errorCode: failure.errorCode,
|
|
137
|
+
error: failure.message,
|
|
138
|
+
errorHint: failure.errorHint,
|
|
139
|
+
});
|
|
140
|
+
}, timeoutMs);
|
|
141
|
+
}),
|
|
142
|
+
]).finally(() => {
|
|
143
143
|
if (timeoutId)
|
|
144
144
|
clearTimeout(timeoutId);
|
|
145
145
|
pending.delete(body.id);
|
|
146
|
-
}
|
|
146
|
+
});
|
|
147
|
+
pending.set(body.id, commandPromise);
|
|
148
|
+
const result = await commandPromise;
|
|
149
|
+
if (!result.ok)
|
|
150
|
+
pushLog('warn', `Command ${body.id} failed: ${result.error ?? result.errorCode ?? 'unknown error'}`);
|
|
151
|
+
jsonResponse(res, result.ok ? 200 : result.errorCode === 'command_result_unknown' ? 408 : 400, result);
|
|
147
152
|
}
|
|
148
153
|
catch (err) {
|
|
149
154
|
jsonResponse(res, 400, { ok: false, error: err instanceof Error ? err.message : 'Invalid request' });
|
|
@@ -93,6 +93,58 @@ describe('createDaemonServer', () => {
|
|
|
93
93
|
clearTimeoutSpy.mockRestore();
|
|
94
94
|
}
|
|
95
95
|
});
|
|
96
|
+
it('uses deadlineAt as the command timeout budget when present', async () => {
|
|
97
|
+
const now = 1_763_000_000_000;
|
|
98
|
+
const dateSpy = vi.spyOn(Date, 'now').mockReturnValue(now);
|
|
99
|
+
const setTimeoutSpy = vi.spyOn(globalThis, 'setTimeout');
|
|
100
|
+
try {
|
|
101
|
+
const { baseUrl } = await start();
|
|
102
|
+
const res = await fetch(`${baseUrl}/command`, {
|
|
103
|
+
method: 'POST',
|
|
104
|
+
headers: { [DAEMON_HEADER_NAME]: '1', 'Content-Type': 'application/json' },
|
|
105
|
+
body: JSON.stringify({
|
|
106
|
+
id: 'deadline-command',
|
|
107
|
+
action: 'exec',
|
|
108
|
+
session: 'work',
|
|
109
|
+
timeout: 120,
|
|
110
|
+
deadlineAt: now + 12_345,
|
|
111
|
+
}),
|
|
112
|
+
});
|
|
113
|
+
expect(res.status).toBe(200);
|
|
114
|
+
await expect(res.json()).resolves.toMatchObject({
|
|
115
|
+
id: 'deadline-command',
|
|
116
|
+
ok: true,
|
|
117
|
+
});
|
|
118
|
+
expect(setTimeoutSpy.mock.calls.some(([, delay]) => delay === 12_345)).toBe(true);
|
|
119
|
+
}
|
|
120
|
+
finally {
|
|
121
|
+
setTimeoutSpy.mockRestore();
|
|
122
|
+
dateSpy.mockRestore();
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
it('attaches duplicate command ids to the in-flight dispatch instead of re-dispatching', async () => {
|
|
126
|
+
const provider = new FakeProvider();
|
|
127
|
+
provider.delayMs = 50;
|
|
128
|
+
const { baseUrl } = await start(provider);
|
|
129
|
+
const body = JSON.stringify({ id: 'same-id', action: 'exec', session: 'work', code: '1' });
|
|
130
|
+
const [first, second] = await Promise.all([
|
|
131
|
+
fetch(`${baseUrl}/command`, {
|
|
132
|
+
method: 'POST',
|
|
133
|
+
headers: { [DAEMON_HEADER_NAME]: '1', 'Content-Type': 'application/json' },
|
|
134
|
+
body,
|
|
135
|
+
}),
|
|
136
|
+
fetch(`${baseUrl}/command`, {
|
|
137
|
+
method: 'POST',
|
|
138
|
+
headers: { [DAEMON_HEADER_NAME]: '1', 'Content-Type': 'application/json' },
|
|
139
|
+
body,
|
|
140
|
+
}),
|
|
141
|
+
]);
|
|
142
|
+
expect(first.status).toBe(200);
|
|
143
|
+
expect(second.status).toBe(200);
|
|
144
|
+
await expect(first.json()).resolves.toMatchObject({ id: 'same-id', ok: true });
|
|
145
|
+
await expect(second.json()).resolves.toMatchObject({ id: 'same-id', ok: true });
|
|
146
|
+
expect(provider.commands).toHaveLength(1);
|
|
147
|
+
});
|
|
96
148
|
it('requires X-Webcmd on non-ping endpoints', async () => {
|
|
97
149
|
const { baseUrl } = await start();
|
|
98
150
|
const res = await fetch(`${baseUrl}/status`);
|
|
@@ -14,5 +14,6 @@ export declare function buildExtensionDisconnectFailure(input: {
|
|
|
14
14
|
action: string;
|
|
15
15
|
dispatched: boolean;
|
|
16
16
|
}): DaemonFailureContract;
|
|
17
|
+
export declare function buildCommandTimeoutFailure(action: string, timeoutMs: number): DaemonFailureContract;
|
|
17
18
|
export declare function buildCommandDispatchFailure(contextId: string): DaemonFailureContract;
|
|
18
19
|
export declare function getResponseCorsHeaders(pathname: string, origin?: string): Record<string, string> | undefined;
|
package/dist/src/daemon-utils.js
CHANGED
|
@@ -16,6 +16,15 @@ export function buildExtensionDisconnectFailure(input) {
|
|
|
16
16
|
}
|
|
17
17
|
return buildCommandDispatchFailure(input.contextId);
|
|
18
18
|
}
|
|
19
|
+
export function buildCommandTimeoutFailure(action, timeoutMs) {
|
|
20
|
+
return {
|
|
21
|
+
message: `Browser ${action} command timed out after ${Math.round(timeoutMs / 1000)}s; it may still complete in the browser.`,
|
|
22
|
+
errorCode: COMMAND_RESULT_UNKNOWN_CODE,
|
|
23
|
+
errorHint: COMMAND_RESULT_UNKNOWN_HINT,
|
|
24
|
+
status: 408,
|
|
25
|
+
countAsCommandResultUnknown: true,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
19
28
|
export function buildCommandDispatchFailure(contextId) {
|
|
20
29
|
return {
|
|
21
30
|
message: `Browser profile "${contextId}" disconnected before command dispatch`,
|
package/dist/src/daemon.js
CHANGED
|
@@ -1,13 +1,9 @@
|
|
|
1
|
-
import { DEFAULT_DAEMON_PORT
|
|
1
|
+
import { DEFAULT_DAEMON_PORT } from './constants.js';
|
|
2
2
|
import { EXIT_CODES } from './errors.js';
|
|
3
3
|
import { log } from './logger.js';
|
|
4
4
|
import { PKG_VERSION } from './version.js';
|
|
5
5
|
import { createDaemonServer } from './daemon/server.js';
|
|
6
6
|
import { LocalCloakRuntimeProvider } from './browser/runtime/local-cloak/provider.js';
|
|
7
|
-
if (process.env.WEBCMD_DAEMON_PORT) {
|
|
8
|
-
log.error(unsupportedDaemonPortEnvMessage(process.env.WEBCMD_DAEMON_PORT));
|
|
9
|
-
process.exit(EXIT_CODES.USAGE_ERROR);
|
|
10
|
-
}
|
|
11
7
|
const provider = new LocalCloakRuntimeProvider();
|
|
12
8
|
const daemon = createDaemonServer(provider, { port: DEFAULT_DAEMON_PORT, host: '127.0.0.1', version: PKG_VERSION });
|
|
13
9
|
daemon.listen().then(() => {
|
package/dist/src/daemon.test.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { COMMAND_RESULT_UNKNOWN_CODE, COMMAND_RESULT_UNKNOWN_HINT, buildCommandDispatchFailure, buildExtensionDisconnectFailure, commandResultUnknownMessage, getResponseCorsHeaders, } from './daemon-utils.js';
|
|
2
|
+
import { COMMAND_RESULT_UNKNOWN_CODE, COMMAND_RESULT_UNKNOWN_HINT, buildCommandDispatchFailure, buildCommandTimeoutFailure, buildExtensionDisconnectFailure, commandResultUnknownMessage, getResponseCorsHeaders, } from './daemon-utils.js';
|
|
3
3
|
describe('getResponseCorsHeaders', () => {
|
|
4
4
|
it('allows the packaged runtime origin to read /ping', () => {
|
|
5
5
|
expect(getResponseCorsHeaders('/ping', 'chrome-extension://abc123')).toEqual({
|
|
@@ -57,4 +57,13 @@ describe('daemon command dispatch', () => {
|
|
|
57
57
|
countAsCommandResultUnknown: false,
|
|
58
58
|
});
|
|
59
59
|
});
|
|
60
|
+
it('classifies command timeouts as command_result_unknown', () => {
|
|
61
|
+
expect(buildCommandTimeoutFailure('exec', 12_345)).toEqual({
|
|
62
|
+
message: 'Browser exec command timed out after 12s; it may still complete in the browser.',
|
|
63
|
+
errorCode: 'command_result_unknown',
|
|
64
|
+
errorHint: COMMAND_RESULT_UNKNOWN_HINT,
|
|
65
|
+
status: 408,
|
|
66
|
+
countAsCommandResultUnknown: true,
|
|
67
|
+
});
|
|
68
|
+
});
|
|
60
69
|
});
|
package/dist/src/doctor.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { DEFAULT_DAEMON_PORT } from './constants.js';
|
|
7
7
|
import { BrowserBridge } from './browser/index.js';
|
|
8
|
+
import { setDaemonCommandTimeoutSeconds } from './browser/daemon-client.js';
|
|
8
9
|
import { getDaemonHealth } from './browser/daemon-transport.js';
|
|
9
10
|
import { getErrorMessage } from './errors.js';
|
|
10
11
|
import { getRuntimeLabel } from './runtime-detect.js';
|
|
@@ -18,10 +19,12 @@ const DOCTOR_SESSION = '__doctor__';
|
|
|
18
19
|
*/
|
|
19
20
|
export async function checkConnectivity(opts) {
|
|
20
21
|
const start = Date.now();
|
|
22
|
+
const timeoutSeconds = opts?.timeout ?? DOCTOR_LIVE_TIMEOUT_SECONDS;
|
|
23
|
+
setDaemonCommandTimeoutSeconds(timeoutSeconds);
|
|
21
24
|
try {
|
|
22
25
|
const bridge = new BrowserBridge();
|
|
23
26
|
const page = await bridge.connect({
|
|
24
|
-
timeout:
|
|
27
|
+
timeout: timeoutSeconds,
|
|
25
28
|
session: DOCTOR_SESSION,
|
|
26
29
|
surface: 'browser',
|
|
27
30
|
});
|
|
@@ -38,6 +41,9 @@ export async function checkConnectivity(opts) {
|
|
|
38
41
|
catch (err) {
|
|
39
42
|
return { ok: false, error: getErrorMessage(err), durationMs: Date.now() - start };
|
|
40
43
|
}
|
|
44
|
+
finally {
|
|
45
|
+
setDaemonCommandTimeoutSeconds(null);
|
|
46
|
+
}
|
|
41
47
|
}
|
|
42
48
|
export async function runBrowserDoctor(opts = {}) {
|
|
43
49
|
// Live connectivity check is the core of doctor — it doubles as auto-start
|
|
@@ -87,6 +93,18 @@ export async function runBrowserDoctor(opts = {}) {
|
|
|
87
93
|
if (!connectivity.ok) {
|
|
88
94
|
issues.push(`Browser connectivity test failed: ${connectivity.error ?? 'unknown'}`);
|
|
89
95
|
}
|
|
96
|
+
const profileConfig = loadProfileConfig();
|
|
97
|
+
const staleDefault = profileConfig.defaultContextId;
|
|
98
|
+
if (staleDefault && profiles?.length && !profiles.some((p) => p.contextId === staleDefault)) {
|
|
99
|
+
const alias = aliasForContextId(profileConfig, staleDefault);
|
|
100
|
+
const label = alias ? `${alias} (${staleDefault})` : staleDefault;
|
|
101
|
+
const fallbackNote = profiles.length === 1
|
|
102
|
+
? `Commands currently fall back to the only active profile: ${profiles[0].contextId}.`
|
|
103
|
+
: 'Multiple profiles are active, so commands will ask you to choose.';
|
|
104
|
+
issues.push(`Default Cloak profile is not active: ${label}.\n` +
|
|
105
|
+
` ${fallbackNote}\n` +
|
|
106
|
+
' Refresh it with: webcmd profile list, then webcmd profile use <name>.');
|
|
107
|
+
}
|
|
90
108
|
if (adapterShadows.length > 0) {
|
|
91
109
|
issues.push(formatAdapterShadowIssue(adapterShadows));
|
|
92
110
|
}
|
package/dist/src/doctor.test.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
-
const { mockGetDaemonHealth, mockConnect, mockClose, mockFindShadowedUserAdapters } = vi.hoisted(() => ({
|
|
2
|
+
const { mockGetDaemonHealth, mockConnect, mockClose, mockFindShadowedUserAdapters, mockSetDaemonCommandTimeoutSeconds, } = vi.hoisted(() => ({
|
|
3
3
|
mockGetDaemonHealth: vi.fn(),
|
|
4
4
|
mockConnect: vi.fn(),
|
|
5
5
|
mockClose: vi.fn(),
|
|
6
6
|
mockFindShadowedUserAdapters: vi.fn(),
|
|
7
|
+
mockSetDaemonCommandTimeoutSeconds: vi.fn(),
|
|
7
8
|
}));
|
|
8
9
|
vi.mock('./browser/daemon-transport.js', () => ({
|
|
9
10
|
getDaemonHealth: mockGetDaemonHealth,
|
|
@@ -14,6 +15,9 @@ vi.mock('./browser/index.js', () => ({
|
|
|
14
15
|
close = mockClose;
|
|
15
16
|
},
|
|
16
17
|
}));
|
|
18
|
+
vi.mock('./browser/daemon-client.js', () => ({
|
|
19
|
+
setDaemonCommandTimeoutSeconds: mockSetDaemonCommandTimeoutSeconds,
|
|
20
|
+
}));
|
|
17
21
|
vi.mock('./adapter-shadow.js', async () => {
|
|
18
22
|
const actual = await vi.importActual('./adapter-shadow.js');
|
|
19
23
|
return {
|
|
@@ -27,6 +31,7 @@ describe('doctor report rendering', () => {
|
|
|
27
31
|
beforeEach(() => {
|
|
28
32
|
vi.clearAllMocks();
|
|
29
33
|
mockFindShadowedUserAdapters.mockReturnValue([]);
|
|
34
|
+
mockSetDaemonCommandTimeoutSeconds.mockClear();
|
|
30
35
|
// Doctor always runs live connectivity. Tests that want connect to fail override.
|
|
31
36
|
mockConnect.mockResolvedValue({
|
|
32
37
|
evaluate: vi.fn().mockResolvedValue(2),
|
|
@@ -44,7 +49,7 @@ describe('doctor report rendering', () => {
|
|
|
44
49
|
runtimeVersion: '1.6.8',
|
|
45
50
|
issues: [],
|
|
46
51
|
}));
|
|
47
|
-
expect(text).toContain('[OK] Daemon: running on port
|
|
52
|
+
expect(text).toContain('[OK] Daemon: running on port 9777');
|
|
48
53
|
expect(text).toContain('(v1.7.9)');
|
|
49
54
|
expect(text).toContain('[OK] Runtime: Cloak connected (v1.6.8)');
|
|
50
55
|
expect(text).toContain('Everything looks good!');
|
|
@@ -61,7 +66,7 @@ describe('doctor report rendering', () => {
|
|
|
61
66
|
runtimeVersion: '1.0.3',
|
|
62
67
|
issues: ['Stale daemon detected: daemon v1.7.6 != CLI v1.7.9.\n Run: webcmd daemon restart'],
|
|
63
68
|
}));
|
|
64
|
-
expect(text).toContain('[WARN] Daemon: running on port
|
|
69
|
+
expect(text).toContain('[WARN] Daemon: running on port 9777 (v1.7.6, stale; CLI v1.7.9)');
|
|
65
70
|
expect(text).toContain('Run: webcmd daemon restart');
|
|
66
71
|
expect(text).not.toContain('Everything looks good!');
|
|
67
72
|
});
|
|
@@ -81,7 +86,7 @@ describe('doctor report rendering', () => {
|
|
|
81
86
|
runtimeConnected: false,
|
|
82
87
|
issues: ['Daemon is running but the Cloak runtime is not connected.'],
|
|
83
88
|
}));
|
|
84
|
-
expect(text).toContain('[OK] Daemon: running on port
|
|
89
|
+
expect(text).toContain('[OK] Daemon: running on port 9777');
|
|
85
90
|
expect(text).toContain('[MISSING] Runtime: Cloak not connected');
|
|
86
91
|
});
|
|
87
92
|
it('renders OK when the connected Cloak runtime version is unknown', () => {
|
|
@@ -152,6 +157,33 @@ describe('doctor report rendering', () => {
|
|
|
152
157
|
expect.stringContaining('Daemon is not running'),
|
|
153
158
|
]));
|
|
154
159
|
});
|
|
160
|
+
it('reports a stale default Cloak profile when it is not active', async () => {
|
|
161
|
+
const fs = await import('node:fs');
|
|
162
|
+
const os = await import('node:os');
|
|
163
|
+
const path = await import('node:path');
|
|
164
|
+
const configDir = fs.mkdtempSync(path.join(os.tmpdir(), 'webcmd-doctor-profile-'));
|
|
165
|
+
fs.writeFileSync(path.join(configDir, 'browser-profiles.json'), JSON.stringify({ version: 1, aliases: { work: 'profile-default' }, defaultContextId: 'profile-default' }));
|
|
166
|
+
vi.stubEnv('WEBCMD_CONFIG_DIR', configDir);
|
|
167
|
+
try {
|
|
168
|
+
mockGetDaemonHealth.mockResolvedValueOnce({
|
|
169
|
+
state: 'ready',
|
|
170
|
+
status: {
|
|
171
|
+
runtimeConnected: true,
|
|
172
|
+
runtimeName: 'Cloak',
|
|
173
|
+
profiles: [{ contextId: 'active-profile', runtimeConnected: true, pending: 0 }],
|
|
174
|
+
},
|
|
175
|
+
});
|
|
176
|
+
const report = await runBrowserDoctor();
|
|
177
|
+
expect(report.issues).toEqual(expect.arrayContaining([
|
|
178
|
+
expect.stringContaining('Default Cloak profile is not active: work (profile-default)'),
|
|
179
|
+
]));
|
|
180
|
+
expect(report.issues.join('\n')).toContain('fall back to the only active profile: active-profile');
|
|
181
|
+
}
|
|
182
|
+
finally {
|
|
183
|
+
vi.unstubAllEnvs();
|
|
184
|
+
fs.rmSync(configDir, { recursive: true, force: true });
|
|
185
|
+
}
|
|
186
|
+
});
|
|
155
187
|
it('reports flapping when live check succeeds but final status shows runtime disconnected', async () => {
|
|
156
188
|
mockGetDaemonHealth.mockResolvedValueOnce({ state: 'no-runtime', status: { runtimeConnected: false, runtimeName: 'Cloak' } });
|
|
157
189
|
const report = await runBrowserDoctor();
|
|
@@ -202,6 +234,8 @@ describe('doctor report rendering', () => {
|
|
|
202
234
|
await runBrowserDoctor();
|
|
203
235
|
expect(timeoutSeen).toBe(8);
|
|
204
236
|
expect(closeWindow).toHaveBeenCalledTimes(1);
|
|
237
|
+
expect(mockSetDaemonCommandTimeoutSeconds).toHaveBeenNthCalledWith(1, 8);
|
|
238
|
+
expect(mockSetDaemonCommandTimeoutSeconds).toHaveBeenLastCalledWith(null);
|
|
205
239
|
});
|
|
206
240
|
it('does not report an issue when the connected Cloak runtime does not report a version', async () => {
|
|
207
241
|
const status = {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Article download helper — shared logic for downloading articles as Markdown.
|
|
3
3
|
*
|
|
4
|
-
* Used by
|
|
4
|
+
* Used by article adapters that export readable web pages as Markdown.
|
|
5
5
|
*
|
|
6
6
|
* Flow: ArticleData → TurndownService → image download → frontmatter → .md file
|
|
7
7
|
*/
|
|
@@ -35,12 +35,12 @@ export interface ArticleDownloadOptions {
|
|
|
35
35
|
configureTurndown?: (td: TurndownService) => void;
|
|
36
36
|
/** Custom image extension detector (default: infer from URL extension) */
|
|
37
37
|
detectImageExt?: (url: string) => string;
|
|
38
|
-
/** Custom frontmatter labels (default:
|
|
38
|
+
/** Custom frontmatter labels (default: English labels) */
|
|
39
39
|
frontmatterLabels?: FrontmatterLabels;
|
|
40
40
|
/**
|
|
41
41
|
* Extra CSS selectors removed from the article before Turndown conversion.
|
|
42
42
|
* Use this to drop site-specific noise the adapter can't always trim upstream
|
|
43
|
-
* (e.g.
|
|
43
|
+
* (e.g. social widgets, reward panels, wiki infoboxes).
|
|
44
44
|
*/
|
|
45
45
|
cleanSelectors?: string[];
|
|
46
46
|
/**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Article download helper — shared logic for downloading articles as Markdown.
|
|
3
3
|
*
|
|
4
|
-
* Used by
|
|
4
|
+
* Used by article adapters that export readable web pages as Markdown.
|
|
5
5
|
*
|
|
6
6
|
* Flow: ArticleData → TurndownService → image download → frontmatter → .md file
|
|
7
7
|
*/
|
|
@@ -13,9 +13,9 @@ import { httpDownload, sanitizeFilename } from './index.js';
|
|
|
13
13
|
import { formatBytes } from './progress.js';
|
|
14
14
|
const IMAGE_CONCURRENCY = 5;
|
|
15
15
|
const DEFAULT_LABELS = {
|
|
16
|
-
author: '
|
|
17
|
-
publishTime: '
|
|
18
|
-
sourceUrl: '
|
|
16
|
+
author: 'Author',
|
|
17
|
+
publishTime: 'Published',
|
|
18
|
+
sourceUrl: 'Source URL',
|
|
19
19
|
};
|
|
20
20
|
// ============================================================
|
|
21
21
|
// Markdown Conversion
|
|
@@ -112,8 +112,8 @@ function createTurndown(configure, cleanSelectors) {
|
|
|
112
112
|
},
|
|
113
113
|
});
|
|
114
114
|
// Per-adapter dirty-node removal. Adapters know their site's specific noise
|
|
115
|
-
// (
|
|
116
|
-
// empty so the generic converter stays untouched.
|
|
115
|
+
// (social widgets, reward panels, wiki infoboxes, and similar chrome);
|
|
116
|
+
// we keep the default set empty so the generic converter stays untouched.
|
|
117
117
|
const selectorRules = (cleanSelectors ?? [])
|
|
118
118
|
.map(sel => sel.trim())
|
|
119
119
|
.filter(Boolean);
|
|
@@ -152,7 +152,7 @@ function convertToMarkdown(contentHtml, codeBlocks, configure, cleanSelectors) {
|
|
|
152
152
|
md = md.replace(/\u00a0/g, ' ');
|
|
153
153
|
// Turndown leaves behind lone dashes / middle dots when list bullets or
|
|
154
154
|
// decorative separators lose their surrounding inline context.
|
|
155
|
-
md = md.replace(/^[ \t]*[
|
|
155
|
+
md = md.replace(/^[ \t]*[-\u00b7][ \t]*$/gm, '');
|
|
156
156
|
md = md.replace(/^[ \t]+$/gm, '');
|
|
157
157
|
md = md.replace(/[ \t]+$/gm, '');
|
|
158
158
|
md = md.replace(/\n{3,}/g, '\n\n');
|
|
@@ -96,11 +96,11 @@ describe('downloadArticle', () => {
|
|
|
96
96
|
it('collapses 3+ blank lines and strips lone bullet / middle-dot residue', async () => {
|
|
97
97
|
const md = await runAndRead('<p>top</p>' +
|
|
98
98
|
'<p>-</p>' +
|
|
99
|
-
'<p
|
|
99
|
+
'<p>\u00b7</p>' +
|
|
100
100
|
'<p>bottom</p>');
|
|
101
101
|
expect(md).not.toMatch(/\n{3,}/);
|
|
102
102
|
expect(md).not.toMatch(/^\s*-\s*$/m);
|
|
103
|
-
expect(md).not.toMatch(/^\s
|
|
103
|
+
expect(md).not.toMatch(/^\s*\u00b7\s*$/m);
|
|
104
104
|
expect(md).toContain('top');
|
|
105
105
|
expect(md).toContain('bottom');
|
|
106
106
|
});
|
|
@@ -118,13 +118,13 @@ describe('downloadArticle', () => {
|
|
|
118
118
|
});
|
|
119
119
|
it('cleanSelectors removes matching nodes before conversion', async () => {
|
|
120
120
|
const md = await runAndRead('<p>keep-me</p>' +
|
|
121
|
-
'<div class="vote-card"
|
|
122
|
-
'<section class="reward-panel"
|
|
121
|
+
'<div class="vote-card">Collapsed card</div>' +
|
|
122
|
+
'<section class="reward-panel">Reward panel</section>' +
|
|
123
123
|
'<p>also-keep</p>', { cleanSelectors: ['.vote-card', '.reward-panel'] });
|
|
124
124
|
expect(md).toContain('keep-me');
|
|
125
125
|
expect(md).toContain('also-keep');
|
|
126
|
-
expect(md).not.toContain('
|
|
127
|
-
expect(md).not.toContain('
|
|
126
|
+
expect(md).not.toContain('Collapsed card');
|
|
127
|
+
expect(md).not.toContain('Reward panel');
|
|
128
128
|
});
|
|
129
129
|
it('cleanSelectors silently ignores invalid selectors', async () => {
|
|
130
130
|
const md = await runAndRead('<p>survives</p><div class="x">and-this-too</div>', { cleanSelectors: ['!!!not-a-valid-selector', '.missing'] });
|
|
@@ -18,7 +18,7 @@ export function checkYtdlp() {
|
|
|
18
18
|
}
|
|
19
19
|
/** Domains that host video content and can be downloaded via yt-dlp. */
|
|
20
20
|
const VIDEO_PLATFORM_DOMAINS = [
|
|
21
|
-
'youtube.com', 'youtu.be', '
|
|
21
|
+
'youtube.com', 'youtu.be', 'twitter.com',
|
|
22
22
|
'x.com', 'tiktok.com', 'vimeo.com', 'twitch.tv',
|
|
23
23
|
];
|
|
24
24
|
/**
|
|
@@ -143,11 +143,10 @@ describe('video-platform host detection', () => {
|
|
|
143
143
|
for (const url of [
|
|
144
144
|
'https://www.youtube.com/watch?v=abc',
|
|
145
145
|
'https://youtu.be/abc',
|
|
146
|
-
'https://
|
|
146
|
+
'https://vimeo.com/12345',
|
|
147
147
|
'https://twitter.com/u/status/1',
|
|
148
148
|
'https://x.com/u/status/1',
|
|
149
149
|
'https://www.tiktok.com/@u/video/1',
|
|
150
|
-
'https://vimeo.com/12345',
|
|
151
150
|
'https://www.twitch.tv/u',
|
|
152
151
|
]) {
|
|
153
152
|
expect(requiresYtdlp(url)).toBe(true);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Media download helper — shared logic for batch downloading images/videos.
|
|
3
3
|
*
|
|
4
|
-
* Used by:
|
|
4
|
+
* Used by: twitter/download, youtube/download,
|
|
5
5
|
* and future media adapters.
|
|
6
6
|
*
|
|
7
7
|
* Flow: MediaItem[] → DownloadProgressTracker → httpDownload/ytdlpDownload → results
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Media download helper — shared logic for batch downloading images/videos.
|
|
3
3
|
*
|
|
4
|
-
* Used by:
|
|
4
|
+
* Used by: twitter/download, youtube/download,
|
|
5
5
|
* and future media adapters.
|
|
6
6
|
*
|
|
7
7
|
* Flow: MediaItem[] → DownloadProgressTracker → httpDownload/ytdlpDownload → results
|
|
@@ -13,7 +13,6 @@ export const builtinApps = {
|
|
|
13
13
|
codex: { port: 9238, processName: 'Codex', bundleId: 'com.openai.codex', displayName: 'Codex' },
|
|
14
14
|
chatwise: { port: 9228, processName: 'ChatWise', bundleId: 'com.chatwise.app', displayName: 'ChatWise' },
|
|
15
15
|
'discord-app': { port: 9232, processName: 'Discord', bundleId: 'com.discord.app', displayName: 'Discord' },
|
|
16
|
-
'doubao-app': { port: 9225, processName: 'Doubao', bundleId: 'com.volcengine.doubao', displayName: 'Doubao' },
|
|
17
16
|
antigravity: {
|
|
18
17
|
port: 9234,
|
|
19
18
|
processName: 'Antigravity',
|
|
@@ -36,13 +35,6 @@ export const builtinApps = {
|
|
|
36
35
|
bundleId: 'com.trae.solo.app',
|
|
37
36
|
displayName: 'Trae SOLO',
|
|
38
37
|
},
|
|
39
|
-
'trae-cn': {
|
|
40
|
-
port: 39240,
|
|
41
|
-
processName: 'Trae CN',
|
|
42
|
-
executableNames: ['Electron'],
|
|
43
|
-
bundleId: 'cn.trae.app',
|
|
44
|
-
displayName: 'Trae CN',
|
|
45
|
-
},
|
|
46
38
|
};
|
|
47
39
|
/** Merge builtin + user-defined apps. User entries are additive only. */
|
|
48
40
|
export function loadApps(userApps) {
|
|
@@ -17,16 +17,8 @@ describe('electron-apps registry', () => {
|
|
|
17
17
|
expect(new Set(ports).size).toBe(ports.length);
|
|
18
18
|
expect(ports).not.toContain(9222);
|
|
19
19
|
});
|
|
20
|
-
it('returns builtin app entry for Trae CN', () => {
|
|
21
|
-
const app = getElectronApp('trae-cn');
|
|
22
|
-
expect(app).toBeDefined();
|
|
23
|
-
expect(app.port).toBe(39240);
|
|
24
|
-
expect(app.processName).toBe('Trae CN');
|
|
25
|
-
expect(app.bundleId).toBe('cn.trae.app');
|
|
26
|
-
expect(app.executableNames).toEqual(['Electron']);
|
|
27
|
-
});
|
|
28
20
|
it('returns undefined for non-Electron sites', () => {
|
|
29
|
-
expect(getElectronApp('
|
|
21
|
+
expect(getElectronApp('youtube')).toBeUndefined();
|
|
30
22
|
expect(getElectronApp('hackernews')).toBeUndefined();
|
|
31
23
|
});
|
|
32
24
|
it('isElectronApp returns true for registered apps', () => {
|
|
@@ -35,7 +27,6 @@ describe('electron-apps registry', () => {
|
|
|
35
27
|
expect(isElectronApp('chatwise')).toBe(true);
|
|
36
28
|
expect(isElectronApp('qoder')).toBe(true);
|
|
37
29
|
expect(isElectronApp('trae-solo')).toBe(true);
|
|
38
|
-
expect(isElectronApp('trae-cn')).toBe(true);
|
|
39
30
|
});
|
|
40
31
|
it('registers Qoder on its own CDP port', () => {
|
|
41
32
|
const app = getElectronApp('qoder');
|
|
@@ -54,7 +45,7 @@ describe('electron-apps registry', () => {
|
|
|
54
45
|
expect(app.bundleId).toBe('com.trae.solo.app');
|
|
55
46
|
});
|
|
56
47
|
it('isElectronApp returns false for non-Electron sites', () => {
|
|
57
|
-
expect(isElectronApp('
|
|
48
|
+
expect(isElectronApp('youtube')).toBe(false);
|
|
58
49
|
expect(isElectronApp('notion')).toBe(false);
|
|
59
50
|
expect(isElectronApp('unknown-app')).toBe(false);
|
|
60
51
|
});
|
package/dist/src/errors.test.js
CHANGED
|
@@ -19,11 +19,11 @@ describe('Error type hierarchy', () => {
|
|
|
19
19
|
}
|
|
20
20
|
});
|
|
21
21
|
it('AuthRequiredError has correct code, domain, and auto-generated hint', () => {
|
|
22
|
-
const err = new AuthRequiredError('
|
|
22
|
+
const err = new AuthRequiredError('youtube.com');
|
|
23
23
|
expect(err.code).toBe('AUTH_REQUIRED');
|
|
24
|
-
expect(err.domain).toBe('
|
|
25
|
-
expect(err.message).toBe('Not logged in to
|
|
26
|
-
expect(err.hint).toContain('https://
|
|
24
|
+
expect(err.domain).toBe('youtube.com');
|
|
25
|
+
expect(err.message).toBe('Not logged in to youtube.com');
|
|
26
|
+
expect(err.hint).toContain('https://youtube.com');
|
|
27
27
|
});
|
|
28
28
|
it('AuthRequiredError accepts custom message', () => {
|
|
29
29
|
const err = new AuthRequiredError('x.com', 'No ct0 cookie found');
|
|
@@ -31,9 +31,9 @@ describe('Error type hierarchy', () => {
|
|
|
31
31
|
expect(err.hint).toContain('https://x.com');
|
|
32
32
|
});
|
|
33
33
|
it('TimeoutError has correct code and hint', () => {
|
|
34
|
-
const err = new TimeoutError('
|
|
34
|
+
const err = new TimeoutError('youtube/search', 60);
|
|
35
35
|
expect(err.code).toBe('TIMEOUT');
|
|
36
|
-
expect(err.message).toBe('
|
|
36
|
+
expect(err.message).toBe('youtube/search timed out after 60s');
|
|
37
37
|
expect(err.hint).toContain('timeout');
|
|
38
38
|
});
|
|
39
39
|
it('ArgumentError has correct code', () => {
|
|
@@ -59,14 +59,14 @@ describe('Error type hierarchy', () => {
|
|
|
59
59
|
});
|
|
60
60
|
describe('toEnvelope', () => {
|
|
61
61
|
it('converts CliError to structured envelope', () => {
|
|
62
|
-
const err = new AuthRequiredError('
|
|
62
|
+
const err = new AuthRequiredError('youtube.com');
|
|
63
63
|
const envelope = toEnvelope(err);
|
|
64
64
|
expect(envelope).toEqual({
|
|
65
65
|
ok: false,
|
|
66
66
|
error: {
|
|
67
67
|
code: 'AUTH_REQUIRED',
|
|
68
|
-
message: 'Not logged in to
|
|
69
|
-
help: expect.stringContaining('https://
|
|
68
|
+
message: 'Not logged in to youtube.com',
|
|
69
|
+
help: expect.stringContaining('https://youtube.com'),
|
|
70
70
|
exitCode: 77,
|
|
71
71
|
},
|
|
72
72
|
});
|