cdpilot 0.5.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. package/README.md +306 -9
  2. package/bin/cdpilot.js +225 -11
  3. package/package.json +47 -9
  4. package/src/cdpilot.py +8654 -2116
package/README.md CHANGED
@@ -29,7 +29,7 @@ AI agents and developers need browser control that **just works**:
29
29
 
30
30
  - **Zero config** — `npx cdpilot launch` starts an isolated browser session
31
31
  - **Zero dependency** — No Puppeteer, no Playwright, no Selenium. Pure CDP over HTTP
32
- - **40+ commands** — Navigate, click, type, screenshot, network, console, accessibility, and more
32
+ - **70+ commands** — Navigate, click, type, screenshot, network, console, accessibility, video understanding, progressive anti-bot resilience, and more
33
33
  - **AI-agent friendly** — Designed for Claude, GPT, Gemini, and any LLM tool-use workflow
34
34
  - **Isolated sessions** — Your personal browser stays untouched. cdpilot runs in its own profile
35
35
  - **Visual feedback** — Green glow overlay, cursor visualization, click ripples, and keystroke display keep you informed during automation
@@ -213,10 +213,34 @@ cdpilot throttle slow3g # Simulate slow 3G
213
213
  cdpilot throttle fast3g # Simulate fast 3G
214
214
  cdpilot throttle offline # Go offline
215
215
  cdpilot throttle off # Back to normal
216
- cdpilot proxy <url> # Set proxy
216
+ cdpilot proxy <url> # Set proxy (legacy single-URL form)
217
217
  cdpilot proxy off # Remove proxy
218
+
219
+ # v0.7.0: named pools (BrightData, IPRoyal, Anchor, etc.)
220
+ cdpilot proxy add brd "http://USER:PASS@brd.superproxy.io:22225" --geo us
221
+ cdpilot proxy add ipr "http://USER:PASS@geo.iproyal.com:12321" --sticky
222
+ cdpilot proxy use brd # Activate one pool
223
+ cdpilot proxy list # Show pools (credentials redacted)
224
+ cdpilot proxy show [<name>] # Active or named pool URL (redacted)
225
+ cdpilot proxy remove <name> # Drop a pool
226
+ ```
227
+
228
+ ### TLS Fingerprint (v0.8.0)
229
+
230
+ ```bash
231
+ cdpilot tls-check # Probe JA3/JA4/H2 via tls.peet.ws
232
+ cdpilot tls-check --service browserleaks # Alternate echo
233
+ cdpilot tls-check --json # Raw JSON
218
234
  ```
219
235
 
236
+ **Known limitation:** v0.8.0 ships the **probe** (`tls-check`) but no in-tree TLS fix.
237
+ There is no Chromium-based TLS-corrected browser that ships as a standalone binary
238
+ exposing `--remote-debugging-port`. Camoufox is Firefox+Juggler (no CDP);
239
+ Patchright / undetected-chromedriver / nodriver are Python/Playwright libraries,
240
+ not standalone browsers. cdpilot's CDP-only architecture is incompatible with all
241
+ of them without a protocol adapter. **Tracking:** v0.9 roadmap (TLS-MITM plugin
242
+ using curl-impersonate semantics, OR BoringSSL-patched Chromium fork).
243
+
220
244
  ### Request Interception
221
245
 
222
246
  ```bash
@@ -264,10 +288,22 @@ cdpilot session-close [id] # Close session
264
288
  ### Advanced
265
289
 
266
290
  ```bash
267
- cdpilot cookies [domain] # List cookies (filter by domain)
268
- cdpilot cookies save <file> [<domain>]
269
- # Export cookies as JSON (optional domain filter)
270
- cdpilot cookies load <file> # Import cookies (replay CF clearance across runs)
291
+ cdpilot cookies [domain] # List cookies (filter by domain)
292
+ cdpilot cookies save <file> [<domain>] # Export cookies as JSON
293
+ cdpilot cookies load <file> # Import cookies (replay CF clearance)
294
+ cdpilot cookies save --host x.com # Save to per-host cache
295
+ cdpilot cookies load --host x.com # Load from per-host cache
296
+ cdpilot cookies list # Cached hosts + age + CF clearance flag
297
+ cdpilot cookies clear --host x.com # Remove one host
298
+ cdpilot cookies clear --all # Wipe entire cache
299
+ cdpilot cookies clear --older-than 7d # Remove stale entries
300
+ cdpilot cookies auto on # Toggle global auto-save/replay flag (v0.6.1: requires safe-list)
301
+ cdpilot cookies auto add <host> # Opt host into auto save/replay (v0.6.1)
302
+ cdpilot cookies auto remove <host> # Remove host from safe-list
303
+ cdpilot cookies auto list # Enable flag + current safe-list
304
+ cdpilot cookies cf-replay <url> # Inject cached CF clearance before nav
305
+ cdpilot wipe [--cookies|--storage|--tabs|--keep h1,h2]
306
+ # v0.6.2: per-task state hygiene (cross-task contamination)
271
307
  cdpilot storage # localStorage contents
272
308
  cdpilot upload <sel> <file> # Upload file to input
273
309
  cdpilot multi-eval <js> # Execute JS in all tabs
@@ -307,6 +343,42 @@ cdpilot dismiss aggressive # Handle chained modals (cookie banner → signup)
307
343
  > lookalikes (Delete account, Sign out, Subscribe) — safe to chain into a
308
344
  > query workflow.
309
345
 
346
+ ### Video Understanding
347
+
348
+ A single screenshot can't see motion. `cdpilot watch` runs a continuous
349
+ screencast (`Page.startScreencast`) into a ring buffer of JPEG frames, so an
350
+ AI agent can query a time window and actually *watch* what happened —
351
+ animations, mouse cursor movement, scroll, an explosion effect — instead of
352
+ guessing from one still frame.
353
+
354
+ ```bash
355
+ cdpilot watch start <url|file://...> # Begin screencast, play the video
356
+ cdpilot watch query --at 1:23 --window 5s # Frames around a timestamp
357
+ cdpilot watch ask "did the menu animate open?" # Ask about recent frames
358
+ cdpilot watch status # Show capture state + buffer size
359
+ cdpilot watch stop # Stop the screencast
360
+ ```
361
+
362
+ Works on both local files (`file://...`) and online video (YouTube, Vimeo,
363
+ Twitter, Facebook, Instagram). Zero dependency — Pillow is optional and only
364
+ used for motion-detection between frames.
365
+
366
+ > **DRM limitation:** DRM-protected players (Netflix and similar) render as
367
+ > black frames at the CDP layer — cdpilot cannot capture them. Everything
368
+ > non-DRM works.
369
+
370
+ MCP exposes this as `browser_watch_*` tools for AI agents.
371
+
372
+ ### Video Understanding (commands)
373
+
374
+ ```bash
375
+ cdpilot watch start <url|file://> # Start screencast, play video
376
+ cdpilot watch query --at 1:23 --window 5s # Frames around a timestamp
377
+ cdpilot watch ask "did the modal slide in?" # Ask about recent frames
378
+ cdpilot watch status # Capture state + buffer size
379
+ cdpilot watch stop # Stop screencast
380
+ ```
381
+
310
382
  ### Stealth & CAPTCHA
311
383
 
312
384
  Zero-dependency anti-fingerprint layer — patches `navigator.webdriver`,
@@ -315,6 +387,30 @@ vendor/renderer, permissions, hardware concurrency, and the `Worker`
315
387
  constructor. Injected via `Page.addScriptToEvaluateOnNewDocument` before
316
388
  any page script runs. Disabled by default; opt-in.
317
389
 
390
+ At launch, cdpilot also passes `--disable-blink-features=AutomationControlled`,
391
+ which closes the Blink runtime flag that Cloudflare and DataDome probe to detect
392
+ an automated browser.
393
+
394
+ #### Three-tier stealth mode
395
+
396
+ `cdpilot mode` is the recommended entry point — one switch that sets how much
397
+ fingerprint surface cdpilot touches, lightest to heaviest:
398
+
399
+ ```bash
400
+ cdpilot mode # show current tier + what it injects
401
+ cdpilot mode regular # no fingerprint patch — cleanest, fastest (default)
402
+ cdpilot mode stealth # light patch: webdriver / chrome.runtime / permissions
403
+ cdpilot mode undetected # full patch: + plugin array + WebGL + Worker
404
+ ```
405
+
406
+ `regular` is the default because Stealth Bench V1 found the full patch set
407
+ *alone* lowered scores — a synthetic plugin array is itself a tell. The
408
+ `stealth` tier deliberately omits plugin spoofing; escalate to `undetected`
409
+ only for hard targets. The adaptive layer learns the right tier per host and
410
+ escalates on CAPTCHA. Effect applies on the next navigation. Env override:
411
+ `CDPILOT_MODE=<tier>`. The legacy `stealth on/off` toggle still works and stays
412
+ coherent with the tier:
413
+
318
414
  ```bash
319
415
  cdpilot stealth on # enable fingerprint patches (opt-in)
320
416
  cdpilot stealth off # disable (default)
@@ -338,6 +434,109 @@ cdpilot adaptive clear # Drop the stealth host memory entirely
338
434
  > when it sees one — adds the host to a persistent list, retries once with
339
435
  > stealth on. Never auto-demotes. Conservative by design.
340
436
 
437
+ ### Friction Ladder (progressive anti-bot detection)
438
+
439
+ Real sites don't just throw a CAPTCHA — they stack defenses incrementally.
440
+ `cdpilot friction` reports which rung is currently active so an agent can react
441
+ appropriately instead of guessing. Six levels, lowest to highest:
442
+
443
+ ```
444
+ none → rate_limited → soft_captcha → login_wall → otp_sms → hard_block
445
+ ```
446
+
447
+ ```bash
448
+ cdpilot friction # JSON: current rung + recommended response policy
449
+ ```
450
+
451
+ Bilingual (English + Turkish) DOM heuristics. The detection is **read-only — it
452
+ never bypasses anything.** The response policy is deliberately conservative:
453
+
454
+ - `rate_limited` → automatic exponential backoff + retry
455
+ - `soft_captcha` → defer to the captcha tools
456
+ - `login_wall` / `otp_sms` / `hard_block` → flagged for **human handoff, not
457
+ autonomously solved**
458
+
459
+ That last line is an ethics boundary, not a missing feature: cdpilot will not
460
+ attempt to defeat a login, an OTP/SMS gate, or an outright block on its own.
461
+ MCP exposes this as `browser_friction`.
462
+
463
+ ### Press-and-Hold (PerimeterX / HUMAN behavioral challenge)
464
+
465
+ PerimeterX's "Press & Hold" is a *behavioral* challenge, not a token — there's
466
+ no provider to call. The only solution is a real press → hold → release
467
+ gesture, which cdpilot emits via the CDP Input domain: a Gaussian-randomized
468
+ ~3–7s hold with ±1–2px micro-jitter while the button is held.
469
+
470
+ ```bash
471
+ cdpilot press-hold # auto-find the px-captcha target
472
+ cdpilot press-hold "#px-captcha button" # explicit selector
473
+ ```
474
+
475
+ `captcha-solve` auto-routes here when it detects a `perimeterx` challenge.
476
+ MCP exposes this as `browser_press_hold`.
477
+
478
+ ### Captcha Solver Plugins (v0.6+)
479
+
480
+ Optional integration with 2captcha, anti-captcha, and capmonster. Per-solve
481
+ cost ~$0.001–0.003. API keys stored in `~/.cdpilot/captcha-providers.json`
482
+ (chmod 600) — **never committed to git**.
483
+
484
+ ```bash
485
+ # One-time setup
486
+ cdpilot captcha config --provider 2captcha --api-key YOUR_KEY
487
+ cdpilot captcha config --provider anticaptcha --api-key YOUR_KEY # fallback
488
+
489
+ # Enable auto-solve (adaptive layer auto-solves on detect)
490
+ cdpilot captcha auto on
491
+
492
+ # Manual solve (debug / scripting)
493
+ cdpilot captcha solve --type recaptcha-v2 --site-key SK --url https://example.com
494
+ # returns: {"token": "03AGdBq2...", "duration_ms": 12500, "cost": 0.003, "provider": "2captcha"}
495
+
496
+ cdpilot captcha solve --type hcaptcha --site-key SK --url URL
497
+ cdpilot captcha solve --type turnstile --site-key SK --url URL
498
+ cdpilot captcha solve --type funcaptcha --site-key SK --url URL
499
+
500
+ # Status & balance
501
+ cdpilot captcha status # {"configured": [...], "preferred": "2captcha", "auto_enabled": true}
502
+ cdpilot captcha balance # {"2captcha": 1.23, "anticaptcha": 0.50}
503
+ ```
504
+
505
+ Supported types: `recaptcha-v2`, `recaptcha-v3`, `hcaptcha`, `turnstile`, `funcaptcha`
506
+
507
+ Tokens are injected via `Runtime.evaluate` CDP — no browser-side libraries required.
508
+ When `captcha auto on` is set, the adaptive layer detects and solves automatically
509
+ after each navigation. Without auto-on, detection still works but solving is manual.
510
+
511
+ > **Expected bench improvement (v0.6):** reCaptcha 2/6 → 5+/6, hCaptcha 2/3 → 3/3
512
+
513
+ #### Image CAPTCHA + profile warming
514
+
515
+ `captcha-solve` handles the image-based rate-limit CAPTCHAs that the token
516
+ solvers above don't cover:
517
+
518
+ ```bash
519
+ cdpilot captcha-solve # auto-detect + route (incl. press-hold)
520
+ cdpilot captcha-solve --provider amazon-local # offline OCR (default)
521
+ cdpilot captcha-solve --provider capsolver # BYOK image-to-text
522
+ cdpilot captcha-solve --provider 2captcha # BYOK image-to-text
523
+ ```
524
+
525
+ - **Amazon classic image CAPTCHA** (the "Type the characters you see" page) is
526
+ OCR'd offline via the **optional** `amazoncaptcha` library
527
+ (`pip install amazoncaptcha` — pure-Python + Pillow, MIT). Not installed = the
528
+ command reports it and exits cleanly; no hard dependency added.
529
+ - **BYOK providers** (`capsolver`, `2captcha`) use their image-to-text APIs via
530
+ `CAPSOLVER_API_KEY` / `TWOCAPTCHA_API_KEY`.
531
+
532
+ ```bash
533
+ cdpilot profile warm # age the profile for reCAPTCHA v3 score
534
+ ```
535
+
536
+ `profile warm` browses a set of low-risk sites to build cookie/history age,
537
+ which nudges reCAPTCHA v3's behavioral score upward over time. Slow by
538
+ design — run it ahead of a session, not inline.
539
+
341
540
  Verified against public bot-detection panels:
342
541
  - **bot.sannysoft.com:** 24/24 PASS (WebDriver, Chrome obj, Plugins as PluginArray, WebGL, PHANTOM_*, HEADCHR_*, SELENIUM_DRIVER)
343
542
  - **bot.incolumitas.com** intoli: 6/6 OK — new-tests: 6/7 OK (one FAIL = pure CDP presence, cannot be JS-patched)
@@ -360,6 +559,24 @@ until cdpilot health >/dev/null; do cdpilot launch; sleep 2; done
360
559
  Surfaces today's Brave crash count from `~/Library/Logs/DiagnosticReports/`
361
560
  on macOS — spot degradation before your automation silently stalls.
362
561
 
562
+ ### Scaling & Workstation Use
563
+
564
+ ```bash
565
+ CDPILOT_POOL_SIZE=4 cdpilot launch # 4 separate browser processes
566
+ CDPILOT_OFFSCREEN=1 cdpilot launch # headed, but no window on your screen
567
+ ```
568
+
569
+ - **Multi-instance pool** (`CDPILOT_POOL_SIZE=N`) starts N independent browser
570
+ processes and dispatches work to the least-loaded one, for `N × per-instance`
571
+ parallelism. Default is `1` — single instance, no change for existing users.
572
+ - **Off-screen mode** (`CDPILOT_OFFSCREEN=1`) keeps the browser headed (real
573
+ rendering, no headless fingerprint) but positions the window where it can't
574
+ steal focus — meant for automating on a workstation you're also using.
575
+ - **Docker + Xvfb harness** (`cdpilot-bench/docker/`) runs headed-in-Xvfb so
576
+ bench/automation runs never pop a window on the host display. CI-ready. Note
577
+ that software rendering (no GPU) lowers anti-bot scores versus native — it's
578
+ an isolated environment for reproducibility, not the headline configuration.
579
+
363
580
  ## Use with AI Agents
364
581
 
365
582
  cdpilot is designed to be called by AI agents as a tool:
@@ -405,6 +622,9 @@ print(result.stdout)
405
622
  | `CHROME_BIN` | Auto-detect | Browser binary path |
406
623
  | `CDPILOT_PROFILE` | `~/.cdpilot/profile` | Isolated browser profile |
407
624
  | `BROWSER_SESSION` | Auto | Session identifier |
625
+ | `CDPILOT_MODE` | `regular` | Stealth tier override (`regular`/`stealth`/`undetected`) |
626
+ | `CDPILOT_OFFSCREEN` | `0` | Headed but render off-screen — no window steals focus |
627
+ | `CDPILOT_POOL_SIZE` | `1` | N separate browser processes, least-loaded dispatch |
408
628
 
409
629
  ## How It Works
410
630
 
@@ -422,6 +642,54 @@ print(result.stdout)
422
642
 
423
643
  **No Puppeteer. No Playwright. No Selenium.** Just direct CDP communication.
424
644
 
645
+ ## Stealth Bench V1
646
+
647
+ `cdpilot` is benchmarked against a suite of 80 high-friction web tasks to measure success rates against modern anti-bot systems. Gemini 2.5 Flash drives `cdpilot` as the controller; success is defined as full task completion without interception.
648
+
649
+ ### v0.5.3 Results (current)
650
+
651
+ | Category | Success / Total | Rate |
652
+ | :--- | :--- | :--- |
653
+ | Custom Antibot | 5 / 5 | 100.0% |
654
+ | Temu Slider | 1 / 1 | 100.0% |
655
+ | hCaptcha | 2 / 3 | 67.0% |
656
+ | Cloudflare | 12 / 22 | 55.0% |
657
+ | DataDome | 5 / 13 | 38.0% |
658
+ | reCaptcha | 2 / 6 | 33.0% |
659
+ | Akamai | 1 / 6 | 17.0% |
660
+ | PerimeterX | 2 / 18 | 11.0% |
661
+ | GeeTest | 0 / 4 | 0.0% |
662
+ | Shape | 0 / 1 | 0.0% |
663
+ | Kasada | 0 / 1 | 0.0% |
664
+ | **Total** | **30 / 80** | **37.5%** |
665
+
666
+ ### Version history
667
+
668
+ | Version | Mode | Total | Rate |
669
+ | :--- | :--- | :--- | :--- |
670
+ | v0.5.0 | Baseline (stealth off / adaptive off) | 30 / 80 | 37.5% |
671
+ | v0.5.0 | Stealth only (stealth on / adaptive off) | 32 / 80 | 40.0% |
672
+ | v0.5.0 | Full (stealth on / adaptive on) | 26 / 80 | 32.5% |
673
+ | v0.5.1 | Full — regression fix | 29 / 80 | 36.25% |
674
+ | v0.5.2 | Full — entropy auto-hook | 28 / 80 | 35.0% |
675
+ | v0.5.3 | Full — entropy scope tightened | 30 / 80 | 37.5% |
676
+ | v0.6.0 | + captcha solver + cookies-auto (regression) | 15 / 80 | 18.75% |
677
+ | **v0.8.0** | **Full — cookies safe-host scoped + per-task wipe (no proxy, no TLS fork)** | **29 / 80** | **36.25%** |
678
+ | v0.7.0 (slot) | + named proxy pools | _depends on user proxy_ | — |
679
+ | v0.8.0 (slot) | + TLS-aware launcher (camoufox/undetected-chrome) | _depends on browser choice_ | — |
680
+
681
+ **What cdpilot does not do:** `cdpilot` is an avoidance engine, not a CAPTCHA solver. We prioritize structural stealth (JS fingerprinting, behavioral entropy) to prevent challenges from appearing. When a CAPTCHA blocks progress and cannot be bypassed, the task fails — that is the honest definition of our success rate. PerimeterX (2/18), GeeTest (0/4) and Akamai (1/6) are known weaknesses; v0.7+ (residential proxy) and v0.8+ (TLS fingerprint correction via camoufox) target these directly.
682
+
683
+ ## Recommended Configuration
684
+
685
+ Based on Stealth Bench V1 results:
686
+
687
+ - **Speed-first** (most use cases): `cdpilot launch` — default browser behavior, no patches
688
+ - **Stealth-on** (RECOMMENDED, best overall): `cdpilot launch && cdpilot stealth on`
689
+ - **Full adaptive** (specific captcha-heavy workflows): `cdpilot launch && cdpilot stealth on && cdpilot adaptive on`
690
+
691
+ The full adaptive layer is bench-neutral vs baseline (30/80 vs 30/80) for Stealth Bench V1's task mix. Stealth-only (32/80 = 40%) is still the best-performing single variant. For your specific workload, profile both and pick.
692
+
425
693
  ## Comparison
426
694
 
427
695
  | Feature | cdpilot | Puppeteer | Playwright | Selenium |
@@ -453,13 +721,36 @@ Future paid offerings:
453
721
 
454
722
  Found a vulnerability? Please email the maintainer directly instead of opening a public issue.
455
723
 
724
+ ## Cookie Persistence (v0.6+)
725
+
726
+ Per-host cookie cache with auto-replay before navigation. Particularly useful for
727
+ sites with expensive challenges (Cloudflare, DataDome) — once passed, clearance
728
+ cookies (`cf_clearance`, `__cf_bm`) are cached and replayed on next visit.
729
+
730
+ ```bash
731
+ # Enable auto-mode — cookies saved/replayed on every navigate
732
+ cdpilot cookies auto on
733
+
734
+ # Manual per-host workflow
735
+ cdpilot cookies save --host x.com # cache current session cookies
736
+ cdpilot cookies load --host x.com # inject before navigating
737
+ cdpilot cookies cf-replay https://x.com # explicit CF clearance injection
738
+
739
+ # Inspect and clean
740
+ cdpilot cookies list # all cached hosts + age + CF flag
741
+ cdpilot cookies clear --older-than 7d # prune stale cache
742
+ ```
743
+
744
+ Storage: `~/.cdpilot/cookies/<host>/cookies.json` (chmod 600, never committed to git).
745
+ Expired cookies are filtered automatically on load.
746
+
456
747
  ## Roadmap
457
748
 
458
749
  The only browser MCP with built-in test assertions. Here's what we've shipped and what's next:
459
750
 
460
751
  ### Shipped
461
752
 
462
- - [x] 60+ CLI commands (navigate, click, fill, screenshot, PDF, console, network...)
753
+ - [x] 70+ CLI commands (navigate, click, fill, screenshot, PDF, console, network, video understanding, friction ladder...)
463
754
  - [x] MCP server for AI agent integration (Claude Code, Cursor, etc.)
464
755
  - [x] **10 built-in test assertions** — assert, assert-url, assert-title, assert-count, assert-value, assert-attr, assert-visible/hidden, wait-for, check (batch), screenshot-diff
465
756
  - [x] **Accessibility tree snapshot** (`a11y-snapshot`) — structured data with @ref references, 500x fewer tokens than screenshots
@@ -483,14 +774,20 @@ The only browser MCP with built-in test assertions. Here's what we've shipped an
483
774
  - [x] Pre-flight wizard (auto-installs dependencies on first run)
484
775
  - [x] Persistent MCP glow (stays on during entire AI session, like Claude's orange glow)
485
776
  - [x] DevExtension system (native JS injection without browser store)
486
- - [x] **Smart commands** — `smart-click`, `smart-fill`, `smart-select` — interact by visible text, no CSS selectors needed, no LLM required
777
+ - [x] **Smart commands** — `smart-click`, `smart-fill`, `smart-select` — interact by visible text, no CSS selectors needed, no LLM required. Now with a disabled-element guard (no more false "clicked" on disabled buttons), Shadow DOM traversal (Lightning, Polymer, lit-element widgets), locale-aware text matching (Turkish İ/i, German ß), and floating-label support for `smart-fill` (Material / Ant / Chakra via `aria-labelledby` and `closest` label resolution)
778
+ - [x] **Video understanding** (`watch`) — continuous screencast into a ring buffer so an AI agent can query a time window and see motion (animation, cursor, scroll), not just one still frame. Local `file://` and online video (YouTube/Vimeo/Twitter/etc.); DRM players (Netflix) excluded
779
+ - [x] **Friction ladder** (`friction`) — 6-level progressive anti-bot detection (none → rate_limited → soft_captcha → login_wall → otp_sms → hard_block), bilingual EN+TR, read-only; rate-limit auto-backoff, login/OTP/hard-block flagged for human handoff (no autonomous bypass)
780
+ - [x] **Three-tier stealth mode** (`mode regular|stealth|undetected`) — single switch over fingerprint surface, with per-host adaptive tier learning
781
+ - [x] **Press-and-hold solver** (`press-hold`) — humanized press → hold → release gesture (Gaussian 3–7s + micro-jitter) for PerimeterX/HUMAN behavioral challenges; `captcha-solve` auto-routes here
782
+ - [x] **Image CAPTCHA + profile warming** — offline Amazon image OCR (optional `amazoncaptcha` lib) + BYOK image-to-text (capsolver/2captcha); `profile warm` ages the profile for reCAPTCHA v3 score
783
+ - [x] **Multi-instance pool + off-screen mode** (`CDPILOT_POOL_SIZE`, `CDPILOT_OFFSCREEN`) — N parallel browser processes; headed rendering without stealing window focus
487
784
  - [x] **Data extraction** (`extract`) — structured DOM data in text, JSON, or list format
488
785
  - [x] **Page observation** (`observe`) — list all interactive elements with available actions
489
786
  - [x] **Script runner** (`run`) — execute `.cdp` script files with pass/fail reporting
490
787
 
491
788
  ### Coming Soon
492
789
 
493
- - [ ] **iframe & Shadow DOM** support — interact with elements inside iframes and shadow roots
790
+ - [ ] **iframe** support — interact with elements inside iframes (Shadow DOM traversal already shipped in smart commands)
494
791
  - [ ] **Session recording & replay** — record browser sessions and replay them deterministically
495
792
  - [ ] **Stealth mode** *(Pro)* — human-like mouse/typing, anti-fingerprint, CAPTCHA solving
496
793
  - [ ] **cdpilot Cloud** — hosted browser sessions API, REST + WebSocket MCP endpoint