lasso-mcp 1.4.0 → 1.8.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.
Files changed (281) hide show
  1. package/README.en.md +39 -12
  2. package/README.md +51 -15
  3. package/dist/browse/ExpectPoll.d.ts.map +1 -1
  4. package/dist/browse/ExpectPoll.js +7 -3
  5. package/dist/browse/ExpectPoll.js.map +1 -1
  6. package/dist/browse/HighRiskGate.d.ts.map +1 -1
  7. package/dist/browse/HighRiskGate.js +3 -2
  8. package/dist/browse/HighRiskGate.js.map +1 -1
  9. package/dist/browse/StealthEngine.d.ts +25 -6
  10. package/dist/browse/StealthEngine.d.ts.map +1 -1
  11. package/dist/browse/StealthEngine.js +71 -17
  12. package/dist/browse/StealthEngine.js.map +1 -1
  13. package/dist/browse/cdp-actions.d.ts.map +1 -1
  14. package/dist/browse/cdp-actions.js +9 -4
  15. package/dist/browse/cdp-actions.js.map +1 -1
  16. package/dist/browse/stealth-evasions/chrome-app.d.ts +11 -0
  17. package/dist/browse/stealth-evasions/chrome-app.d.ts.map +1 -0
  18. package/dist/browse/stealth-evasions/chrome-app.js +45 -0
  19. package/dist/browse/stealth-evasions/chrome-app.js.map +1 -0
  20. package/dist/browse/stealth-evasions/chrome-csi.d.ts +10 -0
  21. package/dist/browse/stealth-evasions/chrome-csi.d.ts.map +1 -0
  22. package/dist/browse/stealth-evasions/chrome-csi.js +26 -0
  23. package/dist/browse/stealth-evasions/chrome-csi.js.map +1 -0
  24. package/dist/browse/stealth-evasions/chrome-loadtimes.d.ts +10 -0
  25. package/dist/browse/stealth-evasions/chrome-loadtimes.d.ts.map +1 -0
  26. package/dist/browse/stealth-evasions/chrome-loadtimes.js +36 -0
  27. package/dist/browse/stealth-evasions/chrome-loadtimes.js.map +1 -0
  28. package/dist/browse/stealth-evasions/chrome-runtime.d.ts +12 -0
  29. package/dist/browse/stealth-evasions/chrome-runtime.d.ts.map +1 -0
  30. package/dist/browse/stealth-evasions/chrome-runtime.js +101 -0
  31. package/dist/browse/stealth-evasions/chrome-runtime.js.map +1 -0
  32. package/dist/browse/stealth-evasions/hardware-concurrency.d.ts +10 -0
  33. package/dist/browse/stealth-evasions/hardware-concurrency.d.ts.map +1 -0
  34. package/dist/browse/stealth-evasions/hardware-concurrency.js +18 -0
  35. package/dist/browse/stealth-evasions/hardware-concurrency.js.map +1 -0
  36. package/dist/browse/stealth-evasions/iframe-contentwindow.d.ts +12 -0
  37. package/dist/browse/stealth-evasions/iframe-contentwindow.d.ts.map +1 -0
  38. package/dist/browse/stealth-evasions/iframe-contentwindow.js +53 -0
  39. package/dist/browse/stealth-evasions/iframe-contentwindow.js.map +1 -0
  40. package/dist/browse/stealth-evasions/media-codecs.d.ts +12 -0
  41. package/dist/browse/stealth-evasions/media-codecs.d.ts.map +1 -0
  42. package/dist/browse/stealth-evasions/media-codecs.js +39 -0
  43. package/dist/browse/stealth-evasions/media-codecs.js.map +1 -0
  44. package/dist/browse/stealth-evasions/navigator-plugins.d.ts +12 -0
  45. package/dist/browse/stealth-evasions/navigator-plugins.d.ts.map +1 -0
  46. package/dist/browse/stealth-evasions/navigator-plugins.js +85 -0
  47. package/dist/browse/stealth-evasions/navigator-plugins.js.map +1 -0
  48. package/dist/browse/stealth-evasions/navigator-vendor.d.ts +11 -0
  49. package/dist/browse/stealth-evasions/navigator-vendor.d.ts.map +1 -0
  50. package/dist/browse/stealth-evasions/navigator-vendor.js +19 -0
  51. package/dist/browse/stealth-evasions/navigator-vendor.js.map +1 -0
  52. package/dist/browse/stealth-evasions/outer-dimensions.d.ts +11 -0
  53. package/dist/browse/stealth-evasions/outer-dimensions.d.ts.map +1 -0
  54. package/dist/browse/stealth-evasions/outer-dimensions.js +24 -0
  55. package/dist/browse/stealth-evasions/outer-dimensions.js.map +1 -0
  56. package/dist/browse/stealth-evasions/ua-client-hints.d.ts +18 -0
  57. package/dist/browse/stealth-evasions/ua-client-hints.d.ts.map +1 -0
  58. package/dist/browse/stealth-evasions/ua-client-hints.js +71 -0
  59. package/dist/browse/stealth-evasions/ua-client-hints.js.map +1 -0
  60. package/dist/browse/stealth-evasions/webgl-vendor.d.ts +11 -0
  61. package/dist/browse/stealth-evasions/webgl-vendor.d.ts.map +1 -0
  62. package/dist/browse/stealth-evasions/webgl-vendor.js +38 -0
  63. package/dist/browse/stealth-evasions/webgl-vendor.js.map +1 -0
  64. package/dist/browse/stealth-profiles.d.ts +86 -24
  65. package/dist/browse/stealth-profiles.d.ts.map +1 -1
  66. package/dist/browse/stealth-profiles.js +122 -22
  67. package/dist/browse/stealth-profiles.js.map +1 -1
  68. package/dist/browse/upstream-response.d.ts +50 -0
  69. package/dist/browse/upstream-response.d.ts.map +1 -0
  70. package/dist/browse/upstream-response.js +83 -0
  71. package/dist/browse/upstream-response.js.map +1 -0
  72. package/dist/channels/BrowseChannel.d.ts +8 -0
  73. package/dist/channels/BrowseChannel.d.ts.map +1 -1
  74. package/dist/channels/BrowseChannel.js +211 -28
  75. package/dist/channels/BrowseChannel.js.map +1 -1
  76. package/dist/channels/BrowserbaseChannel.d.ts +1 -1
  77. package/dist/channels/BrowserbaseChannel.d.ts.map +1 -1
  78. package/dist/channels/BrowserbaseChannel.js +3 -1
  79. package/dist/channels/BrowserbaseChannel.js.map +1 -1
  80. package/dist/channels/DesktopChannel.d.ts.map +1 -1
  81. package/dist/channels/DesktopChannel.js +4 -0
  82. package/dist/channels/DesktopChannel.js.map +1 -1
  83. package/dist/channels/HeadlessChannel.d.ts +27 -3
  84. package/dist/channels/HeadlessChannel.d.ts.map +1 -1
  85. package/dist/channels/HeadlessChannel.js +57 -3
  86. package/dist/channels/HeadlessChannel.js.map +1 -1
  87. package/dist/channels/StagehandChannel.d.ts +7 -0
  88. package/dist/channels/StagehandChannel.d.ts.map +1 -1
  89. package/dist/channels/StagehandChannel.js +7 -0
  90. package/dist/channels/StagehandChannel.js.map +1 -1
  91. package/dist/channels/SteelChannel.d.ts +192 -0
  92. package/dist/channels/SteelChannel.d.ts.map +1 -0
  93. package/dist/channels/SteelChannel.js +322 -0
  94. package/dist/channels/SteelChannel.js.map +1 -0
  95. package/dist/config/providers.d.ts +38 -0
  96. package/dist/config/providers.d.ts.map +1 -1
  97. package/dist/config/providers.js +55 -0
  98. package/dist/config/providers.js.map +1 -1
  99. package/dist/desktop/ScreenshotVlmProvider.d.ts +14 -0
  100. package/dist/desktop/ScreenshotVlmProvider.d.ts.map +1 -1
  101. package/dist/desktop/ScreenshotVlmProvider.js +53 -1
  102. package/dist/desktop/ScreenshotVlmProvider.js.map +1 -1
  103. package/dist/desktop/desktop-types.d.ts +6 -0
  104. package/dist/desktop/desktop-types.d.ts.map +1 -1
  105. package/dist/desktop/desktop-types.js.map +1 -1
  106. package/dist/doctor/creepjs-probe.d.ts +118 -0
  107. package/dist/doctor/creepjs-probe.d.ts.map +1 -0
  108. package/dist/doctor/creepjs-probe.js +221 -0
  109. package/dist/doctor/creepjs-probe.js.map +1 -0
  110. package/dist/doctor/doctor-cli.d.ts +47 -0
  111. package/dist/doctor/doctor-cli.d.ts.map +1 -0
  112. package/dist/doctor/doctor-cli.js +55 -0
  113. package/dist/doctor/doctor-cli.js.map +1 -0
  114. package/dist/doctor/doctor.d.ts +40 -1
  115. package/dist/doctor/doctor.d.ts.map +1 -1
  116. package/dist/doctor/doctor.js +385 -1
  117. package/dist/doctor/doctor.js.map +1 -1
  118. package/dist/doctor/fixtures/creepjs-baseline.json +21 -0
  119. package/dist/fallback/CircuitBreaker.d.ts +7 -0
  120. package/dist/fallback/CircuitBreaker.d.ts.map +1 -1
  121. package/dist/fallback/CircuitBreaker.js +11 -0
  122. package/dist/fallback/CircuitBreaker.js.map +1 -1
  123. package/dist/index.js +207 -13
  124. package/dist/index.js.map +1 -1
  125. package/dist/launcher/launch-chrome.d.ts +41 -6
  126. package/dist/launcher/launch-chrome.d.ts.map +1 -1
  127. package/dist/launcher/launch-chrome.js +120 -19
  128. package/dist/launcher/launch-chrome.js.map +1 -1
  129. package/dist/logged-in/CdpClient.d.ts +3 -2
  130. package/dist/logged-in/CdpClient.d.ts.map +1 -1
  131. package/dist/logged-in/CdpClient.js +18 -5
  132. package/dist/logged-in/CdpClient.js.map +1 -1
  133. package/dist/runtime/CallerTierTracker.d.ts +16 -0
  134. package/dist/runtime/CallerTierTracker.d.ts.map +1 -1
  135. package/dist/runtime/CallerTierTracker.js +34 -0
  136. package/dist/runtime/CallerTierTracker.js.map +1 -1
  137. package/dist/runtime/runtime-types.d.ts +1 -1
  138. package/dist/runtime/runtime-types.d.ts.map +1 -1
  139. package/dist/subprocess/RustBridge.d.ts +14 -0
  140. package/dist/subprocess/RustBridge.d.ts.map +1 -1
  141. package/dist/subprocess/RustBridge.js +38 -0
  142. package/dist/subprocess/RustBridge.js.map +1 -1
  143. package/dist/subprocess/SubprocessManager.d.ts +27 -0
  144. package/dist/subprocess/SubprocessManager.d.ts.map +1 -1
  145. package/dist/subprocess/SubprocessManager.js +98 -1
  146. package/dist/subprocess/SubprocessManager.js.map +1 -1
  147. package/dist/tools/admin.d.ts +1 -1
  148. package/dist/tools/admin.d.ts.map +1 -1
  149. package/dist/tools/admin.js +41 -0
  150. package/dist/tools/admin.js.map +1 -1
  151. package/dist/tools/annotations.d.ts +17 -0
  152. package/dist/tools/annotations.d.ts.map +1 -1
  153. package/dist/tools/annotations.js +20 -0
  154. package/dist/tools/annotations.js.map +1 -1
  155. package/dist/tools/browse.d.ts +10 -1
  156. package/dist/tools/browse.d.ts.map +1 -1
  157. package/dist/tools/browse.js +62 -3
  158. package/dist/tools/browse.js.map +1 -1
  159. package/dist/tools/descriptions.d.ts +1 -0
  160. package/dist/tools/descriptions.d.ts.map +1 -1
  161. package/dist/tools/descriptions.js +53 -0
  162. package/dist/tools/descriptions.js.map +1 -1
  163. package/dist/tools/desktop.d.ts.map +1 -1
  164. package/dist/tools/desktop.js +10 -0
  165. package/dist/tools/desktop.js.map +1 -1
  166. package/dist/tools/screenshot.d.ts.map +1 -1
  167. package/dist/tools/screenshot.js +2 -1
  168. package/dist/tools/screenshot.js.map +1 -1
  169. package/dist/tools/search.d.ts +33 -1
  170. package/dist/tools/search.d.ts.map +1 -1
  171. package/dist/tools/search.js +62 -3
  172. package/dist/tools/search.js.map +1 -1
  173. package/dist/tools/steel.d.ts +41 -0
  174. package/dist/tools/steel.d.ts.map +1 -0
  175. package/dist/tools/steel.js +112 -0
  176. package/dist/tools/steel.js.map +1 -0
  177. package/doc/17-/345/212/237/350/203/275/346/265/213/350/257/225/346/270/205/345/215/225.md +466 -0
  178. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/admin-tool_list.json +8 -0
  179. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/admin1.jsonl +11 -0
  180. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/admin2.jsonl +5 -0
  181. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/caps.jsonl +10 -0
  182. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/doctor-cli.json +184 -0
  183. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/doctor-mcp.json +8 -0
  184. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/fetch1.jsonl +4 -0
  185. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/forest.jsonl +6 -0
  186. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/forest2.jsonl +3 -0
  187. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/mcp-batch.mjs +60 -0
  188. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/mcp-wave1.mjs +48 -0
  189. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/mcp.mjs +67 -0
  190. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/search1.jsonl +14 -0
  191. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/search2.jsonl +3 -0
  192. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/ssrf.jsonl +7 -0
  193. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/ssrf2.jsonl +2 -0
  194. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/t-entry-04.jsonl +6 -0
  195. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/tools-full.json +1111 -0
  196. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/u085.jsonl +1 -0
  197. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/u085b.mjs +11 -0
  198. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/upstream-probe.mjs +13 -0
  199. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/w2-browse-session.mjs +29 -0
  200. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/w2-netprobe.mjs +10 -0
  201. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/w2-steps-full.mjs +30 -0
  202. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/w2-steps2.mjs +24 -0
  203. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/w2-time-call.mjs +11 -0
  204. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/wave1-browse.md +132 -0
  205. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/wave1-desktop-mcp.mjs +66 -0
  206. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/wave1-desktop.md +159 -0
  207. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/wave1-entry-cli.md +161 -0
  208. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/wave1-gov-search.md +88 -0
  209. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/wave1-summary.md +134 -0
  210. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/wave2-browse.md +241 -0
  211. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/wave2-desktop-cli.md +188 -0
  212. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/wave2-gov.md +135 -0
  213. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/wave2-misc.mjs +50 -0
  214. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/wave2-misc2.mjs +33 -0
  215. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/wave2-misc3.mjs +35 -0
  216. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/wave2-readtext.mjs +33 -0
  217. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/wave2-rt06.mjs +60 -0
  218. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/wave2-rt06b.mjs +28 -0
  219. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/wave2-run.mjs +32 -0
  220. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/wave2-search.mjs +38 -0
  221. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/wave2-summary.md +134 -0
  222. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/wave2-tools.mjs +94 -0
  223. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/wave2-tools2.mjs +42 -0
  224. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/wave2-tools3.mjs +22 -0
  225. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/wave2-tools4.mjs +41 -0
  226. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/wave2-zod.mjs +15 -0
  227. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/wayback.jsonl +3 -0
  228. package/doc/17-/346/211/247/350/241/214/350/256/260/345/275/225/wayback2.jsonl +2 -0
  229. package/doc/KEY-GUIDE.md +68 -4
  230. package/doc/TROUBLESHOOTING.md +2 -0
  231. package/package.json +2 -2
  232. package/profiles/profiles.json +11 -0
  233. package/src/browse/ExpectPoll.ts +7 -3
  234. package/src/browse/HighRiskGate.ts +3 -2
  235. package/src/browse/StealthEngine.ts +79 -19
  236. package/src/browse/cdp-actions.ts +10 -4
  237. package/src/browse/stealth-evasions/chrome-app.ts +45 -0
  238. package/src/browse/stealth-evasions/chrome-csi.ts +26 -0
  239. package/src/browse/stealth-evasions/chrome-loadtimes.ts +36 -0
  240. package/src/browse/stealth-evasions/chrome-runtime.ts +101 -0
  241. package/src/browse/stealth-evasions/hardware-concurrency.ts +18 -0
  242. package/src/browse/stealth-evasions/iframe-contentwindow.ts +53 -0
  243. package/src/browse/stealth-evasions/media-codecs.ts +39 -0
  244. package/src/browse/stealth-evasions/navigator-plugins.ts +85 -0
  245. package/src/browse/stealth-evasions/navigator-vendor.ts +19 -0
  246. package/src/browse/stealth-evasions/outer-dimensions.ts +24 -0
  247. package/src/browse/stealth-evasions/ua-client-hints.ts +71 -0
  248. package/src/browse/stealth-evasions/webgl-vendor.ts +38 -0
  249. package/src/browse/stealth-profiles.ts +151 -23
  250. package/src/browse/upstream-response.ts +95 -0
  251. package/src/channels/BrowseChannel.ts +229 -28
  252. package/src/channels/BrowserbaseChannel.ts +3 -1
  253. package/src/channels/DesktopChannel.ts +4 -0
  254. package/src/channels/HeadlessChannel.ts +63 -3
  255. package/src/channels/StagehandChannel.ts +7 -0
  256. package/src/channels/SteelChannel.ts +389 -0
  257. package/src/config/providers.ts +58 -0
  258. package/src/desktop/ScreenshotVlmProvider.ts +68 -1
  259. package/src/desktop/desktop-types.ts +6 -0
  260. package/src/doctor/creepjs-probe.ts +334 -0
  261. package/src/doctor/doctor-cli.ts +104 -0
  262. package/src/doctor/doctor.ts +486 -1
  263. package/src/doctor/fixtures/creepjs-baseline.json +21 -0
  264. package/src/fallback/CircuitBreaker.ts +12 -0
  265. package/src/index.ts +218 -12
  266. package/src/invariants/check-invariants.mjs +577 -0
  267. package/src/launcher/launch-chrome.ts +138 -19
  268. package/src/logged-in/CdpClient.ts +20 -8
  269. package/src/runtime/CallerTierTracker.ts +41 -0
  270. package/src/runtime/runtime-types.ts +3 -1
  271. package/src/subprocess/RustBridge.ts +40 -0
  272. package/src/subprocess/SubprocessManager.ts +89 -1
  273. package/src/tools/admin.ts +44 -0
  274. package/src/tools/annotations.ts +21 -0
  275. package/src/tools/browse.ts +77 -2
  276. package/src/tools/descriptions.ts +54 -0
  277. package/src/tools/desktop.ts +10 -0
  278. package/src/tools/screenshot.ts +2 -1
  279. package/src/tools/search.ts +97 -19
  280. package/src/tools/steel.ts +157 -0
  281. package/vitest.workspace.ts +43 -0
package/README.en.md CHANGED
@@ -49,7 +49,8 @@ Twin star of [media-gen-mcp](https://github.com/wangdong233/media-gen-mcp) (the
49
49
  | "List everything I can control right now" | One unified list (web pages and desktop windows all in it) |
50
50
  | "Turn off dark mode" | Auto click / type / hotkey (with result verification — it confirms it actually happened) |
51
51
  | "Just fetch this JSON endpoint" | Raw bytes (fastest, cheapest) |
52
- | "This site has Cloudflare, I can't scrape it" | Cloud Chrome anti-bot bypass (off by default; you explicitly opt in) |
52
+ | "This site seems to have some anti-bot, let's try" | `browse_headless` has built-in anti-detection (passes basic bot checks) many sites scrape directly, no config needed |
53
+ | "This site has Cloudflare, I can't scrape it" | Cloud Chrome anti-bot — **Steel self-hosted (free)** or browserbase/stagehand (paid, off by default) |
53
54
  | "Is Lasso set up correctly?" | A health-check report (tells you what's missing) |
54
55
 
55
56
  > You don't need to memorize any capability names. Just say what you want — Claude picks the right way to get it done.
@@ -67,9 +68,11 @@ Lasso itself is **completely free + MIT open source**. Here's what each capabili
67
68
  | Scrape public pages / screenshots / PDF / network audit / raw bytes | ✅ Free | Runs locally, no key, no payment |
68
69
  | Scrape logged-in pages (reuse local Chrome) | ✅ Free | Runs locally, no key, no payment |
69
70
  | Drive desktop (macOS / Windows / Linux) | ✅ Free | Built and run locally, only OS authorization needed; **optional** Apple Developer account \$99/yr for signed persistent authorization (works without signing too — just re-authorize each time) |
70
- | Cloud browser (browserbase / stagehand) | ⚠️ Paid, off by default | Paid after trial; **costs nothing if you don't configure it** Lasso's only paid item |
71
+ | Cloud browser · self-hosted Steel (v1.6 new) | Free | Run Steel (Apache-2.0 open source) in local Docker — **zero per-session cost + cookies never leave your machine**; needs `LASSO_ALLOW_CLOUD_BROWSER=true` + `STEEL_ENDPOINT=http://localhost:3000` |
72
+ | Cloud browser · hosted (browserbase / stagehand) | ⚠️ Paid, off by default | Pay-as-you-go after trial; **costs nothing if you don't configure it** |
73
+ | `browse_headless` anti-detection (v1.5 new) | ✅ Free | Injects 16 anti-detection layers by default (UA / webdriver / webgl, etc.) — passes many basic bot checks out of the box |
71
74
 
72
- > In one sentence: **as long as you don't turn on the cloud browser, Lasso costs zero** — search has free tiers enough for daily use, and everything else is completely free.
75
+ > In one sentence: **as long as you don't turn on the hosted cloud browser (browserbase/stagehand), Lasso costs zero** — search has free tiers enough for daily use, and the self-hosted Steel cloud browser is free too.
73
76
 
74
77
  ---
75
78
 
@@ -93,6 +96,8 @@ No keys needed right after install (this is **Tier 1: zero config**):
93
96
  - Fetch raw bytes from a JSON API or file directly
94
97
  - Control native macOS apps (Finder / Mail / System Settings, etc. — requires a one-time tick in System Settings)
95
98
 
99
+ > 💡 **Search may be zero-config too**: if your machine's `~/.claude.json` already has the Zhipu `web-search-prime` MCP configured, Lasso auto-detects and reuses it at startup — no need to set a separate `ZHIPU_API_KEY`, search just works. Run `lasso doctor` and check whether `#36 machine_search_mcp` is `pass`.
100
+
96
101
  Your first output — just say to Claude:
97
102
 
98
103
  > "Grab the text of example.com and turn it into markdown"
@@ -123,6 +128,8 @@ Defaults to Zhipu (strong for Chinese); you can add Brave and Bing for multi-sou
123
128
 
124
129
  Auto-strips nav bars, ads, sidebars and other clutter — **saves 30–70% on tokens** (and money). Need citation markers (great for research, feeding RAG)? One sentence switches modes.
125
130
 
131
+ > **As of v1.5, `browse_headless` has anti-detection on by default** (spoofed UA / `navigator.webdriver` removed / faked webgl, plugins, codecs, and a dozen more layers). **Zero config — automatic.** Many "detect headless" sites now scrape directly. Only Cloudflare-grade heavy anti-bot needs the cloud browser (see "Anti-Bot Bypass" below). Want to verify the anti-detection effect? Run `lasso doctor --stealth-check` for a creepjs detection comparison.
132
+
126
133
  ### Scrape Logged-in Pages (even with 2FA)
127
134
 
128
135
  > You: "Show me my Jira to-dos" → snapshot of the logged-in page
@@ -173,7 +180,10 @@ Goes to the Internet Archive (Wayback Machine) to find the last archived copy of
173
180
 
174
181
  > You: "This site has Cloudflare, I can't scrape it" → cloud Chrome anti-bot
175
182
 
176
- **Completely off by default.** Only activates when you explicitly turn it on AND have configured a cloud-browser key. You don't need it for normal pages.
183
+ **Completely off by default.** Only activates when you explicitly turn it on AND have configured a cloud browser (self-hosted Steel or hosted browserbase/stagehand). Light anti-bot is already handled by `browse_headless`'s built-in anti-detection **only Cloudflare-grade heavy protection needs the cloud browser**.
184
+
185
+ - **Steel self-hosted (recommended · free)**: run an open-source cloud browser in local Docker — zero per-session cost, cookies never leave your machine. One command to set up, see [Key Guide · Steel](./doc/KEY-GUIDE.md#steel_endpoint--自托管云浏览器v16-新推荐免费).
186
+ - **browserbase / stagehand (hosted · paid)**: pay-as-you-go after trial; the fallback when you don't want to run Docker yourself.
177
187
 
178
188
  ---
179
189
 
@@ -205,7 +215,7 @@ Restart Claude Code → `/mcp` → `lasso ✓ Connected`. **That's it — no key
205
215
  | Near-zero search failures (multi-source) | Add Brave / Bing keys (both have free tiers) | Auto-fails-over if one is down — you don't feel a thing |
206
216
  | Scrape logged-in pages | Run `lasso launch-chrome` once | Reuses your local Chrome session |
207
217
  | Drive the macOS desktop | Run `lasso doctor` once | Drive native apps |
208
- | Scrape Cloudflare-protected sites | Double confirmation + a cloud key | Off by default; needs your explicit opt-in |
218
+ | Scrape Cloudflare-protected sites | Double confirmation + a cloud browser channel (self-hosted Steel free / hosted paid) | Off by default; needs your explicit opt-in |
209
219
 
210
220
  Below, each of the four modules is broken out with the shortest path to "it just works".
211
221
 
@@ -281,18 +291,33 @@ After that, say "open my logged-in Jira" to Claude and it'll connect automatical
281
291
 
282
292
  **Details** → [Key Configuration Guide · Desktop Control](./doc/KEY-GUIDE.md#c-桌面控制系统授权无-key).
283
293
 
284
- ### 4. Cloud Anti-Bot (⚠️ Paid, off by default · needs double confirmation)
294
+ ### 4. Cloud Browser: Self-Hosted or Hosted (self-hosted free / hosted paid, off by default · needs double confirmation)
285
295
 
286
- **What it does**: Scrapes sites guarded by Cloudflare or heavy anti-bot protection.
296
+ **What it does**: Scrapes sites guarded by Cloudflare or heavy anti-bot protection (light anti-bot is already handled by `browse_headless`'s built-in anti-detection — this section is only for the heavy stuff).
287
297
 
288
- **Does it need a key**: Yes and it only activates when **you explicitly turn it on**.
298
+ **Does it need a key**: Depends on which path you take. Pick one of three cloud channels — **only the hosted path needs a key**:
299
+
300
+ - **(a) Steel self-hosted (recommended · free)**: run an open-source cloud browser in local Docker — **zero per-session cost + cookies never leave your machine**. No key to apply for; just run Docker yourself.
301
+ - **(b) browserbase hosted (paid)**: 100-minute trial, then pay-as-you-go.
302
+ - **(c) stagehand hosted (paid)**: AI-friendly page observation; trial-oriented.
289
303
 
290
304
  **How to configure**: Both conditions must be met at the same time:
291
305
 
292
306
  1. Master switch: set `LASSO_ALLOW_CLOUD_BROWSER` to `true`
293
- 2. At least one cloud key (browserbase or stagehand pick one)
307
+ 2. At least one cloud channel — Steel (set `STEEL_ENDPOINT`) or browserbase/stagehand (set the corresponding key)
308
+
309
+ **Shortest config · Steel self-hosted (free, recommended)**:
310
+
311
+ ```json
312
+ {
313
+ "LASSO_ALLOW_CLOUD_BROWSER": true,
314
+ "STEEL_ENDPOINT": "http://localhost:3000"
315
+ }
316
+ ```
317
+
318
+ Start Steel with one Docker command: `docker run -p 3000:3000 -p 9223:9223 ghcr.io/steel-dev/steel-browser`. Full setup steps in [Key Guide · Steel](./doc/KEY-GUIDE.md#steel_endpoint--自托管云浏览器v16-新推荐免费).
294
319
 
295
- Write it into `~/.lasso/config.json`:
320
+ **Shortest config · browserbase hosted (paid)**:
296
321
 
297
322
  ```json
298
323
  {
@@ -301,9 +326,9 @@ Write it into `~/.lasso/config.json`:
301
326
  }
302
327
  ```
303
328
 
304
- > Off by default — no config means no such capability. You don't need it for normal pages, **and it only activates when you explicitly opt in**.
329
+ > Off by default — no config means no such capability. You don't need it for normal pages, **and it only activates when you explicitly opt in**. Light anti-bot doesn't need the cloud browser at all — `browse_headless`'s built-in anti-detection handles it.
305
330
 
306
- **How to apply for cloud keys, trial quotas** → see the [Key Configuration Guide · Cloud Browser](./doc/KEY-GUIDE.md#d-云浏览器反爬默认关双重解锁).
331
+ **How to apply for hosted keys, how to set up Steel Docker** → see the [Key Configuration Guide · Cloud Browser](./doc/KEY-GUIDE.md#d-云浏览器反爬默认关双重解锁).
307
332
 
308
333
  <details>
309
334
  <summary><b>Advanced tuning (optional — ordinary users can skip)</b></summary>
@@ -316,6 +341,7 @@ You can **completely ignore** the below for daily use. These are only for specia
316
341
  - Allow company intranet / special proxy ranges
317
342
  - Set your own passphrase to encrypt login cookies (if unset, macOS Keychain is used)
318
343
  - Save search-result snapshots to disk (for regression testing)
344
+ - Set the Steel self-hosted cloud browser endpoint (`STEEL_ENDPOINT`, e.g. `http://localhost:3000`; needs `LASSO_ALLOW_CLOUD_BROWSER=true` too in order to activate)
319
345
 
320
346
  Full variable list and defaults: [Key Configuration Guide · Advanced Tuning](./doc/KEY-GUIDE.md#e-高级调优可选全不配). **Surge / Clash TUN proxy networks (fake-ip) are already allowed out of the box.**
321
347
 
@@ -350,6 +376,7 @@ Your data is yours.
350
376
  | Search keeps returning nothing | Check whether the key expired / quota is exhausted; adding multiple providers (Zhipu + Brave + Bing) dramatically lowers the failure rate |
351
377
  | A link won't open | Say "this link is dead, find an archive" to check the Internet Archive |
352
378
  | Prompted that internal-network access was blocked | Double-check the URL; TUN proxy networks are allowed by default, other internal networks need explicit permission |
379
+ | Want to verify the anti-detection effect | Run `lasso doctor --stealth-check` — it drives the creepjs detection page and compares against a baseline (optional, doesn't affect daily use) |
353
380
 
354
381
  Full FAQ and debugging tips in [`doc/TROUBLESHOOTING.md`](./doc/TROUBLESHOOTING.md).
355
382
 
package/README.md CHANGED
@@ -49,7 +49,8 @@
49
49
  | 「列一下我现在能控的所有窗口和网页」 | 一个统一清单(网页和桌面窗口都在里面) |
50
50
  | 「把系统深色模式关掉」 | 自动点按 / 输入 / 快捷键(带结果验证,做完了会确认) |
51
51
  | 「直接取这个 JSON 接口的返回值」 | 原始字节(最快最省) |
52
- | 「这个站有 Cloudflare 我抓不动」 | 云端 Chrome 反爬(默认关,你明确要开才开) |
52
+ | 「这个站好像有点反爬,试试看」 | `browse_headless` 自带反检测(过基础 bot 检测),很多站点直接能抓,无需配置 |
53
+ | 「这个站有 Cloudflare 我抓不动」 | 云端 Chrome 反爬——**Steel 自托管(免费)** 或 browserbase/stagehand(付费,默认关) |
53
54
  | 「Lasso 现在配好了吗?」 | 一份健康自检报告(告诉你哪里没配好) |
54
55
 
55
56
  > 你不用记任何能力名,直接说你想干什么,Claude 自己挑最合适的方式完成。
@@ -67,9 +68,11 @@ Lasso 本体**完全免费 + MIT 开源**。每一项能力到底要不要花钱
67
68
  | 抓公开页 / 截图 / PDF / 网络审计 / 抓原始字节 | ✅ 免费 | 本地运行,无 key 无付费 |
68
69
  | 抓登录态页面(复用本机 Chrome) | ✅ 免费 | 本地运行,无 key 无付费 |
69
70
  | 控桌面(macOS / Windows / Linux) | ✅ 免费 | 本地构建运行,仅需系统授权;**可选** Apple 开发者账号 \$99/年做签名持久授权(不签名也能用,只是每次重授权) |
70
- | 云浏览器(browserbase / stagehand) | ⚠️ 付费,默认关 | 试用后付费;**不配不花钱**,是 Lasso 唯一付费项 |
71
+ | 云浏览器 · 自托管 Steel(v1.6 新) | 免费 | 本地 Docker Steel(Apache-2.0 开源),**零 per-session 费 + cookie 不出本地**;需 `LASSO_ALLOW_CLOUD_BROWSER=true` + `STEEL_ENDPOINT=http://localhost:3000` |
72
+ | 云浏览器 · 托管型(browserbase / stagehand) | ⚠️ 付费,默认关 | browserbase 试用后按量付费;stagehand 是程序化实验通道(无 MCP 工具入口);**不配不花钱** |
73
+ | `browse_headless` 反检测(v1.5 新) | ✅ 免费 | 默认注入 16 路反检测(UA / webdriver / webgl 等),很多基础 bot 检测直接过 |
71
74
 
72
- > 一句话总结:**只要不开云浏览器,Lasso 全程 0 成本**——搜索有免费额度够日常用,其余能力完全免费。
75
+ > 一句话总结:**只要不开托管型云浏览器(browserbase/stagehand),Lasso 全程 0 成本**——搜索有免费额度够日常用,Steel 自托管也是免费的。
73
76
 
74
77
  ---
75
78
 
@@ -93,6 +96,8 @@ claude mcp add lasso -- npx -y lasso-mcp
93
96
  - 直接取 JSON 接口或文件的**原始返回**
94
97
  - 控制 macOS 原生 app(Finder / Mail / 系统设置等,需在系统设置里勾一下授权)
95
98
 
99
+ > 💡 **搜索也可能零配置可用**:如果你机器的 `~/.claude.json` 已经配过智谱 `web-search-prime` MCP,Lasso 启动时自动检测复用,连 `ZHIPU_API_KEY` 都不用单独配——搜索直接能用。跑 `lasso doctor` 看 `#36 machine_search_mcp` 是不是 `pass` 就知道。
100
+
96
101
  第一份产出——直接对 Claude 说:
97
102
 
98
103
  > 「抓一下 example.com 的文字,转成 markdown」
@@ -123,6 +128,8 @@ claude mcp add lasso -- npx -y lasso-mcp
123
128
 
124
129
  自动剥掉导航条、广告、侧边栏等冗余,**省 30–70% 字数**(也更省钱)。要带引用角标(适合做调研、喂给 RAG)也能一句话切换。
125
130
 
131
+ > **v1.5 起,`browse_headless` 默认开启反检测**(伪装 UA / 抹除 `navigator.webdriver` / 伪造 webgl、plugins、codecs 等共十几路)。**无需配置,自动生效**——很多「检测 headless」的站点现在能直接抓(v1.8 修复了一个注入静默失效的缺陷,现在是真的生效,且注入失败会在日志里如实报错)。只有 Cloudflare 级重度反爬才需要走云浏览器(见下方「反爬强攻」)。想验证反检测效果?跑 `lasso doctor --stealth-check` 看 creepjs 检测对比。
132
+
126
133
  ### 抓登录态页(有 2FA 的也行)
127
134
 
128
135
  > 你:「看看我 Jira 的待办」 → 登录态页面快照
@@ -141,7 +148,7 @@ claude mcp add lasso -- npx -y lasso-mcp
141
148
 
142
149
  > 你:「截个整页长图」「存成 PDF」 → 落盘文件路径
143
150
 
144
- 所有图片和 PDF 都**存到本地、返回路径**,不会把一大坨图片数据塞进对话浪费上下文。
151
+ 所有图片和 PDF 都**存到本地、返回路径**,不会把一大坨图片数据塞进对话浪费上下文。超大文本输出(fetch_url / network 等)超过 48 KiB 也会自动落盘,返回预览 + `@oN` 续页句柄——用 `read_text` 工具按页续读(v1.8 起经 MCP 可直接调用)。
145
152
 
146
153
  ### 看一个页面加载了什么
147
154
 
@@ -173,12 +180,18 @@ macOS 上能控 Finder / Mail / Safari / Notes / 系统设置等任何原生 app
173
180
 
174
181
  > 你:「这个站有 Cloudflare,抓不动」 → 云端 Chrome 反爬
175
182
 
176
- 默认**完全关闭**。只有你明确要开、并且配了云端浏览器的 key,才会启用。普通页面用不上。
183
+ 默认**完全关闭**。只有你明确要开、并且配了云浏览器(自托管 Steel 或托管型 browserbase/stagehand),才会启用。轻度反爬 `browse_headless` 自带反检测就能过,**只有 Cloudflare 级重度反爬才需要走云浏览器**。
184
+
185
+ - **Steel 自托管(推荐 · 免费)**:本地 Docker 跑一个开源云浏览器,零 per-session 费、cookie 不出本地。一行命令开通,见 [Key 配置指南 · Steel](./doc/KEY-GUIDE.md#steel_endpoint--自托管云浏览器v16-新推荐免费)。
186
+ - **browserbase(托管型 · 付费)**:试用后按量付费,不想自己跑 Docker 时的备选。
187
+ - **stagehand(托管型 · 付费)**:⚠️ 程序化实验通道——配 key 只装配内部 channel,**没有 MCP 工具入口**(REST 契约未经验证;`lasso doctor` #39 `stagehand_rest_contract_probe` 专测此项)。
177
188
 
178
189
  ---
179
190
 
180
191
  ## 安装
181
192
 
193
+ **当前版本 v1.8.0**(本版修复了 wave1 全量实测暴露的 24 条缺陷:上游 chrome-devtools-mcp@0.3.0 契约适配、截图真实落盘、launch-chrome 探活、caller-tier 配额接线、`read_text` 续页工具等——完整清单见 [doc/17-功能测试清单.md](doc/17-功能测试清单.md) 的「v1.8 修复记录」)。
194
+
182
195
  **前提**:Node.js ≥ 20;Claude Code(或任何支持 MCP 的客户端)。
183
196
 
184
197
  ```bash
@@ -205,7 +218,7 @@ claude mcp add lasso -- npx -y lasso-mcp
205
218
  | 搜索几乎不挂 | 再加 Brave / Bing key(都有免费额度) | 任一家挂了自动切,你无感 |
206
219
  | 抓登录态页面 | 跑一次 `lasso launch-chrome` | 复用本机 Chrome 登录态 |
207
220
  | 控 macOS 桌面 | 跑一次 `lasso doctor` | 控原生 app |
208
- | 抓有 Cloudflare 的站 | 双重确认 + 云端 key | 默认关,要你明确要开才开 |
221
+ | 抓有 Cloudflare 的站 | 双重确认 + 云浏览器通道(自托管 Steel 免费 / 托管型付费) | 默认关,要你明确要开才开 |
209
222
 
210
223
  下面按四个模块拆开讲,每个都给「最短能跑通」的配法。
211
224
 
@@ -221,8 +234,12 @@ claude mcp add lasso -- npx -y lasso-mcp
221
234
 
222
235
  ```bash
223
236
  lasso config init # 创建 ~/.lasso/config.json 模板
237
+ lasso --version # 查看版本号(v1.8 起)
238
+ lasso --help # 查看全部子命令用法
224
239
  ```
225
240
 
241
+ > v1.8 起命令行符合常规惯例:未知子命令 / 未知参数会打印用法并以非零码退出,不再静默落入 MCP server 模式挂起等输入。
242
+
226
243
  打开 `~/.lasso/config.json`,照着填:
227
244
 
228
245
  ```json
@@ -253,12 +270,14 @@ key 名和上面表格里写的一样,照着填即可,存盘后下次启动
253
270
 
254
271
  **要不要 key**:不用。
255
272
 
256
- **怎么配**:跑一次下面的命令,它会自动找你本机的 Chrome,复用你已经登录好的全部会话(2FA 你自己解过的也算):
273
+ **怎么配**:跑一次下面的命令,它会自动找你本机的 Chrome 并带调试端口启动。v1.8 起默认用 Lasso 自己的**独立 profile**(Chrome 136+ 不允许对默认 profile 开调试端口,老办法会秒退);第一次在这个窗口里登录你的账号(2FA 自己解),之后**这个 profile 的登录态会被一直复用**:
257
274
 
258
275
  ```bash
259
276
  lasso launch-chrome
260
277
  ```
261
278
 
279
+ 启动后 Lasso 会自动探活调试端口(`curl /json/version` 级验证):Chrome 没起来 / 端口被占会**明确报错**,不再「返回成功但其实连不上」。想复用某个已有 profile 目录可以 `lasso launch-chrome --profile <目录>`。
280
+
262
281
  之后对 Claude 说「打开我已登录的 Jira」就会自动连上。
263
282
 
264
283
  > 🔴 **红线**:2FA / 短信验证码 / CAPTCHA / 邮件魔法链接——Lasso 不替你解,必须你在本机 Chrome 里手动过一次。
@@ -281,18 +300,33 @@ lasso launch-chrome
281
300
 
282
301
  **详见** → [Key 配置指南 · 桌面控制](./doc/KEY-GUIDE.md#c-桌面控制系统授权无-key)。
283
302
 
284
- ### 四、云端反爬(⚠️ 付费,默认关 · 双重确认才开)
303
+ ### 四、云浏览器:自托管或托管(自托管免费 / 托管付费,默认关 · 双重确认才开)
285
304
 
286
- **能干什么**:抓被 Cloudflare、重度反爬挡住的站。
305
+ **能干什么**:抓被 Cloudflare、重度反爬挡住的站(轻度反爬 `browse_headless` 自带反检测就能过,这里只针对重度)。
287
306
 
288
- **要不要 key**:要,并且**必须你明确要开**才会启用。
307
+ **要不要 key**:取决于走哪条路。三种云通道任选其一,**只有走托管型才要 key**:
308
+
309
+ - **(a) Steel 自托管(推荐 · 免费)**:本地 Docker 跑一个开源云浏览器,**零 per-session 费 + cookie 不出本地**。无需申请 key,自己跑 Docker 即可。
310
+ - **(b) browserbase 托管(付费)**:100 分钟试用,之后按量付费。
311
+ - **(c) stagehand 托管(付费)**:AI 友好的页面观察,试用为主。⚠️ **程序化实验通道**——配了 key 也**没有 MCP 工具入口**(REST 契约未经运行时验证,`lasso doctor` #39 专测此项);要实际过反爬请选 Steel 或 browserbase。
289
312
 
290
313
  **怎么配**:需要两个条件同时满足——
291
314
 
292
315
  1. 总开关:`LASSO_ALLOW_CLOUD_BROWSER` 设为 `true`
293
- 2. 至少一个云端 key(browserbase stagehand,二选一)
316
+ 2. 至少一个云通道——Steel(设 `STEEL_ENDPOINT`)或 browserbase(设对应 key);stagehand key 只装配内部实验通道,不暴露工具
317
+
318
+ **最短配置 · Steel 自托管(免费推荐)**:
319
+
320
+ ```json
321
+ {
322
+ "LASSO_ALLOW_CLOUD_BROWSER": true,
323
+ "STEEL_ENDPOINT": "http://localhost:3000"
324
+ }
325
+ ```
326
+
327
+ Steel 用 Docker 一行启动:`docker run -p 3000:3000 -p 9223:9223 ghcr.io/steel-dev/steel-browser`。完整开通步骤见 [Key 配置指南 · Steel](./doc/KEY-GUIDE.md#steel_endpoint--自托管云浏览器v16-新推荐免费)。
294
328
 
295
- 写进 `~/.lasso/config.json`:
329
+ **最短配置 · browserbase 托管(付费)**:
296
330
 
297
331
  ```json
298
332
  {
@@ -301,9 +335,9 @@ lasso launch-chrome
301
335
  }
302
336
  ```
303
337
 
304
- > 默认完全关闭——没配就等于没这个能力。普通页面用不上,**只有你明确要开才会启用**。
338
+ > 默认完全关闭——没配就等于没这个能力。普通页面用不上,**只有你明确要开才会启用**。轻度反爬根本不需要云浏览器,`browse_headless` 自带反检测就能过。
305
339
 
306
- **怎么申请云端 key、有哪些试用额度** → 见 [Key 配置指南 · 云浏览器](./doc/KEY-GUIDE.md#d-云浏览器反爬默认关双重解锁)。
340
+ **怎么申请托管 key、Steel Docker 怎么开通** → 见 [Key 配置指南 · 云浏览器](./doc/KEY-GUIDE.md#d-云浏览器反爬默认关双重解锁)。
307
341
 
308
342
  <details>
309
343
  <summary><b>高级调优(可选,普通用户不用展开)</b></summary>
@@ -316,8 +350,9 @@ lasso launch-chrome
316
350
  - 放行公司内网 / 特殊代理网段
317
351
  - 给登录 cookie 加一个自己的加密口令(不设则走 macOS 钥匙串)
318
352
  - 落盘搜索结果快照(做回归测试用)
353
+ - 设 Steel 自托管云浏览器端点(`STEEL_ENDPOINT`,如 `http://localhost:3000`;需同时开 `LASSO_ALLOW_CLOUD_BROWSER=true` 才启用)
319
354
 
320
- 完整变量清单和默认值见 [Key 配置指南 · 高级调优](./doc/KEY-GUIDE.md#e-高级调优可选全不配)。**Surge / Clash 等 TUN 代理网络(fake-ip)已内置放行,无需额外配置。**
355
+ 完整变量清单和默认值见 [Key 配置指南 · 高级调优](./doc/KEY-GUIDE.md#e-高级调优可选全不配)。**Surge / Clash 等 TUN 代理网络(fake-ip,`198.18.0.0/15`)与 `127.0.0.1`(本机 Chrome CDP 调试端口用)都已内置放行**,无需额外配置——这是设计行为,不是漏配。
321
356
 
322
357
  > **向后兼容**:如果你以前用 `claude mcp add -e KEY=VAL` 装过,那些环境变量**仍然生效**,且会**覆盖**配置文件。配置文件只是新增的一条更友好的途径,不废除老办法。
323
358
 
@@ -350,6 +385,7 @@ lasso launch-chrome
350
385
  | 搜索一直没结果 | 检查 key 是否过期 / 额度用完;配多家(智谱 + Brave + Bing)可大幅降低失败率 |
351
386
  | 链接打不开 | 改说「这个链接找不到了,找找存档」,去查互联网档案馆 |
352
387
  | 提示要内网访问被拒 | 确认 URL 没写错;TUN 代理网络已默认放行,其他内网需手动允许 |
388
+ | 想验证反检测效果 | 跑 `lasso doctor --stealth-check`,会驱动 creepjs 检测页对比基线(可选,不影响日常使用) |
353
389
 
354
390
  完整 FAQ 与调试技巧见 [`doc/TROUBLESHOOTING.md`](./doc/TROUBLESHOOTING.md)。
355
391
 
@@ -1 +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"}
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;AAM5D,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;AA6BD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAmBhE"}
@@ -1,3 +1,4 @@
1
+ import { evalTextValue } from "./upstream-response.js";
1
2
  // ============================================================
2
3
  // 常量
3
4
  // ============================================================
@@ -102,8 +103,9 @@ async function snapshotCondition(client, cond) {
102
103
  const r = (await client.callTool("evaluate_script", {
103
104
  function: expr,
104
105
  }));
105
- const text = firstText(r);
106
- return { holds: text === "true" };
106
+ // W1-DEF-1b(v1.8):上游返回 markdown 围栏包裹(实测契约见 upstream-response.ts)
107
+ const text = evalTextValue(r) ?? firstText(r);
108
+ return { holds: text?.trim() === "true" };
107
109
  }
108
110
  catch {
109
111
  return { holds: false };
@@ -126,7 +128,9 @@ export function buildConditionExpr(cond) {
126
128
  clauses.push(`((document.body && document.body.innerText || "").indexOf(${JSON.stringify(cond.text)}) !== -1)`);
127
129
  }
128
130
  const expr = clauses.length > 0 ? clauses.join(" || ") : "false";
129
- return `(function(){ return (${expr}).toString(); })()`;
131
+ // W1-DEF-1(v1.8):函数表达式(上游 0.3.0 evaluate_script 契约),上游调用后
132
+ // 取 "true"/"false" 返回——不再传 IIFE 语句串。
133
+ return `() => ((${expr})).toString()`;
130
134
  }
131
135
  // ============================================================
132
136
  // 内部 helper
@@ -1 +1 @@
1
- {"version":3,"file":"ExpectPoll.js","sourceRoot":"","sources":["../../src/browse/ExpectPoll.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ExpectPoll.js","sourceRoot":"","sources":["../../src/browse/ExpectPoll.ts"],"names":[],"mappings":"AAmCA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AA+BvD,+DAA+D;AAC/D,KAAK;AACL,+DAA+D;AAC/D,MAAM,wBAAwB,GAAG,GAAG,CAAC;AACrC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEhC,+DAA+D;AAC/D,SAAS;AACT,+DAA+D;AAC/D;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAiB,EACjB,IAAqB,EACrB,WAA+B,EAC/B,IAAwB;IAExB,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAExB,+CAA+C;IAC/C,IAAI,WAAW,IAAI,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC;QACpD,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,mBAAmB;IACnB,MAAM,QAAQ,GAAG,IAAI,EAAE,cAAc,IAAI,wBAAwB,CAAC;IAClE,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,EAAE,gBAAgB,IAAI,kBAAkB,CAAC;IAChF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;IACtC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;QACtB,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;QAC7D,IAAI,SAAS;YAAE,OAAO,UAAU,CAAC;IACnC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,+DAA+D;AAC/D,sDAAsD;AACtD,+DAA+D;AAC/D;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAqB;IACrD,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CACb,6DAA6D,CAC9D,CAAC;IACJ,CAAC;AACH,CAAC;AAED,+DAA+D;AAC/D,sDAAsD;AACtD,+DAA+D;AAC/D;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC5B,IAAuB,EACvB,IAAqB;IAErB,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC1E,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAChE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACpE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,GAAsB,EACtB,IAAqB;IAErB,4CAA4C;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IAChE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IACtE,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAEjD,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AACxC,CAAC;AAED,+DAA+D;AAC/D,qDAAqD;AACrD,+DAA+D;AAC/D;;;;;;GAMG;AACH,KAAK,UAAU,iBAAiB,CAC9B,MAAiB,EACjB,IAAqB;IAErB,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,iBAAiB,EAAE;YAClD,QAAQ,EAAE,IAAI;SACf,CAAC,CAAkB,CAAC;QACrB,iEAAiE;QACjE,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC;QAC9C,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,MAAM,EAAE,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAqB;IACtD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,OAAO,CAAC,IAAI,CACV,iCAAiC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAC9E,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,6BAA6B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CACV,6DAA6D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAClG,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACjE,0DAA0D;IAC1D,qCAAqC;IACrC,OAAO,WAAW,IAAI,eAAe,CAAC;AACxC,CAAC;AAED,+DAA+D;AAC/D,YAAY;AACZ,+DAA+D;AAC/D,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AAMD,SAAS,SAAS,CAAC,CAA4B;IAC7C,IAAI,CAAC,CAAC,EAAE,OAAO;QAAE,OAAO,SAAS,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC;IACjD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"HighRiskGate.d.ts","sourceRoot":"","sources":["../../src/browse/HighRiskGate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAM7C,gEAAgE;AAChE,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAKD;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,kBAAkB,EAAE,aAAa,CAAC;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB,CAMC,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAO/C,CAAC;AAKH;;;;;;;GAOG;AACH,qBAAa,YAAY;IAKrB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAJjC;;OAEG;gBAEgB,cAAc,EAAE,MAAM,OAAO,CAAC,SAAS,CAAC;IAG3D;;;;;;;;;;;;;;;;OAgBG;IACG,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAqE1D;AAKD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAwCtD"}
1
+ {"version":3,"file":"HighRiskGate.d.ts","sourceRoot":"","sources":["../../src/browse/HighRiskGate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAM7C,gEAAgE;AAChE,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAKD;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,kBAAkB,EAAE,aAAa,CAAC;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB,CAMC,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAO/C,CAAC;AAKH;;;;;;;GAOG;AACH,qBAAa,YAAY;IAKrB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAJjC;;OAEG;gBAEgB,cAAc,EAAE,MAAM,OAAO,CAAC,SAAS,CAAC;IAG3D;;;;;;;;;;;;;;;;OAgBG;IACG,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAqE1D;AAKD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAyCtD"}
@@ -167,7 +167,8 @@ export function buildAssessExpr(target) {
167
167
  kind: p.kind,
168
168
  selector: p.selector,
169
169
  }));
170
- return `(function(){
170
+ // W1-DEF-1(v1.8):函数表达式(上游 0.3.0 evaluate_script 契约),不再传 IIFE 语句串。
171
+ return `() => {
171
172
  try {
172
173
  var target = ${JSON.stringify(target)};
173
174
  var pairs = ${JSON.stringify(pairs)};
@@ -200,7 +201,7 @@ export function buildAssessExpr(target) {
200
201
  } catch (e) {
201
202
  return JSON.stringify({ ok: false, reason: "eval_error:" + String(e) });
202
203
  }
203
- })()`;
204
+ }`;
204
205
  }
205
206
  function firstText(r) {
206
207
  if (!r?.content)
@@ -1 +1 @@
1
- {"version":3,"file":"HighRiskGate.js","sourceRoot":"","sources":["../../src/browse/HighRiskGate.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAc3C,+DAA+D;AAC/D,uDAAuD;AACvD,+DAA+D;AAC/D;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAG1B,MAAM,CAAC,MAAM,CAAC;IACjB,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,gEAAgE,EAAE;IAC3F,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,kCAAkC,EAAE;IACnE,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,eAAe,EAAE;IAChD,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,oBAAoB,EAAE;IACrD,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE;CAC9C,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAwB,IAAI,GAAG,CAAC;IAC3D,UAAU;IACV,UAAU;IACV,YAAY;IACZ,SAAS;IACT,MAAM;IACN,UAAU;CACX,CAAC,CAAC;AAEH,+DAA+D;AAC/D,eAAe;AACf,+DAA+D;AAC/D;;;;;;;GAOG;AACH,MAAM,OAAO,YAAY;IAKJ;IAJnB;;OAEG;IACH,YACmB,cAAwC;QAAxC,mBAAc,GAAd,cAAc,CAA0B;IACxD,CAAC;IAEJ;;;;;;;;;;;;;;;;OAgBG;IACH,KAAK,CAAC,UAAU,CAAC,IAAU;QACzB,wBAAwB;QACxB,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACtC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC5B,CAAC;QAED,oBAAoB;QACpB,IAAI,MAA0B,CAAC;QAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC5B,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC;QACjC,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAClC,oEAAoE;YACpE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,iDAAiD;YACjD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC5B,CAAC;QAED,2BAA2B;QAC3B,IAAI,MAAiB,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QACvC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,qDAAqD;YACrD,MAAM,CAAC,IAAI,CAAC;gBACV,GAAG,EAAE,mCAAmC;gBACxC,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;aACjB,CAAC,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,wBAAwB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACzE,CAAC;QAED,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,iBAAiB,EAAE;gBAClD,QAAQ,EAAE,IAAI;aACf,CAAC,CAAkB,CAAC;YACrB,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC;YAC7D,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAK9B,CAAC;YACF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,qBAAqB,OAAO,CAAC,IAAI,EAAE;oBAC3C,QAAQ,EAAE,OAAO,CAAC,IAAI;iBACvB,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC5B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,mDAAmD;YACnD,MAAM,CAAC,IAAI,CAAC;gBACV,GAAG,EAAE,4BAA4B;gBACjC,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;aACjB,CAAC,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACpE,CAAC;IACH,CAAC;CACF;AAED,+DAA+D;AAC/D,yCAAyC;AACzC,+DAA+D;AAC/D;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,0DAA0D;IAC1D,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3C,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;KACrB,CAAC,CAAC,CAAC;IACJ,OAAO;;qBAEY,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;oBACvB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BlC,CAAC;AACR,CAAC;AAQD,SAAS,SAAS,CAAC,CAA4B;IAC7C,IAAI,CAAC,CAAC,EAAE,OAAO;QAAE,OAAO,SAAS,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC;IACjD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"HighRiskGate.js","sourceRoot":"","sources":["../../src/browse/HighRiskGate.ts"],"names":[],"mappings":"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"}
@@ -28,13 +28,20 @@ export declare class StealthEngine {
28
28
  /**
29
29
  * 在 navigate 前注入 stealth profile(CDP methods 直调 + evaluate_script)。
30
30
  *
31
- * 流程(parse5 §3.3.1):
31
+ * v1.5 流程(parse13 §3.1 + §4.5):
32
32
  * 1. profile 校验(未知 profile 名 → throw;caller catch 走 didnt)
33
- * 2. evaluate_script(STEALTH_INJECTION_SCRIPT) → navigator.webdriver / languages /
34
- * window.chrome / permissions 抹除
35
- * 3. evaluate_script(userAgentOverride) → navigator.userAgent 改写(CDP
36
- * Network.setUserAgentOverride chrome-devtools-mcp 暂未暴露独立工具,
37
- * evaluate fallback;browserbase 自带 stealth 时本步幂等)
33
+ * 2. evaluate_script(buildUserAgentOverrideScript) → navigator.userAgent / platform /
34
+ * language 改写(**先执行**,使后续 UA client hints 能读到正确 Chrome 版本)
35
+ * 3. evaluate_script(STEALTH_INJECTION_SCRIPT 16 路) → webdriver / languages / permissions /
36
+ * chrome.runtime/app/csi/loadTimes / plugins / vendor / hardwareConcurrency / media.codecs /
37
+ * webgl.vendor / iframe.contentWindow / outerdimensions / userAgentData(brands 版本与
38
+ * UA 一致;Safari/Firefox profile 跳过)
39
+ *
40
+ * HTTP header 侧 sec-ch-ua / sec-fetch-* 注入(parse13 §4.5):依赖 chrome-devtools-mcp
41
+ * 暴露 setExtraHTTPHeaders(spike 未解),v1.5 MVP 暂只走 JS 侧 navigator.userAgentData
42
+ * (ua-client-hints.ts 是 sec-ch-ua 的 JS API 投影)。profile 的 header 字段
43
+ * (secChUa / secFetch* / accept*)已定义在 StealthProfile 顶级 const(INV-30),供后续
44
+ * chrome-devtools-mcp 暴露 header 注入工具时直用。
38
45
  *
39
46
  * 注:viewport / timezone 由 chrome-devtools-mcp 启动 flag 控制
40
47
  * (subprocess spec 加 --window-size / --timezone);StealthEngine 不在这里设。
@@ -75,7 +82,19 @@ export declare class StealthEngine {
75
82
  /**
76
83
  * evaluate_script 包装:失败时不抛(stealth 是 best-effort,注入失败不阻断 browse)。
77
84
  * 调用方(injectProfile)希望 stealth 失败可恢复时用此 helper。
85
+ *
86
+ * W1-DEF-1(v1.8):校验上游返回 isError——SDK 标准 { content, isError } 形态下
87
+ * callTool 不 reject 也会失败(上游脚本错误 / 契约拒绝),必须显式检查。
88
+ *
89
+ * @returns true=注入成功(上游非 isError);false=失败(throw 或 isError)
78
90
  */
79
91
  private evaluate;
80
92
  }
93
+ /**
94
+ * 把「语句串脚本」(如 STEALTH_INJECTION_SCRIPT 的 13 段 IIFE join)包成
95
+ * chrome-devtools-mcp@0.3.0 evaluate_script 要求的单个函数表达式。
96
+ * 上游调用该函数时各语句依次执行。输入必须已是函数表达式的场景不要走此包装
97
+ * (会产生 `() => { () => ... }` 的非法语句)。
98
+ */
99
+ export declare function toFnExpression(script: string): string;
81
100
  //# sourceMappingURL=StealthEngine.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"StealthEngine.d.ts","sourceRoot":"","sources":["../../src/browse/StealthEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAE5D,OAAO,EAKL,KAAK,kBAAkB,EAExB,MAAM,uBAAuB,CAAC;AAK/B,qBAAa,aAAa;IACxB;;;;;;;;;;;;;;;;;OAiBG;IACG,aAAa,CACjB,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,kBAAkB,GAC9B,OAAO,CAAC,IAAI,CAAC;IA0BhB;;;;;;;;;OASG;IACG,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IAsBpE;;;;;;;;;;;OAWG;IACH,oBAAoB,CAAC,MAAM,EAAE,qBAAqB,GAAG,uBAAuB,GAAG;QAC7E,OAAO,EAAE,OAAO,CAAC;QACjB,gBAAgB,EAAE,MAAM,CAAC;QACzB,KAAK,EAAE,MAAM,CAAC;KACf;IAoBD;;;OAGG;YACW,QAAQ;CAgBvB"}
1
+ {"version":3,"file":"StealthEngine.d.ts","sourceRoot":"","sources":["../../src/browse/StealthEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAG5D,OAAO,EAKL,KAAK,kBAAkB,EAExB,MAAM,uBAAuB,CAAC;AAK/B,qBAAa,aAAa;IACxB;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACG,aAAa,CACjB,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,kBAAkB,GAC9B,OAAO,CAAC,IAAI,CAAC;IA4ChB;;;;;;;;;OASG;IACG,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IAwBpE;;;;;;;;;;;OAWG;IACH,oBAAoB,CAAC,MAAM,EAAE,qBAAqB,GAAG,uBAAuB,GAAG;QAC7E,OAAO,EAAE,OAAO,CAAC;QACjB,gBAAgB,EAAE,MAAM,CAAC;QACzB,KAAK,EAAE,MAAM,CAAC;KACf;IAoBD;;;;;;;;OAQG;YACW,QAAQ;CA6BvB;AAKD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAErD"}