voidcrawl 0.3.5__tar.gz → 0.3.6__tar.gz

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 (75) hide show
  1. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/Cargo.lock +49 -62
  2. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/Cargo.toml +6 -0
  3. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/PKG-INFO +3 -2
  4. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/README.md +1 -0
  5. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/Cargo.toml +1 -1
  6. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/README.md +1 -0
  7. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/examples/download_via_action.rs +2 -2
  8. voidcrawl-0.3.6/crates/core/src/input.rs +205 -0
  9. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/src/lib.rs +1 -0
  10. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/src/page.rs +322 -11
  11. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/src/session.rs +35 -1
  12. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/tests/ax_tree.rs +3 -3
  13. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/pyo3_bindings/Cargo.toml +4 -4
  14. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/pyo3_bindings/src/lib.rs +263 -5
  15. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/pyproject.toml +2 -2
  16. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/__init__.py +42 -0
  17. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/__init__.pyi +4 -0
  18. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/_ext.pyi +132 -2
  19. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/profiles.py +3 -0
  20. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/scale.py +4 -1
  21. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/LICENSE.md +0 -0
  22. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/CORPUS.md +0 -0
  23. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/examples/download_and_scan.rs +0 -0
  24. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/src/antibot.rs +0 -0
  25. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/src/ax.rs +0 -0
  26. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/src/captcha.rs +0 -0
  27. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/src/error.rs +0 -0
  28. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/src/pool.rs +0 -0
  29. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/src/profile.rs +0 -0
  30. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/src/scanner.rs +0 -0
  31. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/src/stealth.rs +0 -0
  32. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/tests/antibot_accuracy.rs +0 -0
  33. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/tests/captcha_capture.rs +0 -0
  34. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/tests/captcha_runtime_loaded.rs +0 -0
  35. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/tests/download.rs +0 -0
  36. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/tests/emulation.rs +0 -0
  37. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/tests/integration.rs +0 -0
  38. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/tests/profile_lock.rs +0 -0
  39. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/tests/scanner.rs +0 -0
  40. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/tests/stealth_ua.rs +0 -0
  41. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/_downloads.py +0 -0
  42. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/__init__.py +0 -0
  43. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/__init__.pyi +0 -0
  44. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/_base.py +0 -0
  45. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/_base.pyi +0 -0
  46. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/_flow.py +0 -0
  47. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/_flow.pyi +0 -0
  48. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/_protocol.py +0 -0
  49. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/_protocol.pyi +0 -0
  50. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/__init__.py +0 -0
  51. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/__init__.pyi +0 -0
  52. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/click.py +0 -0
  53. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/click.pyi +0 -0
  54. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/dom.py +0 -0
  55. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/dom.pyi +0 -0
  56. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/hover.py +0 -0
  57. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/hover.pyi +0 -0
  58. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/input.py +0 -0
  59. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/input.pyi +0 -0
  60. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/network.py +0 -0
  61. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/network.pyi +0 -0
  62. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/scroll.py +0 -0
  63. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/scroll.pyi +0 -0
  64. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/wait.py +0 -0
  65. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/wait.pyi +0 -0
  66. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/js/click_at.js +0 -0
  67. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/js/hover.js +0 -0
  68. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/js/wait_for_selector.js +0 -0
  69. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/cli.py +0 -0
  70. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/debug.py +0 -0
  71. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/debug.pyi +0 -0
  72. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/py.typed +0 -0
  73. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/scale.pyi +0 -0
  74. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/schema.py +0 -0
  75. {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/schema.pyi +0 -0
@@ -251,9 +251,9 @@ checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33"
251
251
 
252
252
  [[package]]
253
253
  name = "cc"
254
- version = "1.2.63"
254
+ version = "1.2.64"
255
255
  source = "registry+https://github.com/rust-lang/crates.io-index"
256
- checksum = "556e016178bb5662a08681bbe0f00f8e17631781a4dfc8c45e466e4b185ec27f"
256
+ checksum = "dad887fd958be91b5098c0248def011f4523ab786cd411be668777e55063501f"
257
257
  dependencies = [
258
258
  "find-msvc-tools",
259
259
  "shlex",
@@ -279,8 +279,6 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
279
279
  [[package]]
280
280
  name = "chromiumoxide"
281
281
  version = "0.9.1"
282
- source = "registry+https://github.com/rust-lang/crates.io-index"
283
- checksum = "26ed067eb6c1f660bdb87c05efb964421d2ca262bae0296cdfe38cf0cd949a3e"
284
282
  dependencies = [
285
283
  "async-tungstenite",
286
284
  "base64",
@@ -636,9 +634,9 @@ dependencies = [
636
634
 
637
635
  [[package]]
638
636
  name = "daachorse"
639
- version = "3.0.1"
637
+ version = "3.0.2"
640
638
  source = "registry+https://github.com/rust-lang/crates.io-index"
641
- checksum = "d90e4c4a7034cde152cbbac492a8d61c5d85b0fe9972afdf32737ff5fc17c9ff"
639
+ checksum = "99251f238b74cd219a86fe6ea9328308ebb223fcbb5b8eb5aa400b847a41dded"
642
640
 
643
641
  [[package]]
644
642
  name = "darling"
@@ -1415,9 +1413,9 @@ dependencies = [
1415
1413
 
1416
1414
  [[package]]
1417
1415
  name = "js-sys"
1418
- version = "0.3.100"
1416
+ version = "0.3.102"
1419
1417
  source = "registry+https://github.com/rust-lang/crates.io-index"
1420
- checksum = "f2025f20d7a4fa7785846e7b63d10a76d3f1cee98ee5cb79ea59703f95e42162"
1418
+ checksum = "03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31"
1421
1419
  dependencies = [
1422
1420
  "cfg-if",
1423
1421
  "futures-util",
@@ -1432,9 +1430,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
1432
1430
 
1433
1431
  [[package]]
1434
1432
  name = "leb128"
1435
- version = "0.2.6"
1433
+ version = "0.2.7"
1436
1434
  source = "registry+https://github.com/rust-lang/crates.io-index"
1437
- checksum = "6cc46bac87ef8093eed6f272babb833b6443374399985ac8ed28471ee0918545"
1435
+ checksum = "c83bff1d572d6b9aeef67ddfc8448e4a3737909cb28e81f97c791b9018703e52"
1438
1436
 
1439
1437
  [[package]]
1440
1438
  name = "leb128fmt"
@@ -1535,9 +1533,9 @@ dependencies = [
1535
1533
 
1536
1534
  [[package]]
1537
1535
  name = "memchr"
1538
- version = "2.8.1"
1536
+ version = "2.8.2"
1539
1537
  source = "registry+https://github.com/rust-lang/crates.io-index"
1540
- checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8"
1538
+ checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4"
1541
1539
 
1542
1540
  [[package]]
1543
1541
  name = "memfd"
@@ -1768,9 +1766,9 @@ dependencies = [
1768
1766
 
1769
1767
  [[package]]
1770
1768
  name = "pyo3"
1771
- version = "0.28.3"
1769
+ version = "0.29.0"
1772
1770
  source = "registry+https://github.com/rust-lang/crates.io-index"
1773
- checksum = "91fd8e38a3b50ed1167fb981cd6fd60147e091784c427b8f7183a7ee32c31c12"
1771
+ checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c"
1774
1772
  dependencies = [
1775
1773
  "libc",
1776
1774
  "once_cell",
@@ -1782,9 +1780,9 @@ dependencies = [
1782
1780
 
1783
1781
  [[package]]
1784
1782
  name = "pyo3-async-runtimes"
1785
- version = "0.28.0"
1783
+ version = "0.29.0"
1786
1784
  source = "registry+https://github.com/rust-lang/crates.io-index"
1787
- checksum = "9e7364a95bf00e8377bbf9b0f09d7ff9715a29d8fcf93b47d1a967363b973178"
1785
+ checksum = "b3ef68daa7316a3fac65e5e18b2203f010346de1c1c53456811a2624673ab046"
1788
1786
  dependencies = [
1789
1787
  "futures-channel",
1790
1788
  "futures-util",
@@ -1796,19 +1794,18 @@ dependencies = [
1796
1794
 
1797
1795
  [[package]]
1798
1796
  name = "pyo3-build-config"
1799
- version = "0.28.3"
1797
+ version = "0.29.0"
1800
1798
  source = "registry+https://github.com/rust-lang/crates.io-index"
1801
- checksum = "e368e7ddfdeb98c9bca7f8383be1648fd84ab466bf2bc015e94008db6d35611e"
1799
+ checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078"
1802
1800
  dependencies = [
1803
- "python3-dll-a",
1804
1801
  "target-lexicon",
1805
1802
  ]
1806
1803
 
1807
1804
  [[package]]
1808
1805
  name = "pyo3-ffi"
1809
- version = "0.28.3"
1806
+ version = "0.29.0"
1810
1807
  source = "registry+https://github.com/rust-lang/crates.io-index"
1811
- checksum = "7f29e10af80b1f7ccaf7f69eace800a03ecd13e883acfacc1e5d0988605f651e"
1808
+ checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b"
1812
1809
  dependencies = [
1813
1810
  "libc",
1814
1811
  "pyo3-build-config",
@@ -1816,9 +1813,9 @@ dependencies = [
1816
1813
 
1817
1814
  [[package]]
1818
1815
  name = "pyo3-macros"
1819
- version = "0.28.3"
1816
+ version = "0.29.0"
1820
1817
  source = "registry+https://github.com/rust-lang/crates.io-index"
1821
- checksum = "df6e520eff47c45997d2fc7dd8214b25dd1310918bbb2642156ef66a67f29813"
1818
+ checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771"
1822
1819
  dependencies = [
1823
1820
  "proc-macro2",
1824
1821
  "pyo3-macros-backend",
@@ -1828,26 +1825,16 @@ dependencies = [
1828
1825
 
1829
1826
  [[package]]
1830
1827
  name = "pyo3-macros-backend"
1831
- version = "0.28.3"
1828
+ version = "0.29.0"
1832
1829
  source = "registry+https://github.com/rust-lang/crates.io-index"
1833
- checksum = "c4cdc218d835738f81c2338f822078af45b4afdf8b2e33cbb5916f108b813acb"
1830
+ checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362"
1834
1831
  dependencies = [
1835
1832
  "heck",
1836
1833
  "proc-macro2",
1837
- "pyo3-build-config",
1838
1834
  "quote",
1839
1835
  "syn",
1840
1836
  ]
1841
1837
 
1842
- [[package]]
1843
- name = "python3-dll-a"
1844
- version = "0.2.15"
1845
- source = "registry+https://github.com/rust-lang/crates.io-index"
1846
- checksum = "d80ba7540edb18890d444c5aa8e1f1f99b1bdf26fb26ae383135325f4a36042b"
1847
- dependencies = [
1848
- "cc",
1849
- ]
1850
-
1851
1838
  [[package]]
1852
1839
  name = "quote"
1853
1840
  version = "1.0.45"
@@ -2391,9 +2378,9 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
2391
2378
 
2392
2379
  [[package]]
2393
2380
  name = "smallvec"
2394
- version = "1.15.1"
2381
+ version = "1.15.2"
2395
2382
  source = "registry+https://github.com/rust-lang/crates.io-index"
2396
- checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
2383
+ checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90"
2397
2384
  dependencies = [
2398
2385
  "serde",
2399
2386
  ]
@@ -2440,9 +2427,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
2440
2427
 
2441
2428
  [[package]]
2442
2429
  name = "syn"
2443
- version = "2.0.117"
2430
+ version = "2.0.118"
2444
2431
  source = "registry+https://github.com/rust-lang/crates.io-index"
2445
- checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
2432
+ checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422"
2446
2433
  dependencies = [
2447
2434
  "proc-macro2",
2448
2435
  "quote",
@@ -2845,7 +2832,7 @@ checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1"
2845
2832
 
2846
2833
  [[package]]
2847
2834
  name = "void_crawl"
2848
- version = "0.3.5"
2835
+ version = "0.3.6"
2849
2836
  dependencies = [
2850
2837
  "futures",
2851
2838
  "pyo3",
@@ -2857,7 +2844,7 @@ dependencies = [
2857
2844
 
2858
2845
  [[package]]
2859
2846
  name = "void_crawl_core"
2860
- version = "0.3.5"
2847
+ version = "0.3.6"
2861
2848
  dependencies = [
2862
2849
  "chromiumoxide",
2863
2850
  "fd-lock",
@@ -2876,7 +2863,7 @@ dependencies = [
2876
2863
 
2877
2864
  [[package]]
2878
2865
  name = "voidcrawl-mcp"
2879
- version = "0.3.5"
2866
+ version = "0.3.6"
2880
2867
  dependencies = [
2881
2868
  "anyhow",
2882
2869
  "base64",
@@ -2954,9 +2941,9 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
2954
2941
 
2955
2942
  [[package]]
2956
2943
  name = "wasip2"
2957
- version = "1.0.3+wasi-0.2.9"
2944
+ version = "1.0.4+wasi-0.2.12"
2958
2945
  source = "registry+https://github.com/rust-lang/crates.io-index"
2959
- checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6"
2946
+ checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487"
2960
2947
  dependencies = [
2961
2948
  "wit-bindgen 0.57.1",
2962
2949
  ]
@@ -2972,9 +2959,9 @@ dependencies = [
2972
2959
 
2973
2960
  [[package]]
2974
2961
  name = "wasm-bindgen"
2975
- version = "0.2.123"
2962
+ version = "0.2.125"
2976
2963
  source = "registry+https://github.com/rust-lang/crates.io-index"
2977
- checksum = "a254a4b10c19a76f09a27640e7ffbf9bc30bf67e16a3bf28aaefa4920fe81563"
2964
+ checksum = "8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1a"
2978
2965
  dependencies = [
2979
2966
  "cfg-if",
2980
2967
  "once_cell",
@@ -2985,9 +2972,9 @@ dependencies = [
2985
2972
 
2986
2973
  [[package]]
2987
2974
  name = "wasm-bindgen-futures"
2988
- version = "0.4.73"
2975
+ version = "0.4.75"
2989
2976
  source = "registry+https://github.com/rust-lang/crates.io-index"
2990
- checksum = "54568702fabf5d4849ce2b90fadfa64168a097eaf4b351ce9df8b687a0086aaf"
2977
+ checksum = "503b14d284f2c8dac03b819967e155ea753f573586193b2b2c95990cb5d69280"
2991
2978
  dependencies = [
2992
2979
  "js-sys",
2993
2980
  "wasm-bindgen",
@@ -2995,9 +2982,9 @@ dependencies = [
2995
2982
 
2996
2983
  [[package]]
2997
2984
  name = "wasm-bindgen-macro"
2998
- version = "0.2.123"
2985
+ version = "0.2.125"
2999
2986
  source = "registry+https://github.com/rust-lang/crates.io-index"
3000
- checksum = "24a40fc75b0ec6f3746ceb10d36f53a93dcd68a93b11b6445983945d79eba0dc"
2987
+ checksum = "4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3d"
3001
2988
  dependencies = [
3002
2989
  "quote",
3003
2990
  "wasm-bindgen-macro-support",
@@ -3005,9 +2992,9 @@ dependencies = [
3005
2992
 
3006
2993
  [[package]]
3007
2994
  name = "wasm-bindgen-macro-support"
3008
- version = "0.2.123"
2995
+ version = "0.2.125"
3009
2996
  source = "registry+https://github.com/rust-lang/crates.io-index"
3010
- checksum = "908f34bd9b9ce3d4caf07b72dfab63d61504d156856c6bd3cd87fa350cf3985b"
2997
+ checksum = "fecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebd"
3011
2998
  dependencies = [
3012
2999
  "bumpalo",
3013
3000
  "proc-macro2",
@@ -3018,9 +3005,9 @@ dependencies = [
3018
3005
 
3019
3006
  [[package]]
3020
3007
  name = "wasm-bindgen-shared"
3021
- version = "0.2.123"
3008
+ version = "0.2.125"
3022
3009
  source = "registry+https://github.com/rust-lang/crates.io-index"
3023
- checksum = "7acbf7616c27b194bbb550bf77ed0c2c3e5b7fd1260a93082b95fb7f47959b92"
3010
+ checksum = "23939e44bb9a5d7576fa2b563dc2e136628f1224e88a8deed09e04858b77871f"
3024
3011
  dependencies = [
3025
3012
  "unicode-ident",
3026
3013
  ]
@@ -3258,9 +3245,9 @@ dependencies = [
3258
3245
 
3259
3246
  [[package]]
3260
3247
  name = "web-sys"
3261
- version = "0.3.100"
3248
+ version = "0.3.102"
3262
3249
  source = "registry+https://github.com/rust-lang/crates.io-index"
3263
- checksum = "6e0871acf327f283dc6da28a1696cdc64fb355ba9f935d052021fa77f35cce69"
3250
+ checksum = "a6430a72df5eb332242960fe84b3002a241163998241eb596d4f739b9757061d"
3264
3251
  dependencies = [
3265
3252
  "js-sys",
3266
3253
  "wasm-bindgen",
@@ -3277,9 +3264,9 @@ dependencies = [
3277
3264
 
3278
3265
  [[package]]
3279
3266
  name = "which"
3280
- version = "8.0.3"
3267
+ version = "8.0.4"
3281
3268
  source = "registry+https://github.com/rust-lang/crates.io-index"
3282
- checksum = "c789537cf2f7f55be8e6192f92e464174ee55f91af622777f7f1ceb0dbccd03e"
3269
+ checksum = "48d7cd18d4acb58fb3cdfe9ea54e6cd96a4e7d4cc45c56338b236e82dad47248"
3283
3270
  dependencies = [
3284
3271
  "libc",
3285
3272
  ]
@@ -3608,9 +3595,9 @@ dependencies = [
3608
3595
 
3609
3596
  [[package]]
3610
3597
  name = "yara-x-macros"
3611
- version = "1.17.0"
3598
+ version = "1.18.0"
3612
3599
  source = "registry+https://github.com/rust-lang/crates.io-index"
3613
- checksum = "eff2e4994394cb743155ee2a560e19cbc42e8e829593a8c1faa02e3ddc897638"
3600
+ checksum = "f3ed838cfc6391f383db4b408ae65f0b113277222b6bb98a3baa29b5f34e3293"
3614
3601
  dependencies = [
3615
3602
  "darling",
3616
3603
  "proc-macro2",
@@ -3702,9 +3689,9 @@ dependencies = [
3702
3689
 
3703
3690
  [[package]]
3704
3691
  name = "zeroize"
3705
- version = "1.8.2"
3692
+ version = "1.9.0"
3706
3693
  source = "registry+https://github.com/rust-lang/crates.io-index"
3707
- checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0"
3694
+ checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e"
3708
3695
 
3709
3696
  [[package]]
3710
3697
  name = "zerotrie"
@@ -39,3 +39,9 @@ similar_names = "allow"
39
39
  doc_lazy_continuation = "allow"
40
40
  needless_raw_string_hashes = "allow"
41
41
  too_many_lines = "allow"
42
+
43
+ # Vendored chromiumoxide with VoidCrawl's minimal-CDP stealth patch surface.
44
+ # The fork still launches or attaches to stock Chrome/Chromium; it only changes
45
+ # selected CDP-client behavior when VOIDCRAWL_STEALTH_NO_RUNTIME is set.
46
+ [patch.crates-io]
47
+ chromiumoxide = { path = "vendor/chromiumoxide" }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: voidcrawl
3
- Version: 0.3.5
3
+ Version: 0.3.6
4
4
  Classifier: Programming Language :: Python :: 3 :: Only
5
5
  Classifier: Programming Language :: Python :: 3.10
6
6
  Classifier: Programming Language :: Python :: 3.11
@@ -10,7 +10,7 @@ Classifier: Programming Language :: Python :: 3.14
10
10
  Requires-Dist: click>=8.3.2
11
11
  Requires-Dist: pydantic>=2
12
12
  Requires-Dist: rich>=14.3.3 ; extra == 'debug'
13
- Requires-Dist: voidcrawl-mcp==0.3.5 ; extra == 'mcp'
13
+ Requires-Dist: voidcrawl-mcp==0.3.6 ; extra == 'mcp'
14
14
  Provides-Extra: debug
15
15
  Provides-Extra: mcp
16
16
  License-File: LICENSE.md
@@ -178,6 +178,7 @@ uv run pytest tests/ -v
178
178
 
179
179
  - [Full API reference](docs/api-reference.md)
180
180
  - [Anti-bot / CDN detection](docs/antibot.md)
181
+ - [Cross-origin & closed-shadow frames](docs/cross-origin-frames.md)
181
182
  - [Examples](examples/)
182
183
 
183
184
  ## Contact
@@ -157,6 +157,7 @@ uv run pytest tests/ -v
157
157
 
158
158
  - [Full API reference](docs/api-reference.md)
159
159
  - [Anti-bot / CDN detection](docs/antibot.md)
160
+ - [Cross-origin & closed-shadow frames](docs/cross-origin-frames.md)
160
161
  - [Examples](examples/)
161
162
 
162
163
  ## Contact
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "void_crawl_core"
3
- version = "0.3.5"
3
+ version = "0.3.6"
4
4
  edition.workspace = true
5
5
  license.workspace = true
6
6
  rust-version.workspace = true
@@ -157,6 +157,7 @@ uv run pytest tests/ -v
157
157
 
158
158
  - [Full API reference](docs/api-reference.md)
159
159
  - [Anti-bot / CDN detection](docs/antibot.md)
160
+ - [Cross-origin & closed-shadow frames](docs/cross-origin-frames.md)
160
161
  - [Examples](examples/)
161
162
 
162
163
  ## Contact
@@ -43,10 +43,10 @@ async fn main() -> Result<(), Box<dyn Error>> {
43
43
  let capture = page.arm_download(quarantine.path(), max_bytes).await?;
44
44
 
45
45
  println!(" clicking the \"Download\" button …");
46
- page.click_by_role("button", "Download", 0).await?;
46
+ page.click_by_role("button", "Download", 0, false).await?;
47
47
  // Drive may interpose a "Download anyway" virus-scan interstitial for files
48
48
  // it can't scan — clicking it is just another action in the same flow.
49
- let _ = page.click_by_role("button", "Download anyway", 0).await;
49
+ let _ = page.click_by_role("button", "Download anyway", 0, false).await;
50
50
 
51
51
  println!(" waiting for the download to land …");
52
52
  let outcome = capture.wait(&page, Duration::from_secs(90)).await?;
@@ -0,0 +1,205 @@
1
+ //! Humanized pointer paths for CDP mouse input (CAS-147).
2
+ //!
3
+ //! Pure, dependency-free generation of a realistic cursor trajectory between
4
+ //! two points, emitted as a sequence of `Input.dispatchMouseEvent` `MouseMoved`
5
+ //! steps before the press. The path has **non-linear (arc) curvature**, a
6
+ //! **minimum-jerk** velocity profile (slow start/stop), small **tremor**, and
7
+ //! an optional **dwell** on the target — the traits a managed challenge looks
8
+ //! for in real pointer input. No page-world JS is injected; only CDP events.
9
+ //!
10
+ //! Generation is deterministic under a seeded [`Rng`] so it can be unit-tested
11
+ //! exactly; the live path seeds from wall-clock entropy at the call site.
12
+
13
+ #![allow(clippy::cast_possible_truncation, clippy::cast_precision_loss, clippy::cast_sign_loss)]
14
+
15
+ /// One step along a humanized path: an absolute target plus the delay to wait
16
+ /// *before* dispatching it (ms).
17
+ #[derive(Debug, Clone, Copy, PartialEq)]
18
+ pub struct PathStep {
19
+ pub x: f64,
20
+ pub y: f64,
21
+ pub delay_ms: u64,
22
+ }
23
+
24
+ /// Shape/timing knobs for [`humanized_path`].
25
+ #[derive(Debug, Clone, Copy)]
26
+ pub struct HumanizeOptions {
27
+ /// Max perpendicular bow of the arc, in px (actual is randomized within ±).
28
+ pub curve: f64,
29
+ /// Per-step tremor amplitude, in px (damped toward the target).
30
+ pub tremor: f64,
31
+ /// Pause on the target before the press, in ms (a final dwell step).
32
+ pub dwell_ms: u64,
33
+ /// Total movement duration floor, in ms.
34
+ pub min_duration_ms: f64,
35
+ /// Total movement duration ceiling, in ms — keeps agent workflows bounded.
36
+ pub max_duration_ms: f64,
37
+ }
38
+
39
+ impl Default for HumanizeOptions {
40
+ fn default() -> Self {
41
+ Self {
42
+ curve: 22.0,
43
+ tremor: 1.1,
44
+ dwell_ms: 55,
45
+ min_duration_ms: 120.0,
46
+ max_duration_ms: 900.0,
47
+ }
48
+ }
49
+ }
50
+
51
+ /// SplitMix64 — a tiny deterministic PRNG. Avoids a `rand` dependency and makes
52
+ /// path generation reproducible from a seed (for tests).
53
+ #[derive(Debug, Clone)]
54
+ pub struct Rng(u64);
55
+
56
+ impl Rng {
57
+ #[must_use]
58
+ pub fn seed(seed: u64) -> Self {
59
+ Self(seed)
60
+ }
61
+
62
+ fn next_u64(&mut self) -> u64 {
63
+ self.0 = self.0.wrapping_add(0x9E37_79B9_7F4A_7C15);
64
+ let mut z = self.0;
65
+ z = (z ^ (z >> 30)).wrapping_mul(0xBF58_476D_1CE4_E5B9);
66
+ z = (z ^ (z >> 27)).wrapping_mul(0x94D0_49BB_1331_11EB);
67
+ z ^ (z >> 31)
68
+ }
69
+
70
+ /// Uniform in `[0, 1)`.
71
+ fn unit(&mut self) -> f64 {
72
+ // 53-bit mantissa for an even distribution.
73
+ (self.next_u64() >> 11) as f64 / (1u64 << 53) as f64
74
+ }
75
+
76
+ /// Uniform in `[lo, hi)`.
77
+ fn range(&mut self, lo: f64, hi: f64) -> f64 {
78
+ lo + (hi - lo) * self.unit()
79
+ }
80
+ }
81
+
82
+ /// Minimum-jerk easing `6t^5 - 15t^4 + 10t^3` (smootherstep): zero velocity and
83
+ /// acceleration at both ends, like a real hand starting and stopping.
84
+ fn min_jerk(t: f64) -> f64 {
85
+ t * t * t * (t * (t * 6.0 - 15.0) + 10.0)
86
+ }
87
+
88
+ /// Generate a humanized cursor path from `start` to `end`.
89
+ ///
90
+ /// Returns at least a couple of `MouseMoved` steps (more for longer travel),
91
+ /// the **last of which lands exactly on `end`**, optionally followed by a dwell
92
+ /// step (same coords, `dwell_ms`). Total of all `delay_ms` is bounded by
93
+ /// `opts.max_duration_ms` (+ the dwell).
94
+ #[must_use]
95
+ pub fn humanized_path(
96
+ start: (f64, f64),
97
+ end: (f64, f64),
98
+ opts: &HumanizeOptions,
99
+ rng: &mut Rng,
100
+ ) -> Vec<PathStep> {
101
+ let (x0, y0) = start;
102
+ let (x1, y1) = end;
103
+ let (dx, dy) = (x1 - x0, y1 - y0);
104
+ let dist = dx.hypot(dy);
105
+
106
+ // Step count and duration both scale with distance, then clamp.
107
+ let steps = ((dist / 9.0).round() as usize).clamp(6, 40);
108
+ let duration =
109
+ (opts.min_duration_ms + dist * 1.6).clamp(opts.min_duration_ms, opts.max_duration_ms);
110
+
111
+ // Perpendicular unit vector for the arc bow (zero for a zero-length move).
112
+ let (nx, ny) = if dist > 1e-6 { (-dy / dist, dx / dist) } else { (0.0, 0.0) };
113
+ let bow = rng.range(-opts.curve, opts.curve);
114
+
115
+ let mut out = Vec::with_capacity(steps + 1);
116
+ let mut prev_e = 0.0_f64;
117
+ for i in 1..=steps {
118
+ let t = i as f64 / steps as f64;
119
+ let e = min_jerk(t);
120
+ // Arc weight peaks at the midpoint, vanishes at both ends.
121
+ let arc = bow * (1.0 - (2.0 * e - 1.0).powi(2));
122
+ // Tremor: damped toward the target for a clean final landing.
123
+ let damp = 1.0 - 0.65 * e;
124
+ let jx = rng.range(-opts.tremor, opts.tremor) * damp;
125
+ let jy = rng.range(-opts.tremor, opts.tremor) * damp;
126
+ // Per-step delay follows the same min-jerk profile (fast in the middle).
127
+ let delay = ((e - prev_e) * duration).max(1.0).round() as u64;
128
+ prev_e = e;
129
+ out.push(PathStep {
130
+ x: x0 + dx * e + nx * arc + jx,
131
+ y: y0 + dy * e + ny * arc + jy,
132
+ delay_ms: delay,
133
+ });
134
+ }
135
+ // Land exactly on target (no residual tremor on the final position).
136
+ if let Some(last) = out.last_mut() {
137
+ last.x = x1;
138
+ last.y = y1;
139
+ }
140
+ // Optional dwell on the target before the press.
141
+ if opts.dwell_ms > 0 {
142
+ out.push(PathStep { x: x1, y: y1, delay_ms: opts.dwell_ms });
143
+ }
144
+ out
145
+ }
146
+
147
+ #[cfg(test)]
148
+ mod tests {
149
+ use super::*;
150
+
151
+ const A: (f64, f64) = (0.0, 0.0);
152
+ const B: (f64, f64) = (300.0, 200.0);
153
+
154
+ #[test]
155
+ fn seeded_generation_is_deterministic() {
156
+ let opts = HumanizeOptions::default();
157
+ let p1 = humanized_path(A, B, &opts, &mut Rng::seed(42));
158
+ let p2 = humanized_path(A, B, &opts, &mut Rng::seed(42));
159
+ assert_eq!(p1, p2);
160
+ }
161
+
162
+ #[test]
163
+ fn different_seeds_differ() {
164
+ let opts = HumanizeOptions::default();
165
+ let p1 = humanized_path(A, B, &opts, &mut Rng::seed(1));
166
+ let p2 = humanized_path(A, B, &opts, &mut Rng::seed(2));
167
+ assert_ne!(p1, p2);
168
+ }
169
+
170
+ #[test]
171
+ fn emits_multiple_moves_and_lands_exactly_on_target() {
172
+ let opts = HumanizeOptions::default();
173
+ let path = humanized_path(A, B, &opts, &mut Rng::seed(7));
174
+ // Several moves before the press (dwell is the last step here).
175
+ assert!(path.len() >= 6, "got {} steps", path.len());
176
+ // The move that places the cursor on target is exact.
177
+ let move_steps = &path[..path.len() - 1];
178
+ assert!(!move_steps.is_empty(), "humanized path should include movement steps");
179
+ let landing = move_steps[move_steps.len() - 1];
180
+ assert!((landing.x - B.0).abs() < 1e-9 && (landing.y - B.1).abs() < 1e-9);
181
+ }
182
+
183
+ #[test]
184
+ fn duration_is_bounded() {
185
+ let opts = HumanizeOptions::default();
186
+ // A very long travel still stays within the ceiling (+ dwell).
187
+ let path = humanized_path((0.0, 0.0), (5000.0, 5000.0), &opts, &mut Rng::seed(3));
188
+ let total: u64 = path.iter().map(|s| s.delay_ms).sum();
189
+ let ceiling = opts.max_duration_ms as u64 + opts.dwell_ms + path.len() as u64;
190
+ assert!(total <= ceiling, "total {total} > ceiling {ceiling}");
191
+ }
192
+
193
+ #[test]
194
+ fn path_is_curved_not_straight() {
195
+ // A no-tremor, fixed-bow path should bow off the straight line at the mid.
196
+ let opts = HumanizeOptions { tremor: 0.0, dwell_ms: 0, ..Default::default() };
197
+ let path = humanized_path(A, B, &opts, &mut Rng::seed(11));
198
+ let mid = path[path.len() / 2];
199
+ // Distance of the midpoint from the straight A→B line.
200
+ let (dx, dy) = (B.0 - A.0, B.1 - A.1);
201
+ let len = dx.hypot(dy);
202
+ let dev = ((mid.x - A.0) * dy - (mid.y - A.1) * dx).abs() / len;
203
+ assert!(dev > 1.0, "midpoint deviation {dev} too small — path is ~straight");
204
+ }
205
+ }
@@ -6,6 +6,7 @@ pub mod antibot;
6
6
  pub mod ax;
7
7
  pub mod captcha;
8
8
  pub mod error;
9
+ pub mod input;
9
10
  pub mod page;
10
11
  pub mod pool;
11
12
  pub mod profile;