@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,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for dom-snapshot.ts: DOM snapshot engine.
|
|
3
|
+
*
|
|
4
|
+
* Since the engine generates JavaScript strings for in-page evaluation,
|
|
5
|
+
* these tests validate:
|
|
6
|
+
* 1. The generated code is syntactically valid JS
|
|
7
|
+
* 2. Options are correctly embedded
|
|
8
|
+
* 3. The output structure matches expected format
|
|
9
|
+
* 4. All features are present (Shadow DOM, iframe, table, diff, etc.)
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for dom-snapshot.ts: DOM snapshot engine.
|
|
3
|
+
*
|
|
4
|
+
* Since the engine generates JavaScript strings for in-page evaluation,
|
|
5
|
+
* these tests validate:
|
|
6
|
+
* 1. The generated code is syntactically valid JS
|
|
7
|
+
* 2. Options are correctly embedded
|
|
8
|
+
* 3. The output structure matches expected format
|
|
9
|
+
* 4. All features are present (Shadow DOM, iframe, table, diff, etc.)
|
|
10
|
+
*/
|
|
11
|
+
import { describe, it, expect } from 'vitest';
|
|
12
|
+
import { generateSnapshotJs, scrollToRefJs, getFormStateJs } from './dom-snapshot.js';
|
|
13
|
+
describe('generateSnapshotJs', () => {
|
|
14
|
+
it('returns a non-empty string', () => {
|
|
15
|
+
const js = generateSnapshotJs();
|
|
16
|
+
expect(typeof js).toBe('string');
|
|
17
|
+
expect(js.length).toBeGreaterThan(100);
|
|
18
|
+
});
|
|
19
|
+
it('generates syntactically valid JS (can be parsed)', () => {
|
|
20
|
+
const js = generateSnapshotJs();
|
|
21
|
+
expect(() => new Function(js)).not.toThrow();
|
|
22
|
+
});
|
|
23
|
+
it('embeds default options correctly', () => {
|
|
24
|
+
const js = generateSnapshotJs();
|
|
25
|
+
expect(js).toContain('VIEWPORT_EXPAND = 800');
|
|
26
|
+
expect(js).toContain('MAX_DEPTH = 50');
|
|
27
|
+
expect(js).toContain('INTERACTIVE_ONLY = false');
|
|
28
|
+
expect(js).toContain('MAX_TEXT_LEN = 120');
|
|
29
|
+
expect(js).toContain('INCLUDE_SCROLL_INFO = true');
|
|
30
|
+
expect(js).toContain('BBOX_DEDUP = true');
|
|
31
|
+
expect(js).toContain('INCLUDE_SHADOW_DOM = true');
|
|
32
|
+
expect(js).toContain('INCLUDE_IFRAMES = true');
|
|
33
|
+
expect(js).toContain('PAINT_ORDER_CHECK = true');
|
|
34
|
+
expect(js).toContain('ANNOTATE_REFS = true');
|
|
35
|
+
expect(js).toContain('REPORT_HIDDEN = true');
|
|
36
|
+
expect(js).toContain('FILTER_ADS = true');
|
|
37
|
+
expect(js).toContain('MARKDOWN_TABLES = true');
|
|
38
|
+
expect(js).toContain('PREV_HASHES = null');
|
|
39
|
+
});
|
|
40
|
+
it('embeds custom options correctly', () => {
|
|
41
|
+
const js = generateSnapshotJs({
|
|
42
|
+
viewportExpand: 2000,
|
|
43
|
+
maxDepth: 30,
|
|
44
|
+
interactiveOnly: true,
|
|
45
|
+
maxTextLength: 200,
|
|
46
|
+
includeScrollInfo: false,
|
|
47
|
+
bboxDedup: false,
|
|
48
|
+
includeShadowDom: false,
|
|
49
|
+
includeIframes: false,
|
|
50
|
+
maxIframes: 3,
|
|
51
|
+
paintOrderCheck: false,
|
|
52
|
+
annotateRefs: false,
|
|
53
|
+
reportHidden: false,
|
|
54
|
+
filterAds: false,
|
|
55
|
+
markdownTables: false,
|
|
56
|
+
});
|
|
57
|
+
expect(js).toContain('VIEWPORT_EXPAND = 2000');
|
|
58
|
+
expect(js).toContain('MAX_DEPTH = 30');
|
|
59
|
+
expect(js).toContain('INTERACTIVE_ONLY = true');
|
|
60
|
+
expect(js).toContain('MAX_TEXT_LEN = 200');
|
|
61
|
+
expect(js).toContain('INCLUDE_SCROLL_INFO = false');
|
|
62
|
+
expect(js).toContain('BBOX_DEDUP = false');
|
|
63
|
+
expect(js).toContain('INCLUDE_SHADOW_DOM = false');
|
|
64
|
+
expect(js).toContain('INCLUDE_IFRAMES = false');
|
|
65
|
+
expect(js).toContain('MAX_IFRAMES = 3');
|
|
66
|
+
expect(js).toContain('PAINT_ORDER_CHECK = false');
|
|
67
|
+
expect(js).toContain('ANNOTATE_REFS = false');
|
|
68
|
+
expect(js).toContain('REPORT_HIDDEN = false');
|
|
69
|
+
expect(js).toContain('FILTER_ADS = false');
|
|
70
|
+
expect(js).toContain('MARKDOWN_TABLES = false');
|
|
71
|
+
});
|
|
72
|
+
it('clamps maxDepth between 1 and 200', () => {
|
|
73
|
+
expect(generateSnapshotJs({ maxDepth: -5 })).toContain('MAX_DEPTH = 1');
|
|
74
|
+
expect(generateSnapshotJs({ maxDepth: 999 })).toContain('MAX_DEPTH = 200');
|
|
75
|
+
expect(generateSnapshotJs({ maxDepth: 75 })).toContain('MAX_DEPTH = 75');
|
|
76
|
+
});
|
|
77
|
+
it('wraps output as an IIFE', () => {
|
|
78
|
+
const js = generateSnapshotJs();
|
|
79
|
+
expect(js.startsWith('(() =>')).toBe(true);
|
|
80
|
+
expect(js.trimEnd().endsWith(')()')).toBe(true);
|
|
81
|
+
});
|
|
82
|
+
it('embeds previousHashes for incremental diff', () => {
|
|
83
|
+
const hashes = JSON.stringify(['12345', '67890']);
|
|
84
|
+
const js = generateSnapshotJs({ previousHashes: hashes });
|
|
85
|
+
expect(js).toContain('new Set(["12345","67890"])');
|
|
86
|
+
});
|
|
87
|
+
it('includes all core features in generated code', () => {
|
|
88
|
+
const js = generateSnapshotJs();
|
|
89
|
+
// Tag filtering
|
|
90
|
+
expect(js).toContain('SKIP_TAGS');
|
|
91
|
+
expect(js).toContain("'script'");
|
|
92
|
+
expect(js).toContain("'style'");
|
|
93
|
+
// SVG collapsing
|
|
94
|
+
expect(js).toContain('SVG_CHILDREN');
|
|
95
|
+
// Interactive detection
|
|
96
|
+
expect(js).toContain('INTERACTIVE_TAGS');
|
|
97
|
+
expect(js).toContain('INTERACTIVE_ROLES');
|
|
98
|
+
expect(js).toContain('isInteractive');
|
|
99
|
+
// Visibility
|
|
100
|
+
expect(js).toContain('isVisibleByCSS');
|
|
101
|
+
expect(js).toContain('isInExpandedViewport');
|
|
102
|
+
// BBox dedup
|
|
103
|
+
expect(js).toContain('isContainedBy');
|
|
104
|
+
expect(js).toContain('PROPAGATING_TAGS');
|
|
105
|
+
expect(js).toContain('PROPAGATING_ROLES');
|
|
106
|
+
expect(js).toContain('isBboxPropagator');
|
|
107
|
+
expect(js).toContain('isDistinctivelyInteractive');
|
|
108
|
+
// Shadow DOM
|
|
109
|
+
expect(js).toContain('shadowRoot');
|
|
110
|
+
expect(js).toContain('|shadow|');
|
|
111
|
+
// iframe
|
|
112
|
+
expect(js).toContain('walkIframe');
|
|
113
|
+
expect(js).toContain('|iframe|');
|
|
114
|
+
// Paint order
|
|
115
|
+
expect(js).toContain('isOccludedByOverlay');
|
|
116
|
+
expect(js).toContain('elementFromPoint');
|
|
117
|
+
// Ad filtering
|
|
118
|
+
expect(js).toContain('isAdElement');
|
|
119
|
+
expect(js).toContain('AD_PATTERNS');
|
|
120
|
+
// data-ref annotation
|
|
121
|
+
expect(js).toContain('data-webcmd-ref');
|
|
122
|
+
// Hidden elements report
|
|
123
|
+
expect(js).toContain('hiddenInteractives');
|
|
124
|
+
expect(js).toContain('hidden_interactive');
|
|
125
|
+
// Incremental diff
|
|
126
|
+
expect(js).toContain('hashElement');
|
|
127
|
+
expect(js).toContain('currentHashes');
|
|
128
|
+
expect(js).toContain('__webcmd_prev_hashes');
|
|
129
|
+
// Table serialization
|
|
130
|
+
expect(js).toContain('serializeTable');
|
|
131
|
+
expect(js).toContain('|table|');
|
|
132
|
+
// Synthetic attributes
|
|
133
|
+
expect(js).toContain("'YYYY-MM-DD'");
|
|
134
|
+
expect(js).toContain('value=••••');
|
|
135
|
+
// Page metadata
|
|
136
|
+
expect(js).toContain('location.href');
|
|
137
|
+
expect(js).toContain('document.title');
|
|
138
|
+
});
|
|
139
|
+
it('contains proper attribute whitelist', () => {
|
|
140
|
+
const js = generateSnapshotJs();
|
|
141
|
+
const expectedAttrs = [
|
|
142
|
+
'aria-label', 'aria-expanded', 'aria-checked', 'aria-selected',
|
|
143
|
+
'placeholder', 'href', 'role', 'data-testid', 'autocomplete',
|
|
144
|
+
];
|
|
145
|
+
for (const attr of expectedAttrs) {
|
|
146
|
+
expect(js).toContain(`'${attr}'`);
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
it('includes scroll info formatting', () => {
|
|
150
|
+
const js = generateSnapshotJs();
|
|
151
|
+
expect(js).toContain('scrollHeight');
|
|
152
|
+
expect(js).toContain('scrollTop');
|
|
153
|
+
expect(js).toContain('|scroll|');
|
|
154
|
+
expect(js).toContain('page_scroll');
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
describe('BBox 99% containment filter', () => {
|
|
158
|
+
it('propagates bbox for both PROPAGATING_TAGS and PROPAGATING_ROLES', () => {
|
|
159
|
+
const js = generateSnapshotJs();
|
|
160
|
+
// Role-based propagator list covers the common wrapper-as-control patterns
|
|
161
|
+
// that show up as <div role=button><svg/><span/></div> on modern SPAs.
|
|
162
|
+
for (const role of ['button', 'link', 'menuitem', 'tab', 'option']) {
|
|
163
|
+
expect(js).toContain(`'${role}'`);
|
|
164
|
+
}
|
|
165
|
+
// propagate site uses the unified helper, not only the tag set
|
|
166
|
+
expect(js).toContain('isBboxPropagator(el, tag)');
|
|
167
|
+
});
|
|
168
|
+
it('suppresses interactive descendants at 0.99 containment when they are not distinctive', () => {
|
|
169
|
+
const js = generateSnapshotJs();
|
|
170
|
+
expect(js).toContain('isContainedBy(rect, parentPropagatingRect, 0.99)');
|
|
171
|
+
expect(js).toContain('!isDistinctivelyInteractive(el)');
|
|
172
|
+
// The suppression path flips the local interactive flag so the node is
|
|
173
|
+
// still emitted (for text / shape) but does not get its own [N] ref.
|
|
174
|
+
expect(js).toContain('interactive = false');
|
|
175
|
+
});
|
|
176
|
+
it('does not suppress inputs / href-bearing anchors even when fully contained', () => {
|
|
177
|
+
const js = generateSnapshotJs();
|
|
178
|
+
// Guards inside isDistinctivelyInteractive
|
|
179
|
+
expect(js).toContain("tag === 'input'");
|
|
180
|
+
expect(js).toContain("tag === 'select'");
|
|
181
|
+
expect(js).toContain("tag === 'textarea'");
|
|
182
|
+
expect(js).toContain("tag === 'a'");
|
|
183
|
+
expect(js).toContain("el.hasAttribute('href')");
|
|
184
|
+
// aria-label / aria-labelledby / id / test-id / name preserve distinctness
|
|
185
|
+
expect(js).toContain("el.hasAttribute('aria-label')");
|
|
186
|
+
expect(js).toContain("el.hasAttribute('aria-labelledby')");
|
|
187
|
+
expect(js).toContain("el.id");
|
|
188
|
+
expect(js).toContain("el.getAttribute('data-testid')");
|
|
189
|
+
expect(js).toContain("el.hasAttribute('name')");
|
|
190
|
+
});
|
|
191
|
+
it('keeps the existing 0.95 non-interactive dedup tier in place', () => {
|
|
192
|
+
const js = generateSnapshotJs();
|
|
193
|
+
// The original non-interactive bbox filter is still present alongside the
|
|
194
|
+
// new interactive tier — two complementary thresholds, not a replacement.
|
|
195
|
+
expect(js).toContain('isContainedBy(rect, parentPropagatingRect, 0.95)');
|
|
196
|
+
});
|
|
197
|
+
it('bbox containment branches are gated on BBOX_DEDUP flag', () => {
|
|
198
|
+
const off = generateSnapshotJs({ bboxDedup: false });
|
|
199
|
+
// When the option is off, the filter becomes inert (BBOX_DEDUP = false)
|
|
200
|
+
// but the inlined helpers still ship — we only guard at the call sites.
|
|
201
|
+
expect(off).toContain('BBOX_DEDUP = false');
|
|
202
|
+
expect(off).toContain('isBboxPropagator');
|
|
203
|
+
expect(off).toContain('isDistinctivelyInteractive');
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
describe('scrollToRefJs', () => {
|
|
207
|
+
it('generates valid JS', () => {
|
|
208
|
+
const js = scrollToRefJs('42');
|
|
209
|
+
expect(() => new Function(js)).not.toThrow();
|
|
210
|
+
});
|
|
211
|
+
it('targets data-webcmd-ref', () => {
|
|
212
|
+
const js = scrollToRefJs('7');
|
|
213
|
+
expect(js).toContain('data-webcmd-ref');
|
|
214
|
+
expect(js).toContain('scrollIntoView');
|
|
215
|
+
expect(js).toContain('"7"');
|
|
216
|
+
});
|
|
217
|
+
it('falls back to data-ref', () => {
|
|
218
|
+
const js = scrollToRefJs('3');
|
|
219
|
+
expect(js).toContain('data-ref');
|
|
220
|
+
});
|
|
221
|
+
it('returns scrolled info', () => {
|
|
222
|
+
const js = scrollToRefJs('1');
|
|
223
|
+
expect(js).toContain('scrolled: true');
|
|
224
|
+
expect(js).toContain('tag:');
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
describe('getFormStateJs', () => {
|
|
228
|
+
it('generates valid JS', () => {
|
|
229
|
+
const js = getFormStateJs();
|
|
230
|
+
expect(() => new Function(js)).not.toThrow();
|
|
231
|
+
});
|
|
232
|
+
it('collects form elements', () => {
|
|
233
|
+
const js = getFormStateJs();
|
|
234
|
+
expect(js).toContain('document.forms');
|
|
235
|
+
expect(js).toContain('form.elements');
|
|
236
|
+
});
|
|
237
|
+
it('collects orphan fields', () => {
|
|
238
|
+
const js = getFormStateJs();
|
|
239
|
+
expect(js).toContain('orphanFields');
|
|
240
|
+
expect(js).toContain('el.form');
|
|
241
|
+
});
|
|
242
|
+
it('handles different input types', () => {
|
|
243
|
+
const js = getFormStateJs();
|
|
244
|
+
expect(js).toContain('checkbox');
|
|
245
|
+
expect(js).toContain('radio');
|
|
246
|
+
expect(js).toContain('password');
|
|
247
|
+
expect(js).toContain('contenteditable');
|
|
248
|
+
});
|
|
249
|
+
it('extracts labels', () => {
|
|
250
|
+
const js = getFormStateJs();
|
|
251
|
+
expect(js).toContain('aria-label');
|
|
252
|
+
expect(js).toContain('label[for=');
|
|
253
|
+
expect(js).toContain('closest');
|
|
254
|
+
expect(js).toContain('placeholder');
|
|
255
|
+
});
|
|
256
|
+
it('masks passwords', () => {
|
|
257
|
+
const js = getFormStateJs();
|
|
258
|
+
expect(js).toContain('••••');
|
|
259
|
+
});
|
|
260
|
+
it('includes data-webcmd-ref in output', () => {
|
|
261
|
+
const js = getFormStateJs();
|
|
262
|
+
expect(js).toContain('data-webcmd-ref');
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
describe('Search Element Detection', () => {
|
|
266
|
+
it('includes SEARCH_INDICATORS set', () => {
|
|
267
|
+
const js = generateSnapshotJs();
|
|
268
|
+
expect(js).toContain('SEARCH_INDICATORS');
|
|
269
|
+
expect(js).toContain('search');
|
|
270
|
+
expect(js).toContain('magnify');
|
|
271
|
+
expect(js).toContain('glass');
|
|
272
|
+
});
|
|
273
|
+
it('includes hasFormControlDescendant function', () => {
|
|
274
|
+
const js = generateSnapshotJs();
|
|
275
|
+
expect(js).toContain('hasFormControlDescendant');
|
|
276
|
+
expect(js).toContain('input');
|
|
277
|
+
expect(js).toContain('select');
|
|
278
|
+
expect(js).toContain('textarea');
|
|
279
|
+
});
|
|
280
|
+
it('includes isSearchElement function', () => {
|
|
281
|
+
const js = generateSnapshotJs();
|
|
282
|
+
expect(js).toContain('isSearchElement');
|
|
283
|
+
expect(js).toContain('className');
|
|
284
|
+
expect(js).toContain('data-');
|
|
285
|
+
});
|
|
286
|
+
it('checks label wrapper detection in isInteractive', () => {
|
|
287
|
+
const js = generateSnapshotJs();
|
|
288
|
+
// Label elements without "for" attribute should check for form control descendants
|
|
289
|
+
expect(js).toContain('hasFormControlDescendant(el, 2)');
|
|
290
|
+
});
|
|
291
|
+
it('checks span wrapper detection in isInteractive', () => {
|
|
292
|
+
const js = generateSnapshotJs();
|
|
293
|
+
// Span elements should check for form control descendants
|
|
294
|
+
expect(js).toContain("tag === 'span'");
|
|
295
|
+
});
|
|
296
|
+
it('integrates search element detection into isInteractive', () => {
|
|
297
|
+
const js = generateSnapshotJs();
|
|
298
|
+
expect(js).toContain('isSearchElement(el)');
|
|
299
|
+
});
|
|
300
|
+
// Blocker B regression: compound contract must be emitted by `browser state`,
|
|
301
|
+
// not only by `browser find --css`. Otherwise agents inspecting the default
|
|
302
|
+
// snapshot still have to round-trip `find` on every date/select/file control.
|
|
303
|
+
it('inlines compoundInfoOf() and attaches compound info to each interactive ref', () => {
|
|
304
|
+
const js = generateSnapshotJs();
|
|
305
|
+
expect(js).toContain('function compoundInfoOf(el)');
|
|
306
|
+
// Wiring: the walk body should call compoundInfoOf on every interactive node
|
|
307
|
+
expect(js).toContain('compoundInfoOf(el)');
|
|
308
|
+
// And collect them into a per-ref map keyed by the same [N] index as the tree
|
|
309
|
+
expect(js).toContain('compoundInfos');
|
|
310
|
+
// And emit a sidecar section after the tree so agents can find the JSON
|
|
311
|
+
expect(js).toContain("'compounds ('");
|
|
312
|
+
});
|
|
313
|
+
});
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser connection error helpers.
|
|
3
|
+
*
|
|
4
|
+
* Simplified — no more token/runtime/CDP classification.
|
|
5
|
+
* The daemon architecture has a single failure mode: daemon not reachable or runtime not ready.
|
|
6
|
+
*/
|
|
7
|
+
import { BrowserConnectError, type BrowserConnectKind } from '../errors.js';
|
|
8
|
+
/**
|
|
9
|
+
* Unified browser error classification.
|
|
10
|
+
*
|
|
11
|
+
* All transient error detection lives here — daemon-client, pipeline executor,
|
|
12
|
+
* and page retry logic all use this single system instead of maintaining
|
|
13
|
+
* separate pattern lists.
|
|
14
|
+
*/
|
|
15
|
+
/** Error category — determines which layer should retry. */
|
|
16
|
+
export type BrowserErrorKind = 'extension-transient' | 'target-navigation' | 'non-retryable';
|
|
17
|
+
/** How the caller should handle the error. */
|
|
18
|
+
export interface RetryAdvice {
|
|
19
|
+
/** Error category — callers use this to decide whether *they* should retry. */
|
|
20
|
+
kind: BrowserErrorKind;
|
|
21
|
+
/** Whether the error is transient and worth retrying. */
|
|
22
|
+
retryable: boolean;
|
|
23
|
+
/** Suggested delay before retry (ms). */
|
|
24
|
+
delayMs: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Classify a browser error and return retry advice.
|
|
28
|
+
*
|
|
29
|
+
* Single source of truth for "is this error transient?" across all layers.
|
|
30
|
+
*/
|
|
31
|
+
export declare function classifyBrowserError(err: unknown): RetryAdvice;
|
|
32
|
+
/**
|
|
33
|
+
* Check if an error is a transient browser error worth retrying.
|
|
34
|
+
* Convenience wrapper around classifyBrowserError().
|
|
35
|
+
*/
|
|
36
|
+
export declare function isTransientBrowserError(err: unknown): boolean;
|
|
37
|
+
export type ConnectFailureKind = BrowserConnectKind;
|
|
38
|
+
export declare function formatBrowserConnectError(kind: ConnectFailureKind, detail?: string): BrowserConnectError;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser connection error helpers.
|
|
3
|
+
*
|
|
4
|
+
* Simplified — no more token/runtime/CDP classification.
|
|
5
|
+
* The daemon architecture has a single failure mode: daemon not reachable or runtime not ready.
|
|
6
|
+
*/
|
|
7
|
+
import { BrowserConnectError } from '../errors.js';
|
|
8
|
+
import { DEFAULT_DAEMON_PORT } from '../constants.js';
|
|
9
|
+
/**
|
|
10
|
+
* Runtime/daemon transient patterns — service worker restarts, attach races,
|
|
11
|
+
* tab closure, daemon hiccups. These warrant a longer retry delay (~1500ms)
|
|
12
|
+
* because the runtime needs time to recover.
|
|
13
|
+
*/
|
|
14
|
+
const EXTENSION_TRANSIENT_PATTERNS = [
|
|
15
|
+
'Extension disconnected',
|
|
16
|
+
'Extension not connected',
|
|
17
|
+
'attach failed',
|
|
18
|
+
'Detached while handling command',
|
|
19
|
+
'Debugger is not attached to the tab',
|
|
20
|
+
'no longer exists',
|
|
21
|
+
'No tab with id',
|
|
22
|
+
'CDP connection',
|
|
23
|
+
'Daemon command failed',
|
|
24
|
+
'No window with id',
|
|
25
|
+
];
|
|
26
|
+
/**
|
|
27
|
+
* CDP target navigation patterns — SPA client-side redirects can invalidate the
|
|
28
|
+
* CDP target after chrome.tabs reports 'complete'. These warrant a shorter retry
|
|
29
|
+
* delay (~200ms) because the new document is usually available quickly.
|
|
30
|
+
*/
|
|
31
|
+
const TARGET_NAVIGATION_PATTERNS = [
|
|
32
|
+
'Inspected target navigated or closed',
|
|
33
|
+
];
|
|
34
|
+
function errorMessage(err) {
|
|
35
|
+
return err instanceof Error ? err.message : String(err);
|
|
36
|
+
}
|
|
37
|
+
const ERROR_CODE_ADVICE = {
|
|
38
|
+
attach_failed: { kind: 'extension-transient', retryable: true, delayMs: 1500 },
|
|
39
|
+
tab_gone: { kind: 'extension-transient', retryable: true, delayMs: 1500 },
|
|
40
|
+
target_navigated: { kind: 'target-navigation', retryable: true, delayMs: 200 },
|
|
41
|
+
detached_mid_command: { kind: 'non-retryable', retryable: false, delayMs: 0 },
|
|
42
|
+
cdp_timeout: { kind: 'non-retryable', retryable: false, delayMs: 0 },
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Classify a browser error and return retry advice.
|
|
46
|
+
*
|
|
47
|
+
* Single source of truth for "is this error transient?" across all layers.
|
|
48
|
+
*/
|
|
49
|
+
export function classifyBrowserError(err) {
|
|
50
|
+
const code = err && typeof err === 'object' ? err.code : undefined;
|
|
51
|
+
if (typeof code === 'string' && ERROR_CODE_ADVICE[code]) {
|
|
52
|
+
return ERROR_CODE_ADVICE[code];
|
|
53
|
+
}
|
|
54
|
+
const msg = errorMessage(err);
|
|
55
|
+
// Runtime/daemon transient errors — longer recovery time
|
|
56
|
+
if (EXTENSION_TRANSIENT_PATTERNS.some(p => msg.includes(p))) {
|
|
57
|
+
return { kind: 'extension-transient', retryable: true, delayMs: 1500 };
|
|
58
|
+
}
|
|
59
|
+
// CDP target navigation errors — shorter recovery time
|
|
60
|
+
if (TARGET_NAVIGATION_PATTERNS.some(p => msg.includes(p))) {
|
|
61
|
+
return { kind: 'target-navigation', retryable: true, delayMs: 200 };
|
|
62
|
+
}
|
|
63
|
+
// CDP protocol error with target/context invalidation (e.g., -32000 "target closed" or
|
|
64
|
+
// -32000 "Cannot find default execution context" — both indicate the inspected target
|
|
65
|
+
// went away and a fresh attach should recover).
|
|
66
|
+
if (msg.includes('-32000') && /target|context/i.test(msg)) {
|
|
67
|
+
return { kind: 'target-navigation', retryable: true, delayMs: 200 };
|
|
68
|
+
}
|
|
69
|
+
return { kind: 'non-retryable', retryable: false, delayMs: 0 };
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Check if an error is a transient browser error worth retrying.
|
|
73
|
+
* Convenience wrapper around classifyBrowserError().
|
|
74
|
+
*/
|
|
75
|
+
export function isTransientBrowserError(err) {
|
|
76
|
+
return classifyBrowserError(err).retryable;
|
|
77
|
+
}
|
|
78
|
+
export function formatBrowserConnectError(kind, detail) {
|
|
79
|
+
switch (kind) {
|
|
80
|
+
case 'daemon-not-running':
|
|
81
|
+
return new BrowserConnectError('Cannot connect to webcmd daemon.' + (detail ? `\n\n${detail}` : ''), `Run \`webcmd doctor\` to diagnose, or \`webcmd daemon restart\` to force a fresh daemon. Default port is ${DEFAULT_DAEMON_PORT}.`, kind);
|
|
82
|
+
case 'runtime-not-ready':
|
|
83
|
+
case 'extension-not-connected':
|
|
84
|
+
return new BrowserConnectError('Browser runtime is not ready.' + (detail ? `\n\n${detail}` : ''), 'Run `webcmd daemon restart`. If this is the first browser-backed command, wait for CloakBrowser to finish installing its browser binary, then retry.', 'runtime-not-ready');
|
|
85
|
+
case 'command-failed':
|
|
86
|
+
return new BrowserConnectError(`Browser command failed: ${detail ?? 'unknown error'}`, undefined, kind);
|
|
87
|
+
default:
|
|
88
|
+
return new BrowserConnectError(detail ?? 'Failed to connect to browser', undefined, kind);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { classifyBrowserError, isTransientBrowserError } from './errors.js';
|
|
3
|
+
describe('classifyBrowserError', () => {
|
|
4
|
+
it('classifies extension transient errors with 1500ms delay', () => {
|
|
5
|
+
for (const msg of [
|
|
6
|
+
'Extension disconnected',
|
|
7
|
+
'Extension not connected',
|
|
8
|
+
'attach failed',
|
|
9
|
+
'Detached while handling command',
|
|
10
|
+
'Debugger is not attached to the tab: 123',
|
|
11
|
+
'no longer exists',
|
|
12
|
+
'No tab with id: 456',
|
|
13
|
+
'CDP connection reset',
|
|
14
|
+
'Daemon command failed',
|
|
15
|
+
'No window with id: 123',
|
|
16
|
+
]) {
|
|
17
|
+
const advice = classifyBrowserError(new Error(msg));
|
|
18
|
+
expect(advice.kind, `expected "${msg}" → extension-transient`).toBe('extension-transient');
|
|
19
|
+
expect(advice.retryable).toBe(true);
|
|
20
|
+
expect(advice.delayMs).toBe(1500);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
it('classifies CDP target navigation errors with 200ms delay', () => {
|
|
24
|
+
const advice = classifyBrowserError(new Error('Inspected target navigated or closed'));
|
|
25
|
+
expect(advice.kind).toBe('target-navigation');
|
|
26
|
+
expect(advice.retryable).toBe(true);
|
|
27
|
+
expect(advice.delayMs).toBe(200);
|
|
28
|
+
});
|
|
29
|
+
it('classifies CDP -32000 target errors with 200ms delay', () => {
|
|
30
|
+
const advice = classifyBrowserError(new Error('{"code":-32000,"message":"Target closed"}'));
|
|
31
|
+
expect(advice.kind).toBe('target-navigation');
|
|
32
|
+
expect(advice.retryable).toBe(true);
|
|
33
|
+
expect(advice.delayMs).toBe(200);
|
|
34
|
+
});
|
|
35
|
+
it('classifies CDP -32000 execution-context errors with 200ms delay', () => {
|
|
36
|
+
const advice = classifyBrowserError(new Error('{"code":-32000,"message":"Cannot find default execution context"}'));
|
|
37
|
+
expect(advice.kind).toBe('target-navigation');
|
|
38
|
+
expect(advice.retryable).toBe(true);
|
|
39
|
+
expect(advice.delayMs).toBe(200);
|
|
40
|
+
});
|
|
41
|
+
it('returns non-retryable for unrelated errors', () => {
|
|
42
|
+
for (const msg of ['Permission denied', 'malformed exec payload', 'SyntaxError']) {
|
|
43
|
+
const advice = classifyBrowserError(new Error(msg));
|
|
44
|
+
expect(advice.kind).toBe('non-retryable');
|
|
45
|
+
expect(advice.retryable).toBe(false);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
it('handles non-Error values', () => {
|
|
49
|
+
expect(classifyBrowserError('Extension disconnected').kind).toBe('extension-transient');
|
|
50
|
+
expect(classifyBrowserError(42).kind).toBe('non-retryable');
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
describe('isTransientBrowserError (convenience wrapper)', () => {
|
|
54
|
+
it('returns true for transient errors', () => {
|
|
55
|
+
expect(isTransientBrowserError(new Error('No window with id: 123'))).toBe(true);
|
|
56
|
+
});
|
|
57
|
+
it('returns false for non-transient errors', () => {
|
|
58
|
+
expect(isTransientBrowserError(new Error('Permission denied'))).toBe(false);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `browser extract` — agent-native article/content reading channel.
|
|
3
|
+
*
|
|
4
|
+
* Pipeline (from first principles — agents want the *content*, not the DOM):
|
|
5
|
+
* 1. Scope: select `--selector` (default: document.body or <main>/<article>)
|
|
6
|
+
* 2. Denoise: strip script/style/nav/header/footer/aside/iframe/svg/form, inline noise
|
|
7
|
+
* 3. Convert: HTML → Markdown via shared `htmlToMarkdown` (turndown)
|
|
8
|
+
* 4. Chunk: paragraph-boundary-aware slicing with `next_start_char` cursor
|
|
9
|
+
*
|
|
10
|
+
* Why a separate command:
|
|
11
|
+
* - `get html --as json` returns tree structure; useless for "read the article".
|
|
12
|
+
* - `get text` flattens everything; loses headings, lists, links.
|
|
13
|
+
* - Markdown is the agent-readable middle ground: structure preserved, noise gone.
|
|
14
|
+
*
|
|
15
|
+
* Continuation contract: the envelope always carries `start`, `end`,
|
|
16
|
+
* `total_chars`, and `next_start_char` (null when the last chunk was emitted).
|
|
17
|
+
* Agents pass `--start <next>` to continue. No session state required.
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Returns the JS expression string used with `page.evaluate` to produce the
|
|
21
|
+
* cleaned HTML subtree that we then hand to `htmlToMarkdown`. We do the
|
|
22
|
+
* denoise/clone inside the page so we can use DOM APIs (querySelectorAll,
|
|
23
|
+
* cloneNode) rather than regex on serialized HTML.
|
|
24
|
+
*/
|
|
25
|
+
export declare function buildExtractHtmlJs(selector: string | null): string;
|
|
26
|
+
export interface ExtractChunkOptions {
|
|
27
|
+
content: string;
|
|
28
|
+
start: number;
|
|
29
|
+
chunkSize: number;
|
|
30
|
+
}
|
|
31
|
+
export interface ExtractChunkResult {
|
|
32
|
+
content: string;
|
|
33
|
+
start: number;
|
|
34
|
+
end: number;
|
|
35
|
+
nextStartChar: number | null;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Slice `content` into one chunk starting at `start` with target size
|
|
39
|
+
* `chunkSize`. When the chunk would land mid-paragraph, we pull the break
|
|
40
|
+
* back to the nearest `\n\n` (or `\n`) within a small window to keep the
|
|
41
|
+
* output readable. If no boundary is found, we hard-cut at `start+chunkSize`.
|
|
42
|
+
*/
|
|
43
|
+
export declare function chunkMarkdown(opts: ExtractChunkOptions): ExtractChunkResult;
|
|
44
|
+
export interface RunExtractOptions {
|
|
45
|
+
html: string;
|
|
46
|
+
url: string;
|
|
47
|
+
title: string;
|
|
48
|
+
selector: string | null;
|
|
49
|
+
start: number;
|
|
50
|
+
chunkSize: number;
|
|
51
|
+
}
|
|
52
|
+
export interface RunExtractResult {
|
|
53
|
+
url: string;
|
|
54
|
+
title: string;
|
|
55
|
+
selector: string | null;
|
|
56
|
+
total_chars: number;
|
|
57
|
+
chunk_size: number;
|
|
58
|
+
start: number;
|
|
59
|
+
end: number;
|
|
60
|
+
next_start_char: number | null;
|
|
61
|
+
content: string;
|
|
62
|
+
}
|
|
63
|
+
/** End-to-end host-side pipeline: HTML → markdown → chunked envelope. */
|
|
64
|
+
export declare function runExtractFromHtml(opts: RunExtractOptions): RunExtractResult;
|
|
65
|
+
export declare const __extractInternals: {
|
|
66
|
+
DEFAULT_CHUNK_SIZE: number;
|
|
67
|
+
MIN_CHUNK_SIZE: number;
|
|
68
|
+
MAX_CHUNK_SIZE: number;
|
|
69
|
+
};
|