lasso-mcp 1.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +267 -0
- package/LICENSE +21 -0
- package/README.md +159 -0
- package/dist/browse/ExpectPoll.d.ts +97 -0
- package/dist/browse/ExpectPoll.d.ts.map +1 -0
- package/dist/browse/ExpectPoll.js +146 -0
- package/dist/browse/ExpectPoll.js.map +1 -0
- package/dist/browse/HighRiskGate.d.ts +115 -0
- package/dist/browse/HighRiskGate.d.ts.map +1 -0
- package/dist/browse/HighRiskGate.js +214 -0
- package/dist/browse/HighRiskGate.js.map +1 -0
- package/dist/browse/StealthEngine.d.ts +81 -0
- package/dist/browse/StealthEngine.d.ts.map +1 -0
- package/dist/browse/StealthEngine.js +166 -0
- package/dist/browse/StealthEngine.js.map +1 -0
- package/dist/browse/StepEngine.d.ts +113 -0
- package/dist/browse/StepEngine.d.ts.map +1 -0
- package/dist/browse/StepEngine.js +242 -0
- package/dist/browse/StepEngine.js.map +1 -0
- package/dist/browse/cdp-actions.d.ts +124 -0
- package/dist/browse/cdp-actions.d.ts.map +1 -0
- package/dist/browse/cdp-actions.js +216 -0
- package/dist/browse/cdp-actions.js.map +1 -0
- package/dist/browse/content-type-router.d.ts +35 -0
- package/dist/browse/content-type-router.d.ts.map +1 -0
- package/dist/browse/content-type-router.js +70 -0
- package/dist/browse/content-type-router.js.map +1 -0
- package/dist/browse/stealth-profiles.d.ts +134 -0
- package/dist/browse/stealth-profiles.d.ts.map +1 -0
- package/dist/browse/stealth-profiles.js +164 -0
- package/dist/browse/stealth-profiles.js.map +1 -0
- package/dist/browse/steps-types.d.ts +109 -0
- package/dist/browse/steps-types.d.ts.map +1 -0
- package/dist/browse/steps-types.js +2 -0
- package/dist/browse/steps-types.js.map +1 -0
- package/dist/channels/BaseChannel.d.ts +34 -0
- package/dist/channels/BaseChannel.d.ts.map +1 -0
- package/dist/channels/BaseChannel.js +3 -0
- package/dist/channels/BaseChannel.js.map +1 -0
- package/dist/channels/BingChannel.d.ts +99 -0
- package/dist/channels/BingChannel.d.ts.map +1 -0
- package/dist/channels/BingChannel.js +271 -0
- package/dist/channels/BingChannel.js.map +1 -0
- package/dist/channels/BraveChannel.d.ts +84 -0
- package/dist/channels/BraveChannel.d.ts.map +1 -0
- package/dist/channels/BraveChannel.js +243 -0
- package/dist/channels/BraveChannel.js.map +1 -0
- package/dist/channels/BrowseChannel.d.ts +129 -0
- package/dist/channels/BrowseChannel.d.ts.map +1 -0
- package/dist/channels/BrowseChannel.js +625 -0
- package/dist/channels/BrowseChannel.js.map +1 -0
- package/dist/channels/BrowserbaseChannel.d.ts +132 -0
- package/dist/channels/BrowserbaseChannel.d.ts.map +1 -0
- package/dist/channels/BrowserbaseChannel.js +220 -0
- package/dist/channels/BrowserbaseChannel.js.map +1 -0
- package/dist/channels/DesktopChannel.d.ts +224 -0
- package/dist/channels/DesktopChannel.d.ts.map +1 -0
- package/dist/channels/DesktopChannel.js +414 -0
- package/dist/channels/DesktopChannel.js.map +1 -0
- package/dist/channels/HeadlessChannel.d.ts +22 -0
- package/dist/channels/HeadlessChannel.d.ts.map +1 -0
- package/dist/channels/HeadlessChannel.js +36 -0
- package/dist/channels/HeadlessChannel.js.map +1 -0
- package/dist/channels/LoggedInChannel.d.ts +148 -0
- package/dist/channels/LoggedInChannel.d.ts.map +1 -0
- package/dist/channels/LoggedInChannel.js +318 -0
- package/dist/channels/LoggedInChannel.js.map +1 -0
- package/dist/channels/SearchChannel.d.ts +89 -0
- package/dist/channels/SearchChannel.d.ts.map +1 -0
- package/dist/channels/SearchChannel.js +217 -0
- package/dist/channels/SearchChannel.js.map +1 -0
- package/dist/channels/StagehandChannel.d.ts +126 -0
- package/dist/channels/StagehandChannel.d.ts.map +1 -0
- package/dist/channels/StagehandChannel.js +295 -0
- package/dist/channels/StagehandChannel.js.map +1 -0
- package/dist/channels/UiChannel.d.ts +20 -0
- package/dist/channels/UiChannel.d.ts.map +1 -0
- package/dist/channels/UiChannel.js +20 -0
- package/dist/channels/UiChannel.js.map +1 -0
- package/dist/config/config.d.ts +26 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +101 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/provider-registry.d.ts +97 -0
- package/dist/config/provider-registry.d.ts.map +1 -0
- package/dist/config/provider-registry.js +150 -0
- package/dist/config/provider-registry.js.map +1 -0
- package/dist/config/providers.d.ts +126 -0
- package/dist/config/providers.d.ts.map +1 -0
- package/dist/config/providers.js +308 -0
- package/dist/config/providers.js.map +1 -0
- package/dist/config/quota-ledger.d.ts +100 -0
- package/dist/config/quota-ledger.d.ts.map +1 -0
- package/dist/config/quota-ledger.js +208 -0
- package/dist/config/quota-ledger.js.map +1 -0
- package/dist/desktop/AppleScriptProvider.d.ts +98 -0
- package/dist/desktop/AppleScriptProvider.d.ts.map +1 -0
- package/dist/desktop/AppleScriptProvider.js +156 -0
- package/dist/desktop/AppleScriptProvider.js.map +1 -0
- package/dist/desktop/AxBackend.d.ts +127 -0
- package/dist/desktop/AxBackend.d.ts.map +1 -0
- package/dist/desktop/AxBackend.js +110 -0
- package/dist/desktop/AxBackend.js.map +1 -0
- package/dist/desktop/AxBackendFactory.d.ts +88 -0
- package/dist/desktop/AxBackendFactory.d.ts.map +1 -0
- package/dist/desktop/AxBackendFactory.js +83 -0
- package/dist/desktop/AxBackendFactory.js.map +1 -0
- package/dist/desktop/AxProvider.d.ts +95 -0
- package/dist/desktop/AxProvider.d.ts.map +1 -0
- package/dist/desktop/AxProvider.js +212 -0
- package/dist/desktop/AxProvider.js.map +1 -0
- package/dist/desktop/CGEventProvider.d.ts +122 -0
- package/dist/desktop/CGEventProvider.d.ts.map +1 -0
- package/dist/desktop/CGEventProvider.js +222 -0
- package/dist/desktop/CGEventProvider.js.map +1 -0
- package/dist/desktop/OutlineMapper.d.ts +71 -0
- package/dist/desktop/OutlineMapper.d.ts.map +1 -0
- package/dist/desktop/OutlineMapper.js +76 -0
- package/dist/desktop/OutlineMapper.js.map +1 -0
- package/dist/desktop/ScreenshotVlmProvider.d.ts +102 -0
- package/dist/desktop/ScreenshotVlmProvider.d.ts.map +1 -0
- package/dist/desktop/ScreenshotVlmProvider.js +194 -0
- package/dist/desktop/ScreenshotVlmProvider.js.map +1 -0
- package/dist/desktop/apple-script-whitelist.d.ts +82 -0
- package/dist/desktop/apple-script-whitelist.d.ts.map +1 -0
- package/dist/desktop/apple-script-whitelist.js +103 -0
- package/dist/desktop/apple-script-whitelist.js.map +1 -0
- package/dist/desktop/ax-role-map.d.ts +28 -0
- package/dist/desktop/ax-role-map.d.ts.map +1 -0
- package/dist/desktop/ax-role-map.js +72 -0
- package/dist/desktop/ax-role-map.js.map +1 -0
- package/dist/desktop/desktop-doctor-checks.d.ts +28 -0
- package/dist/desktop/desktop-doctor-checks.d.ts.map +1 -0
- package/dist/desktop/desktop-doctor-checks.js +390 -0
- package/dist/desktop/desktop-doctor-checks.js.map +1 -0
- package/dist/desktop/desktop-types.d.ts +199 -0
- package/dist/desktop/desktop-types.d.ts.map +1 -0
- package/dist/desktop/desktop-types.js +83 -0
- package/dist/desktop/desktop-types.js.map +1 -0
- package/dist/desktop/platform-detect.d.ts +44 -0
- package/dist/desktop/platform-detect.d.ts.map +1 -0
- package/dist/desktop/platform-detect.js +63 -0
- package/dist/desktop/platform-detect.js.map +1 -0
- package/dist/doctor/doctor.d.ts +273 -0
- package/dist/doctor/doctor.d.ts.map +1 -0
- package/dist/doctor/doctor.js +1492 -0
- package/dist/doctor/doctor.js.map +1 -0
- package/dist/fallback/BudgetTracker.d.ts +83 -0
- package/dist/fallback/BudgetTracker.d.ts.map +1 -0
- package/dist/fallback/BudgetTracker.js +101 -0
- package/dist/fallback/BudgetTracker.js.map +1 -0
- package/dist/fallback/CircuitBreaker.d.ts +45 -0
- package/dist/fallback/CircuitBreaker.d.ts.map +1 -0
- package/dist/fallback/CircuitBreaker.js +61 -0
- package/dist/fallback/CircuitBreaker.js.map +1 -0
- package/dist/fallback/FallbackDecider.d.ts +159 -0
- package/dist/fallback/FallbackDecider.d.ts.map +1 -0
- package/dist/fallback/FallbackDecider.js +291 -0
- package/dist/fallback/FallbackDecider.js.map +1 -0
- package/dist/fallback/LongCircuitBreaker.d.ts +119 -0
- package/dist/fallback/LongCircuitBreaker.d.ts.map +1 -0
- package/dist/fallback/LongCircuitBreaker.js +148 -0
- package/dist/fallback/LongCircuitBreaker.js.map +1 -0
- package/dist/fallback/PartialFailures.d.ts +65 -0
- package/dist/fallback/PartialFailures.d.ts.map +1 -0
- package/dist/fallback/PartialFailures.js +41 -0
- package/dist/fallback/PartialFailures.js.map +1 -0
- package/dist/fallback/PolicyGate.d.ts +132 -0
- package/dist/fallback/PolicyGate.d.ts.map +1 -0
- package/dist/fallback/PolicyGate.js +135 -0
- package/dist/fallback/PolicyGate.js.map +1 -0
- package/dist/fallback/outcome.d.ts +43 -0
- package/dist/fallback/outcome.d.ts.map +1 -0
- package/dist/fallback/outcome.js +113 -0
- package/dist/fallback/outcome.js.map +1 -0
- package/dist/forest/InteractDispatcher.d.ts +104 -0
- package/dist/forest/InteractDispatcher.d.ts.map +1 -0
- package/dist/forest/InteractDispatcher.js +176 -0
- package/dist/forest/InteractDispatcher.js.map +1 -0
- package/dist/forest/RootRegistry.d.ts +99 -0
- package/dist/forest/RootRegistry.d.ts.map +1 -0
- package/dist/forest/RootRegistry.js +170 -0
- package/dist/forest/RootRegistry.js.map +1 -0
- package/dist/forest/forest-types.d.ts +106 -0
- package/dist/forest/forest-types.d.ts.map +1 -0
- package/dist/forest/forest-types.js +25 -0
- package/dist/forest/forest-types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +797 -0
- package/dist/index.js.map +1 -0
- package/dist/launcher/chrome-paths.d.ts +61 -0
- package/dist/launcher/chrome-paths.d.ts.map +1 -0
- package/dist/launcher/chrome-paths.js +178 -0
- package/dist/launcher/chrome-paths.js.map +1 -0
- package/dist/launcher/launch-chrome.d.ts +163 -0
- package/dist/launcher/launch-chrome.d.ts.map +1 -0
- package/dist/launcher/launch-chrome.js +259 -0
- package/dist/launcher/launch-chrome.js.map +1 -0
- package/dist/logged-in/CdpClient.d.ts +53 -0
- package/dist/logged-in/CdpClient.d.ts.map +1 -0
- package/dist/logged-in/CdpClient.js +144 -0
- package/dist/logged-in/CdpClient.js.map +1 -0
- package/dist/logged-in/CookieStore.d.ts +54 -0
- package/dist/logged-in/CookieStore.d.ts.map +1 -0
- package/dist/logged-in/CookieStore.js +179 -0
- package/dist/logged-in/CookieStore.js.map +1 -0
- package/dist/logged-in/ProfileRegistry.d.ts +65 -0
- package/dist/logged-in/ProfileRegistry.d.ts.map +1 -0
- package/dist/logged-in/ProfileRegistry.js +157 -0
- package/dist/logged-in/ProfileRegistry.js.map +1 -0
- package/dist/logged-in/TabRegistry.d.ts +61 -0
- package/dist/logged-in/TabRegistry.d.ts.map +1 -0
- package/dist/logged-in/TabRegistry.js +116 -0
- package/dist/logged-in/TabRegistry.js.map +1 -0
- package/dist/logged-in/keychain.d.ts +43 -0
- package/dist/logged-in/keychain.d.ts.map +1 -0
- package/dist/logged-in/keychain.js +125 -0
- package/dist/logged-in/keychain.js.map +1 -0
- package/dist/observ/MetricsCollector.d.ts +43 -0
- package/dist/observ/MetricsCollector.d.ts.map +1 -0
- package/dist/observ/MetricsCollector.js +164 -0
- package/dist/observ/MetricsCollector.js.map +1 -0
- package/dist/observ/ResourceMonitor.d.ts +82 -0
- package/dist/observ/ResourceMonitor.d.ts.map +1 -0
- package/dist/observ/ResourceMonitor.js +185 -0
- package/dist/observ/ResourceMonitor.js.map +1 -0
- package/dist/runtime/CallerTierTracker.d.ts +87 -0
- package/dist/runtime/CallerTierTracker.d.ts.map +1 -0
- package/dist/runtime/CallerTierTracker.js +200 -0
- package/dist/runtime/CallerTierTracker.js.map +1 -0
- package/dist/runtime/CapabilityBag.d.ts +76 -0
- package/dist/runtime/CapabilityBag.d.ts.map +1 -0
- package/dist/runtime/CapabilityBag.js +204 -0
- package/dist/runtime/CapabilityBag.js.map +1 -0
- package/dist/runtime/ToolManager.d.ts +135 -0
- package/dist/runtime/ToolManager.d.ts.map +1 -0
- package/dist/runtime/ToolManager.js +247 -0
- package/dist/runtime/ToolManager.js.map +1 -0
- package/dist/runtime/hot-reload.d.ts +62 -0
- package/dist/runtime/hot-reload.d.ts.map +1 -0
- package/dist/runtime/hot-reload.js +188 -0
- package/dist/runtime/hot-reload.js.map +1 -0
- package/dist/runtime/runtime-types.d.ts +134 -0
- package/dist/runtime/runtime-types.d.ts.map +1 -0
- package/dist/runtime/runtime-types.js +2 -0
- package/dist/runtime/runtime-types.js.map +1 -0
- package/dist/search/AttributedSearch.d.ts +29 -0
- package/dist/search/AttributedSearch.d.ts.map +1 -0
- package/dist/search/AttributedSearch.js +19 -0
- package/dist/search/AttributedSearch.js.map +1 -0
- package/dist/search/FallbackChain.d.ts +104 -0
- package/dist/search/FallbackChain.d.ts.map +1 -0
- package/dist/search/FallbackChain.js +84 -0
- package/dist/search/FallbackChain.js.map +1 -0
- package/dist/search/FreeTierRouter.d.ts +33 -0
- package/dist/search/FreeTierRouter.d.ts.map +1 -0
- package/dist/search/FreeTierRouter.js +30 -0
- package/dist/search/FreeTierRouter.js.map +1 -0
- package/dist/search/MultiSourceFanout.d.ts +89 -0
- package/dist/search/MultiSourceFanout.d.ts.map +1 -0
- package/dist/search/MultiSourceFanout.js +227 -0
- package/dist/search/MultiSourceFanout.js.map +1 -0
- package/dist/search/SearchCache.d.ts +44 -0
- package/dist/search/SearchCache.d.ts.map +1 -0
- package/dist/search/SearchCache.js +222 -0
- package/dist/search/SearchCache.js.map +1 -0
- package/dist/serp/ChangeDetection.d.ts +37 -0
- package/dist/serp/ChangeDetection.d.ts.map +1 -0
- package/dist/serp/ChangeDetection.js +101 -0
- package/dist/serp/ChangeDetection.js.map +1 -0
- package/dist/serp/HitRateStats.d.ts +29 -0
- package/dist/serp/HitRateStats.d.ts.map +1 -0
- package/dist/serp/HitRateStats.js +70 -0
- package/dist/serp/HitRateStats.js.map +1 -0
- package/dist/serp/RecordingStore.d.ts +95 -0
- package/dist/serp/RecordingStore.d.ts.map +1 -0
- package/dist/serp/RecordingStore.js +236 -0
- package/dist/serp/RecordingStore.js.map +1 -0
- package/dist/serp/SelectorRegistry.d.ts +56 -0
- package/dist/serp/SelectorRegistry.d.ts.map +1 -0
- package/dist/serp/SelectorRegistry.js +79 -0
- package/dist/serp/SelectorRegistry.js.map +1 -0
- package/dist/serp/SerpHealthMonitor.d.ts +88 -0
- package/dist/serp/SerpHealthMonitor.d.ts.map +1 -0
- package/dist/serp/SerpHealthMonitor.js +117 -0
- package/dist/serp/SerpHealthMonitor.js.map +1 -0
- package/dist/serp/extract.d.ts +46 -0
- package/dist/serp/extract.d.ts.map +1 -0
- package/dist/serp/extract.js +117 -0
- package/dist/serp/extract.js.map +1 -0
- package/dist/serp/replay-baseline.d.ts +94 -0
- package/dist/serp/replay-baseline.d.ts.map +1 -0
- package/dist/serp/replay-baseline.js +217 -0
- package/dist/serp/replay-baseline.js.map +1 -0
- package/dist/serp/selectors.d.ts +33 -0
- package/dist/serp/selectors.d.ts.map +1 -0
- package/dist/serp/selectors.js +62 -0
- package/dist/serp/selectors.js.map +1 -0
- package/dist/ssrf/cidr.d.ts +13 -0
- package/dist/ssrf/cidr.d.ts.map +1 -0
- package/dist/ssrf/cidr.js +37 -0
- package/dist/ssrf/cidr.js.map +1 -0
- package/dist/ssrf/defaults.d.ts +28 -0
- package/dist/ssrf/defaults.d.ts.map +1 -0
- package/dist/ssrf/defaults.js +44 -0
- package/dist/ssrf/defaults.js.map +1 -0
- package/dist/ssrf/ssrf-guard.d.ts +25 -0
- package/dist/ssrf/ssrf-guard.d.ts.map +1 -0
- package/dist/ssrf/ssrf-guard.js +110 -0
- package/dist/ssrf/ssrf-guard.js.map +1 -0
- package/dist/subprocess/McpClient.d.ts +60 -0
- package/dist/subprocess/McpClient.d.ts.map +1 -0
- package/dist/subprocess/McpClient.js +122 -0
- package/dist/subprocess/McpClient.js.map +1 -0
- package/dist/subprocess/RustBridge.d.ts +66 -0
- package/dist/subprocess/RustBridge.d.ts.map +1 -0
- package/dist/subprocess/RustBridge.js +194 -0
- package/dist/subprocess/RustBridge.js.map +1 -0
- package/dist/subprocess/SubprocessManager.d.ts +200 -0
- package/dist/subprocess/SubprocessManager.d.ts.map +1 -0
- package/dist/subprocess/SubprocessManager.js +508 -0
- package/dist/subprocess/SubprocessManager.js.map +1 -0
- package/dist/tools/admin.d.ts +176 -0
- package/dist/tools/admin.d.ts.map +1 -0
- package/dist/tools/admin.js +542 -0
- package/dist/tools/admin.js.map +1 -0
- package/dist/tools/annotations.d.ts +200 -0
- package/dist/tools/annotations.d.ts.map +1 -0
- package/dist/tools/annotations.js +217 -0
- package/dist/tools/annotations.js.map +1 -0
- package/dist/tools/browse.d.ts +34 -0
- package/dist/tools/browse.d.ts.map +1 -0
- package/dist/tools/browse.js +113 -0
- package/dist/tools/browse.js.map +1 -0
- package/dist/tools/browserbase.d.ts +40 -0
- package/dist/tools/browserbase.d.ts.map +1 -0
- package/dist/tools/browserbase.js +114 -0
- package/dist/tools/browserbase.js.map +1 -0
- package/dist/tools/descriptions.d.ts +65 -0
- package/dist/tools/descriptions.d.ts.map +1 -0
- package/dist/tools/descriptions.js +622 -0
- package/dist/tools/descriptions.js.map +1 -0
- package/dist/tools/desktop.d.ts +31 -0
- package/dist/tools/desktop.d.ts.map +1 -0
- package/dist/tools/desktop.js +129 -0
- package/dist/tools/desktop.js.map +1 -0
- package/dist/tools/doctor-tool.d.ts +20 -0
- package/dist/tools/doctor-tool.d.ts.map +1 -0
- package/dist/tools/doctor-tool.js +14 -0
- package/dist/tools/doctor-tool.js.map +1 -0
- package/dist/tools/fetch-url.d.ts +68 -0
- package/dist/tools/fetch-url.d.ts.map +1 -0
- package/dist/tools/fetch-url.js +284 -0
- package/dist/tools/fetch-url.js.map +1 -0
- package/dist/tools/interact.d.ts +48 -0
- package/dist/tools/interact.d.ts.map +1 -0
- package/dist/tools/interact.js +163 -0
- package/dist/tools/interact.js.map +1 -0
- package/dist/tools/network.d.ts +120 -0
- package/dist/tools/network.d.ts.map +1 -0
- package/dist/tools/network.js +319 -0
- package/dist/tools/network.js.map +1 -0
- package/dist/tools/pdf.d.ts +95 -0
- package/dist/tools/pdf.d.ts.map +1 -0
- package/dist/tools/pdf.js +216 -0
- package/dist/tools/pdf.js.map +1 -0
- package/dist/tools/read-text.d.ts +21 -0
- package/dist/tools/read-text.d.ts.map +1 -0
- package/dist/tools/read-text.js +75 -0
- package/dist/tools/read-text.js.map +1 -0
- package/dist/tools/screenshot.d.ts +120 -0
- package/dist/tools/screenshot.d.ts.map +1 -0
- package/dist/tools/screenshot.js +163 -0
- package/dist/tools/screenshot.js.map +1 -0
- package/dist/tools/search.d.ts +128 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +453 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/wayback.d.ts +70 -0
- package/dist/tools/wayback.d.ts.map +1 -0
- package/dist/tools/wayback.js +151 -0
- package/dist/tools/wayback.js.map +1 -0
- package/dist/types.d.ts +390 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +13 -0
- package/dist/types.js.map +1 -0
- package/dist/util/logger.d.ts +18 -0
- package/dist/util/logger.d.ts.map +1 -0
- package/dist/util/logger.js +10 -0
- package/dist/util/logger.js.map +1 -0
- package/dist/util/output-envelope.d.ts +50 -0
- package/dist/util/output-envelope.d.ts.map +1 -0
- package/dist/util/output-envelope.js +168 -0
- package/dist/util/output-envelope.js.map +1 -0
- package/dist/util/rpm-limiter.d.ts +90 -0
- package/dist/util/rpm-limiter.d.ts.map +1 -0
- package/dist/util/rpm-limiter.js +135 -0
- package/dist/util/rpm-limiter.js.map +1 -0
- package/dist/util/run-id.d.ts +5 -0
- package/dist/util/run-id.d.ts.map +1 -0
- package/dist/util/run-id.js +19 -0
- package/dist/util/run-id.js.map +1 -0
- package/dist/util/state-store.d.ts +109 -0
- package/dist/util/state-store.d.ts.map +1 -0
- package/dist/util/state-store.js +222 -0
- package/dist/util/state-store.js.map +1 -0
- package/dist/util/url-safety.d.ts +23 -0
- package/dist/util/url-safety.d.ts.map +1 -0
- package/dist/util/url-safety.js +35 -0
- package/dist/util/url-safety.js.map +1 -0
- package/doc/SELECTOR-MAINTENANCE.md +259 -0
- package/doc/TROUBLESHOOTING.md +234 -0
- package/fixtures/serp-baseline/README.md +54 -0
- package/fixtures/serp-baseline/baidu/claude-code-mcp.html +19 -0
- package/fixtures/serp-baseline/baidu/claude-code-mcp.json +8 -0
- package/fixtures/serp-baseline/baidu/rust-async-runtime.html +20 -0
- package/fixtures/serp-baseline/baidu/rust-async-runtime.json +8 -0
- package/fixtures/serp-baseline/bing/axios-undici-fetch.html +20 -0
- package/fixtures/serp-baseline/bing/axios-undici-fetch.json +8 -0
- package/fixtures/serp-baseline/bing/vitest-runner.html +20 -0
- package/fixtures/serp-baseline/bing/vitest-runner.json +8 -0
- package/fixtures/serp-baseline/google/mcp-architecture.html +25 -0
- package/fixtures/serp-baseline/google/mcp-architecture.json +8 -0
- package/fixtures/serp-baseline/google/wayback-machine.html +21 -0
- package/fixtures/serp-baseline/google/wayback-machine.json +8 -0
- package/package.json +53 -0
- package/src/browse/ExpectPoll.ts +240 -0
- package/src/browse/HighRiskGate.ts +269 -0
- package/src/browse/StealthEngine.ts +222 -0
- package/src/browse/StepEngine.ts +347 -0
- package/src/browse/cdp-actions.ts +272 -0
- package/src/browse/content-type-router.ts +83 -0
- package/src/browse/stealth-profiles.ts +199 -0
- package/src/browse/steps-types.ts +129 -0
- package/src/channels/BaseChannel.ts +37 -0
- package/src/channels/BingChannel.ts +321 -0
- package/src/channels/BraveChannel.ts +290 -0
- package/src/channels/BrowseChannel.ts +750 -0
- package/src/channels/BrowserbaseChannel.ts +268 -0
- package/src/channels/DesktopChannel.ts +459 -0
- package/src/channels/HeadlessChannel.ts +38 -0
- package/src/channels/LoggedInChannel.ts +349 -0
- package/src/channels/SearchChannel.ts +245 -0
- package/src/channels/StagehandChannel.ts +377 -0
- package/src/channels/UiChannel.ts +23 -0
- package/src/config/config.ts +134 -0
- package/src/config/provider-registry.ts +212 -0
- package/src/config/providers.ts +340 -0
- package/src/config/quota-ledger.ts +224 -0
- package/src/desktop/AppleScriptProvider.ts +226 -0
- package/src/desktop/AxBackend.ts +226 -0
- package/src/desktop/AxBackendFactory.ts +132 -0
- package/src/desktop/AxProvider.ts +269 -0
- package/src/desktop/CGEventProvider.ts +312 -0
- package/src/desktop/OutlineMapper.ts +116 -0
- package/src/desktop/ScreenshotVlmProvider.ts +266 -0
- package/src/desktop/apple-script-whitelist.ts +153 -0
- package/src/desktop/ax-role-map.ts +73 -0
- package/src/desktop/desktop-doctor-checks.ts +446 -0
- package/src/desktop/desktop-types.ts +295 -0
- package/src/desktop/platform-detect.ts +94 -0
- package/src/doctor/doctor.ts +1940 -0
- package/src/fallback/BudgetTracker.ts +132 -0
- package/src/fallback/CircuitBreaker.ts +79 -0
- package/src/fallback/FallbackDecider.ts +347 -0
- package/src/fallback/LongCircuitBreaker.ts +173 -0
- package/src/fallback/PartialFailures.ts +93 -0
- package/src/fallback/PolicyGate.ts +216 -0
- package/src/fallback/outcome.ts +120 -0
- package/src/forest/InteractDispatcher.ts +228 -0
- package/src/forest/README.md +78 -0
- package/src/forest/RootRegistry.ts +229 -0
- package/src/forest/forest-types.ts +135 -0
- package/src/index.ts +933 -0
- package/src/invariants/check-invariants.mjs +2730 -0
- package/src/launcher/chrome-paths.ts +232 -0
- package/src/launcher/launch-chrome.ts +324 -0
- package/src/logged-in/CdpClient.ts +176 -0
- package/src/logged-in/CookieStore.ts +191 -0
- package/src/logged-in/ProfileRegistry.ts +213 -0
- package/src/logged-in/TabRegistry.ts +151 -0
- package/src/logged-in/keychain.ts +136 -0
- package/src/observ/MetricsCollector.ts +196 -0
- package/src/observ/ResourceMonitor.ts +226 -0
- package/src/runtime/CallerTierTracker.ts +211 -0
- package/src/runtime/CapabilityBag.ts +223 -0
- package/src/runtime/ToolManager.ts +315 -0
- package/src/runtime/hot-reload.ts +227 -0
- package/src/runtime/runtime-types.ts +184 -0
- package/src/search/AttributedSearch.ts +41 -0
- package/src/search/FallbackChain.ts +166 -0
- package/src/search/FreeTierRouter.ts +53 -0
- package/src/search/MultiSourceFanout.ts +313 -0
- package/src/search/SearchCache.ts +259 -0
- package/src/serp/ChangeDetection.ts +130 -0
- package/src/serp/HitRateStats.ts +82 -0
- package/src/serp/RecordingStore.ts +259 -0
- package/src/serp/SelectorRegistry.ts +118 -0
- package/src/serp/SerpHealthMonitor.ts +167 -0
- package/src/serp/extract.ts +168 -0
- package/src/serp/replay-baseline.ts +286 -0
- package/src/serp/selectors.ts +78 -0
- package/src/ssrf/cidr.ts +39 -0
- package/src/ssrf/defaults.ts +45 -0
- package/src/ssrf/ssrf-guard.ts +140 -0
- package/src/subprocess/McpClient.ts +170 -0
- package/src/subprocess/RustBridge.ts +224 -0
- package/src/subprocess/SubprocessManager.ts +597 -0
- package/src/tools/admin.ts +677 -0
- package/src/tools/annotations.ts +257 -0
- package/src/tools/browse.ts +172 -0
- package/src/tools/browserbase.ts +159 -0
- package/src/tools/descriptions.ts +636 -0
- package/src/tools/desktop.ts +171 -0
- package/src/tools/doctor-tool.ts +34 -0
- package/src/tools/fetch-url.ts +340 -0
- package/src/tools/interact.ts +249 -0
- package/src/tools/network.ts +417 -0
- package/src/tools/pdf.ts +280 -0
- package/src/tools/read-text.ts +104 -0
- package/src/tools/screenshot.ts +217 -0
- package/src/tools/search.ts +596 -0
- package/src/tools/wayback.ts +258 -0
- package/src/types.ts +446 -0
- package/src/util/logger.ts +24 -0
- package/src/util/output-envelope.ts +224 -0
- package/src/util/rpm-limiter.ts +138 -0
- package/src/util/run-id.ts +20 -0
- package/src/util/state-store.ts +300 -0
- package/src/util/url-safety.ts +40 -0
- package/tsconfig.json +23 -0
package/ARCHITECTURE.md
ADDED
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
# Lasso 架构
|
|
2
|
+
|
|
3
|
+
> 本文是 Lasso v1.0 的架构概览(user-first;深度架构基线见 [`doc/08`](./../doc/08-media-interact-功能架构.md);实施排期与决策记录见 [`doc/09`](./../doc/09-media-interact-实施排期.md))。
|
|
4
|
+
|
|
5
|
+
## 1. 项目定位
|
|
6
|
+
|
|
7
|
+
Lasso 是 Claude Code 的**全交互**对外抓手 MCP(浏览器 + 桌面)。与 [media-gen-mcp](https://github.com/wangdong233/media-gen-mcp)(图像抓手)双子星:
|
|
8
|
+
|
|
9
|
+
- media-gen-mcp:「所有图像操作归一个 MCP」(生成 + 识别)
|
|
10
|
+
- **Lasso**:「所有外部交互归一个 MCP」(浏览器 + 桌面)
|
|
11
|
+
|
|
12
|
+
四通道:`search` / `browse_headless` / `browse_logged_in` / `desktop`。所有通道共享同一套 fallback 范式 / 状态模型 / 工具风格(R-CI-02 红线:禁第二套做法)。
|
|
13
|
+
|
|
14
|
+
## 2. 整体分层
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
┌────────────────────────────────────────────────────────────────┐
|
|
18
|
+
│ Claude Code │
|
|
19
|
+
└──────────────────────────────┬─────────────────────────────────┘
|
|
20
|
+
│ stdio MCP (JSON-RPC)
|
|
21
|
+
▼
|
|
22
|
+
┌────────────────────────────────────────────────────────────────┐
|
|
23
|
+
│ Lasso(单进程 Node.js) │
|
|
24
|
+
│ │
|
|
25
|
+
│ ┌──────────────────────────────────────────────────────────┐ │
|
|
26
|
+
│ │ Tool Layer(src/tools/) │ │
|
|
27
|
+
│ │ search / browse_headless / browse_logged_in │ │
|
|
28
|
+
│ │ desktop / admin / doctor │ │
|
|
29
|
+
│ │ 每工具 Zod inputSchema + ToolAnnotations 完整 │ │
|
|
30
|
+
│ └────────────────────────┬─────────────────────────────────┘ │
|
|
31
|
+
│ │ typed call │
|
|
32
|
+
│ ┌────────────────────────▼─────────────────────────────────┐ │
|
|
33
|
+
│ │ Channel Layer(src/channels/ + src/browse/ + src/desktop/│ │
|
|
34
|
+
│ │ + src/search/ + src/logged-in/) │ │
|
|
35
|
+
│ │ BaseChannel ← UiChannel ← BrowseChannel / DesktopChannel│ │
|
|
36
|
+
│ │ ← SearchChannel / LoggedInChannel │ │
|
|
37
|
+
│ └────────────────────────┬─────────────────────────────────┘ │
|
|
38
|
+
│ │ FallbackDecider + tri-state │
|
|
39
|
+
│ ┌────────────────────────▼─────────────────────────────────┐ │
|
|
40
|
+
│ │ Fallback Engine(src/fallback/) │ │
|
|
41
|
+
│ │ worked / didnt / unknown → unknown 触发下一档 │ │
|
|
42
|
+
│ └────────────────────────┬─────────────────────────────────┘ │
|
|
43
|
+
│ │ │
|
|
44
|
+
│ ┌────────────────────────▼─────────────────────────────────┐ │
|
|
45
|
+
│ │ Subprocess Layer(src/subprocess/) │ │
|
|
46
|
+
│ │ SubprocessManager + RustBridge │ │
|
|
47
|
+
│ │ chrome-devtools-mcp ×2(headless / logged_in) │ │
|
|
48
|
+
│ │ lasso-rust-helper(AXAPI/UIA/AT-SPI + screenshot + TCC) │ │
|
|
49
|
+
│ └──────────────────────────────────────────────────────────┘ │
|
|
50
|
+
└──────────────────────────────┬─────────────────────────────────┘
|
|
51
|
+
┌───────────────────────┼───────────────────────┐
|
|
52
|
+
▼ ▼ ▼
|
|
53
|
+
chrome-devtools-mcp 智谱/Brave/Bing/Wayback lasso-rust-helper
|
|
54
|
+
(--headless (search multi-engine (macOS AXAPI
|
|
55
|
+
/ --browser-url via HTTP) Windows UIA
|
|
56
|
+
:9222) Linux AT-SPI
|
|
57
|
+
+ screenshot + TCC)
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## 3. 核心抽象
|
|
61
|
+
|
|
62
|
+
### 3.1 BaseChannel / UiChannel 分层
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
BaseChannel (src/channels/BaseChannel.ts)
|
|
66
|
+
├── SearchChannel (只通用层;不进 UI)
|
|
67
|
+
└── UiChannel (src/channels/UiChannel.ts)
|
|
68
|
+
├── BrowseChannel (browse_headless + browse_logged_in 复用)
|
|
69
|
+
├── HeadlessChannel
|
|
70
|
+
├── LoggedInChannel
|
|
71
|
+
└── DesktopChannel (desktop 4 档 fallback:ax → appleScript → cgEvent → screenshotVlm)
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
UI 通道共享 UiChannel 的状态写盘 / LRU / output envelope 机制;Search 只走通用层(无 UI 状态概念)。**INV-2 守:所有 XxxChannel 必须 extends BaseChannel**(不绕过)。
|
|
75
|
+
|
|
76
|
+
### 3.2 CapabilityBag(运行时动态启停)
|
|
77
|
+
|
|
78
|
+
`src/runtime/CapabilityBag.ts`(v0.6+):通道运行时可 enable/disable,无需重启进程。`admin` tool 提供 `channel_health` / `reset` action。**INV-37 守:admin tool 必经 toolManager.register(不直调 server.tool)**。
|
|
79
|
+
|
|
80
|
+
### 3.3 FallbackPlan + tri-state outcome
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
outcome = worked | didnt | unknown
|
|
84
|
+
│
|
|
85
|
+
▼
|
|
86
|
+
┌──────────────────────┐
|
|
87
|
+
│ unknown → 触发下一档 │
|
|
88
|
+
│ worked → 链止,返成功│
|
|
89
|
+
│ didnt → 链止,返失败│
|
|
90
|
+
│ (如 404 / 2FA) │
|
|
91
|
+
└──────────────────────┘
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
铁律:**event delivery ≠ semantic success**(INV-13)。例如 `desktop act` 调用 AXPress 不报错(event delivered),但目标按钮没有真的被点(disabled / obscured)→ 必须 `expect` 验证后置条件,failed 时 `outcome=didnt` 终止链。
|
|
95
|
+
|
|
96
|
+
### 3.4 StateStore LRU(128)
|
|
97
|
+
|
|
98
|
+
页面 DOM / 桌面 OutlineNode 不灌 CC 上下文,而是写本地磁盘(`~/.cache/lasso/state/`),返回 `state_id`。CC 后续 `act` / `find` 经 `state_id` 引用 → **4× token 效率**。LRU(128) 自动淘汰旧状态。
|
|
99
|
+
|
|
100
|
+
## 4. desktop 跨平台(v1.0 落地)
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
AxBackend interface(三平台同构 OutlineNode 契约)
|
|
104
|
+
├── MacAxBackend → rust.call("ax_snapshot") → rust-helper/src/ax.rs [cfg(macos)]
|
|
105
|
+
├── WinUiaBackend → rust.call("uia_snapshot") → rust-helper/src/uia.rs [cfg(windows)]
|
|
106
|
+
└── LinuxAtspiBackend → rust.call("atspi_snapshot") → rust-helper/src/atspi.rs [cfg(linux)]
|
|
107
|
+
│
|
|
108
|
+
▼
|
|
109
|
+
AxBackendFactory.create() ← platform-detect.ts (process.platform)
|
|
110
|
+
│
|
|
111
|
+
▼
|
|
112
|
+
AxProvider(业务逻辑;三平台共享)
|
|
113
|
+
│
|
|
114
|
+
▼
|
|
115
|
+
OutlineMapper(三平台共享;纯数据变换;INV-61 守)
|
|
116
|
+
│
|
|
117
|
+
▼
|
|
118
|
+
OutlineNode(同形异源;INV-19 守:类型无 surface 字段)
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**关键设计决策**(守简单性 02 §5 R-CI-02 + §6.1 R-FF-01):
|
|
122
|
+
|
|
123
|
+
1. **不重写 AxBackend interface**。v0.3.5 已定义 `snapshot / find / act` 三方法;v1.0 只加 backend 实现,不破契约。
|
|
124
|
+
2. **不在 TS 层做平台分支**。`AxProvider` 不 `if (platform === 'win32')`;而是 `AxBackendFactory.create()` 经 `platform-detect.ts` 路由。**INV-21 守:src/**/*.ts 无平台字面量**(AXUIElement / CGEvent / libatspi 都隔离在 rust-helper/*.rs)。
|
|
125
|
+
3. **不渗 OutlineMapper 到 backend 内**。OutlineMapper 三平台共享同一个(INV-61 守:mapper 是纯数据变换,不感知 backend 实现选择);Rust 端三平台都返同形 AxNode JSON。
|
|
126
|
+
4. **不引 electron / tauri 跨平台 AX 抽象**。它们抽象太厚(带 IPC / window management),Lasso 只需"读 AX 树 + act 节点",薄壳足够(02 §5 R-ABS-01 错误抽象警惕)。
|
|
127
|
+
5. **Windows UIA 用官方 `windows` crate(microsoft/windows-rs)**。微软长期维护 + auto-generated from Win32 metadata + 完整覆盖(社区 uiautomation crate 维护风险高,不选)。
|
|
128
|
+
6. **Linux AT-SPI 用 `atspi` crate(odilia-app)**。pure Rust via zbus D-Bus,无 C 依赖,CI Linux headless 可编。
|
|
129
|
+
|
|
130
|
+
## 5. 设计原则(08 §0)
|
|
131
|
+
|
|
132
|
+
1. **能力导向命名**:search / browse_* / desktop(不按后端命名)
|
|
133
|
+
2. **页面/界面状态写磁盘**:4× token 效率
|
|
134
|
+
3. **减少推理调用**:多步链式(如 search → click → extract)一次工具调用完成
|
|
135
|
+
4. **fallback 对 CC 透明**:CC 只看到 `worked / didnt`,不感知降级细节
|
|
136
|
+
5. **诚实三态交付**:`worked / didnt / unknown`(unknown 是 fallback 触发器)
|
|
137
|
+
6. **零侵入跟随上游**:chrome-devtools-mcp 升级时 Lasso 不改业务(契约锁版本)
|
|
138
|
+
7. **第二套做法红线**(R-CI-02):横切关注点变体只允许一套(fallback 范式 / state 模型 / dispatch Map / provider registry 等)
|
|
139
|
+
8. **不变量脚本化**(CI 守门):65 条 INV 静态 grep + 形状测,防 refactor 回退
|
|
140
|
+
9. **平台差异隔离在 backend 内部**:AxBackend 三平台同构 OutlineNode 契约;TS 层零平台字面量
|
|
141
|
+
|
|
142
|
+
## 6. 边界(08 §7)
|
|
143
|
+
|
|
144
|
+
Lasso 明确**不做**以下事情:
|
|
145
|
+
|
|
146
|
+
- **不解 2FA**:站点要求 2FA 时返 `NEEDS_MANUAL_2FA`(red line;不让 CC 尝试绕过)
|
|
147
|
+
- **不做坐标 grounding**:desktop 走语义 AX tree,不 click (x, y) 坐标(坐标方案脆弱)
|
|
148
|
+
- **不做 RRF 融合 / corpus 持久化**:search 是 hit + wayback 兜底,不是 RAG
|
|
149
|
+
- **不导出 cookie**:`browse_logged_in` 的 cookie 留本机 Chrome(除用户显式 opt-in `admin` action 且经 AES-256-GCM 加密)
|
|
150
|
+
- **不引云浏览器**:cloud 浏览器通道(Browserbase / Stagehand)必经 `LASSO_ALLOW_CLOUD_BROWSER=true` manual-switch + API key 双重解锁(INV-25 守)
|
|
151
|
+
- **macOS-only 开发**:Win/Linux backend 编译可证(cfg-gate + `cargo check --target`),真机执行待社区反馈(不伪造)
|
|
152
|
+
|
|
153
|
+
## 7. 测试策略
|
|
154
|
+
|
|
155
|
+
| 层 | 工具 | 覆盖 | 规模 |
|
|
156
|
+
|---|---|---|---|
|
|
157
|
+
| 架构不变量 | `check-invariants.mjs`(自写) | INV-1..65 静态 grep + 形状测 | 65 条 |
|
|
158
|
+
| TS 单测 | vitest | channel / fallback / forest / doctor / launcher / outline-contract / replay-baseline | ≈1400 测试 |
|
|
159
|
+
| Rust 单测 | cargo test | macOS 路径(ax / applescript / cgevent / screenshot / tcc / windows) | ≈180 测试 |
|
|
160
|
+
| 跨平台编译 | cargo check --target | Windows (x86_64-pc-windows-msvc) + Linux (x86_64-unknown-linux-gnu) | CI Linux runner |
|
|
161
|
+
| 录制回放回归 | npm run replay-baseline | fixtures/serp-baseline/ × 三引擎 × 多 query | 12+ fixtures |
|
|
162
|
+
| 故障注入 | vitest | fallback 链 / 限流 / 政策 gate / SERP 改版 | ~20 场景 |
|
|
163
|
+
| 契约锁 | chrome-devtools-mcp version pin | 上游小版本升级不破 Lasso | package.json |
|
|
164
|
+
|
|
165
|
+
## 8. 不变量(65 条)分类
|
|
166
|
+
|
|
167
|
+
| 范畴 | INV 编号 | 守的是什么 |
|
|
168
|
+
|---|---|---|
|
|
169
|
+
| 单一真源(grep 守 class / type 只在一处定义) | INV-3 / 9 / 24 / 60 | ProviderConfig / ProviderRegistry / RootRegistry / AxBackendFactory |
|
|
170
|
+
| 禁第二套(横切关注点变体只允许一套) | INV-4 / 6 / 23 / 33 | FallbackDecider / dispatch Map / 跨 surface fallback / pdf dispatch |
|
|
171
|
+
| 平台隔离(src/**/*.ts 无平台字面量) | INV-21 / 60 / 61 | TS 层无 AXUIElement/CGEvent/UIAutomationClient |
|
|
172
|
+
| 隐私红线 | INV-15 / 43 / 48..53 / 57 / 62 | output envelope 0o600 / 零遥测 / cookie AES-256-GCM / 录制 opt-in / 禁录 logged_in |
|
|
173
|
+
| 安全红线 | INV-14 / 25 / 27 / 30 / 31 / 32 | HIGH_RISK_PATTERNS / cloud 双重解锁 / appleScript 白名单 / stealth profiles / SSRF / 连接池 |
|
|
174
|
+
| 诚实交付 | INV-13 / 19 | expect failed 必须 didnt + 终止 / OutlineNode 同形异源 |
|
|
175
|
+
| v1.0 release polish | INV-63 / 64 / 65 | version 三处一致 / launcher 不引新 npm dep / README+ARCHITECTURE 必引用 08+09 |
|
|
176
|
+
|
|
177
|
+
完整 INV 列表 + 释义见 `src/invariants/check-invariants.mjs` 顶部注释。
|
|
178
|
+
|
|
179
|
+
## 9. 数据流(典型场景)
|
|
180
|
+
|
|
181
|
+
### 9.1 search(多引擎 fallback)
|
|
182
|
+
|
|
183
|
+
```
|
|
184
|
+
CC → search("rust async", engine="auto")
|
|
185
|
+
→ SearchChannel.run()
|
|
186
|
+
→ FallbackChain: 智谱 → Brave → Bing → Wayback → RecordingStore replay
|
|
187
|
+
→ 任一 worked 即止;全 didnt + 有录制 → recording_replay_miss 兜底
|
|
188
|
+
→ 返 { outcome: "worked", entries: [...], engine: "zhipu" }
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### 9.2 browse_logged_in(2FA 场景)
|
|
192
|
+
|
|
193
|
+
```
|
|
194
|
+
CC → browse_logged_in("https://app.example.com", action="snapshot")
|
|
195
|
+
→ LoggedInChannel.run() → chrome-devtools-mcp (:9222 CDP)
|
|
196
|
+
→ 站点返 302 to /login/2fa
|
|
197
|
+
→ outcome="didnt" + error="NEEDS_MANUAL_2FA"
|
|
198
|
+
→ 链止(不 fallback;2FA 是红线)
|
|
199
|
+
→ CC 提示用户本机 Chrome 完成 2FA
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### 9.3 desktop(macOS ax → screenshotVlm 兜底)
|
|
203
|
+
|
|
204
|
+
```
|
|
205
|
+
CC → desktop(action="act", actions=[{ref:"@e7", type:"click"}])
|
|
206
|
+
→ DesktopChannel.act()
|
|
207
|
+
→ FallbackPlan: ax → appleScript → cgEvent → screenshotVlm
|
|
208
|
+
→ ax.invoke(@e7) → expect 视觉验证
|
|
209
|
+
→ worked → 链止,返成功
|
|
210
|
+
→ unknown(按钮未响应)→ 下一档 appleScript
|
|
211
|
+
→ ...
|
|
212
|
+
→ screenshotVlm 兜底(最后一次)
|
|
213
|
+
→ 返 { outcome: "worked"|"didnt", provider: "desktop.ax"|"desktop.cgEvent"|"desktop.vlm" }
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### 9.4 launch-chrome(跨平台子命令)
|
|
217
|
+
|
|
218
|
+
```
|
|
219
|
+
$ lasso launch-chrome
|
|
220
|
+
→ runLaunchChromeCli() → detectChromePath()
|
|
221
|
+
→ macOS: /Applications/Google Chrome.app/...
|
|
222
|
+
→ Linux: /usr/bin/google-chrome
|
|
223
|
+
→ Windows: C:\Program Files\Google\Chrome\...
|
|
224
|
+
→ spawn chrome --remote-debugging-port=9222 ...
|
|
225
|
+
→ 输出 "Chrome ready at http://127.0.0.1:9222"
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
## 10. 关键路径文件索引
|
|
229
|
+
|
|
230
|
+
| 模块 | 主文件 | 行数 |
|
|
231
|
+
|---|---|---|
|
|
232
|
+
| Tool 注册 | src/index.ts | ~1000 |
|
|
233
|
+
| Tool handler | src/tools/{search,browse,desktop,admin,doctor}.ts | — |
|
|
234
|
+
| Channel 层 | src/channels/{BaseChannel,UiChannel}.ts | — |
|
|
235
|
+
| BrowseChannel | src/browse/BrowseChannel.ts | — |
|
|
236
|
+
| DesktopChannel | src/desktop/AxProvider.ts | ~250 |
|
|
237
|
+
| AxBackend 契约 | src/desktop/AxBackend.ts(含三平台 backend class) | ~250 |
|
|
238
|
+
| AxBackendFactory | src/desktop/AxBackendFactory.ts(INV-60 单一真源) | ~110 |
|
|
239
|
+
| OutlineMapper | src/desktop/OutlineMapper.ts(三平台共享,INV-61) | ~120 |
|
|
240
|
+
| FallbackDecider | src/fallback/FallbackDecider.ts | ~280 |
|
|
241
|
+
| Forest 调度 | src/forest/RootRegistry.ts(INV-24) | — |
|
|
242
|
+
| RecordingStore | src/serp/RecordingStore.ts(v0.9;v1.0 不改) | ~260 |
|
|
243
|
+
| replay-baseline | src/serp/replay-baseline.ts(v1.0 录制回放回归) | ~280 |
|
|
244
|
+
| Launcher | src/launcher/{launch-chrome,chrome-paths}.ts(INV-64 不引新 npm dep) | ~200 |
|
|
245
|
+
| Doctor | src/doctor/doctor.ts(v1.0 32 项 check) | ~1800 |
|
|
246
|
+
| Invariants | src/invariants/check-invariants.mjs(65 条 INV) | ~2700 |
|
|
247
|
+
| Rust helper | rust-helper/src/{ax,uia,atspi,applescript,cgevent,screenshot,tcc,windows,main,ax_role_map}.rs | ~3500 |
|
|
248
|
+
|
|
249
|
+
## 11. 版本与发布
|
|
250
|
+
|
|
251
|
+
- **当前版本**:`1.0.0`(v1.0 稳定发布;2026-07-22)
|
|
252
|
+
- **version 真源**:`package.json` + `src/index.ts:LASSO_SERVER_VERSION` + `src/doctor/doctor.ts:LASSO_VERSION`(INV-63 守:三处必字面量一致)
|
|
253
|
+
- **doctor readiness**:32 项 check 全 pass → `ready: true`
|
|
254
|
+
- **跨平台 backend**:macOS 本机全证;Win/Linux 编译可证 + 契约可证,真机执行待社区反馈(parse11-acceptance.md 手测清单)
|
|
255
|
+
|
|
256
|
+
## 12. 相关文档
|
|
257
|
+
|
|
258
|
+
- [README.md](./README.md) — 用户手册(安装 / 配置 / 工具列表 / 隐私 / 故障排查)
|
|
259
|
+
- [doc/08 功能架构](./../doc/08-media-interact-功能架构.md) — 权威架构基线(F 编号、能力矩阵)
|
|
260
|
+
- [doc/09 实施排期](./../doc/09-media-interact-实施排期.md) — v0.1 → v1.0 能力跃升路径与决策记录
|
|
261
|
+
- [doc/13 全交互重设计](./../doc/13-全交互抓手重设计.md) — 桌面演进设计
|
|
262
|
+
- [doc/TROUBLESHOOTING.md](./doc/TROUBLESHOOTING.md) — FAQ + error_kind 释义
|
|
263
|
+
- [doc/SELECTOR-MAINTENANCE.md](./doc/SELECTOR-MAINTENANCE.md) — selector 债维护手册
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
本文档是 Lasso v1.0 架构概览(user-first;2026-07-22)。深度架构基线(含 F 编号 / 不变量推导链 / 测试策略)见 [`doc/08`](./../doc/08-media-interact-功能架构.md);v0.1 → v1.0 实施排期(含每 phase 决策记录)见 [`doc/09`](./../doc/09-media-interact-实施排期.md)。
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 wangdong233
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# Lasso
|
|
2
|
+
|
|
3
|
+
> CC 的**全交互**对外抓手 MCP(浏览器 + 桌面)。牛仔套索,"套住任何界面"。
|
|
4
|
+
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
[]()
|
|
7
|
+
[](https://www.npmjs.com/package/lasso-mcp)
|
|
8
|
+
|
|
9
|
+
## 这是什么(30 秒读完)
|
|
10
|
+
|
|
11
|
+
Lasso 让 Claude Code 通过这**唯一一个** MCP,高效和**浏览器 + 桌面**交互。与 [media-gen-mcp](https://github.com/wangdong233/media-gen-mcp)(图像抓手)双子星:「所有图像操作归一个 MCP」↔「所有外部交互归一个 MCP」。
|
|
12
|
+
|
|
13
|
+
**四通道**:
|
|
14
|
+
- `search` — 智谱 / Brave / Bing / Wayback 多引擎 fallback(默认入口,≈永不失败)
|
|
15
|
+
- `browse_headless` — chrome-devtools-mcp `--headless --isolated`(干净无头)
|
|
16
|
+
- `browse_logged_in` — chrome-devtools-mcp `--browser-url :9222`(复用本机已登录 Chrome,2FA 不解)
|
|
17
|
+
- `desktop` — macOS AXAPI / Windows UIA / Linux AT-SPI(三平台语义同构 OutlineNode)
|
|
18
|
+
|
|
19
|
+
跨模态 fallback 链自动降级(search 失败 → browse_headless 实搜;desktop ax 失败 → screenshotVlm 兜底),对 CC 透明。
|
|
20
|
+
|
|
21
|
+
**v1.0 稳定版**。权威架构见 [`doc/08`](./../doc/08-media-interact-功能架构.md),实施排期见 [`doc/09`](./../doc/09-media-interact-实施排期.md)。
|
|
22
|
+
|
|
23
|
+
## 四通道(能力导向)
|
|
24
|
+
|
|
25
|
+
| 工具 | 通道 | 后端 | 平台 |
|
|
26
|
+
|---|---|---|---|
|
|
27
|
+
| `search` | search | 智谱 / Brave / Bing / Wayback 多引擎 fallback | 跨平台 |
|
|
28
|
+
| `browse_headless` | browse | chrome-devtools-mcp `--headless --isolated` | 跨平台 |
|
|
29
|
+
| `browse_logged_in` | browse | chrome-devtools-mcp `--browser-url :9222` | 跨平台 |
|
|
30
|
+
| `desktop` | desktop | macOS AXAPI / Windows UIA / Linux AT-SPI | 三平台 |
|
|
31
|
+
|
|
32
|
+
## 安装
|
|
33
|
+
|
|
34
|
+
### 1. 装 Lasso
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
# Claude Code 配置(推荐)
|
|
38
|
+
claude mcp add lasso --scope user -- npx -y lasso-mcp@1.0.0
|
|
39
|
+
|
|
40
|
+
# 或全局安装
|
|
41
|
+
npm install -g lasso-mcp@1.0.0
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### 2. 配置(按需)
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
# 搜索(必)
|
|
48
|
+
export ZHIPU_API_KEY=... # 智谱(默认引擎)
|
|
49
|
+
|
|
50
|
+
# 搜索(可选多源 fallback)
|
|
51
|
+
export BRAVE_API_KEYS=key1,key2,... # Brave(CSV 多 key 轮询)
|
|
52
|
+
export BING_API_KEYS=key1,key2,... # Bing(v0.9 第三源)
|
|
53
|
+
|
|
54
|
+
# browse_logged_in:先启动带 :9222 CDP 的 Chrome
|
|
55
|
+
lasso launch-chrome # 跨平台路径探测(macOS/Linux/Windows)
|
|
56
|
+
|
|
57
|
+
# desktop macOS:让 Lasso 自检并引导 TCC 授权
|
|
58
|
+
lasso doctor # 32 项 readiness 检查
|
|
59
|
+
|
|
60
|
+
# desktop Windows:首次调用时系统会弹 UIA 授权(与 macOS TCC 等效)
|
|
61
|
+
# desktop Linux:确保 AT-SPI2 已装(大多数 GNOME/MATE 桌面默认有)
|
|
62
|
+
|
|
63
|
+
# 可选:fake-ip 代理网络(Surge/Clash TUN 段;默认拒私有 IP)
|
|
64
|
+
# Lasso 已默认放行 198.18.0.0/15,无需额外配置
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 3. 自检
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
lasso doctor
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
输出 32 项 readiness JSON:`lasso_version` / `platform_backend_active` / `recording_baseline_count` / TCC 状态 / 各 channel 健康度 等。`ready: true` 即可正常使用。
|
|
74
|
+
|
|
75
|
+
## 工具列表(4 能力工具 + admin + doctor)
|
|
76
|
+
|
|
77
|
+
| 工具 | 用途 | 关键参数 |
|
|
78
|
+
|---|---|---|
|
|
79
|
+
| `search(query, limit, engine, region)` | 关键词搜索(多引擎 fallback) | `engine="auto"` 默认;`engine="fallback_chain"` 显式走全链 |
|
|
80
|
+
| `browse_headless(url, action, options)` | 无头浏览(snapshot/click/fill/scroll/wait/...) | `action` enum |
|
|
81
|
+
| `browse_logged_in(url, action, options)` | 复用登录态浏览(2FA 不解) | 需 `:9222` CDP |
|
|
82
|
+
| `desktop(action, options)` | 控原生 app(snapshot/find/act/...) | `action` enum;三平台同构 OutlineNode |
|
|
83
|
+
| `admin(action, ...)` | 运行时管理(channel_health / reset / profile_list / profile_switch / cookie_restore / ...) | `action` enum |
|
|
84
|
+
| `doctor()` | readiness JSON | — |
|
|
85
|
+
|
|
86
|
+
完整字段定义见源码 `src/tools/*.ts` 的 `inputSchema`(每个工具都注册了完整的 Zod schema + ToolAnnotations)。
|
|
87
|
+
|
|
88
|
+
## 隐私
|
|
89
|
+
|
|
90
|
+
- **cookie=身份**:`browse_logged_in` 不导出用户 cookie;除非用户显式 opt-in `admin` action 且经 AES-256-GCM 加密落盘(08 §5.1 红线;INV-48..53 守)。
|
|
91
|
+
- **SSRF 防护**:所有外网请求经 `allowRanges` 守门(默认拒私有 IP;fake-ip 环境配 `198.18.0.0/15` 已内置;INV-31/32 守)。
|
|
92
|
+
- **desktop audit**:所有 `desktop act` 落 JSONL audit log(本地,10MB 轮转,零遥测)。
|
|
93
|
+
- **录制 opt-in**:`LASSO_RECORD_SEARCH=true` 才落盘 SERP 快照(默认 OFF;INV-57 守)。
|
|
94
|
+
- **无远程 telemetry**:所有指标进程内(INV-43 守)。
|
|
95
|
+
|
|
96
|
+
## 故障排查(常见 `error_kind`)
|
|
97
|
+
|
|
98
|
+
| error_kind | 释义 | next_step |
|
|
99
|
+
|---|---|---|
|
|
100
|
+
| `tcc_denied` | macOS Accessibility / Screen Recording 未授权 | System Settings → Privacy & Security → Accessibility(Screen Recording)→ 勾选 `lasso-rust-helper` |
|
|
101
|
+
| `not_macos` / `not_windows` / `not_linux` | helper binary 平台不匹配 | 重装对应平台 binary(`npm install -g lasso-mcp@1.0.0`) |
|
|
102
|
+
| `unsupported_platform:<x>` | AxBackendFactory 不支持该 platform | Lasso v1.0 支持 `darwin` / `win32` / `linux` |
|
|
103
|
+
| `NEEDS_MANUAL_2FA` | 站点要 2FA(Lasso 不解 2FA,这是红线) | 本机 Chrome 手动登 → 回到 `browse_logged_in` |
|
|
104
|
+
| `recording_replay_miss` | 全源熔断 + 无录制基线 | 配 `LASSO_RECORD_SEARCH=true` 录一份基线兜底 |
|
|
105
|
+
| `upstream_unsupported:pdf` | chrome-devtools-mcp 不支持 pdf 工具 | 用 `browse_headless` + `action="screenshot"` |
|
|
106
|
+
| `upstream_unsupported:network` | chrome-devtools-mcp 不支持 evaluate_script | 等上游支持,或用 `browse_headless` + `action="evaluate"` |
|
|
107
|
+
| `ssrf_blocked` | URL 命中私有/保留 IP 段 | 检查 URL;fake-ip 网络确认 `198.18.0.0/15` 已放行 |
|
|
108
|
+
|
|
109
|
+
完整 FAQ + 调试技巧见 [`doc/TROUBLESHOOTING.md`](./doc/TROUBLESHOOTING.md)。
|
|
110
|
+
|
|
111
|
+
## 架构
|
|
112
|
+
|
|
113
|
+
架构分层图 + data flow + 设计原则 + 边界 见 [`ARCHITECTURE.md`](./ARCHITECTURE.md)。
|
|
114
|
+
|
|
115
|
+
深度架构基线(F 编号、能力矩阵、不变量)见 [`doc/08`](./../doc/08-media-interact-功能架构.md);v0.1 → v1.0 实施排期与决策记录见 [`doc/09`](./../doc/09-media-interact-实施排期.md)。
|
|
116
|
+
|
|
117
|
+
selector 维护(v1.0 录制回放回归 + 改版检测流程)见 [`doc/SELECTOR-MAINTENANCE.md`](./doc/SELECTOR-MAINTENANCE.md)。
|
|
118
|
+
|
|
119
|
+
## 设计原则
|
|
120
|
+
|
|
121
|
+
1. **能力导向命名**(search / browse_* / desktop,不按后端)
|
|
122
|
+
2. **页面/界面状态写磁盘**(不灌上下文,4× token 效率)
|
|
123
|
+
3. **诚实三态交付**(`worked / didnt / unknown`)—— event delivery alone is never treated as semantic success
|
|
124
|
+
4. **第二套做法红线**(四通道共享一套 fallback 范式 / 状态模型 / 工具风格)
|
|
125
|
+
5. **架构不变量脚本化**(CI 守门 65 条,防 refactor 回退)
|
|
126
|
+
6. **平台差异隔离在 backend 内部**(AxBackend 三平台同构 OutlineNode 契约;TS 层不出现平台字面量,INV-21/60/61 守)
|
|
127
|
+
7. **macOS-only 开发,跨平台编译可证**(Win/Linux backend 经 cfg-gate + `cargo check --target` 验编译;真机执行待社区反馈,不伪造)
|
|
128
|
+
|
|
129
|
+
## 开发
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
npm install # 装依赖
|
|
133
|
+
npm run build # TypeScript 编译
|
|
134
|
+
npm run check-invariants # 架构不变量检查(65 条;CI 强制)
|
|
135
|
+
npm test # 全量 vitest(≈1400 测试)
|
|
136
|
+
npm run replay-baseline # SERP 录制回放回归(v1.0;selector 改版检测)
|
|
137
|
+
|
|
138
|
+
# Rust helper(macOS 本机;v1.0 跨平台 backend)
|
|
139
|
+
cd rust-helper && cargo build && cargo test # macOS 零回归
|
|
140
|
+
cd rust-helper && cargo check --target x86_64-pc-windows-msvc # 验 Windows 编译
|
|
141
|
+
cd rust-helper && cargo check --target x86_64-unknown-linux-gnu # 验 Linux 编译
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## 跨平台 desktop 现实边界(诚实声明)
|
|
145
|
+
|
|
146
|
+
Lasso v1.0 的 desktop 通道在 macOS 上**本机可运行时验证**;Windows UIA + Linux AT-SPI 经 `cargo check --target` 验证编译可证 + OutlineNode 三平台同构契约层 CI 单测,**但真实 Win/Linux 运行时执行留手测清单**(`parse11-acceptance.md` 标 pending),待真 Windows/Linux 环境社区反馈。**不伪造「已验证 Windows/Linux」**。
|
|
147
|
+
|
|
148
|
+
## 相关文档
|
|
149
|
+
|
|
150
|
+
- [08 功能架构](./../doc/08-media-interact-功能架构.md) — 权威架构基线(F 编号、不变量)
|
|
151
|
+
- [09 实施排期](./../doc/09-media-interact-实施排期.md) — v0.1 → v1.0 能力跃升路径
|
|
152
|
+
- [13 全交互重设计](./../doc/13-全交互抓手重设计.md) — 桌面演进设计
|
|
153
|
+
- [ARCHITECTURE.md](./ARCHITECTURE.md) — v1.0 架构概览(本文档的姐妹篇)
|
|
154
|
+
- [doc/TROUBLESHOOTING.md](./doc/TROUBLESHOOTING.md) — FAQ + error_kind 释义
|
|
155
|
+
- [doc/SELECTOR-MAINTENANCE.md](./doc/SELECTOR-MAINTENANCE.md) — selector 债维护手册
|
|
156
|
+
|
|
157
|
+
## License
|
|
158
|
+
|
|
159
|
+
MIT © wangdong233
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lasso v0.3 expect 后置条件(parse3 §3.2,F3.2.18)
|
|
3
|
+
*
|
|
4
|
+
* 架构铁律(08 §0 原则 5 / INV-13):event delivery alone is never treated as
|
|
5
|
+
* semantic success. expect failed → 调用方(StepEngine)必须强制 outcome=didnt
|
|
6
|
+
* 并终止 chain。
|
|
7
|
+
*
|
|
8
|
+
* 三态返回:
|
|
9
|
+
* - verified : poll 期间条件满足(gone=true 时即条件消失)
|
|
10
|
+
* - preexisting : preSnapshot 显示动作前条件已满足(保留原 outcome,12 §1.1B
|
|
11
|
+
* 「承认我没造成它但它现在对」)
|
|
12
|
+
* - failed : 超时仍未满足 → 调用方强制 outcome=didnt
|
|
13
|
+
*
|
|
14
|
+
* 借鉴源(12 §1.1B 源码级):
|
|
15
|
+
* - injaneity src/bridge.ts performBrowserTransaction:
|
|
16
|
+
* deadline = Date.now() + timeoutMs;
|
|
17
|
+
* do { snap = cdpSnapshotForContext();
|
|
18
|
+
* present = outlineConditionPresent(restoreOutline(snap.outline), cond);
|
|
19
|
+
* satisfied = present !== cond.gone;
|
|
20
|
+
* if (!satisfied) await sleep(100);
|
|
21
|
+
* } while (!satisfied && Date.now() < deadline);
|
|
22
|
+
* - injaneity src/actions.ts outcomeAfterCheck:
|
|
23
|
+
* verified → outcome=worked
|
|
24
|
+
* failed → outcome=didnt
|
|
25
|
+
* preexisting → 保留原 outcome
|
|
26
|
+
* - injaneity src/contract.ts UiCondition:
|
|
27
|
+
* {ref?, scopeRef?, text?, role?, value?, until:'present'|'absent', timeoutMs?}
|
|
28
|
+
* validateCondition 强制 text/role/value 至少一项 → 我们 cond 至少
|
|
29
|
+
* text/selector/url_contains 之一
|
|
30
|
+
*
|
|
31
|
+
* 决策(parse3 §4.2):走 evaluate_script 100ms poll,不依赖 CDP 原生事件回调
|
|
32
|
+
* (Lasso 通过 chrome-devtools-mcp 工具层调用,拿不到 CDP 原生事件)。
|
|
33
|
+
*/
|
|
34
|
+
import type { ExpectCondition } from "../types.js";
|
|
35
|
+
import type { McpClient } from "../subprocess/McpClient.js";
|
|
36
|
+
/** expect poll 的三态判定(parse3 §3.2)。 */
|
|
37
|
+
export type ExpectVerdict = "verified" | "preexisting" | "failed";
|
|
38
|
+
/**
|
|
39
|
+
* 条件快照:act 前由 BrowseChannel.quickSnapshot() 抓取,用于 preexisting 判定。
|
|
40
|
+
* 字段按需填充 —— 缺失字段在 conditionHolds 中按 false 处理(保守)。
|
|
41
|
+
*/
|
|
42
|
+
export interface ConditionSnapshot {
|
|
43
|
+
/** window.location.href at snapshot time */
|
|
44
|
+
url?: string;
|
|
45
|
+
/** document.body.innerText at snapshot time(可截断到合理长度) */
|
|
46
|
+
body_text?: string;
|
|
47
|
+
/** 预计算好的 selector 命中表(key=selector 表达式,value=是否匹配) */
|
|
48
|
+
selector_hits?: Record<string, boolean>;
|
|
49
|
+
/** Date.now() at capture */
|
|
50
|
+
captured_at?: number;
|
|
51
|
+
}
|
|
52
|
+
/** expectPoll 可选项(测试 / 调参用)。 */
|
|
53
|
+
export interface ExpectPollOptions {
|
|
54
|
+
/** poll 间隔,默认 100ms(直抄 injaneity bridge.ts) */
|
|
55
|
+
pollIntervalMs?: number;
|
|
56
|
+
/** 默认 timeout,仅当 cond.timeout_ms 缺省时启用,默认 5000ms */
|
|
57
|
+
defaultTimeoutMs?: number;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 100ms poll 等待条件成立。返回三态 verified/preexisting/failed。
|
|
61
|
+
*
|
|
62
|
+
* 流程(parse3 §3.2):
|
|
63
|
+
* 1. validateCondition(强制 text/selector/url_contains 至少一项)
|
|
64
|
+
* 2. preSnapshot 预检 → preexisting 短路(仅当相关字段齐全时启用)
|
|
65
|
+
* 3. 100ms poll 循环(gone=true 时反向语义)
|
|
66
|
+
* 4. deadline 内未满足 → failed
|
|
67
|
+
*
|
|
68
|
+
* @throws cond 缺 text/selector/url_contains 时抛错(contract validateCondition)
|
|
69
|
+
*/
|
|
70
|
+
export declare function expectPoll(client: McpClient, cond: ExpectCondition, preSnapshot?: ConditionSnapshot, opts?: ExpectPollOptions): Promise<ExpectVerdict>;
|
|
71
|
+
/**
|
|
72
|
+
* 强制 cond 至少含 text/selector/url_contains 之一。
|
|
73
|
+
* 对应 injaneity contract.ts validateCondition「text/role/value 至少一项」。
|
|
74
|
+
*/
|
|
75
|
+
export declare function validateCondition(cond: ExpectCondition): void;
|
|
76
|
+
/**
|
|
77
|
+
* 在给定 snapshot 上判定 cond 是否「成立」(present)。
|
|
78
|
+
* - OR 语义:多个字段任一命中即 true
|
|
79
|
+
* - snapshot 缺字段 → 该字段按 false(保守)
|
|
80
|
+
* - 不考虑 cond.gone(caller 自行处理反向语义)
|
|
81
|
+
*/
|
|
82
|
+
export declare function conditionHolds(snap: ConditionSnapshot, cond: ExpectCondition): boolean;
|
|
83
|
+
/**
|
|
84
|
+
* 判定 preexisting:act 前是否已处于 desired state。
|
|
85
|
+
* - cond.gone=false : desired=present,preexisting = wasPresent
|
|
86
|
+
* - cond.gone=true : desired=absent,preexisting = !wasPresent
|
|
87
|
+
*
|
|
88
|
+
* 安全边界:若 snapshot 缺相关字段(无法判定)→ 返回 false(不假设 preexisting)。
|
|
89
|
+
*/
|
|
90
|
+
export declare function isPreexisting(pre: ConditionSnapshot, cond: ExpectCondition): boolean;
|
|
91
|
+
/**
|
|
92
|
+
* 构造 evaluate_script 用的 JS 表达式:返回 "true"/"false" 字符串。
|
|
93
|
+
* 三条件 OR(任一命中即 holds=true)。
|
|
94
|
+
* 导出供测试 / BrowseChannel.quickSnapshot 复用。
|
|
95
|
+
*/
|
|
96
|
+
export declare function buildConditionExpr(cond: ExpectCondition): string;
|
|
97
|
+
//# sourceMappingURL=ExpectPoll.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExpectPoll.d.ts","sourceRoot":"","sources":["../../src/browse/ExpectPoll.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAK5D,sCAAsC;AACtC,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,aAAa,GAAG,QAAQ,CAAC;AAElE;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,4CAA4C;IAC5C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,4BAA4B;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,gCAAgC;AAChC,MAAM,WAAW,iBAAiB;IAChC,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oDAAoD;IACpD,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAWD;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,eAAe,EACrB,WAAW,CAAC,EAAE,iBAAiB,EAC/B,IAAI,CAAC,EAAE,iBAAiB,GACvB,OAAO,CAAC,aAAa,CAAC,CAmBxB;AAKD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAM7D;AAKD;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,iBAAiB,EACvB,IAAI,EAAE,eAAe,GACpB,OAAO,CAWT;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,iBAAiB,EACtB,IAAI,EAAE,eAAe,GACpB,OAAO,CAST;AA4BD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAiBhE"}
|