@agentrhq/webcmd 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +278 -20
- package/cli-manifest.json +16247 -34913
- package/clis/_atlassian/shared.js +1 -1
- package/clis/booking/search.js +4 -4
- package/clis/chatgpt/ask.js +2 -2
- package/clis/chatgpt/utils.js +41 -42
- package/clis/chatgpt/utils.test.js +23 -23
- package/clis/chatgpt-app/ax.js +5 -5
- package/clis/chatgpt-app/ax.test.js +8 -8
- package/clis/chatgpt-app/new.js +2 -2
- package/clis/codex/sidebar.js +1 -1
- package/clis/codex/sidebar.test.js +12 -12
- package/clis/coingecko/top.js +3 -3
- package/clis/dblp/dblp.test.js +1 -1
- package/clis/discord-app/search.js +1 -1
- package/clis/discord-app/utils.js +6 -6
- package/clis/facebook/__fixtures__/notifications-page.html +6 -6
- package/clis/facebook/add-friend.js +2 -2
- package/clis/facebook/feed.js +18 -18
- package/clis/facebook/friends.js +4 -4
- package/clis/facebook/groups.js +3 -3
- package/clis/facebook/join-group.js +2 -2
- package/clis/facebook/marketplace-inbox.js +3 -3
- package/clis/facebook/marketplace-listings.js +1 -1
- package/clis/facebook/notifications.js +14 -15
- package/clis/facebook/notifications.test.js +28 -29
- package/clis/gemini/ask.test.js +12 -12
- package/clis/gemini/deep-research-result.js +2 -2
- package/clis/gemini/deep-research-result.test.js +2 -2
- package/clis/gemini/deep-research.js +2 -2
- package/clis/gemini/deep-research.test.js +1 -1
- package/clis/gemini/models.js +11 -11
- package/clis/gemini/models.test.js +1 -1
- package/clis/gemini/reply-state.test.js +89 -89
- package/clis/gemini/utils.js +41 -41
- package/clis/gemini/utils.test.js +30 -30
- package/clis/geogebra/utils.js +1 -1
- package/clis/google-scholar/search.js +3 -3
- package/clis/grok/delete.js +1 -1
- package/clis/grok/export-all.js +2 -2
- package/clis/grok/export.js +2 -2
- package/clis/grok/pin.js +3 -3
- package/clis/grok/utils.js +12 -12
- package/clis/grok/utils.test.js +2 -2
- package/clis/indeed/indeed.test.js +3 -3
- package/clis/indeed/utils.js +1 -1
- package/clis/instagram/post.js +19 -19
- package/clis/instagram/post.test.js +2 -2
- package/clis/instagram/reel.js +6 -6
- package/clis/linkedin/connect.js +3 -3
- package/clis/linkedin/people-search.js +4 -4
- package/clis/linkedin/profile-experience.js +6 -6
- package/clis/linkedin/profile-experience.test.js +10 -10
- package/clis/linkedin/profile-read.js +1 -1
- package/clis/linkedin/safe-send.js +1 -1
- package/clis/linkedin/search.js +1 -1
- package/clis/linkedin/shared.js +2 -2
- package/clis/linkedin/timeline.js +5 -5
- package/clis/manus/manus.test.js +2 -2
- package/clis/medium/feed.js +3 -3
- package/clis/medium/search.js +3 -3
- package/clis/medium/user.js +3 -3
- package/clis/notebooklm/auth.js +2 -2
- package/clis/notebooklm/note-list.test.js +4 -4
- package/clis/notebooklm/notes-get.test.js +8 -8
- package/clis/notebooklm/source-fulltext.test.js +11 -11
- package/clis/notebooklm/utils.js +28 -28
- package/clis/notebooklm/utils.test.js +10 -10
- package/clis/pixiv/search.test.js +3 -3
- package/clis/qoder/quest.js +2 -2
- package/clis/reddit/home.js +2 -2
- package/clis/reddit/hot.js +1 -1
- package/clis/reddit/read.js +2 -2
- package/clis/reddit/read.test.js +1 -1
- package/clis/reddit/reply.js +2 -2
- package/clis/reddit/whoami.js +2 -2
- package/clis/reuters/article-detail.js +1 -1
- package/clis/reuters/search.js +1 -1
- package/clis/slock/attachment-upload.test.js +1 -1
- package/clis/slock/task-convert.js +1 -1
- package/clis/substack/feed.js +3 -3
- package/clis/substack/publication.js +3 -3
- package/clis/substack/search.js +4 -4
- package/clis/tiktok/comment.js +2 -2
- package/clis/tiktok/follow.js +4 -4
- package/clis/tiktok/like.js +1 -1
- package/clis/tiktok/save.js +1 -1
- package/clis/tiktok/unfollow.js +4 -4
- package/clis/tiktok/unlike.js +1 -1
- package/clis/tiktok/unsave.js +2 -2
- package/clis/tiktok/write-refactor.test.js +5 -5
- package/clis/twitter/accept.js +3 -3
- package/clis/twitter/followers.js +1 -1
- package/clis/twitter/list-remove-core.js +2 -2
- package/clis/twitter/list-tweets.test.js +3 -3
- package/clis/twitter/lists.js +6 -6
- package/clis/twitter/lists.test.js +2 -2
- package/clis/twitter/reply-dm.js +1 -1
- package/clis/twitter/shared.test.js +4 -5
- package/clis/twitter/trending.js +1 -1
- package/clis/twitter/utils.js +1 -1
- package/clis/web/read.js +1 -1
- package/clis/web/read.test.js +2 -2
- package/clis/yahoo-finance/quote.js +1 -1
- package/clis/youtube/history.js +4 -4
- package/clis/youtube/transcript-group.js +1 -1
- package/clis/youtube/transcript-group.test.js +5 -5
- package/clis/youtube/transcript.js +5 -5
- package/clis/youtube/video.js +4 -4
- package/clis/youtube/video.test.js +6 -6
- package/dist/src/adapter-shadow.d.ts +11 -0
- package/dist/src/adapter-shadow.js +72 -0
- package/dist/src/adapter-shadow.test.js +49 -0
- package/dist/src/adapter-source.d.ts +11 -0
- package/dist/src/adapter-source.js +24 -0
- package/dist/src/adapter-source.test.d.ts +1 -0
- package/dist/src/adapter-source.test.js +29 -0
- package/dist/src/brand.d.ts +9 -0
- package/dist/src/brand.js +9 -0
- package/dist/src/brand.test.d.ts +1 -0
- package/dist/src/brand.test.js +15 -0
- package/dist/src/browser/analyze.d.ts +118 -0
- package/dist/src/browser/analyze.js +405 -0
- package/dist/src/browser/analyze.test.d.ts +1 -0
- package/dist/src/browser/analyze.test.js +209 -0
- package/dist/src/browser/article-extract.d.ts +57 -0
- package/dist/src/browser/article-extract.e2e.test.d.ts +1 -0
- package/dist/src/browser/article-extract.e2e.test.js +105 -0
- package/dist/src/browser/article-extract.js +169 -0
- package/dist/src/browser/article-extract.test.d.ts +1 -0
- package/dist/src/browser/article-extract.test.js +94 -0
- package/dist/src/browser/ax-snapshot.d.ts +37 -0
- package/dist/src/browser/ax-snapshot.js +217 -0
- package/dist/src/browser/ax-snapshot.test.d.ts +1 -0
- package/dist/src/browser/ax-snapshot.test.js +91 -0
- package/dist/src/browser/base-page.d.ts +151 -0
- package/dist/src/browser/base-page.js +1060 -0
- package/dist/src/browser/base-page.test.d.ts +1 -0
- package/dist/src/browser/base-page.test.js +803 -0
- package/dist/src/browser/bridge-readiness.d.ts +14 -0
- package/dist/src/browser/bridge-readiness.js +24 -0
- package/dist/src/browser/bridge-readiness.test.d.ts +1 -0
- package/dist/src/browser/bridge-readiness.test.js +58 -0
- package/dist/src/browser/bridge.d.ts +26 -0
- package/dist/src/browser/bridge.js +58 -0
- package/dist/src/browser/cdp-click-fixture.test.d.ts +1 -0
- package/dist/src/browser/cdp-click-fixture.test.js +87 -0
- package/dist/src/browser/cdp.d.ts +46 -0
- package/dist/src/browser/cdp.js +536 -0
- package/dist/src/browser/cdp.test.d.ts +1 -0
- package/dist/src/browser/cdp.test.js +79 -0
- package/dist/src/browser/compound.d.ts +59 -0
- package/dist/src/browser/compound.js +112 -0
- package/dist/src/browser/compound.test.d.ts +1 -0
- package/dist/src/browser/compound.test.js +175 -0
- package/dist/src/browser/config.d.ts +2 -0
- package/dist/src/browser/config.js +14 -0
- package/dist/src/browser/daemon-client.d.ts +33 -0
- package/dist/src/browser/daemon-client.js +187 -0
- package/dist/src/browser/daemon-client.test.d.ts +1 -0
- package/dist/src/browser/daemon-client.test.js +411 -0
- package/dist/src/browser/daemon-lifecycle.d.ts +37 -0
- package/dist/src/browser/daemon-lifecycle.js +147 -0
- package/dist/src/browser/daemon-transport.d.ts +54 -0
- package/dist/src/browser/daemon-transport.js +68 -0
- package/dist/src/browser/daemon-version.d.ts +4 -0
- package/dist/src/browser/daemon-version.js +12 -0
- package/dist/src/browser/dom-helpers.d.ts +41 -0
- package/dist/src/browser/dom-helpers.js +239 -0
- package/dist/src/browser/dom-helpers.test.d.ts +1 -0
- package/dist/src/browser/dom-helpers.test.js +106 -0
- package/dist/src/browser/dom-snapshot.d.ts +93 -0
- package/dist/src/browser/dom-snapshot.js +894 -0
- package/dist/src/browser/dom-snapshot.test.d.ts +11 -0
- package/dist/src/browser/dom-snapshot.test.js +313 -0
- package/dist/src/browser/errors.d.ts +38 -0
- package/dist/src/browser/errors.js +90 -0
- package/dist/src/browser/errors.test.d.ts +1 -0
- package/dist/src/browser/errors.test.js +60 -0
- package/dist/src/browser/extract.d.ts +69 -0
- package/dist/src/browser/extract.js +132 -0
- package/dist/src/browser/extract.test.d.ts +1 -0
- package/dist/src/browser/extract.test.js +129 -0
- package/dist/src/browser/find.d.ts +84 -0
- package/dist/src/browser/find.js +398 -0
- package/dist/src/browser/find.test.d.ts +1 -0
- package/dist/src/browser/find.test.js +180 -0
- package/dist/src/browser/html-tree.d.ts +75 -0
- package/dist/src/browser/html-tree.js +112 -0
- package/dist/src/browser/html-tree.test.d.ts +1 -0
- package/dist/src/browser/html-tree.test.js +181 -0
- package/dist/src/browser/index.d.ts +14 -0
- package/dist/src/browser/index.js +12 -0
- package/dist/src/browser/network-cache.d.ts +49 -0
- package/dist/src/browser/network-cache.js +78 -0
- package/dist/src/browser/network-cache.test.d.ts +1 -0
- package/dist/src/browser/network-cache.test.js +75 -0
- package/dist/src/browser/network-interceptor.d.ts +11 -0
- package/dist/src/browser/network-interceptor.js +11 -0
- package/dist/src/browser/network-key.d.ts +22 -0
- package/dist/src/browser/network-key.js +66 -0
- package/dist/src/browser/network-key.test.d.ts +1 -0
- package/dist/src/browser/network-key.test.js +49 -0
- package/dist/src/browser/page.d.ts +83 -0
- package/dist/src/browser/page.js +453 -0
- package/dist/src/browser/page.test.d.ts +1 -0
- package/dist/src/browser/page.test.js +406 -0
- package/dist/src/browser/profile.d.ts +14 -0
- package/dist/src/browser/profile.js +86 -0
- package/dist/src/browser/protocol.d.ts +65 -0
- package/dist/src/browser/protocol.js +1 -0
- package/dist/src/browser/runtime/local-cloak/actions.d.ts +3 -0
- package/dist/src/browser/runtime/local-cloak/actions.js +240 -0
- package/dist/src/browser/runtime/local-cloak/downloads.d.ts +3 -0
- package/dist/src/browser/runtime/local-cloak/downloads.js +28 -0
- package/dist/src/browser/runtime/local-cloak/network.d.ts +28 -0
- package/dist/src/browser/runtime/local-cloak/network.js +120 -0
- package/dist/src/browser/runtime/local-cloak/network.test.d.ts +1 -0
- package/dist/src/browser/runtime/local-cloak/network.test.js +124 -0
- package/dist/src/browser/runtime/local-cloak/profiles.d.ts +6 -0
- package/dist/src/browser/runtime/local-cloak/profiles.js +17 -0
- package/dist/src/browser/runtime/local-cloak/profiles.test.d.ts +1 -0
- package/dist/src/browser/runtime/local-cloak/profiles.test.js +19 -0
- package/dist/src/browser/runtime/local-cloak/provider.d.ts +15 -0
- package/dist/src/browser/runtime/local-cloak/provider.js +27 -0
- package/dist/src/browser/runtime/local-cloak/provider.test.d.ts +1 -0
- package/dist/src/browser/runtime/local-cloak/provider.test.js +244 -0
- package/dist/src/browser/runtime/local-cloak/session-manager.d.ts +77 -0
- package/dist/src/browser/runtime/local-cloak/session-manager.js +280 -0
- package/dist/src/browser/runtime/local-cloak/session-manager.test.d.ts +1 -0
- package/dist/src/browser/runtime/local-cloak/session-manager.test.js +92 -0
- package/dist/src/browser/runtime/provider.d.ts +9 -0
- package/dist/src/browser/runtime/provider.js +1 -0
- package/dist/src/browser/runtime/provider.test.d.ts +2 -0
- package/dist/src/browser/runtime/provider.test.js +49 -0
- package/dist/src/browser/shape-filter.d.ts +52 -0
- package/dist/src/browser/shape-filter.js +101 -0
- package/dist/src/browser/shape-filter.test.d.ts +1 -0
- package/dist/src/browser/shape-filter.test.js +101 -0
- package/dist/src/browser/shape.d.ts +23 -0
- package/dist/src/browser/shape.js +95 -0
- package/dist/src/browser/shape.test.d.ts +1 -0
- package/dist/src/browser/shape.test.js +82 -0
- package/dist/src/browser/stealth.d.ts +11 -0
- package/dist/src/browser/stealth.js +359 -0
- package/dist/src/browser/stealth.test.d.ts +1 -0
- package/dist/src/browser/stealth.test.js +134 -0
- package/dist/src/browser/tabs.d.ts +13 -0
- package/dist/src/browser/tabs.js +70 -0
- package/dist/src/browser/target-errors.d.ts +39 -0
- package/dist/src/browser/target-errors.js +45 -0
- package/dist/src/browser/target-errors.test.d.ts +1 -0
- package/dist/src/browser/target-errors.test.js +94 -0
- package/dist/src/browser/target-resolver.d.ts +158 -0
- package/dist/src/browser/target-resolver.js +570 -0
- package/dist/src/browser/target-resolver.test.d.ts +1 -0
- package/dist/src/browser/target-resolver.test.js +118 -0
- package/dist/src/browser/utils.d.ts +20 -0
- package/dist/src/browser/utils.js +64 -0
- package/dist/src/browser/utils.test.d.ts +1 -0
- package/dist/src/browser/utils.test.js +29 -0
- package/dist/src/browser/verify-fixture.d.ts +65 -0
- package/dist/src/browser/verify-fixture.js +318 -0
- package/dist/src/browser/verify-fixture.test.d.ts +1 -0
- package/dist/src/browser/verify-fixture.test.js +219 -0
- package/dist/src/browser/visual-refs.d.ts +11 -0
- package/dist/src/browser/visual-refs.js +108 -0
- package/dist/src/browser.test.d.ts +1 -0
- package/dist/src/browser.test.js +297 -0
- package/dist/src/build-manifest.d.ts +103 -0
- package/dist/src/build-manifest.js +363 -0
- package/dist/src/build-manifest.test.d.ts +1 -0
- package/dist/src/build-manifest.test.js +341 -0
- package/dist/src/capabilityRouting.d.ts +19 -0
- package/dist/src/capabilityRouting.js +56 -0
- package/dist/src/capabilityRouting.test.d.ts +1 -0
- package/dist/src/capabilityRouting.test.js +63 -0
- package/dist/src/cli-argv-preprocess.d.ts +63 -0
- package/dist/src/cli-argv-preprocess.js +303 -0
- package/dist/src/cli-argv-preprocess.test.d.ts +1 -0
- package/dist/src/cli-argv-preprocess.test.js +304 -0
- package/dist/src/cli.d.ts +79 -0
- package/dist/src/cli.js +3350 -0
- package/dist/src/cli.test.d.ts +1 -0
- package/dist/src/cli.test.js +3041 -0
- package/dist/src/commanderAdapter.d.ts +21 -0
- package/dist/src/commanderAdapter.js +208 -0
- package/dist/src/commanderAdapter.test.d.ts +1 -0
- package/dist/src/commanderAdapter.test.js +352 -0
- package/dist/src/commands/auth.d.ts +40 -0
- package/dist/src/commands/auth.js +434 -0
- package/dist/src/commands/auth.test.d.ts +1 -0
- package/dist/src/commands/auth.test.js +252 -0
- package/dist/src/commands/daemon.d.ts +9 -0
- package/dist/src/commands/daemon.js +91 -0
- package/dist/src/commands/daemon.test.d.ts +1 -0
- package/dist/src/commands/daemon.test.js +293 -0
- package/dist/src/completion-fast.d.ts +22 -0
- package/dist/src/completion-fast.js +88 -0
- package/dist/src/completion-shared.d.ts +13 -0
- package/dist/src/completion-shared.js +61 -0
- package/dist/src/completion.d.ts +21 -0
- package/dist/src/completion.js +68 -0
- package/dist/src/completion.test.d.ts +1 -0
- package/dist/src/completion.test.js +24 -0
- package/dist/src/constants.d.ts +18 -0
- package/dist/src/constants.js +41 -0
- package/dist/src/convention-audit.d.ts +50 -0
- package/dist/src/convention-audit.js +553 -0
- package/dist/src/convention-audit.test.d.ts +1 -0
- package/dist/src/convention-audit.test.js +255 -0
- package/dist/src/daemon/server.d.ts +13 -0
- package/dist/src/daemon/server.js +190 -0
- package/dist/src/daemon/server.test.d.ts +1 -0
- package/dist/src/daemon/server.test.js +184 -0
- package/dist/src/daemon-utils.d.ts +19 -0
- package/dist/src/daemon-utils.js +46 -0
- package/dist/src/daemon.d.ts +1 -0
- package/dist/src/daemon.js +27 -0
- package/dist/src/daemon.test.d.ts +1 -0
- package/dist/src/daemon.test.js +69 -0
- package/dist/src/discovery.d.ts +46 -0
- package/dist/src/discovery.js +341 -0
- package/dist/src/doctor.d.ts +39 -0
- package/dist/src/doctor.js +174 -0
- package/dist/src/doctor.test.d.ts +1 -0
- package/dist/src/doctor.test.js +309 -0
- package/dist/src/download/article-download.d.ts +72 -0
- package/dist/src/download/article-download.js +305 -0
- package/dist/src/download/article-download.test.d.ts +1 -0
- package/dist/src/download/article-download.test.js +235 -0
- package/dist/src/download/index.d.ts +71 -0
- package/dist/src/download/index.js +363 -0
- package/dist/src/download/index.test.d.ts +1 -0
- package/dist/src/download/index.test.js +173 -0
- package/dist/src/download/media-download.d.ts +49 -0
- package/dist/src/download/media-download.js +127 -0
- package/dist/src/download/media-download.test.d.ts +1 -0
- package/dist/src/download/media-download.test.js +112 -0
- package/dist/src/download/progress.d.ts +36 -0
- package/dist/src/download/progress.js +120 -0
- package/dist/src/download/progress.test.d.ts +1 -0
- package/dist/src/download/progress.test.js +36 -0
- package/dist/src/electron-apps.d.ts +31 -0
- package/dist/src/electron-apps.js +83 -0
- package/dist/src/electron-apps.test.d.ts +1 -0
- package/dist/src/electron-apps.test.js +67 -0
- package/dist/src/engine.test.d.ts +1 -0
- package/dist/src/engine.test.js +312 -0
- package/dist/src/errors.d.ts +114 -0
- package/dist/src/errors.js +174 -0
- package/dist/src/errors.test.d.ts +1 -0
- package/dist/src/errors.test.js +109 -0
- package/dist/src/execution.d.ts +24 -0
- package/dist/src/execution.js +511 -0
- package/dist/src/execution.test.d.ts +1 -0
- package/dist/src/execution.test.js +657 -0
- package/dist/src/external-clis.yaml +0 -37
- package/dist/src/external.d.ts +49 -0
- package/dist/src/external.js +211 -0
- package/dist/src/external.test.d.ts +1 -0
- package/dist/src/external.test.js +95 -0
- package/dist/src/generate-release-notes-cli.test.d.ts +1 -0
- package/dist/src/generate-release-notes-cli.test.js +140 -0
- package/dist/src/help.d.ts +88 -0
- package/dist/src/help.js +556 -0
- package/dist/src/help.test.d.ts +1 -0
- package/dist/src/help.test.js +58 -0
- package/dist/src/hooks.d.ts +46 -0
- package/dist/src/hooks.js +58 -0
- package/dist/src/hooks.test.d.ts +4 -0
- package/dist/src/hooks.test.js +92 -0
- package/dist/src/interceptor.d.ts +44 -0
- package/dist/src/interceptor.js +183 -0
- package/dist/src/interceptor.test.d.ts +4 -0
- package/dist/src/interceptor.test.js +81 -0
- package/dist/src/launcher.d.ts +41 -0
- package/dist/src/launcher.js +226 -0
- package/dist/src/launcher.test.d.ts +1 -0
- package/dist/src/launcher.test.js +153 -0
- package/dist/src/logger.d.ts +26 -0
- package/dist/src/logger.js +49 -0
- package/dist/src/main.d.ts +5 -0
- package/dist/src/main.js +177 -0
- package/dist/src/manifest-types.d.ts +43 -0
- package/dist/src/manifest-types.js +9 -0
- package/dist/src/node-network.d.ts +10 -0
- package/dist/src/node-network.js +174 -0
- package/dist/src/node-network.test.d.ts +1 -0
- package/dist/src/node-network.test.js +55 -0
- package/dist/src/observation/artifact.d.ts +16 -0
- package/dist/src/observation/artifact.js +260 -0
- package/dist/src/observation/artifact.test.d.ts +1 -0
- package/dist/src/observation/artifact.test.js +121 -0
- package/dist/src/observation/events.d.ts +89 -0
- package/dist/src/observation/events.js +1 -0
- package/dist/src/observation/index.d.ts +7 -0
- package/dist/src/observation/index.js +7 -0
- package/dist/src/observation/manager.d.ts +9 -0
- package/dist/src/observation/manager.js +27 -0
- package/dist/src/observation/manager.test.d.ts +1 -0
- package/dist/src/observation/manager.test.js +13 -0
- package/dist/src/observation/redaction.d.ts +11 -0
- package/dist/src/observation/redaction.js +81 -0
- package/dist/src/observation/redaction.test.d.ts +1 -0
- package/dist/src/observation/redaction.test.js +32 -0
- package/dist/src/observation/retention.d.ts +32 -0
- package/dist/src/observation/retention.js +160 -0
- package/dist/src/observation/retention.test.d.ts +1 -0
- package/dist/src/observation/retention.test.js +118 -0
- package/dist/src/observation/ring-buffer.d.ts +22 -0
- package/dist/src/observation/ring-buffer.js +45 -0
- package/dist/src/observation/ring-buffer.test.d.ts +1 -0
- package/dist/src/observation/ring-buffer.test.js +22 -0
- package/dist/src/observation/session.d.ts +25 -0
- package/dist/src/observation/session.js +50 -0
- package/dist/src/output.d.ts +14 -0
- package/dist/src/output.js +152 -0
- package/dist/src/output.test.d.ts +1 -0
- package/dist/src/output.test.js +53 -0
- package/dist/src/package-exports.test.d.ts +1 -0
- package/dist/src/package-exports.test.js +112 -0
- package/dist/src/package-paths.d.ts +8 -0
- package/dist/src/package-paths.js +41 -0
- package/dist/src/pipeline/executor.d.ts +11 -0
- package/dist/src/pipeline/executor.js +93 -0
- package/dist/src/pipeline/executor.test.d.ts +4 -0
- package/dist/src/pipeline/executor.test.js +182 -0
- package/dist/src/pipeline/index.d.ts +5 -0
- package/dist/src/pipeline/index.js +5 -0
- package/dist/src/pipeline/registry.d.ts +28 -0
- package/dist/src/pipeline/registry.js +55 -0
- package/dist/src/pipeline/steps/browser.d.ts +13 -0
- package/dist/src/pipeline/steps/browser.js +86 -0
- package/dist/src/pipeline/steps/download.d.ts +18 -0
- package/dist/src/pipeline/steps/download.js +252 -0
- package/dist/src/pipeline/steps/download.test.d.ts +1 -0
- package/dist/src/pipeline/steps/download.test.js +102 -0
- package/dist/src/pipeline/steps/fetch.d.ts +5 -0
- package/dist/src/pipeline/steps/fetch.js +122 -0
- package/dist/src/pipeline/steps/fetch.test.d.ts +1 -0
- package/dist/src/pipeline/steps/fetch.test.js +117 -0
- package/dist/src/pipeline/steps/intercept.d.ts +5 -0
- package/dist/src/pipeline/steps/intercept.js +50 -0
- package/dist/src/pipeline/steps/tap.d.ts +12 -0
- package/dist/src/pipeline/steps/tap.js +93 -0
- package/dist/src/pipeline/steps/transform.d.ts +9 -0
- package/dist/src/pipeline/steps/transform.js +70 -0
- package/dist/src/pipeline/template.d.ts +17 -0
- package/dist/src/pipeline/template.js +344 -0
- package/dist/src/pipeline/template.test.d.ts +4 -0
- package/dist/src/pipeline/template.test.js +197 -0
- package/dist/src/pipeline/transform.test.d.ts +4 -0
- package/dist/src/pipeline/transform.test.js +133 -0
- package/dist/src/plugin-manifest.d.ts +70 -0
- package/dist/src/plugin-manifest.js +160 -0
- package/dist/src/plugin-manifest.test.d.ts +4 -0
- package/dist/src/plugin-manifest.test.js +179 -0
- package/dist/src/plugin-scaffold.d.ts +28 -0
- package/dist/src/plugin-scaffold.js +143 -0
- package/dist/src/plugin-scaffold.test.d.ts +4 -0
- package/dist/src/plugin-scaffold.test.js +83 -0
- package/dist/src/plugin.d.ts +146 -0
- package/dist/src/plugin.js +1303 -0
- package/dist/src/plugin.test.d.ts +4 -0
- package/dist/src/plugin.test.js +1363 -0
- package/dist/src/registry-api.d.ts +13 -0
- package/dist/src/registry-api.js +10 -0
- package/dist/src/registry.d.ts +123 -0
- package/dist/src/registry.js +125 -0
- package/dist/src/registry.test.d.ts +4 -0
- package/dist/src/registry.test.js +209 -0
- 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-copy.test.d.ts +1 -0
- package/dist/src/runtime-copy.test.js +29 -0
- package/dist/src/runtime-detect.d.ts +31 -0
- package/dist/src/runtime-detect.js +47 -0
- package/dist/src/runtime-detect.test.d.ts +1 -0
- package/dist/src/runtime-detect.test.js +39 -0
- package/dist/src/runtime-identity.test.d.ts +1 -0
- package/dist/src/runtime-identity.test.js +18 -0
- package/dist/src/runtime.d.ts +47 -0
- package/dist/src/runtime.js +54 -0
- package/dist/src/scripts/framework.d.ts +7 -0
- package/dist/src/scripts/framework.js +25 -0
- package/dist/src/scripts/interact.d.ts +4 -0
- package/dist/src/scripts/interact.js +20 -0
- package/dist/src/scripts/store.d.ts +13 -0
- package/dist/src/scripts/store.js +48 -0
- package/dist/src/serialization.d.ts +42 -0
- package/dist/src/serialization.js +103 -0
- package/dist/src/serialization.test.d.ts +1 -0
- package/dist/src/serialization.test.js +78 -0
- package/dist/src/skills.d.ts +14 -0
- package/dist/src/skills.js +127 -0
- package/dist/src/skills.test.d.ts +1 -0
- package/dist/src/skills.test.js +71 -0
- package/dist/src/snapshotFormatter.d.ts +11 -0
- package/dist/src/snapshotFormatter.js +336 -0
- package/dist/src/snapshotFormatter.test.d.ts +7 -0
- package/dist/src/snapshotFormatter.test.js +521 -0
- package/dist/src/tui.d.ts +28 -0
- package/dist/src/tui.js +179 -0
- package/dist/src/tui.test.d.ts +1 -0
- package/dist/src/tui.test.js +19 -0
- package/dist/src/types.d.ts +236 -0
- package/dist/src/types.js +7 -0
- package/dist/src/update-check.d.ts +66 -0
- package/dist/src/update-check.js +206 -0
- package/dist/src/update-check.test.d.ts +1 -0
- package/dist/src/update-check.test.js +117 -0
- package/dist/src/utils.d.ts +57 -0
- package/dist/src/utils.js +152 -0
- package/dist/src/utils.test.d.ts +1 -0
- package/dist/src/utils.test.js +155 -0
- package/dist/src/validate.d.ts +21 -0
- package/dist/src/validate.js +130 -0
- package/dist/src/validate.test.d.ts +9 -0
- package/dist/src/validate.test.js +90 -0
- package/dist/src/verify.d.ts +26 -0
- package/dist/src/verify.js +67 -0
- package/dist/src/version.d.ts +4 -0
- package/dist/src/version.js +22 -0
- package/package.json +7 -3
- package/scripts/check-package-bin.mjs +95 -0
- 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/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/adapter-shadow.test.d.ts} +0 -0
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stealth anti-detection module.
|
|
3
|
+
*
|
|
4
|
+
* Generates JS code that patches browser globals to hide automation
|
|
5
|
+
* fingerprints (e.g. navigator.webdriver, missing chrome object, empty
|
|
6
|
+
* plugin list). Injected before page scripts run so that websites cannot
|
|
7
|
+
* detect CDP / extension-based control.
|
|
8
|
+
*
|
|
9
|
+
* Inspired by puppeteer-extra-plugin-stealth.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Return a self-contained JS string that, when evaluated in a page context,
|
|
13
|
+
* applies all stealth patches. Safe to call multiple times — the guard flag
|
|
14
|
+
* ensures patches are applied only once.
|
|
15
|
+
*
|
|
16
|
+
* The generated string is pure static (no dynamic parameters), so we cache
|
|
17
|
+
* it after the first call to avoid re-building ~350 lines on every goto().
|
|
18
|
+
*/
|
|
19
|
+
let _cachedStealthJs;
|
|
20
|
+
export function generateStealthJs() {
|
|
21
|
+
if (_cachedStealthJs !== undefined)
|
|
22
|
+
return _cachedStealthJs;
|
|
23
|
+
return (_cachedStealthJs = `
|
|
24
|
+
(() => {
|
|
25
|
+
// Guard: prevent double-injection across separate CDP evaluations.
|
|
26
|
+
// We cannot use a closure variable (each eval is a fresh scope), and
|
|
27
|
+
// window properties / Symbols are discoverable by anti-bot scripts.
|
|
28
|
+
// Instead, stash the flag in a non-enumerable getter on a built-in
|
|
29
|
+
// prototype that fingerprinters are unlikely to scan.
|
|
30
|
+
const _gProto = EventTarget.prototype;
|
|
31
|
+
const _gKey = '__lsn'; // looks like an internal listener cache
|
|
32
|
+
if (_gProto[_gKey]) return 'skipped';
|
|
33
|
+
try {
|
|
34
|
+
Object.defineProperty(_gProto, _gKey, { value: true, enumerable: false, configurable: true });
|
|
35
|
+
} catch {}
|
|
36
|
+
|
|
37
|
+
// 1. navigator.webdriver → false
|
|
38
|
+
// Most common check; Playwright/Puppeteer/CDP set this to true.
|
|
39
|
+
// Real Chrome returns false (not undefined) — returning undefined is
|
|
40
|
+
// itself a detection signal for advanced fingerprinters.
|
|
41
|
+
try {
|
|
42
|
+
Object.defineProperty(navigator, 'webdriver', {
|
|
43
|
+
get: () => false,
|
|
44
|
+
configurable: true,
|
|
45
|
+
});
|
|
46
|
+
} catch {}
|
|
47
|
+
|
|
48
|
+
// 2. window.chrome stub
|
|
49
|
+
// Real Chrome exposes window.chrome with runtime, loadTimes, csi.
|
|
50
|
+
// Headless/automated Chrome may not have it.
|
|
51
|
+
try {
|
|
52
|
+
if (!window.chrome) {
|
|
53
|
+
window.chrome = {
|
|
54
|
+
runtime: {
|
|
55
|
+
onConnect: { addListener: () => {}, removeListener: () => {} },
|
|
56
|
+
onMessage: { addListener: () => {}, removeListener: () => {} },
|
|
57
|
+
},
|
|
58
|
+
loadTimes: () => ({}),
|
|
59
|
+
csi: () => ({}),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
} catch {}
|
|
63
|
+
|
|
64
|
+
// 3. navigator.plugins — fake population only if empty
|
|
65
|
+
// Real user browser already has plugins; only patch in automated/headless
|
|
66
|
+
// contexts where the list is empty (overwriting real plugins with fakes
|
|
67
|
+
// would be counterproductive and detectable).
|
|
68
|
+
try {
|
|
69
|
+
if (!navigator.plugins || navigator.plugins.length === 0) {
|
|
70
|
+
const fakePlugins = [
|
|
71
|
+
{ name: 'PDF Viewer', filename: 'internal-pdf-viewer', description: 'Portable Document Format' },
|
|
72
|
+
{ name: 'Chrome PDF Viewer', filename: 'internal-pdf-viewer', description: '' },
|
|
73
|
+
{ name: 'Chromium PDF Viewer', filename: 'internal-pdf-viewer', description: '' },
|
|
74
|
+
{ name: 'Microsoft Edge PDF Viewer', filename: 'internal-pdf-viewer', description: '' },
|
|
75
|
+
{ name: 'WebKit built-in PDF', filename: 'internal-pdf-viewer', description: '' },
|
|
76
|
+
];
|
|
77
|
+
fakePlugins.item = (i) => fakePlugins[i] || null;
|
|
78
|
+
fakePlugins.namedItem = (n) => fakePlugins.find(p => p.name === n) || null;
|
|
79
|
+
fakePlugins.refresh = () => {};
|
|
80
|
+
Object.defineProperty(navigator, 'plugins', {
|
|
81
|
+
get: () => fakePlugins,
|
|
82
|
+
configurable: true,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
} catch {}
|
|
86
|
+
|
|
87
|
+
// 4. navigator.languages — guarantee non-empty
|
|
88
|
+
// Some automated contexts return undefined or empty array.
|
|
89
|
+
try {
|
|
90
|
+
if (!navigator.languages || navigator.languages.length === 0) {
|
|
91
|
+
Object.defineProperty(navigator, 'languages', {
|
|
92
|
+
get: () => ['en-US', 'en'],
|
|
93
|
+
configurable: true,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
} catch {}
|
|
97
|
+
|
|
98
|
+
// 5. Permissions.query — normalize notification permission
|
|
99
|
+
// Headless Chrome throws on Permissions.query({ name: 'notifications' }).
|
|
100
|
+
try {
|
|
101
|
+
const origQuery = window.Permissions?.prototype?.query;
|
|
102
|
+
if (origQuery) {
|
|
103
|
+
window.Permissions.prototype.query = function (parameters) {
|
|
104
|
+
if (parameters?.name === 'notifications') {
|
|
105
|
+
return Promise.resolve({ state: Notification.permission, onchange: null });
|
|
106
|
+
}
|
|
107
|
+
return origQuery.call(this, parameters);
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
} catch {}
|
|
111
|
+
|
|
112
|
+
// 6. Clean automation artifacts
|
|
113
|
+
// Remove properties left by Playwright, Puppeteer, or CDP injection.
|
|
114
|
+
try {
|
|
115
|
+
delete window.__playwright;
|
|
116
|
+
delete window.__puppeteer;
|
|
117
|
+
// ChromeDriver injects cdc_ prefixed globals; the suffix varies by version,
|
|
118
|
+
// so scan window for any matching property rather than hardcoding names.
|
|
119
|
+
for (const prop of Object.getOwnPropertyNames(window)) {
|
|
120
|
+
if (prop.startsWith('cdc_') || prop.startsWith('__cdc_')) {
|
|
121
|
+
try { delete window[prop]; } catch {}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
} catch {}
|
|
125
|
+
|
|
126
|
+
// 7. CDP stack trace cleanup
|
|
127
|
+
// Runtime.evaluate injects scripts whose source URLs appear in Error
|
|
128
|
+
// stack traces (e.g. __puppeteer_evaluation_script__, pptr:, debugger://).
|
|
129
|
+
// Websites detect automation by doing: new Error().stack and inspecting it.
|
|
130
|
+
// We override the stack property getter on Error.prototype to filter them.
|
|
131
|
+
// Note: Error.prepareStackTrace is V8/Node-only and not available in
|
|
132
|
+
// browser page context, so we use a property descriptor approach instead.
|
|
133
|
+
// We use generic protocol patterns instead of product-specific names to
|
|
134
|
+
// also catch our own injected code frames without leaking identifiers.
|
|
135
|
+
try {
|
|
136
|
+
const _origDescriptor = Object.getOwnPropertyDescriptor(Error.prototype, 'stack');
|
|
137
|
+
const _cdpPatterns = [
|
|
138
|
+
'puppeteer_evaluation_script',
|
|
139
|
+
'pptr:',
|
|
140
|
+
'debugger://',
|
|
141
|
+
'__playwright',
|
|
142
|
+
'__puppeteer',
|
|
143
|
+
];
|
|
144
|
+
if (_origDescriptor && _origDescriptor.get) {
|
|
145
|
+
Object.defineProperty(Error.prototype, 'stack', {
|
|
146
|
+
get: function () {
|
|
147
|
+
const raw = _origDescriptor.get.call(this);
|
|
148
|
+
if (typeof raw !== 'string') return raw;
|
|
149
|
+
return raw.split('\\n').filter(line =>
|
|
150
|
+
!_cdpPatterns.some(p => line.includes(p))
|
|
151
|
+
).join('\\n');
|
|
152
|
+
},
|
|
153
|
+
configurable: true,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
} catch {}
|
|
157
|
+
|
|
158
|
+
// ── Shared toString disguise infrastructure ──
|
|
159
|
+
// Save the pristine Function.prototype.toString BEFORE any patches,
|
|
160
|
+
// so all subsequent disguises use the real native reference.
|
|
161
|
+
// Anti-bot scripts detect per-instance toString overrides via:
|
|
162
|
+
// Function.hasOwnProperty('toString') → true if patched
|
|
163
|
+
// Function.prototype.toString.call(fn) !== fn.toString()
|
|
164
|
+
// Instead we patch Function.prototype.toString once with a WeakMap
|
|
165
|
+
// lookup, making disguised functions indistinguishable from native.
|
|
166
|
+
const _origToString = Function.prototype.toString;
|
|
167
|
+
const _disguised = new WeakMap();
|
|
168
|
+
try {
|
|
169
|
+
Object.defineProperty(Function.prototype, 'toString', {
|
|
170
|
+
value: function() {
|
|
171
|
+
const override = _disguised.get(this);
|
|
172
|
+
return override !== undefined ? override : _origToString.call(this);
|
|
173
|
+
},
|
|
174
|
+
writable: true, configurable: true,
|
|
175
|
+
});
|
|
176
|
+
} catch {}
|
|
177
|
+
const _disguise = (fn, name) => {
|
|
178
|
+
_disguised.set(fn, 'function ' + name + '() { [native code] }');
|
|
179
|
+
try { Object.defineProperty(fn, 'name', { value: name, configurable: true }); } catch {}
|
|
180
|
+
return fn;
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
// 8. Anti-debugger statement trap
|
|
184
|
+
// Sites inject debugger statements to detect DevTools/CDP.
|
|
185
|
+
// When a CDP debugger is attached, the statement pauses execution
|
|
186
|
+
// and the site measures the time gap to confirm automation.
|
|
187
|
+
// We neutralize this by overriding the Function constructor and
|
|
188
|
+
// eval to strip debugger statements from dynamically created code.
|
|
189
|
+
// Note: this does NOT affect static debugger statements in parsed
|
|
190
|
+
// scripts — those require CDP Debugger.setBreakpointsActive(false)
|
|
191
|
+
// which we handle at the extension level.
|
|
192
|
+
// Caveat: the regex targets standalone debugger statements (preceded
|
|
193
|
+
// by a statement boundary) to minimise false positives inside string
|
|
194
|
+
// literals, but cannot perfectly distinguish all cases without a
|
|
195
|
+
// full parser. This is an acceptable trade-off for stealth code.
|
|
196
|
+
try {
|
|
197
|
+
const _OrigFunction = Function;
|
|
198
|
+
// Match standalone debugger statements preceded by a statement
|
|
199
|
+
// boundary (start of string, semicolon, brace, or newline).
|
|
200
|
+
// This avoids most false positives inside string literals like
|
|
201
|
+
// "use debugger mode" while still catching the anti-bot patterns.
|
|
202
|
+
const _debuggerRe = /(?:^|(?<=[;{}\\n\\r]))\\s*debugger\\s*;?/g;
|
|
203
|
+
const _cleanDebugger = (src) => typeof src === 'string' ? src.replace(_debuggerRe, '') : src;
|
|
204
|
+
// Patch Function constructor to strip debugger from dynamic code.
|
|
205
|
+
// Support both Function('code') and new Function('code') via
|
|
206
|
+
// new.target / Reflect.construct.
|
|
207
|
+
const _PatchedFunction = function(...args) {
|
|
208
|
+
if (args.length > 0) {
|
|
209
|
+
args[args.length - 1] = _cleanDebugger(args[args.length - 1]);
|
|
210
|
+
}
|
|
211
|
+
if (new.target) {
|
|
212
|
+
return Reflect.construct(_OrigFunction, args, new.target);
|
|
213
|
+
}
|
|
214
|
+
return _OrigFunction.apply(this, args);
|
|
215
|
+
};
|
|
216
|
+
_PatchedFunction.prototype = _OrigFunction.prototype;
|
|
217
|
+
Object.setPrototypeOf(_PatchedFunction, _OrigFunction);
|
|
218
|
+
_disguise(_PatchedFunction, 'Function');
|
|
219
|
+
try { window.Function = _PatchedFunction; } catch {}
|
|
220
|
+
|
|
221
|
+
// Patch eval to strip debugger
|
|
222
|
+
const _origEval = window.eval;
|
|
223
|
+
const _patchedEval = function(code) {
|
|
224
|
+
return _origEval.call(this, _cleanDebugger(code));
|
|
225
|
+
};
|
|
226
|
+
_disguise(_patchedEval, 'eval');
|
|
227
|
+
try { window.eval = _patchedEval; } catch {}
|
|
228
|
+
} catch {}
|
|
229
|
+
|
|
230
|
+
// 9. Console method fingerprinting defense
|
|
231
|
+
// When CDP Runtime.enable is called, Chrome replaces console.log etc.
|
|
232
|
+
// with CDP-bound versions. These bound functions have a different
|
|
233
|
+
// toString() output: "function log() { [native code] }" becomes
|
|
234
|
+
// something like "function () { [native code] }" (no name) or the
|
|
235
|
+
// bound function signature leaks. Anti-bot scripts check:
|
|
236
|
+
// console.log.toString().includes('[native code]')
|
|
237
|
+
// console.log.name === 'log'
|
|
238
|
+
// We re-wrap console methods and register them via the shared
|
|
239
|
+
// _disguise infrastructure so Function.prototype.toString.call()
|
|
240
|
+
// also returns the correct native string.
|
|
241
|
+
try {
|
|
242
|
+
const _consoleMethods = ['log', 'warn', 'error', 'info', 'debug', 'table', 'trace', 'dir', 'group', 'groupEnd', 'groupCollapsed', 'clear', 'count', 'assert', 'profile', 'profileEnd', 'time', 'timeEnd', 'timeStamp'];
|
|
243
|
+
for (const _m of _consoleMethods) {
|
|
244
|
+
if (typeof console[_m] !== 'function') continue;
|
|
245
|
+
const _origMethod = console[_m];
|
|
246
|
+
const _nativeStr = 'function ' + _m + '() { [native code] }';
|
|
247
|
+
// Only patch if toString is wrong (i.e. CDP has replaced it)
|
|
248
|
+
try {
|
|
249
|
+
const _currentStr = _origToString.call(_origMethod);
|
|
250
|
+
if (_currentStr === _nativeStr) continue; // already looks native
|
|
251
|
+
} catch {}
|
|
252
|
+
const _wrapper = function() { return _origMethod.apply(console, arguments); };
|
|
253
|
+
Object.defineProperty(_wrapper, 'length', { value: _origMethod.length || 0, configurable: true });
|
|
254
|
+
_disguise(_wrapper, _m);
|
|
255
|
+
try { console[_m] = _wrapper; } catch {}
|
|
256
|
+
}
|
|
257
|
+
} catch {}
|
|
258
|
+
|
|
259
|
+
// 10. window.outerWidth/outerHeight defense
|
|
260
|
+
// When DevTools or CDP debugger is attached, Chrome may alter the
|
|
261
|
+
// window dimensions. Anti-bot scripts compare outerWidth/innerWidth
|
|
262
|
+
// and outerHeight/innerHeight — a significant difference indicates
|
|
263
|
+
// DevTools is open. We freeze the relationship so the delta stays
|
|
264
|
+
// consistent with a normal browser window.
|
|
265
|
+
// Thresholds: width delta > 100px or height delta > 200px indicates
|
|
266
|
+
// a docked DevTools panel. When triggered, we report outerWidth
|
|
267
|
+
// equal to innerWidth (normal for maximised windows) and
|
|
268
|
+
// outerHeight as innerHeight + the captured "normal" delta (capped
|
|
269
|
+
// to a reasonable range), so the result is plausible across OSes.
|
|
270
|
+
try {
|
|
271
|
+
const _normalWidthDelta = window.outerWidth - window.innerWidth;
|
|
272
|
+
const _normalHeightDelta = window.outerHeight - window.innerHeight;
|
|
273
|
+
// Only patch if the delta looks suspicious (e.g. DevTools docked)
|
|
274
|
+
if (_normalWidthDelta > 100 || _normalHeightDelta > 200) {
|
|
275
|
+
Object.defineProperty(window, 'outerWidth', {
|
|
276
|
+
get: () => window.innerWidth,
|
|
277
|
+
configurable: true,
|
|
278
|
+
});
|
|
279
|
+
// Use a clamped height offset (40-120px covers macOS ~78px,
|
|
280
|
+
// Windows ~40px, and Linux ~37-50px title bar heights).
|
|
281
|
+
const _heightOffset = Math.max(40, Math.min(120, _normalHeightDelta));
|
|
282
|
+
Object.defineProperty(window, 'outerHeight', {
|
|
283
|
+
get: () => window.innerHeight + _heightOffset,
|
|
284
|
+
configurable: true,
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
} catch {}
|
|
288
|
+
|
|
289
|
+
// 11. Performance API cleanup
|
|
290
|
+
// CDP injects internal resources and timing entries that don't exist
|
|
291
|
+
// in normal browsing. Filter entries with debugger/devtools URLs.
|
|
292
|
+
try {
|
|
293
|
+
const _origGetEntries = Performance.prototype.getEntries;
|
|
294
|
+
const _origGetByType = Performance.prototype.getEntriesByType;
|
|
295
|
+
const _origGetByName = Performance.prototype.getEntriesByName;
|
|
296
|
+
const _suspiciousPatterns = ['debugger', 'devtools', '__puppeteer', '__playwright', 'pptr:'];
|
|
297
|
+
const _filterEntries = (entries) => {
|
|
298
|
+
if (!Array.isArray(entries)) return entries;
|
|
299
|
+
return entries.filter(e => {
|
|
300
|
+
const name = e.name || '';
|
|
301
|
+
return !_suspiciousPatterns.some(p => name.includes(p));
|
|
302
|
+
});
|
|
303
|
+
};
|
|
304
|
+
Performance.prototype.getEntries = function() {
|
|
305
|
+
return _filterEntries(_origGetEntries.call(this));
|
|
306
|
+
};
|
|
307
|
+
Performance.prototype.getEntriesByType = function(type) {
|
|
308
|
+
return _filterEntries(_origGetByType.call(this, type));
|
|
309
|
+
};
|
|
310
|
+
Performance.prototype.getEntriesByName = function(name, type) {
|
|
311
|
+
return _filterEntries(_origGetByName.call(this, name, type));
|
|
312
|
+
};
|
|
313
|
+
} catch {}
|
|
314
|
+
|
|
315
|
+
// 12. WebDriver-related property defense
|
|
316
|
+
// Some anti-bot systems check additional navigator properties
|
|
317
|
+
// and document properties that may indicate automation.
|
|
318
|
+
try {
|
|
319
|
+
// document.$cdc_ properties (ChromeDriver specific, backup for #6)
|
|
320
|
+
for (const _prop of Object.getOwnPropertyNames(document)) {
|
|
321
|
+
if (_prop.startsWith('$cdc_') || _prop.startsWith('$chrome_')) {
|
|
322
|
+
try { delete document[_prop]; } catch {}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
} catch {}
|
|
326
|
+
|
|
327
|
+
// 13. Iframe contentWindow.chrome consistency
|
|
328
|
+
// Anti-bot scripts create iframes and check if
|
|
329
|
+
// iframe.contentWindow.chrome exists and matches the parent.
|
|
330
|
+
// CDP-controlled pages may have inconsistent iframe contexts.
|
|
331
|
+
try {
|
|
332
|
+
const _origHTMLIFrame = HTMLIFrameElement.prototype;
|
|
333
|
+
const _origContentWindow = Object.getOwnPropertyDescriptor(_origHTMLIFrame, 'contentWindow');
|
|
334
|
+
if (_origContentWindow && _origContentWindow.get) {
|
|
335
|
+
Object.defineProperty(_origHTMLIFrame, 'contentWindow', {
|
|
336
|
+
get: function() {
|
|
337
|
+
const _w = _origContentWindow.get.call(this);
|
|
338
|
+
if (_w) {
|
|
339
|
+
try {
|
|
340
|
+
if (!_w.chrome) {
|
|
341
|
+
Object.defineProperty(_w, 'chrome', {
|
|
342
|
+
value: window.chrome,
|
|
343
|
+
writable: true,
|
|
344
|
+
configurable: true,
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
} catch {}
|
|
348
|
+
}
|
|
349
|
+
return _w;
|
|
350
|
+
},
|
|
351
|
+
configurable: true,
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
} catch {}
|
|
355
|
+
|
|
356
|
+
return 'applied';
|
|
357
|
+
})()
|
|
358
|
+
`);
|
|
359
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { generateStealthJs } from './stealth.js';
|
|
3
|
+
/**
|
|
4
|
+
* Tests for the stealth anti-detection module.
|
|
5
|
+
*
|
|
6
|
+
* We test the generated JS string for expected content and structure.
|
|
7
|
+
* Evaluating in Node is fragile because stealth patches target browser
|
|
8
|
+
* globals (navigator, Performance, HTMLIFrameElement) that don't exist
|
|
9
|
+
* or behave differently in Node. Instead we verify the code string
|
|
10
|
+
* contains the right patches and is syntactically valid.
|
|
11
|
+
*/
|
|
12
|
+
describe('generateStealthJs', () => {
|
|
13
|
+
it('returns a non-empty string', () => {
|
|
14
|
+
const code = generateStealthJs();
|
|
15
|
+
expect(typeof code).toBe('string');
|
|
16
|
+
expect(code.length).toBeGreaterThan(0);
|
|
17
|
+
});
|
|
18
|
+
it('is a valid self-contained IIFE', () => {
|
|
19
|
+
const code = generateStealthJs();
|
|
20
|
+
// Should start/end as an IIFE
|
|
21
|
+
expect(code.trim()).toMatch(/^\(\(\) => \{/);
|
|
22
|
+
expect(code.trim()).toMatch(/\}\)\(\)$/);
|
|
23
|
+
});
|
|
24
|
+
it('patches navigator.webdriver', () => {
|
|
25
|
+
const code = generateStealthJs();
|
|
26
|
+
expect(code).toContain("navigator, 'webdriver'");
|
|
27
|
+
expect(code).toContain('() => false');
|
|
28
|
+
});
|
|
29
|
+
it('stubs window.chrome', () => {
|
|
30
|
+
const code = generateStealthJs();
|
|
31
|
+
expect(code).toContain('window.chrome');
|
|
32
|
+
expect(code).toContain('runtime');
|
|
33
|
+
expect(code).toContain('loadTimes');
|
|
34
|
+
expect(code).toContain('csi');
|
|
35
|
+
});
|
|
36
|
+
it('fakes navigator.plugins if empty', () => {
|
|
37
|
+
const code = generateStealthJs();
|
|
38
|
+
expect(code).toContain('navigator.plugins');
|
|
39
|
+
expect(code).toContain('PDF Viewer');
|
|
40
|
+
expect(code).toContain('Chrome PDF Viewer');
|
|
41
|
+
});
|
|
42
|
+
it('ensures navigator.languages is non-empty', () => {
|
|
43
|
+
const code = generateStealthJs();
|
|
44
|
+
expect(code).toContain('navigator.languages');
|
|
45
|
+
expect(code).toContain("'en-US'");
|
|
46
|
+
});
|
|
47
|
+
it('normalizes Permissions.query for notifications', () => {
|
|
48
|
+
const code = generateStealthJs();
|
|
49
|
+
expect(code).toContain('Permissions');
|
|
50
|
+
expect(code).toContain('notifications');
|
|
51
|
+
});
|
|
52
|
+
it('cleans automation artifacts', () => {
|
|
53
|
+
const code = generateStealthJs();
|
|
54
|
+
expect(code).toContain('__playwright');
|
|
55
|
+
expect(code).toContain('__puppeteer');
|
|
56
|
+
expect(code).toContain("'cdc_'");
|
|
57
|
+
expect(code).toContain("'__cdc_'");
|
|
58
|
+
});
|
|
59
|
+
it('filters CDP patterns from Error.stack', () => {
|
|
60
|
+
const code = generateStealthJs();
|
|
61
|
+
expect(code).toContain('puppeteer_evaluation_script');
|
|
62
|
+
expect(code).toContain("'pptr:'");
|
|
63
|
+
expect(code).toContain("'debugger://'");
|
|
64
|
+
});
|
|
65
|
+
it('neutralizes debugger statement traps', () => {
|
|
66
|
+
const code = generateStealthJs();
|
|
67
|
+
// Should patch Function constructor with new.target / Reflect.construct
|
|
68
|
+
expect(code).toContain('_OrigFunction');
|
|
69
|
+
expect(code).toContain('_PatchedFunction');
|
|
70
|
+
expect(code).toContain('new.target');
|
|
71
|
+
expect(code).toContain('Reflect.construct');
|
|
72
|
+
// Should patch eval
|
|
73
|
+
expect(code).toContain('_origEval');
|
|
74
|
+
expect(code).toContain('_patchedEval');
|
|
75
|
+
// Regex to strip debugger (lookbehind for statement boundaries)
|
|
76
|
+
expect(code).toContain('_debuggerRe');
|
|
77
|
+
});
|
|
78
|
+
it('uses shared toString disguise via WeakMap', () => {
|
|
79
|
+
const code = generateStealthJs();
|
|
80
|
+
// Shared infrastructure at the top of the IIFE
|
|
81
|
+
expect(code).toContain('_origToString');
|
|
82
|
+
expect(code).toContain('WeakMap');
|
|
83
|
+
expect(code).toContain('_disguised');
|
|
84
|
+
expect(code).toContain('_disguise');
|
|
85
|
+
// Should NOT have per-instance toString overrides on Function/eval
|
|
86
|
+
// (they go through _disguise instead)
|
|
87
|
+
});
|
|
88
|
+
it('defends console method fingerprinting', () => {
|
|
89
|
+
const code = generateStealthJs();
|
|
90
|
+
expect(code).toContain('_consoleMethods');
|
|
91
|
+
expect(code).toContain("'log'");
|
|
92
|
+
expect(code).toContain("'warn'");
|
|
93
|
+
expect(code).toContain("'error'");
|
|
94
|
+
expect(code).toContain('[native code]');
|
|
95
|
+
// Uses saved _origToString reference
|
|
96
|
+
expect(code).toContain('_origToString.call');
|
|
97
|
+
});
|
|
98
|
+
it('defends window dimension detection', () => {
|
|
99
|
+
const code = generateStealthJs();
|
|
100
|
+
expect(code).toContain('outerWidth');
|
|
101
|
+
expect(code).toContain('outerHeight');
|
|
102
|
+
expect(code).toContain('innerWidth');
|
|
103
|
+
expect(code).toContain('innerHeight');
|
|
104
|
+
});
|
|
105
|
+
it('filters Performance API entries', () => {
|
|
106
|
+
const code = generateStealthJs();
|
|
107
|
+
expect(code).toContain('getEntries');
|
|
108
|
+
expect(code).toContain('getEntriesByType');
|
|
109
|
+
expect(code).toContain('getEntriesByName');
|
|
110
|
+
expect(code).toContain('_suspiciousPatterns');
|
|
111
|
+
});
|
|
112
|
+
it('cleans document $cdc_ properties', () => {
|
|
113
|
+
const code = generateStealthJs();
|
|
114
|
+
expect(code).toContain("'$cdc_'");
|
|
115
|
+
expect(code).toContain("'$chrome_'");
|
|
116
|
+
});
|
|
117
|
+
it('patches iframe contentWindow.chrome consistency', () => {
|
|
118
|
+
const code = generateStealthJs();
|
|
119
|
+
expect(code).toContain('contentWindow');
|
|
120
|
+
expect(code).toContain('HTMLIFrameElement');
|
|
121
|
+
});
|
|
122
|
+
it('uses non-enumerable guard flag on EventTarget.prototype', () => {
|
|
123
|
+
const code = generateStealthJs();
|
|
124
|
+
expect(code).toContain('EventTarget.prototype');
|
|
125
|
+
expect(code).toContain("'__lsn'");
|
|
126
|
+
expect(code).toContain('enumerable: false');
|
|
127
|
+
});
|
|
128
|
+
it('generates syntactically valid JavaScript', () => {
|
|
129
|
+
const code = generateStealthJs();
|
|
130
|
+
// new Function() parses the code without executing it in a real
|
|
131
|
+
// browser context, catching syntax errors from template literal issues.
|
|
132
|
+
expect(() => new Function(code)).not.toThrow();
|
|
133
|
+
});
|
|
134
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser tab management helpers: extract, diff, and cleanup tab state.
|
|
3
|
+
*/
|
|
4
|
+
export declare function extractTabEntries(raw: unknown): Array<{
|
|
5
|
+
index: number;
|
|
6
|
+
identity: string;
|
|
7
|
+
}>;
|
|
8
|
+
export declare function extractTabIdentities(raw: unknown): string[];
|
|
9
|
+
export declare function diffTabIndexes(initialIdentities: string[], currentTabs: Array<{
|
|
10
|
+
index: number;
|
|
11
|
+
identity: string;
|
|
12
|
+
}>): number[];
|
|
13
|
+
export declare function appendLimited(current: string, chunk: string, limit: number): string;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser tab management helpers: extract, diff, and cleanup tab state.
|
|
3
|
+
*/
|
|
4
|
+
export function extractTabEntries(raw) {
|
|
5
|
+
if (Array.isArray(raw)) {
|
|
6
|
+
return raw.map((tab, index) => ({
|
|
7
|
+
index,
|
|
8
|
+
identity: [
|
|
9
|
+
tab?.id ?? '',
|
|
10
|
+
tab?.url ?? '',
|
|
11
|
+
tab?.title ?? '',
|
|
12
|
+
tab?.name ?? '',
|
|
13
|
+
].join('|'),
|
|
14
|
+
}));
|
|
15
|
+
}
|
|
16
|
+
if (typeof raw === 'string') {
|
|
17
|
+
return raw
|
|
18
|
+
.split('\n')
|
|
19
|
+
.map(line => line.trim())
|
|
20
|
+
.filter(Boolean)
|
|
21
|
+
.map(line => {
|
|
22
|
+
// Match tab list format: "- 0: (current) [title](url)" or "- 1: [title](url)"
|
|
23
|
+
const tabMatch = line.match(/^-\s+(\d+):\s*(.*)$/);
|
|
24
|
+
if (tabMatch) {
|
|
25
|
+
return {
|
|
26
|
+
index: parseInt(tabMatch[1], 10),
|
|
27
|
+
identity: tabMatch[2].trim() || `tab-${tabMatch[1]}`,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
// Legacy format: "Tab 0 ..."
|
|
31
|
+
const legacyMatch = line.match(/Tab\s+(\d+)\s*(.*)$/);
|
|
32
|
+
if (legacyMatch) {
|
|
33
|
+
return {
|
|
34
|
+
index: parseInt(legacyMatch[1], 10),
|
|
35
|
+
identity: legacyMatch[2].trim() || `tab-${legacyMatch[1]}`,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
})
|
|
40
|
+
.filter((entry) => entry !== null);
|
|
41
|
+
}
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
export function extractTabIdentities(raw) {
|
|
45
|
+
return extractTabEntries(raw).map(tab => tab.identity);
|
|
46
|
+
}
|
|
47
|
+
export function diffTabIndexes(initialIdentities, currentTabs) {
|
|
48
|
+
if (initialIdentities.length === 0 || currentTabs.length === 0)
|
|
49
|
+
return [];
|
|
50
|
+
const remaining = new Map();
|
|
51
|
+
for (const identity of initialIdentities) {
|
|
52
|
+
remaining.set(identity, (remaining.get(identity) ?? 0) + 1);
|
|
53
|
+
}
|
|
54
|
+
const tabsToClose = [];
|
|
55
|
+
for (const tab of currentTabs) {
|
|
56
|
+
const count = remaining.get(tab.identity) ?? 0;
|
|
57
|
+
if (count > 0) {
|
|
58
|
+
remaining.set(tab.identity, count - 1);
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
tabsToClose.push(tab.index);
|
|
62
|
+
}
|
|
63
|
+
return tabsToClose.sort((a, b) => b - a);
|
|
64
|
+
}
|
|
65
|
+
export function appendLimited(current, chunk, limit) {
|
|
66
|
+
const next = current + chunk;
|
|
67
|
+
if (next.length <= limit)
|
|
68
|
+
return next;
|
|
69
|
+
return next.slice(-limit);
|
|
70
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured error types for the target resolution system.
|
|
3
|
+
*
|
|
4
|
+
* Every browser action (click, type, select, get) that targets a DOM element
|
|
5
|
+
* goes through the unified resolver. When resolution fails, one of these
|
|
6
|
+
* structured errors is thrown so that AI agents and adapter authors get
|
|
7
|
+
* actionable diagnostics instead of a generic "Element not found".
|
|
8
|
+
*
|
|
9
|
+
* Numeric-ref codes (from snapshot indices):
|
|
10
|
+
* - not_found: the ref no longer exists in the DOM
|
|
11
|
+
* - stale_ref: the ref still exists but points to a different element
|
|
12
|
+
*
|
|
13
|
+
* CSS-selector codes (from `--selector <css>` entrypoints):
|
|
14
|
+
* - invalid_selector: selector syntax rejected by querySelectorAll
|
|
15
|
+
* - selector_not_found: 0 matches
|
|
16
|
+
* - selector_ambiguous: >1 matches for a write op without --nth
|
|
17
|
+
* - selector_nth_out_of_range: --nth beyond matches_n
|
|
18
|
+
* - not_editable: target exists but cannot accept text input
|
|
19
|
+
* - not_checkable: target exists but cannot be checked/unchecked
|
|
20
|
+
* - not_file_input: target exists but is not a usable file input
|
|
21
|
+
*/
|
|
22
|
+
export type TargetErrorCode = 'not_found' | 'stale_ref' | 'invalid_selector' | 'selector_not_found' | 'selector_ambiguous' | 'selector_nth_out_of_range' | 'not_editable' | 'not_checkable' | 'not_file_input';
|
|
23
|
+
export interface TargetErrorInfo {
|
|
24
|
+
code: TargetErrorCode;
|
|
25
|
+
message: string;
|
|
26
|
+
hint: string;
|
|
27
|
+
candidates?: string[];
|
|
28
|
+
/** CSS-path match count, when the error was raised mid-resolution */
|
|
29
|
+
matches_n?: number;
|
|
30
|
+
}
|
|
31
|
+
export declare class TargetError extends Error {
|
|
32
|
+
readonly code: TargetErrorCode;
|
|
33
|
+
readonly hint: string;
|
|
34
|
+
readonly candidates?: string[];
|
|
35
|
+
readonly matches_n?: number;
|
|
36
|
+
constructor(info: TargetErrorInfo);
|
|
37
|
+
/** Serialize for structured output to AI agents */
|
|
38
|
+
toJSON(): TargetErrorInfo;
|
|
39
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured error types for the target resolution system.
|
|
3
|
+
*
|
|
4
|
+
* Every browser action (click, type, select, get) that targets a DOM element
|
|
5
|
+
* goes through the unified resolver. When resolution fails, one of these
|
|
6
|
+
* structured errors is thrown so that AI agents and adapter authors get
|
|
7
|
+
* actionable diagnostics instead of a generic "Element not found".
|
|
8
|
+
*
|
|
9
|
+
* Numeric-ref codes (from snapshot indices):
|
|
10
|
+
* - not_found: the ref no longer exists in the DOM
|
|
11
|
+
* - stale_ref: the ref still exists but points to a different element
|
|
12
|
+
*
|
|
13
|
+
* CSS-selector codes (from `--selector <css>` entrypoints):
|
|
14
|
+
* - invalid_selector: selector syntax rejected by querySelectorAll
|
|
15
|
+
* - selector_not_found: 0 matches
|
|
16
|
+
* - selector_ambiguous: >1 matches for a write op without --nth
|
|
17
|
+
* - selector_nth_out_of_range: --nth beyond matches_n
|
|
18
|
+
* - not_editable: target exists but cannot accept text input
|
|
19
|
+
* - not_checkable: target exists but cannot be checked/unchecked
|
|
20
|
+
* - not_file_input: target exists but is not a usable file input
|
|
21
|
+
*/
|
|
22
|
+
export class TargetError extends Error {
|
|
23
|
+
code;
|
|
24
|
+
hint;
|
|
25
|
+
candidates;
|
|
26
|
+
matches_n;
|
|
27
|
+
constructor(info) {
|
|
28
|
+
super(info.message);
|
|
29
|
+
this.name = 'TargetError';
|
|
30
|
+
this.code = info.code;
|
|
31
|
+
this.hint = info.hint;
|
|
32
|
+
this.candidates = info.candidates;
|
|
33
|
+
this.matches_n = info.matches_n;
|
|
34
|
+
}
|
|
35
|
+
/** Serialize for structured output to AI agents */
|
|
36
|
+
toJSON() {
|
|
37
|
+
return {
|
|
38
|
+
code: this.code,
|
|
39
|
+
message: this.message,
|
|
40
|
+
hint: this.hint,
|
|
41
|
+
...(this.candidates && { candidates: this.candidates }),
|
|
42
|
+
...(this.matches_n !== undefined && { matches_n: this.matches_n }),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|