From 499457184eaaa6cfd8412c4579bf05b149a807a8 Mon Sep 17 00:00:00 2001 From: junhsss Date: Sat, 14 Mar 2026 01:01:18 +0900 Subject: [PATCH 01/16] feat: initial --- .gitignore | 2 + Cargo.lock | 2259 ++++++++++++++++++++++++++++++ Cargo.toml | 40 + src/api/client.rs | 231 +++ src/api/mod.rs | 3 + src/api/session.rs | 517 +++++++ src/api/top_level.rs | 386 +++++ src/browser/lifecycle.rs | 874 ++++++++++++ src/browser/mod.rs | 4 + src/browser/passthrough.rs | 2 + src/browser/routing.rs | 2 + src/browser/runtime.rs | 2 + src/commands/browser/captcha.rs | 182 +++ src/commands/browser/live.rs | 60 + src/commands/browser/mod.rs | 38 + src/commands/browser/sessions.rs | 71 + src/commands/browser/start.rs | 103 ++ src/commands/browser/stop.rs | 67 + src/commands/cache.rs | 42 + src/commands/config.rs | 37 + src/commands/credentials.rs | 369 +++++ src/commands/dev.rs | 173 +++ src/commands/docs.rs | 10 + src/commands/forge.rs | 176 +++ src/commands/login.rs | 208 +++ src/commands/logout.rs | 33 + src/commands/mod.rs | 116 ++ src/commands/pdf.rs | 68 + src/commands/run.rs | 223 +++ src/commands/scrape.rs | 97 ++ src/commands/screenshot.rs | 73 + src/commands/settings.rs | 48 + src/commands/star.rs | 10 + src/commands/support.rs | 10 + src/commands/update.rs | 79 ++ src/config/auth.rs | 141 ++ src/config/mod.rs | 69 + src/config/session_state.rs | 496 +++++++ src/config/settings.rs | 322 +++++ src/lib.rs | 5 + src/main.rs | 8 + src/util/mod.rs | 2 + src/util/output.rs | 1 + src/util/url.rs | 158 +++ tests/cli_compat.rs | 603 ++++++++ 45 files changed, 8420 insertions(+) create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 src/api/client.rs create mode 100644 src/api/mod.rs create mode 100644 src/api/session.rs create mode 100644 src/api/top_level.rs create mode 100644 src/browser/lifecycle.rs create mode 100644 src/browser/mod.rs create mode 100644 src/browser/passthrough.rs create mode 100644 src/browser/routing.rs create mode 100644 src/browser/runtime.rs create mode 100644 src/commands/browser/captcha.rs create mode 100644 src/commands/browser/live.rs create mode 100644 src/commands/browser/mod.rs create mode 100644 src/commands/browser/sessions.rs create mode 100644 src/commands/browser/start.rs create mode 100644 src/commands/browser/stop.rs create mode 100644 src/commands/cache.rs create mode 100644 src/commands/config.rs create mode 100644 src/commands/credentials.rs create mode 100644 src/commands/dev.rs create mode 100644 src/commands/docs.rs create mode 100644 src/commands/forge.rs create mode 100644 src/commands/login.rs create mode 100644 src/commands/logout.rs create mode 100644 src/commands/mod.rs create mode 100644 src/commands/pdf.rs create mode 100644 src/commands/run.rs create mode 100644 src/commands/scrape.rs create mode 100644 src/commands/screenshot.rs create mode 100644 src/commands/settings.rs create mode 100644 src/commands/star.rs create mode 100644 src/commands/support.rs create mode 100644 src/commands/update.rs create mode 100644 src/config/auth.rs create mode 100644 src/config/mod.rs create mode 100644 src/config/session_state.rs create mode 100644 src/config/settings.rs create mode 100644 src/lib.rs create mode 100644 src/main.rs create mode 100644 src/util/mod.rs create mode 100644 src/util/output.rs create mode 100644 src/util/url.rs create mode 100644 tests/cli_compat.rs diff --git a/.gitignore b/.gitignore index 087dc28..30ae5c2 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,5 @@ CLAUDE.md browser-feedback-working-plan.md browser-agent-ux-findings-*.md plan.md/ + +target/ \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..0b59531 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,2259 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "anstream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" + +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "assert-json-diff" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e4f2b81832e72834d7518d8487a0396a28cc408186a2e8854c0f98011faf12" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" + +[[package]] +name = "bumpalo" +version = "3.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" + +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" + +[[package]] +name = "cc" +version = "1.2.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "clap" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + +[[package]] +name = "colored" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "console" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" +dependencies = [ + "encode_unicode", + "libc", + "once_cell", + "unicode-width", + "windows-sys 0.59.0", +] + +[[package]] +name = "deadpool" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0be2b1d1d6ec8d846f05e137292d0b89133caf95ef33695424c09568bdd39b1b" +dependencies = [ + "deadpool-runtime", + "lazy_static", + "num_cpus", + "tokio", +] + +[[package]] +name = "deadpool-runtime" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "092966b41edc516079bdf31ec78a2e0588d1d0c08f78b91d8307215928642b2b" + +[[package]] +name = "dialoguer" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de" +dependencies = [ + "console", + "shell-words", + "tempfile", + "thiserror 1.0.69", + "zeroize", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-executor" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 5.3.0", + "wasip2", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "wasip2", + "wasip3", +] + +[[package]] +name = "h2" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "http" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +dependencies = [ + "equivalent", + "hashbrown 0.16.1", + "serde", + "serde_core", +] + +[[package]] +name = "indicatif" +version = "0.17.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" +dependencies = [ + "console", + "number_prefix", + "portable-atomic", + "unicode-width", + "web-time", +] + +[[package]] +name = "ipnet" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + +[[package]] +name = "iri-string" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itoa" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" + +[[package]] +name = "js-sys" +version = "0.3.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "libc" +version = "0.2.183" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" + +[[package]] +name = "libredox" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1744e39d1d6a9948f4f388969627434e31128196de472883b39f148769bfe30a" +dependencies = [ + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "mio" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "open" +version = "5.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43bb73a7fa3799b198970490a51174027ba0d4ec504b03cd08caf513d40024bc" +dependencies = [ + "is-wsl", + "libc", + "pathdiff", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "portable-atomic" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror 2.0.18", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +dependencies = [ + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.60.2", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.18", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" + +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64", + "bytes", + "futures-core", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.23.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "shell-words" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77" + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "steel-cli" +version = "0.1.0" +dependencies = [ + "anyhow", + "clap", + "colored", + "dialoguer", + "dirs", + "indicatif", + "open", + "reqwest", + "serde", + "serde_json", + "tempfile", + "thiserror 2.0.18", + "tokio", + "url", + "urlencoding", + "wiremock", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.2", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +dependencies = [ + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8" +dependencies = [ + "cfg-if", + "futures-util", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags", + "hashbrown 0.15.5", + "indexmap", + "semver", +] + +[[package]] +name = "web-sys" +version = "0.3.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "wiremock" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08db1edfb05d9b3c1542e521aea074442088292f00b5f28e435c714a98f85031" +dependencies = [ + "assert-json-diff", + "base64", + "deadpool", + "futures", + "http", + "http-body-util", + "hyper", + "hyper-util", + "log", + "once_cell", + "regex", + "serde", + "serde_json", + "tokio", + "url", +] + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2578b716f8a7a858b7f02d5bd870c14bf4ddbbcf3a4c05414ba6503640505e3" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e6cc098ea4d3bd6246687de65af3f920c430e236bee1e3bf2e441463f08a02f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..7148ee4 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,40 @@ +[package] +name = "steel-cli" +version = "0.1.0" +edition = "2024" +description = "Steel CLI - Browser automation for AI agents" +license = "MIT" + +[lib] +name = "steel_cli" +path = "src/lib.rs" + +[[bin]] +name = "steel" +path = "src/main.rs" + +[dependencies] +clap = { version = "4.5", features = ["derive"] } +reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls"] } +serde = { version = "1", features = ["derive"] } +serde_json = "1" +tokio = { version = "1", features = ["full"] } +anyhow = "1" +thiserror = "2" +dirs = "6" +open = "5" +dialoguer = "0.11" +indicatif = "0.17" +colored = "3" +urlencoding = "2" +url = "2" + +[dev-dependencies] +tempfile = "3" +wiremock = "0.6" + +[profile.release] +opt-level = 3 +lto = true +codegen-units = 1 +strip = true diff --git a/src/api/client.rs b/src/api/client.rs new file mode 100644 index 0000000..5005534 --- /dev/null +++ b/src/api/client.rs @@ -0,0 +1,231 @@ +use reqwest::Client; +use serde_json::Value; +use thiserror::Error; + +use crate::config::auth::Auth; +use crate::config::settings::ApiMode; + +#[derive(Debug, Error)] +pub enum ApiError { + #[error("Missing Steel API key. Run `steel login` or set `STEEL_API_KEY`.")] + MissingAuth, + + #[error("Failed to reach Steel API at {url}.")] + Unreachable { + url: String, + #[source] + source: reqwest::Error, + }, + + #[error("Steel API request failed ({status}): {message}")] + RequestFailed { + status: u16, + message: String, + body: Option, + }, + + #[error(transparent)] + Other(#[from] reqwest::Error), +} + +impl ApiError { + /// Check if this is a 404/410 (not found). Matches TS `isNotFoundApiError()`. + pub fn is_not_found(&self) -> bool { + matches!(self, ApiError::RequestFailed { status, .. } if *status == 404 || *status == 410) + } +} + +/// Extract a human-readable error message from a JSON response body. +/// Matches TS `extractApiErrorMessage()`. +fn extract_error_message(body: &Value, status_text: &str) -> String { + // Try body.message + if let Some(msg) = body.get("message").and_then(|v| v.as_str()) { + if !msg.trim().is_empty() { + return msg.to_string(); + } + } + + // Try body.error.message + if let Some(msg) = body + .get("error") + .and_then(|e| e.get("message")) + .and_then(|v| v.as_str()) + { + if !msg.trim().is_empty() { + return msg.to_string(); + } + } + + if !status_text.is_empty() { + return status_text.to_string(); + } + + "Unknown API error".to_string() +} + +pub struct SteelClient { + http: Client, +} + +impl SteelClient { + pub fn new() -> Result { + let http = Client::builder().user_agent("steel-cli").build()?; + Ok(Self { http }) + } + + /// Make an authenticated API request. + /// Matches the shared request pattern in TS `requestApi()` and `requestTopLevelApi()`. + pub async fn request( + &self, + base_url: &str, + mode: ApiMode, + method: reqwest::Method, + path: &str, + body: Option, + auth: &Auth, + ) -> Result { + // Cloud mode requires auth + if mode == ApiMode::Cloud && auth.api_key.is_none() { + return Err(ApiError::MissingAuth); + } + + let url = format!("{base_url}{path}"); + + let mut req = self.http.request(method, &url); + req = req.header("Content-Type", "application/json"); + + if let Some(key) = &auth.api_key { + req = req.header("Steel-Api-Key", key); + } + + if let Some(body) = body { + req = req.json(&body); + } + + let resp = req.send().await.map_err(|e| ApiError::Unreachable { + url: url.clone(), + source: e, + })?; + + let status = resp.status(); + let status_code = status.as_u16(); + let status_text = status.canonical_reason().unwrap_or("").to_string(); + + // Read body as text, then try to parse as JSON + let response_text = resp.text().await.map_err(ApiError::Other)?; + + let response_data: Value = if response_text.trim().is_empty() { + Value::Null + } else { + serde_json::from_str(&response_text).unwrap_or(Value::String(response_text)) + }; + + if !status.is_success() { + let message = extract_error_message(&response_data, &status_text); + return Err(ApiError::RequestFailed { + status: status_code, + message, + body: Some(response_data), + }); + } + + Ok(response_data) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn extract_message_from_body() { + let body = serde_json::json!({"message": "Rate limit exceeded"}); + assert_eq!(extract_error_message(&body, ""), "Rate limit exceeded"); + } + + #[test] + fn extract_message_from_nested_error() { + let body = serde_json::json!({"error": {"message": "Invalid key"}}); + assert_eq!(extract_error_message(&body, ""), "Invalid key"); + } + + #[test] + fn extract_message_falls_back_to_status_text() { + let body = serde_json::json!({}); + assert_eq!(extract_error_message(&body, "Not Found"), "Not Found"); + } + + #[test] + fn extract_message_unknown_fallback() { + let body = serde_json::json!({}); + assert_eq!(extract_error_message(&body, ""), "Unknown API error"); + } + + #[test] + fn is_not_found_404() { + let err = ApiError::RequestFailed { + status: 404, + message: "Not found".into(), + body: None, + }; + assert!(err.is_not_found()); + } + + #[test] + fn is_not_found_410() { + let err = ApiError::RequestFailed { + status: 410, + message: "Gone".into(), + body: None, + }; + assert!(err.is_not_found()); + } + + #[test] + fn is_not_found_500_false() { + let err = ApiError::RequestFailed { + status: 500, + message: "Server error".into(), + body: None, + }; + assert!(!err.is_not_found()); + } + + #[tokio::test] + async fn missing_auth_in_cloud_mode() { + let client = SteelClient::new().unwrap(); + let auth = Auth { + api_key: None, + source: crate::config::auth::AuthSource::None, + }; + + let result = client + .request("http://localhost", ApiMode::Cloud, reqwest::Method::GET, "/test", None, &auth) + .await; + + assert!(matches!(result, Err(ApiError::MissingAuth))); + } + + #[tokio::test] + async fn local_mode_allows_no_auth() { + // This will fail to connect, but should NOT fail with MissingAuth + let client = SteelClient::new().unwrap(); + let auth = Auth { + api_key: None, + source: crate::config::auth::AuthSource::None, + }; + + let result = client + .request( + "http://127.0.0.1:1", + ApiMode::Local, + reqwest::Method::GET, + "/test", + None, + &auth, + ) + .await; + + assert!(matches!(result, Err(ApiError::Unreachable { .. }))); + } +} diff --git a/src/api/mod.rs b/src/api/mod.rs new file mode 100644 index 0000000..866558a --- /dev/null +++ b/src/api/mod.rs @@ -0,0 +1,3 @@ +pub mod client; +pub mod session; +pub mod top_level; diff --git a/src/api/session.rs b/src/api/session.rs new file mode 100644 index 0000000..9bd0c77 --- /dev/null +++ b/src/api/session.rs @@ -0,0 +1,517 @@ +//! Session API: create, list, get, release, captcha. +//! Ported from: cli/source/utils/browser/lifecycle/api-client.ts + +use serde_json::{Value, json}; + +use crate::api::client::{ApiError, SteelClient}; +use crate::config::auth::Auth; +use crate::config::settings::ApiMode; + +/// Options for creating a session. Matches TS `StartSessionRequestOptions`. +#[derive(Debug, Default)] +pub struct CreateSessionOptions { + pub stealth: bool, + pub proxy_url: Option, + pub timeout_ms: Option, + pub headless: Option, + pub region: Option, + pub solve_captcha: bool, + pub namespace: Option, + pub credentials: bool, +} + +/// Extract session list from response. Matches TS `extractSessionList()`. +fn extract_session_list(data: &Value) -> Vec { + // Direct array + if let Some(arr) = data.as_array() { + return arr + .iter() + .filter(|v| v.is_object()) + .cloned() + .collect(); + } + + // Nested { sessions: [...] } + if let Some(obj) = data.as_object() { + if let Some(Value::Array(arr)) = obj.get("sessions") { + return arr + .iter() + .filter(|v| v.is_object()) + .cloned() + .collect(); + } + + // Single session object with id + if obj.contains_key("id") { + return vec![data.clone()]; + } + } + + vec![] +} + +/// Extract a single session from response. Matches TS `extractSingleSession()`. +fn extract_single_session(data: &Value) -> Result { + if let Some(obj) = data.as_object() { + // Nested { session: {...} } + if let Some(session) = obj.get("session") { + if session.is_object() { + return Ok(session.clone()); + } + } + return Ok(data.clone()); + } + + Err(ApiError::RequestFailed { + status: 0, + message: "Unexpected empty response from Steel session API.".into(), + body: None, + }) +} + +/// Build the JSON body for session creation. +fn build_create_body(options: &CreateSessionOptions) -> Value { + let mut payload = json!({}); + let obj = payload.as_object_mut().unwrap(); + + if let Some(ref proxy_url) = options.proxy_url { + let trimmed = proxy_url.trim(); + if !trimmed.is_empty() { + obj.insert("proxyUrl".into(), json!(trimmed)); + } + } + + if let Some(timeout) = options.timeout_ms { + obj.insert("timeout".into(), json!(timeout)); + } + + if let Some(headless) = options.headless { + obj.insert("headless".into(), json!(headless)); + } + + if let Some(ref region) = options.region { + let trimmed = region.trim(); + if !trimmed.is_empty() { + obj.insert("region".into(), json!(trimmed)); + } + } + + if options.stealth { + obj.insert( + "stealthConfig".into(), + json!({"humanizeInteractions": true, "autoCaptchaSolving": true}), + ); + obj.insert("solveCaptcha".into(), json!(true)); + } + + if options.solve_captcha { + obj.insert("solveCaptcha".into(), json!(true)); + } + + if let Some(ref namespace) = options.namespace { + let trimmed = namespace.trim(); + if !trimmed.is_empty() { + obj.insert("namespace".into(), json!(trimmed)); + } + } + + if options.credentials { + obj.insert("credentials".into(), json!({})); + } + + payload +} + +impl SteelClient { + pub async fn list_sessions( + &self, + base_url: &str, + mode: ApiMode, + auth: &Auth, + ) -> Result, ApiError> { + let data = self + .request(base_url, mode, reqwest::Method::GET, "/sessions", None, auth) + .await?; + Ok(extract_session_list(&data)) + } + + pub async fn get_session( + &self, + base_url: &str, + mode: ApiMode, + session_id: &str, + auth: &Auth, + ) -> Result { + let data = self + .request( + base_url, + mode, + reqwest::Method::GET, + &format!("/sessions/{session_id}"), + None, + auth, + ) + .await?; + extract_single_session(&data) + } + + pub async fn create_session( + &self, + base_url: &str, + mode: ApiMode, + options: &CreateSessionOptions, + auth: &Auth, + ) -> Result { + let body = build_create_body(options); + let data = self + .request( + base_url, + mode, + reqwest::Method::POST, + "/sessions", + Some(body), + auth, + ) + .await?; + extract_single_session(&data) + } + + pub async fn release_session( + &self, + base_url: &str, + mode: ApiMode, + session_id: &str, + auth: &Auth, + ) -> Result<(), ApiError> { + self.request( + base_url, + mode, + reqwest::Method::POST, + &format!("/sessions/{session_id}/release"), + None, + auth, + ) + .await?; + Ok(()) + } + + pub async fn solve_captcha( + &self, + base_url: &str, + mode: ApiMode, + session_id: &str, + page_id: Option<&str>, + url: Option<&str>, + task_id: Option<&str>, + auth: &Auth, + ) -> Result { + let mut payload = json!({}); + let obj = payload.as_object_mut().unwrap(); + + if let Some(pid) = page_id { + let trimmed = pid.trim(); + if !trimmed.is_empty() { + obj.insert("pageId".into(), json!(trimmed)); + } + } + if let Some(u) = url { + let trimmed = u.trim(); + if !trimmed.is_empty() { + obj.insert("url".into(), json!(trimmed)); + } + } + if let Some(tid) = task_id { + let trimmed = tid.trim(); + if !trimmed.is_empty() { + obj.insert("taskId".into(), json!(trimmed)); + } + } + + self.request( + base_url, + mode, + reqwest::Method::POST, + &format!("/sessions/{session_id}/captchas/solve"), + Some(payload), + auth, + ) + .await + } + + pub async fn captcha_status( + &self, + base_url: &str, + mode: ApiMode, + session_id: &str, + page_id: Option<&str>, + auth: &Auth, + ) -> Result, ApiError> { + let path = match page_id { + Some(pid) if !pid.trim().is_empty() => { + let encoded = urlencoding::encode(pid.trim()); + format!("/sessions/{session_id}/captchas/status?pageId={encoded}") + } + _ => format!("/sessions/{session_id}/captchas/status"), + }; + + let data = self + .request(base_url, mode, reqwest::Method::GET, &path, None, auth) + .await?; + + if let Some(arr) = data.as_array() { + return Ok(arr.iter().filter(|v| v.is_object()).cloned().collect()); + } + if data.is_object() { + return Ok(vec![data]); + } + Ok(vec![]) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + // --- extract_session_list --- + + #[test] + fn extract_list_from_array() { + let data = json!([{"id": "s1"}, {"id": "s2"}]); + let list = extract_session_list(&data); + assert_eq!(list.len(), 2); + } + + #[test] + fn extract_list_from_nested() { + let data = json!({"sessions": [{"id": "s1"}]}); + let list = extract_session_list(&data); + assert_eq!(list.len(), 1); + } + + #[test] + fn extract_list_single_object() { + let data = json!({"id": "s1", "status": "live"}); + let list = extract_session_list(&data); + assert_eq!(list.len(), 1); + } + + #[test] + fn extract_list_null() { + let list = extract_session_list(&Value::Null); + assert!(list.is_empty()); + } + + // --- extract_single_session --- + + #[test] + fn extract_single_direct() { + let data = json!({"id": "s1"}); + let session = extract_single_session(&data).unwrap(); + assert_eq!(session["id"], "s1"); + } + + #[test] + fn extract_single_nested() { + let data = json!({"session": {"id": "s1"}}); + let session = extract_single_session(&data).unwrap(); + assert_eq!(session["id"], "s1"); + } + + // --- build_create_body --- + + #[test] + fn create_body_empty() { + let body = build_create_body(&CreateSessionOptions::default()); + assert_eq!(body, json!({})); + } + + #[test] + fn create_body_stealth() { + let body = build_create_body(&CreateSessionOptions { + stealth: true, + ..Default::default() + }); + assert_eq!(body["solveCaptcha"], true); + assert!(body["stealthConfig"].is_object()); + } + + #[test] + fn create_body_all_fields() { + let body = build_create_body(&CreateSessionOptions { + proxy_url: Some("http://proxy:8080".into()), + timeout_ms: Some(30000), + headless: Some(true), + region: Some("us-east-1".into()), + solve_captcha: true, + namespace: Some("ns".into()), + credentials: true, + ..Default::default() + }); + assert_eq!(body["proxyUrl"], "http://proxy:8080"); + assert_eq!(body["timeout"], 30000); + assert_eq!(body["headless"], true); + assert_eq!(body["region"], "us-east-1"); + assert_eq!(body["solveCaptcha"], true); + assert_eq!(body["namespace"], "ns"); + assert!(body["credentials"].is_object()); + } + + #[test] + fn create_body_trims_whitespace() { + let body = build_create_body(&CreateSessionOptions { + proxy_url: Some(" ".into()), + region: Some(" ".into()), + namespace: Some(" ".into()), + ..Default::default() + }); + // Empty strings should not appear + assert!(body.get("proxyUrl").is_none()); + assert!(body.get("region").is_none()); + assert!(body.get("namespace").is_none()); + } + + // --- Integration tests with wiremock --- + + use wiremock::{Mock, MockServer, ResponseTemplate}; + use wiremock::matchers::{method, path, header}; + use crate::config::auth::AuthSource; + + fn test_auth() -> Auth { + Auth { + api_key: Some("test-key".into()), + source: AuthSource::Env, + } + } + + #[tokio::test] + async fn list_sessions_success() { + let server = MockServer::start().await; + + Mock::given(method("GET")) + .and(path("/sessions")) + .and(header("Steel-Api-Key", "test-key")) + .respond_with( + ResponseTemplate::new(200) + .set_body_json(json!([{"id": "s1", "status": "live"}])), + ) + .mount(&server) + .await; + + let client = SteelClient::new().unwrap(); + let sessions = client + .list_sessions(&server.uri(), ApiMode::Local, &test_auth()) + .await + .unwrap(); + + assert_eq!(sessions.len(), 1); + assert_eq!(sessions[0]["id"], "s1"); + } + + #[tokio::test] + async fn get_session_success() { + let server = MockServer::start().await; + + Mock::given(method("GET")) + .and(path("/sessions/s1")) + .respond_with( + ResponseTemplate::new(200).set_body_json(json!({"id": "s1", "status": "live"})), + ) + .mount(&server) + .await; + + let client = SteelClient::new().unwrap(); + let session = client + .get_session(&server.uri(), ApiMode::Local, "s1", &test_auth()) + .await + .unwrap(); + + assert_eq!(session["id"], "s1"); + } + + #[tokio::test] + async fn create_session_success() { + let server = MockServer::start().await; + + Mock::given(method("POST")) + .and(path("/sessions")) + .respond_with( + ResponseTemplate::new(200) + .set_body_json(json!({"id": "new-sess", "status": "live"})), + ) + .mount(&server) + .await; + + let client = SteelClient::new().unwrap(); + let session = client + .create_session( + &server.uri(), + ApiMode::Local, + &CreateSessionOptions::default(), + &test_auth(), + ) + .await + .unwrap(); + + assert_eq!(session["id"], "new-sess"); + } + + #[tokio::test] + async fn release_session_success() { + let server = MockServer::start().await; + + Mock::given(method("POST")) + .and(path("/sessions/s1/release")) + .respond_with(ResponseTemplate::new(200).set_body_json(json!({}))) + .mount(&server) + .await; + + let client = SteelClient::new().unwrap(); + client + .release_session(&server.uri(), ApiMode::Local, "s1", &test_auth()) + .await + .unwrap(); + } + + #[tokio::test] + async fn api_error_extracts_message() { + let server = MockServer::start().await; + + Mock::given(method("GET")) + .and(path("/sessions")) + .respond_with( + ResponseTemplate::new(403) + .set_body_json(json!({"message": "Invalid API key"})), + ) + .mount(&server) + .await; + + let client = SteelClient::new().unwrap(); + let err = client + .list_sessions(&server.uri(), ApiMode::Local, &test_auth()) + .await + .unwrap_err(); + + let msg = err.to_string(); + assert!(msg.contains("403"), "expected 403 in: {msg}"); + assert!(msg.contains("Invalid API key"), "expected error message in: {msg}"); + } + + #[tokio::test] + async fn get_session_404_is_not_found() { + let server = MockServer::start().await; + + Mock::given(method("GET")) + .and(path("/sessions/gone")) + .respond_with(ResponseTemplate::new(404).set_body_json(json!({"message": "Not found"}))) + .mount(&server) + .await; + + let client = SteelClient::new().unwrap(); + let err = client + .get_session(&server.uri(), ApiMode::Local, "gone", &test_auth()) + .await + .unwrap_err(); + + assert!(err.is_not_found()); + } +} diff --git a/src/api/top_level.rs b/src/api/top_level.rs new file mode 100644 index 0000000..743a08a --- /dev/null +++ b/src/api/top_level.rs @@ -0,0 +1,386 @@ +//! Top-level API: scrape, screenshot, pdf. +//! Ported from: cli/source/utils/topLevelTools.ts + +use serde_json::{Value, json}; + +use crate::api::client::{ApiError, SteelClient}; +use crate::config::auth::Auth; +use crate::config::settings::ApiMode; + +/// Supported scrape output formats. +pub const SCRAPE_FORMATS: &[&str] = &["html", "readability", "cleaned_html", "markdown"]; + +/// Validate a comma-separated format string. +pub fn parse_scrape_formats(input: &str) -> Result, String> { + let formats: Vec = input + .split(',') + .map(|s| s.trim().to_string()) + .filter(|s| !s.is_empty()) + .collect(); + + if formats.is_empty() { + return Err("Missing value for --format. Example: --format html,markdown".into()); + } + + let invalid: Vec<&String> = formats + .iter() + .filter(|f| !SCRAPE_FORMATS.contains(&f.as_str())) + .collect(); + + if !invalid.is_empty() { + let invalid_str: Vec<&str> = invalid.iter().map(|s| s.as_str()).collect(); + return Err(format!( + "Invalid scrape format(s): {}. Supported: {}", + invalid_str.join(", "), + SCRAPE_FORMATS.join(", ") + )); + } + + Ok(formats) +} + +/// Extract the best text content from a scrape response. +/// Tries preferred formats first, then falls back. +/// Matches TS `getScrapeOutputText()`. +pub fn get_scrape_output_text(data: &Value, preferred: &[String]) -> Option { + let content = data.get("content")?; + + let mut keys: Vec<&str> = Vec::new(); + for f in preferred { + if !keys.contains(&f.as_str()) { + keys.push(f.as_str()); + } + } + for &fallback in &["markdown", "cleaned_html", "html", "readability"] { + if !keys.contains(&fallback) { + keys.push(fallback); + } + } + + for key in keys { + match content.get(key) { + Some(Value::String(s)) if !s.trim().is_empty() => return Some(s.clone()), + Some(v) if key == "readability" && v.is_object() => { + return Some(serde_json::to_string_pretty(v).unwrap_or_default()); + } + _ => continue, + } + } + + None +} + +/// Extract a hosted URL from a screenshot/pdf response. +pub fn get_hosted_url(data: &Value) -> Option { + data.get("url") + .and_then(|v| v.as_str()) + .filter(|s| !s.trim().is_empty()) + .map(|s| s.trim().to_string()) +} + +impl SteelClient { + pub async fn scrape( + &self, + base_url: &str, + mode: ApiMode, + auth: &Auth, + url: &str, + formats: &[String], + delay: Option, + pdf: bool, + screenshot: bool, + use_proxy: bool, + region: Option<&str>, + ) -> Result { + let mut body = json!({ + "url": url, + "format": formats, + }); + let obj = body.as_object_mut().unwrap(); + + if let Some(d) = delay { + obj.insert("delay".into(), json!(d)); + } + if pdf { + obj.insert("pdf".into(), json!(true)); + } + if screenshot { + obj.insert("screenshot".into(), json!(true)); + } + if use_proxy { + obj.insert("useProxy".into(), json!(true)); + } + if let Some(r) = region { + obj.insert("region".into(), json!(r)); + } + + self.request(base_url, mode, reqwest::Method::POST, "/scrape", Some(body), auth) + .await + } + + pub async fn screenshot( + &self, + base_url: &str, + mode: ApiMode, + auth: &Auth, + url: &str, + delay: Option, + full_page: bool, + use_proxy: bool, + region: Option<&str>, + ) -> Result { + let mut body = json!({"url": url}); + let obj = body.as_object_mut().unwrap(); + + if let Some(d) = delay { + obj.insert("delay".into(), json!(d)); + } + if full_page { + obj.insert("fullPage".into(), json!(true)); + } + if use_proxy { + obj.insert("useProxy".into(), json!(true)); + } + if let Some(r) = region { + obj.insert("region".into(), json!(r)); + } + + self.request(base_url, mode, reqwest::Method::POST, "/screenshot", Some(body), auth) + .await + } + + pub async fn pdf( + &self, + base_url: &str, + mode: ApiMode, + auth: &Auth, + url: &str, + delay: Option, + use_proxy: bool, + region: Option<&str>, + ) -> Result { + let mut body = json!({"url": url}); + let obj = body.as_object_mut().unwrap(); + + if let Some(d) = delay { + obj.insert("delay".into(), json!(d)); + } + if use_proxy { + obj.insert("useProxy".into(), json!(true)); + } + if let Some(r) = region { + obj.insert("region".into(), json!(r)); + } + + self.request(base_url, mode, reqwest::Method::POST, "/pdf", Some(body), auth) + .await + } +} + +#[cfg(test)] +mod tests { + use super::*; + + // --- parse_scrape_formats --- + + #[test] + fn parse_formats_valid() { + let result = parse_scrape_formats("html,markdown").unwrap(); + assert_eq!(result, vec!["html", "markdown"]); + } + + #[test] + fn parse_formats_single() { + let result = parse_scrape_formats("markdown").unwrap(); + assert_eq!(result, vec!["markdown"]); + } + + #[test] + fn parse_formats_with_spaces() { + let result = parse_scrape_formats(" html , cleaned_html ").unwrap(); + assert_eq!(result, vec!["html", "cleaned_html"]); + } + + #[test] + fn parse_formats_invalid() { + let err = parse_scrape_formats("html,xml").unwrap_err(); + assert!(err.contains("xml")); + } + + #[test] + fn parse_formats_empty() { + let err = parse_scrape_formats("").unwrap_err(); + assert!(err.contains("Missing value")); + } + + // --- get_scrape_output_text --- + + #[test] + fn output_text_preferred_format() { + let data = json!({ + "content": { + "html": "

Hello

", + "markdown": "# Hello" + } + }); + + let text = + get_scrape_output_text(&data, &["html".into()]).unwrap(); + assert_eq!(text, "

Hello

"); + } + + #[test] + fn output_text_falls_back_to_markdown() { + let data = json!({ + "content": { + "markdown": "# Hello" + } + }); + + let text = get_scrape_output_text(&data, &[]).unwrap(); + assert_eq!(text, "# Hello"); + } + + #[test] + fn output_text_readability_object() { + let data = json!({ + "content": { + "readability": {"title": "Hello", "content": "world"} + } + }); + + let text = get_scrape_output_text(&data, &["readability".into()]).unwrap(); + assert!(text.contains("Hello")); + } + + #[test] + fn output_text_empty_content_returns_none() { + let data = json!({"content": {"markdown": " "}}); + assert!(get_scrape_output_text(&data, &[]).is_none()); + } + + #[test] + fn output_text_no_content_returns_none() { + let data = json!({"url": "http://example.com"}); + assert!(get_scrape_output_text(&data, &[]).is_none()); + } + + // --- get_hosted_url --- + + #[test] + fn hosted_url_present() { + let data = json!({"url": "https://cdn.steel.dev/abc.png"}); + assert_eq!( + get_hosted_url(&data).as_deref(), + Some("https://cdn.steel.dev/abc.png") + ); + } + + #[test] + fn hosted_url_empty() { + let data = json!({"url": " "}); + assert!(get_hosted_url(&data).is_none()); + } + + #[test] + fn hosted_url_missing() { + let data = json!({"status": "ok"}); + assert!(get_hosted_url(&data).is_none()); + } + + // --- Integration tests with wiremock --- + + use wiremock::{Mock, MockServer, ResponseTemplate}; + use wiremock::matchers::{method, path}; + use crate::config::auth::AuthSource; + + fn test_auth() -> Auth { + Auth { + api_key: Some("test-key".into()), + source: AuthSource::Env, + } + } + + #[tokio::test] + async fn scrape_success() { + let server = MockServer::start().await; + + Mock::given(method("POST")) + .and(path("/scrape")) + .respond_with(ResponseTemplate::new(200).set_body_json(json!({ + "content": {"markdown": "# Hello"} + }))) + .mount(&server) + .await; + + let client = SteelClient::new().unwrap(); + let data = client + .scrape( + &server.uri(), + ApiMode::Local, + &test_auth(), + "https://example.com", + &["markdown".into()], + None, + false, + false, + false, + None, + ) + .await + .unwrap(); + + let text = get_scrape_output_text(&data, &["markdown".into()]).unwrap(); + assert_eq!(text, "# Hello"); + } + + #[tokio::test] + async fn screenshot_success() { + let server = MockServer::start().await; + + Mock::given(method("POST")) + .and(path("/screenshot")) + .respond_with( + ResponseTemplate::new(200) + .set_body_json(json!({"url": "https://cdn.steel.dev/shot.png"})), + ) + .mount(&server) + .await; + + let client = SteelClient::new().unwrap(); + let data = client + .screenshot(&server.uri(), ApiMode::Local, &test_auth(), "https://example.com", None, false, false, None) + .await + .unwrap(); + + assert_eq!( + get_hosted_url(&data).as_deref(), + Some("https://cdn.steel.dev/shot.png") + ); + } + + #[tokio::test] + async fn pdf_success() { + let server = MockServer::start().await; + + Mock::given(method("POST")) + .and(path("/pdf")) + .respond_with( + ResponseTemplate::new(200) + .set_body_json(json!({"url": "https://cdn.steel.dev/doc.pdf"})), + ) + .mount(&server) + .await; + + let client = SteelClient::new().unwrap(); + let data = client + .pdf(&server.uri(), ApiMode::Local, &test_auth(), "https://example.com", None, false, None) + .await + .unwrap(); + + assert_eq!( + get_hosted_url(&data).as_deref(), + Some("https://cdn.steel.dev/doc.pdf") + ); + } +} diff --git a/src/browser/lifecycle.rs b/src/browser/lifecycle.rs new file mode 100644 index 0000000..2ace4e2 --- /dev/null +++ b/src/browser/lifecycle.rs @@ -0,0 +1,874 @@ +//! Browser session lifecycle orchestration. +//! Combines API client + session state to implement high-level browser operations. +//! Ported from: cli/source/utils/browser/lifecycle.ts + session-policy.ts + +use serde_json::Value; + +use crate::api::client::{ApiError, SteelClient}; +use crate::api::session::CreateSessionOptions; +use crate::config::auth::Auth; +use crate::config::session_state::{SessionMode, SessionState, SessionStatePaths, read_state, with_lock}; +use crate::config::settings::ApiMode; + +/// Summary of a browser session, matching TS `BrowserSessionSummary`. +#[derive(Debug)] +pub struct SessionSummary { + pub id: String, + pub mode: SessionMode, + pub name: Option, + pub live: bool, + pub status: Option, + pub connect_url: Option, + pub viewer_url: Option, +} + +/// Result of stopping browser sessions. +pub struct StopResult { + pub mode: SessionMode, + pub all: bool, + pub stopped_session_ids: Vec, +} + +/// Result of solving a CAPTCHA. +pub struct CaptchaSolveResult { + pub mode: SessionMode, + pub session_id: String, + pub success: bool, + pub message: Option, + pub raw: Value, +} + +/// Result of checking CAPTCHA status. +pub struct CaptchaStatusResult { + pub mode: SessionMode, + pub session_id: String, + pub status: String, + pub types: Vec, + pub raw: Value, +} + +const CLOSED_SESSION_STATUSES: &[&str] = &[ + "closed", + "completed", + "ended", + "failed", + "released", + "stopped", + "terminated", +]; + +/// Map `SessionMode` to `ApiMode`. +pub fn session_mode_to_api_mode(mode: SessionMode) -> ApiMode { + match mode { + SessionMode::Cloud => ApiMode::Cloud, + SessionMode::Local => ApiMode::Local, + } +} + +/// Map `ApiMode` to `SessionMode`. +pub fn api_mode_to_session_mode(mode: ApiMode) -> SessionMode { + match mode { + ApiMode::Cloud => SessionMode::Cloud, + ApiMode::Local => SessionMode::Local, + } +} + +/// Resolve session mode from options and active state. +/// Matches TS `resolveSessionMode()`. +pub fn resolve_session_mode( + local: bool, + api_url: Option<&str>, + active_mode: Option, +) -> SessionMode { + if local { + return SessionMode::Local; + } + + if let Some(url) = api_url { + // If URL points to the cloud API, use cloud mode + let default_api = crate::config::DEFAULT_API_URL.to_lowercase(); + if url.to_lowercase().contains(&default_api) || url.contains("api.steel.dev") { + return SessionMode::Cloud; + } + return SessionMode::Local; + } + + active_mode.unwrap_or(SessionMode::Cloud) +} + +/// Extract session ID from API response. Matches TS `getSessionId()`. +pub fn get_session_id(session: &Value) -> Option { + session + .get("id") + .or_else(|| session.get("sessionId")) + .and_then(|v| v.as_str()) + .filter(|s| !s.trim().is_empty()) + .map(|s| s.trim().to_string()) +} + +/// Check if session is live. Matches TS `isSessionLive()`. +pub fn is_session_live(session: &Value) -> bool { + let live_keys = ["isLive", "live", "active"]; + for key in &live_keys { + if let Some(v) = session.get(key) { + if let Some(b) = v.as_bool() { + return b; + } + } + } + + if let Some(ended) = session.get("endedAt") { + if let Some(s) = ended.as_str() { + if !s.trim().is_empty() { + return false; + } + } + } + + if let Some(status) = get_session_status(session) { + return !CLOSED_SESSION_STATUSES.contains(&status.to_lowercase().as_str()); + } + + true +} + +fn get_session_status(session: &Value) -> Option { + session + .get("status") + .and_then(|v| v.as_str()) + .filter(|s| !s.trim().is_empty()) + .map(|s| s.trim().to_string()) +} + +fn get_connect_url(session: &Value) -> Option { + let keys = [ + "websocketUrl", + "wsUrl", + "connectUrl", + "cdpUrl", + "browserWSEndpoint", + "wsEndpoint", + ]; + for key in &keys { + if let Some(v) = session.get(key) { + if let Some(s) = v.as_str() { + let trimmed = s.trim(); + if !trimmed.is_empty() { + return Some(trimmed.to_string()); + } + } + } + } + None +} + +fn get_viewer_url(session: &Value, mode: SessionMode, session_id: &str) -> Option { + let keys = ["sessionViewerUrl", "viewerUrl", "liveViewUrl"]; + for key in &keys { + if let Some(v) = session.get(key) { + if let Some(s) = v.as_str() { + let trimmed = s.trim(); + if !trimmed.is_empty() { + return Some(trimmed.to_string()); + } + } + } + } + + if mode == SessionMode::Cloud { + return Some(format!("https://app.steel.dev/sessions/{session_id}")); + } + + None +} + +/// Build session summary from API response. Matches TS `toSessionSummary()`. +pub fn to_session_summary( + session: &Value, + mode: SessionMode, + name: Option<&str>, + auth: &Auth, +) -> anyhow::Result { + let session_id = get_session_id(session) + .ok_or_else(|| anyhow::anyhow!("Session response did not contain an id."))?; + + let mut connect_url = get_connect_url(session); + + // Fallback: build connect URL for cloud mode + if connect_url.is_none() && mode == SessionMode::Cloud { + if let Some(ref api_key) = auth.api_key { + connect_url = Some(format!( + "wss://connect.steel.dev?apiKey={api_key}&sessionId={session_id}" + )); + } + } + + // Inject apiKey into connect URL for cloud mode + if let Some(ref url) = connect_url { + if mode == SessionMode::Cloud { + if let Some(ref api_key) = auth.api_key { + if !url.contains("apiKey=") { + if let Ok(mut parsed) = url::Url::parse(url) { + parsed.query_pairs_mut().append_pair("apiKey", api_key); + connect_url = Some(parsed.to_string()); + } + } + } + } + } + + Ok(SessionSummary { + id: session_id.clone(), + mode, + name: name.map(|s| s.to_string()), + live: is_session_live(session), + status: get_session_status(session), + connect_url, + viewer_url: get_viewer_url(session, mode, &session_id), + }) +} + +/// Try to get a live session, returning None if not found or not live. +async fn try_get_live_session( + client: &SteelClient, + base_url: &str, + mode: ApiMode, + session_id: &str, + auth: &Auth, +) -> Result, ApiError> { + match client.get_session(base_url, mode, session_id, auth).await { + Ok(session) => { + if is_session_live(&session) { + Ok(Some(session)) + } else { + Ok(None) + } + } + Err(e) if e.is_not_found() => Ok(None), + Err(e) => Err(e), + } +} + +/// Resolve target session from state (for stop/live/captcha commands). +fn resolve_target_session( + state: &SessionState, + mode: SessionMode, + session_name: Option<&str>, +) -> (Option, Option) { + if let Some(name) = session_name { + let name = name.trim(); + if !name.is_empty() { + let session_id = state + .named_sessions + .get(mode) + .get(name) + .cloned(); + return (session_id, Some(name.to_string())); + } + } + + if state.active_session_mode == Some(mode) { + if let Some(ref id) = state.active_session_id { + return (Some(id.clone()), state.active_session_name.clone()); + } + } + + (None, None) +} + +/// Resolve session ID for captcha commands (supports explicit --session-id). +fn resolve_captcha_session_id( + state: &SessionState, + mode: SessionMode, + session_id: Option<&str>, + session_name: Option<&str>, +) -> Option { + if let Some(id) = session_id { + let trimmed = id.trim(); + if !trimmed.is_empty() { + return Some(trimmed.to_string()); + } + } + + let (id, _) = resolve_target_session(state, mode, session_name); + id +} + +/// Start a browser session. Matches TS `startBrowserSession()`. +pub async fn start_session( + client: &SteelClient, + base_url: &str, + api_mode: ApiMode, + auth: &Auth, + paths: &SessionStatePaths, + session_name: Option<&str>, + options: &CreateSessionOptions, +) -> anyhow::Result { + let mode = api_mode_to_session_mode(api_mode); + let session_name = session_name.map(|s| s.trim()).filter(|s| !s.is_empty()); + + loop { + // Check for existing candidate + let candidate_id = with_lock(paths, false, |state| { + state + .resolve_candidate(mode, session_name) + .map(|s| s.to_string()) + })?; + + if let Some(ref candidate_id) = candidate_id { + // Try to attach to existing session + let existing = try_get_live_session(client, base_url, api_mode, candidate_id, auth) + .await + .map_err(|e| anyhow::anyhow!("{e}"))?; + + if let Some(ref session) = existing { + // Claim the session under lock + let claimed = with_lock(paths, true, |state| { + let latest = state + .resolve_candidate(mode, session_name) + .map(|s| s.to_string()); + if latest.as_deref() != Some(candidate_id) { + return false; + } + state.set_active(mode, candidate_id, session_name); + true + })?; + + if claimed { + return to_session_summary(session, mode, session_name, auth); + } + continue; + } + + // Dead session — clear and retry + with_lock(paths, true, |state| { + let latest = state + .resolve_candidate(mode, session_name) + .map(|s| s.to_string()); + if latest.as_deref() == Some(candidate_id) { + state.clear_active(mode, candidate_id); + } + })?; + continue; + } + + // No candidate — create new session + let created = client + .create_session(base_url, api_mode, options, auth) + .await + .map_err(|e| anyhow::anyhow!("{e}"))?; + + let created_id = get_session_id(&created) + .ok_or_else(|| anyhow::anyhow!("API did not return a session id."))?; + + // Claim the created session under lock + let claimed = with_lock(paths, true, |state| { + let latest = state + .resolve_candidate(mode, session_name) + .map(|s| s.to_string()); + if latest.is_some() { + return false; + } + + if let Some(name) = session_name { + state.named_sessions.get_mut(mode).insert(name.to_string(), created_id.clone()); + } + state.set_active(mode, &created_id, session_name); + true + })?; + + if claimed { + return to_session_summary(&created, mode, session_name, auth); + } + + // Race: another session appeared — release ours and retry + let _ = client + .release_session(base_url, api_mode, &created_id, auth) + .await; + } +} + +/// Stop browser sessions. Matches TS `stopBrowserSession()`. +pub async fn stop_session( + client: &SteelClient, + base_url: &str, + api_mode: ApiMode, + auth: &Auth, + paths: &SessionStatePaths, + session_name: Option<&str>, + all: bool, +) -> anyhow::Result { + let mode = api_mode_to_session_mode(api_mode); + + if all { + let sessions = client + .list_sessions(base_url, api_mode, auth) + .await + .map_err(|e| anyhow::anyhow!("{e}"))?; + + let live_ids: Vec = sessions + .iter() + .filter(|s| is_session_live(s)) + .filter_map(|s| get_session_id(s)) + .collect(); + + for id in &live_ids { + let _ = client.release_session(base_url, api_mode, id, auth).await; + } + + with_lock(paths, true, |state| { + for id in &live_ids { + state.clear_active(mode, id); + } + })?; + + return Ok(StopResult { + mode, + all: true, + stopped_session_ids: live_ids, + }); + } + + let target_id = with_lock(paths, false, |state| { + let (id, _) = resolve_target_session(state, mode, session_name); + id + })?; + + let Some(target_id) = target_id else { + return Ok(StopResult { + mode, + all: false, + stopped_session_ids: vec![], + }); + }; + + client + .release_session(base_url, api_mode, &target_id, auth) + .await + .map_err(|e| anyhow::anyhow!("{e}"))?; + + with_lock(paths, true, |state| { + state.clear_active(mode, &target_id); + })?; + + Ok(StopResult { + mode, + all: false, + stopped_session_ids: vec![target_id], + }) +} + +/// List browser sessions with names resolved from state. +pub async fn list_sessions( + client: &SteelClient, + base_url: &str, + api_mode: ApiMode, + auth: &Auth, + paths: &SessionStatePaths, +) -> anyhow::Result> { + let mode = api_mode_to_session_mode(api_mode); + let sessions = client + .list_sessions(base_url, api_mode, auth) + .await + .map_err(|e| anyhow::anyhow!("{e}"))?; + + let state = read_state(&paths.state_path); + + let mut summaries = Vec::new(); + for session in &sessions { + let id = get_session_id(session); + let name = id + .as_deref() + .and_then(|id| state.resolve_name(mode, id)) + .map(|s| s.to_string()); + let summary = to_session_summary(session, mode, name.as_deref(), auth)?; + summaries.push(summary); + } + + Ok(summaries) +} + +/// Get the live URL for the active session. +pub async fn get_live_url( + client: &SteelClient, + base_url: &str, + api_mode: ApiMode, + auth: &Auth, + paths: &SessionStatePaths, + session_name: Option<&str>, +) -> anyhow::Result> { + let mode = api_mode_to_session_mode(api_mode); + let target_id = with_lock(paths, false, |state| { + let (id, _) = resolve_target_session(state, mode, session_name); + id + })?; + + let Some(target_id) = target_id else { + return Ok(None); + }; + + let session = try_get_live_session(client, base_url, api_mode, &target_id, auth) + .await + .map_err(|e| anyhow::anyhow!("{e}"))?; + + let Some(session) = session else { + return Ok(None); + }; + + let summary = to_session_summary(&session, mode, None, auth)?; + Ok(summary.viewer_url) +} + +/// Solve a CAPTCHA for a browser session. +pub async fn solve_captcha( + client: &SteelClient, + base_url: &str, + api_mode: ApiMode, + auth: &Auth, + paths: &SessionStatePaths, + explicit_session_id: Option<&str>, + session_name: Option<&str>, + page_id: Option<&str>, + url: Option<&str>, + task_id: Option<&str>, +) -> anyhow::Result { + let mode = api_mode_to_session_mode(api_mode); + + let session_id = with_lock(paths, false, |state| { + resolve_captcha_session_id(state, mode, explicit_session_id, session_name) + })?; + + let session_id = session_id.ok_or_else(|| { + anyhow::anyhow!( + "No target browser session found for CAPTCHA solving. \ + Pass `--session-id`, pass `--session `, or start a session first." + ) + })?; + + let raw = client + .solve_captcha(base_url, api_mode, &session_id, page_id, url, task_id, auth) + .await + .map_err(|e| anyhow::anyhow!("{e}"))?; + + let success = raw.get("success").and_then(|v| v.as_bool()).unwrap_or(false); + let message = raw + .get("message") + .and_then(|v| v.as_str()) + .map(|s| s.to_string()); + + Ok(CaptchaSolveResult { + mode, + session_id, + success, + message, + raw, + }) +} + +/// Get CAPTCHA status for a browser session. +pub async fn captcha_status( + client: &SteelClient, + base_url: &str, + api_mode: ApiMode, + auth: &Auth, + paths: &SessionStatePaths, + explicit_session_id: Option<&str>, + session_name: Option<&str>, + page_id: Option<&str>, + wait: bool, + timeout_ms: Option, + interval_ms: Option, +) -> anyhow::Result { + let mode = api_mode_to_session_mode(api_mode); + let timeout = timeout_ms.unwrap_or(60_000); + let interval = interval_ms.unwrap_or(1_000); + + let session_id = with_lock(paths, false, |state| { + resolve_captcha_session_id(state, mode, explicit_session_id, session_name) + })?; + + let session_id = session_id.ok_or_else(|| { + anyhow::anyhow!( + "No target browser session found for CAPTCHA status. \ + Pass `--session-id`, pass `--session `, or start a session first." + ) + })?; + + let start = std::time::Instant::now(); + + loop { + let pages = client + .captcha_status(base_url, api_mode, &session_id, page_id, auth) + .await + .map_err(|e| anyhow::anyhow!("{e}"))?; + + let (status, types) = normalize_captcha_status(&pages); + + if !wait || is_terminal_captcha_status(&status) { + return Ok(CaptchaStatusResult { + mode, + session_id, + status, + types, + raw: serde_json::json!({"pages": pages}), + }); + } + + if start.elapsed().as_millis() as u64 >= timeout { + anyhow::bail!( + "CAPTCHA status polling timed out after {timeout}ms. Last status: {status}" + ); + } + + tokio::time::sleep(std::time::Duration::from_millis(interval)).await; + } +} + +const KNOWN_CAPTCHA_TYPES: &[&str] = &[ + "recaptchaV2", + "recaptchaV3", + "turnstile", + "image_to_text", +]; + +fn normalize_captcha_status(pages: &[Value]) -> (String, Vec) { + if pages.is_empty() { + return ("none".to_string(), vec![]); + } + + let mut all_tasks: Vec<&Value> = Vec::new(); + let mut any_solving = false; + + for page in pages { + if page.get("isSolvingCaptcha").and_then(|v| v.as_bool()) == Some(true) { + any_solving = true; + } + + if let Some(tasks) = page.get("tasks").and_then(|v| v.as_array()) { + for task in tasks { + if task.is_object() { + all_tasks.push(task); + } + } + } + } + + if all_tasks.is_empty() { + let status = if any_solving { "solving" } else { "none" }; + return (status.to_string(), vec![]); + } + + let mut solving_types: Vec = Vec::new(); + let mut failed_types: Vec = Vec::new(); + let mut has_solving = false; + let mut has_failed = false; + let mut has_solved = false; + + for task in &all_tasks { + let task_status = task.get("status").and_then(|v| v.as_str()).unwrap_or(""); + let task_type = task.get("type").and_then(|v| v.as_str()).unwrap_or(""); + let is_known = KNOWN_CAPTCHA_TYPES.contains(&task_type); + + match task_status { + "solving" | "detected" | "validating" => { + has_solving = true; + if is_known && !solving_types.contains(&task_type.to_string()) { + solving_types.push(task_type.to_string()); + } + } + "failed_to_solve" | "failed_to_detect" | "validation_failed" => { + has_failed = true; + if is_known && !failed_types.contains(&task_type.to_string()) { + failed_types.push(task_type.to_string()); + } + } + "solved" => { + has_solved = true; + } + _ => {} + } + } + + if has_solving || any_solving { + return ("solving".to_string(), solving_types); + } + + if has_failed { + return ("failed".to_string(), failed_types); + } + + if has_solved { + return ("solved".to_string(), vec![]); + } + + ("none".to_string(), vec![]) +} + +fn is_terminal_captcha_status(status: &str) -> bool { + matches!(status, "solved" | "failed" | "none") +} + +/// Sanitize connect URL for display (mask API key). +pub fn sanitize_connect_url(url: &str) -> String { + if let Ok(mut parsed) = url::Url::parse(url) { + let pairs: Vec<(String, String)> = parsed + .query_pairs() + .map(|(k, v)| { + if k == "apiKey" && v.len() > 7 { + (k.to_string(), format!("{}...", &v[..7])) + } else { + (k.to_string(), v.to_string()) + } + }) + .collect(); + + if !pairs.is_empty() { + parsed.query_pairs_mut().clear(); + for (k, v) in &pairs { + parsed.query_pairs_mut().append_pair(k, v); + } + } + + parsed.to_string() + } else { + url.to_string() + } +} + +#[cfg(test)] +mod tests { + use super::*; + use serde_json::json; + + #[test] + fn get_session_id_from_id() { + let s = json!({"id": "s1"}); + assert_eq!(get_session_id(&s).as_deref(), Some("s1")); + } + + #[test] + fn get_session_id_from_session_id() { + let s = json!({"sessionId": "s2"}); + assert_eq!(get_session_id(&s).as_deref(), Some("s2")); + } + + #[test] + fn get_session_id_empty() { + let s = json!({"id": " "}); + assert_eq!(get_session_id(&s), None); + } + + #[test] + fn session_live_by_flag() { + assert!(is_session_live(&json!({"isLive": true}))); + assert!(!is_session_live(&json!({"isLive": false}))); + } + + #[test] + fn session_live_by_status() { + assert!(is_session_live(&json!({"status": "running"}))); + assert!(!is_session_live(&json!({"status": "released"}))); + assert!(!is_session_live(&json!({"status": "terminated"}))); + } + + #[test] + fn session_live_ended_at() { + assert!(!is_session_live(&json!({"endedAt": "2025-01-01"}))); + } + + #[test] + fn session_live_default() { + assert!(is_session_live(&json!({"id": "s1"}))); + } + + #[test] + fn viewer_url_cloud_fallback() { + let url = get_viewer_url(&json!({}), SessionMode::Cloud, "s1"); + assert_eq!(url.as_deref(), Some("https://app.steel.dev/sessions/s1")); + } + + #[test] + fn viewer_url_local_none() { + let url = get_viewer_url(&json!({}), SessionMode::Local, "s1"); + assert_eq!(url, None); + } + + #[test] + fn viewer_url_from_response() { + let url = get_viewer_url( + &json!({"sessionViewerUrl": "https://custom.dev/view"}), + SessionMode::Local, + "s1", + ); + assert_eq!(url.as_deref(), Some("https://custom.dev/view")); + } + + #[test] + fn connect_url_from_response() { + let url = get_connect_url(&json!({"websocketUrl": "wss://foo.dev/ws"})); + assert_eq!(url.as_deref(), Some("wss://foo.dev/ws")); + } + + #[test] + fn sanitize_masks_api_key() { + let url = "wss://connect.steel.dev?apiKey=sk-12345678&sessionId=s1"; + let sanitized = sanitize_connect_url(url); + assert!(sanitized.contains("sk-1234...")); + assert!(sanitized.contains("sessionId=s1")); + } + + #[test] + fn normalize_captcha_none() { + let (status, types) = normalize_captcha_status(&[]); + assert_eq!(status, "none"); + assert!(types.is_empty()); + } + + #[test] + fn normalize_captcha_solving() { + let pages = vec![json!({ + "isSolvingCaptcha": true, + "tasks": [{"status": "solving", "type": "turnstile"}] + })]; + let (status, types) = normalize_captcha_status(&pages); + assert_eq!(status, "solving"); + assert_eq!(types, vec!["turnstile"]); + } + + #[test] + fn normalize_captcha_solved() { + let pages = vec![json!({ + "tasks": [{"status": "solved", "type": "recaptchaV2"}] + })]; + let (status, _types) = normalize_captcha_status(&pages); + assert_eq!(status, "solved"); + } + + #[test] + fn normalize_captcha_failed() { + let pages = vec![json!({ + "tasks": [{"status": "failed_to_solve", "type": "turnstile"}] + })]; + let (status, types) = normalize_captcha_status(&pages); + assert_eq!(status, "failed"); + assert_eq!(types, vec!["turnstile"]); + } + + #[test] + fn resolve_mode_local_flag() { + assert_eq!(resolve_session_mode(true, None, None), SessionMode::Local); + } + + #[test] + fn resolve_mode_default_cloud() { + assert_eq!(resolve_session_mode(false, None, None), SessionMode::Cloud); + } + + #[test] + fn resolve_mode_active_state() { + assert_eq!( + resolve_session_mode(false, None, Some(SessionMode::Local)), + SessionMode::Local + ); + } +} diff --git a/src/browser/mod.rs b/src/browser/mod.rs new file mode 100644 index 0000000..0673413 --- /dev/null +++ b/src/browser/mod.rs @@ -0,0 +1,4 @@ +pub mod lifecycle; +pub mod passthrough; +pub mod routing; +pub mod runtime; diff --git a/src/browser/passthrough.rs b/src/browser/passthrough.rs new file mode 100644 index 0000000..0a7d492 --- /dev/null +++ b/src/browser/passthrough.rs @@ -0,0 +1,2 @@ +// Browser passthrough: spawn agent-browser subprocess +// Ported from: cli/source/utils/browser/adapter.ts diff --git a/src/browser/routing.rs b/src/browser/routing.rs new file mode 100644 index 0000000..a203428 --- /dev/null +++ b/src/browser/routing.rs @@ -0,0 +1,2 @@ +// Browser command routing: native vs passthrough +// Ported from: cli/source/utils/browser/routing.ts diff --git a/src/browser/runtime.rs b/src/browser/runtime.rs new file mode 100644 index 0000000..e1c82dd --- /dev/null +++ b/src/browser/runtime.rs @@ -0,0 +1,2 @@ +// Vendored runtime resolution: manifest-based binary discovery +// Ported from: cli/source/utils/browser/runtime.ts diff --git a/src/commands/browser/captcha.rs b/src/commands/browser/captcha.rs new file mode 100644 index 0000000..44a2190 --- /dev/null +++ b/src/commands/browser/captcha.rs @@ -0,0 +1,182 @@ +use clap::{Parser, Subcommand}; + +use crate::api::client::SteelClient; +use crate::browser::lifecycle; +use crate::config::auth; +use crate::config::session_state::SessionStatePaths; +use crate::config::settings::{ApiMode, EnvVars}; + +#[derive(Subcommand)] +pub enum Command { + /// Solve a CAPTCHA on the current page + Solve(SolveArgs), + + /// Check CAPTCHA status + Status(StatusArgs), +} + +#[derive(Parser)] +pub struct SolveArgs { + /// Session name + #[arg(short, long)] + pub session: Option, + + /// Session ID + #[arg(long)] + pub session_id: Option, + + /// Page ID + #[arg(long)] + pub page_id: Option, + + /// Page URL for targeted CAPTCHA solving + #[arg(long)] + pub url: Option, + + /// CAPTCHA task ID for targeted solving + #[arg(long)] + pub task_id: Option, + + /// Print full raw API payload + #[arg(long)] + pub raw: bool, + + /// Use local runtime + #[arg(short, long)] + pub local: bool, + + /// Explicit self-hosted API endpoint URL + #[arg(long)] + pub api_url: Option, +} + +#[derive(Parser)] +pub struct StatusArgs { + /// Session name + #[arg(short, long)] + pub session: Option, + + /// Session ID + #[arg(long)] + pub session_id: Option, + + /// Page ID + #[arg(long)] + pub page_id: Option, + + /// Wait for terminal status + #[arg(short, long)] + pub wait: bool, + + /// Timeout in milliseconds for --wait mode + #[arg(long)] + pub timeout: Option, + + /// Poll interval in milliseconds for --wait mode + #[arg(long)] + pub interval: Option, + + /// Print full raw API payload + #[arg(long)] + pub raw: bool, + + /// Use local runtime + #[arg(short, long)] + pub local: bool, + + /// Explicit self-hosted API endpoint URL + #[arg(long)] + pub api_url: Option, +} + +fn resolve_common(local: bool, api_url: Option<&str>) -> (ApiMode, auth::Auth, String) { + let mode = ApiMode::resolve(local, api_url); + let auth = auth::resolve_auth(); + let env_vars = EnvVars::from_env(); + let config = crate::config::settings::read_config().ok(); + let local_config_url = config.as_ref().and_then(|c| c.local_api_url()); + let base_url = mode.resolve_base_url(api_url, &env_vars, local_config_url); + (mode, auth, base_url) +} + +pub async fn run(command: Command) -> anyhow::Result<()> { + match command { + Command::Solve(args) => run_solve(args).await, + Command::Status(args) => run_status(args).await, + } +} + +async fn run_solve(args: SolveArgs) -> anyhow::Result<()> { + let (mode, auth, base_url) = resolve_common(args.local, args.api_url.as_deref()); + let client = SteelClient::new()?; + let paths = SessionStatePaths::default_paths(); + + let result = lifecycle::solve_captcha( + &client, + &base_url, + mode, + &auth, + &paths, + args.session_id.as_deref(), + args.session.as_deref(), + args.page_id.as_deref(), + args.url.as_deref(), + args.task_id.as_deref(), + ) + .await?; + + println!("session_id: {}", result.session_id); + println!("mode: {:?}", result.mode); + println!("success: {}", result.success); + if let Some(ref msg) = result.message { + println!("message: {msg}"); + } + + if args.raw { + println!("{}", serde_json::to_string_pretty(&result.raw)?); + } + + if !result.success { + std::process::exit(1); + } + + Ok(()) +} + +async fn run_status(args: StatusArgs) -> anyhow::Result<()> { + let (mode, auth, base_url) = resolve_common(args.local, args.api_url.as_deref()); + let client = SteelClient::new()?; + let paths = SessionStatePaths::default_paths(); + + let result = lifecycle::captcha_status( + &client, + &base_url, + mode, + &auth, + &paths, + args.session_id.as_deref(), + args.session.as_deref(), + args.page_id.as_deref(), + args.wait, + args.timeout, + args.interval, + ) + .await?; + + if args.raw { + println!("{}", serde_json::to_string_pretty(&result.raw)?); + } else { + let type_suffix = if result.types.is_empty() { + String::new() + } else { + format!(" {}", result.types.join(",")) + }; + println!("{}{type_suffix}", result.status); + } + + if result.status != "solved" && result.status != "none" { + std::process::exit(1); + } + + Ok(()) +} diff --git a/src/commands/browser/live.rs b/src/commands/browser/live.rs new file mode 100644 index 0000000..4b88d17 --- /dev/null +++ b/src/commands/browser/live.rs @@ -0,0 +1,60 @@ +use clap::Parser; + +use crate::api::client::SteelClient; +use crate::browser::lifecycle::get_live_url; +use crate::config::auth; +use crate::config::session_state::SessionStatePaths; +use crate::config::settings::{ApiMode, EnvVars}; + +#[derive(Parser)] +pub struct Args { + /// Named session + #[arg(short, long)] + pub session: Option, + + /// Use local runtime + #[arg(short, long)] + pub local: bool, + + /// Explicit self-hosted API endpoint URL + #[arg(long)] + pub api_url: Option, +} + +pub async fn run(args: Args) -> anyhow::Result<()> { + let mode = ApiMode::resolve(args.local, args.api_url.as_deref()); + let auth = auth::resolve_auth(); + let env_vars = EnvVars::from_env(); + let config = crate::config::settings::read_config().ok(); + let local_config_url = config.as_ref().and_then(|c| c.local_api_url()); + let base_url = mode.resolve_base_url(args.api_url.as_deref(), &env_vars, local_config_url); + + let client = SteelClient::new()?; + let paths = SessionStatePaths::default_paths(); + + let live_url = get_live_url( + &client, + &base_url, + mode, + &auth, + &paths, + args.session.as_deref(), + ) + .await?; + + match live_url { + Some(url) => println!("{url}"), + None => { + let msg = match args.session.as_deref() { + Some(name) => format!( + "No live session found for \"{name}\". \ + Start one with `steel browser start --session {name}`." + ), + None => "No active live session found. Start one with `steel browser start`.".to_string(), + }; + anyhow::bail!("{msg}"); + } + } + + Ok(()) +} diff --git a/src/commands/browser/mod.rs b/src/commands/browser/mod.rs new file mode 100644 index 0000000..00ec5fc --- /dev/null +++ b/src/commands/browser/mod.rs @@ -0,0 +1,38 @@ +pub mod captcha; +pub mod live; +pub mod sessions; +pub mod start; +pub mod stop; + +use clap::Subcommand; + +#[derive(Subcommand)] +pub enum Command { + /// Create or attach to a browser session + Start(start::Args), + + /// Stop a browser session + Stop(stop::Args), + + /// List active browser sessions + Sessions(sessions::Args), + + /// Open the live session viewer + Live(live::Args), + + /// CAPTCHA management + Captcha { + #[command(subcommand)] + command: captcha::Command, + }, +} + +pub async fn run(command: Command) -> anyhow::Result<()> { + match command { + Command::Start(args) => start::run(args).await, + Command::Stop(args) => stop::run(args).await, + Command::Sessions(args) => sessions::run(args).await, + Command::Live(args) => live::run(args).await, + Command::Captcha { command } => captcha::run(command).await, + } +} diff --git a/src/commands/browser/sessions.rs b/src/commands/browser/sessions.rs new file mode 100644 index 0000000..ad0c1c8 --- /dev/null +++ b/src/commands/browser/sessions.rs @@ -0,0 +1,71 @@ +use clap::Parser; + +use crate::api::client::SteelClient; +use crate::browser::lifecycle::list_sessions; +use crate::config::auth; +use crate::config::session_state::SessionStatePaths; +use crate::config::settings::{ApiMode, EnvVars}; + +#[derive(Parser)] +pub struct Args { + /// Use local runtime + #[arg(short, long)] + pub local: bool, + + /// Explicit self-hosted API endpoint URL + #[arg(long)] + pub api_url: Option, + + /// Include full raw API payload for each session + #[arg(long)] + pub raw: bool, +} + +pub async fn run(args: Args) -> anyhow::Result<()> { + let mode = ApiMode::resolve(args.local, args.api_url.as_deref()); + let auth = auth::resolve_auth(); + let env_vars = EnvVars::from_env(); + let config = crate::config::settings::read_config().ok(); + let local_config_url = config.as_ref().and_then(|c| c.local_api_url()); + let base_url = mode.resolve_base_url(args.api_url.as_deref(), &env_vars, local_config_url); + + let client = SteelClient::new()?; + let paths = SessionStatePaths::default_paths(); + + if args.raw { + // Raw mode: print full API response + let raw_sessions = client + .list_sessions(&base_url, mode, &auth) + .await + .map_err(|e| anyhow::anyhow!("{e}"))?; + println!("{}", serde_json::to_string_pretty(&raw_sessions)?); + return Ok(()); + } + + let sessions = list_sessions(&client, &base_url, mode, &auth, &paths).await?; + + let output: Vec = sessions + .iter() + .map(|s| { + let mut obj = serde_json::json!({ + "id": s.id, + "mode": format!("{:?}", s.mode), + "live": s.live, + }); + if let Some(ref name) = s.name { + obj["name"] = serde_json::json!(name); + } + if let Some(ref status) = s.status { + obj["status"] = serde_json::json!(status); + } + if let Some(ref url) = s.viewer_url { + obj["viewerUrl"] = serde_json::json!(url); + } + obj + }) + .collect(); + + println!("{}", serde_json::to_string_pretty(&output)?); + + Ok(()) +} diff --git a/src/commands/browser/start.rs b/src/commands/browser/start.rs new file mode 100644 index 0000000..66e87cb --- /dev/null +++ b/src/commands/browser/start.rs @@ -0,0 +1,103 @@ +use clap::Parser; + +use crate::api::client::SteelClient; +use crate::api::session::CreateSessionOptions; +use crate::browser::lifecycle::{sanitize_connect_url, start_session}; +use crate::config::auth; +use crate::config::session_state::SessionStatePaths; +use crate::config::settings::{ApiMode, EnvVars}; + +#[derive(Parser)] +pub struct Args { + /// Named session for reuse + #[arg(short, long)] + pub session: Option, + + /// Use local runtime + #[arg(short, long)] + pub local: bool, + + /// Explicit self-hosted API endpoint URL + #[arg(long)] + pub api_url: Option, + + /// Enable stealth mode (humanize interactions + auto CAPTCHA) + #[arg(long)] + pub stealth: bool, + + /// Use a residential proxy + #[arg(short = 'p', long)] + pub proxy: Option, + + /// Session timeout in milliseconds (create-time only) + #[arg(long = "session-timeout")] + pub session_timeout: Option, + + /// Create new sessions in headless mode (create-time only) + #[arg(long = "session-headless")] + pub session_headless: Option, + + /// Preferred session region (create-time only) + #[arg(long = "session-region")] + pub session_region: Option, + + /// Enable manual CAPTCHA solving on new sessions (create-time only) + #[arg(long = "session-solve-captcha")] + pub session_solve_captcha: bool, + + /// Credential namespace + #[arg(long)] + pub namespace: Option, + + /// Inject credentials + #[arg(long)] + pub credentials: bool, +} + +pub async fn run(args: Args) -> anyhow::Result<()> { + let mode = ApiMode::resolve(args.local, args.api_url.as_deref()); + let auth = auth::resolve_auth(); + let env_vars = EnvVars::from_env(); + let config = crate::config::settings::read_config().ok(); + let local_config_url = config.as_ref().and_then(|c| c.local_api_url()); + let base_url = mode.resolve_base_url(args.api_url.as_deref(), &env_vars, local_config_url); + + let client = SteelClient::new()?; + let paths = SessionStatePaths::default_paths(); + + let options = CreateSessionOptions { + stealth: args.stealth, + proxy_url: args.proxy, + timeout_ms: args.session_timeout, + headless: args.session_headless, + region: args.session_region, + solve_captcha: args.session_solve_captcha, + namespace: args.namespace, + credentials: args.credentials, + }; + + let session = start_session( + &client, + &base_url, + mode, + &auth, + &paths, + args.session.as_deref(), + &options, + ) + .await?; + + println!("id: {}", session.id); + println!("mode: {:?}", session.mode); + if let Some(ref name) = session.name { + println!("name: {name}"); + } + if let Some(ref url) = session.viewer_url { + println!("live_url: {url}"); + } + if let Some(ref url) = session.connect_url { + println!("connect_url: {}", sanitize_connect_url(url)); + } + + Ok(()) +} diff --git a/src/commands/browser/stop.rs b/src/commands/browser/stop.rs new file mode 100644 index 0000000..427d388 --- /dev/null +++ b/src/commands/browser/stop.rs @@ -0,0 +1,67 @@ +use clap::Parser; + +use crate::api::client::SteelClient; +use crate::browser::lifecycle::stop_session; +use crate::config::auth; +use crate::config::session_state::SessionStatePaths; +use crate::config::settings::{ApiMode, EnvVars}; + +#[derive(Parser)] +pub struct Args { + /// Named session to stop + #[arg(short, long)] + pub session: Option, + + /// Stop all sessions + #[arg(short, long)] + pub all: bool, + + /// Use local runtime + #[arg(short, long)] + pub local: bool, + + /// Explicit self-hosted API endpoint URL + #[arg(long)] + pub api_url: Option, +} + +pub async fn run(args: Args) -> anyhow::Result<()> { + if args.all && args.session.is_some() { + anyhow::bail!("Cannot combine `--all` with `--session`."); + } + + let mode = ApiMode::resolve(args.local, args.api_url.as_deref()); + let auth = auth::resolve_auth(); + let env_vars = EnvVars::from_env(); + let config = crate::config::settings::read_config().ok(); + let local_config_url = config.as_ref().and_then(|c| c.local_api_url()); + let base_url = mode.resolve_base_url(args.api_url.as_deref(), &env_vars, local_config_url); + + let client = SteelClient::new()?; + let paths = SessionStatePaths::default_paths(); + + let result = stop_session( + &client, + &base_url, + mode, + &auth, + &paths, + args.session.as_deref(), + args.all, + ) + .await?; + + if result.stopped_session_ids.is_empty() { + println!("No active browser sessions to stop."); + } else if result.all { + println!( + "Stopped {} sessions in {:?} mode.", + result.stopped_session_ids.len(), + result.mode + ); + } else { + println!("Stopped session {}.", result.stopped_session_ids[0]); + } + + Ok(()) +} diff --git a/src/commands/cache.rs b/src/commands/cache.rs new file mode 100644 index 0000000..43f977f --- /dev/null +++ b/src/commands/cache.rs @@ -0,0 +1,42 @@ +use clap::Parser; + +#[derive(Parser)] +pub struct Args { + /// Remove all cached files and directories + #[arg(short, long)] + pub clean: bool, +} + +pub async fn run(args: Args) -> anyhow::Result<()> { + let cache_dir = dirs::cache_dir() + .ok_or_else(|| anyhow::anyhow!("Could not determine cache directory"))? + .join("steel"); + + if !args.clean { + println!("Steel CLI cache directory: {}", cache_dir.display()); + println!("Use --clean to remove all cached files."); + return Ok(()); + } + + if !cache_dir.exists() { + println!("Cache directory does not exist. Nothing to clean."); + return Ok(()); + } + + let mut count = 0u64; + for entry in std::fs::read_dir(&cache_dir)? { + let entry = entry?; + let path = entry.path(); + if path.is_dir() { + std::fs::remove_dir_all(&path)?; + } else { + std::fs::remove_file(&path)?; + } + count += 1; + } + + println!("Removed {count} item(s) from cache."); + println!("Cache directory: {}", cache_dir.display()); + + Ok(()) +} diff --git a/src/commands/config.rs b/src/commands/config.rs new file mode 100644 index 0000000..e3e4610 --- /dev/null +++ b/src/commands/config.rs @@ -0,0 +1,37 @@ +use clap::Parser; + +use crate::config::auth; +use crate::config::settings::read_config; + +#[derive(Parser)] +pub struct Args {} + +pub async fn run(_args: Args) -> anyhow::Result<()> { + let auth = auth::resolve_auth(); + let config = read_config().ok(); + + if auth.api_key.is_none() && config.is_none() { + println!("You are not logged in. Please run `steel login` to authenticate."); + return Ok(()); + } + + if let Some(ref key) = auth.api_key { + let masked = if key.len() > 7 { + format!("{}...", &key[..7]) + } else { + key.clone() + }; + println!("apiKey: {masked}"); + println!("source: {:?}", auth.source); + } + + if let Some(ref cfg) = config { + if let Some(ref browser) = cfg.browser { + if let Some(ref url) = browser.api_url { + println!("browser.apiUrl: {url}"); + } + } + } + + Ok(()) +} diff --git a/src/commands/credentials.rs b/src/commands/credentials.rs new file mode 100644 index 0000000..9a1cc10 --- /dev/null +++ b/src/commands/credentials.rs @@ -0,0 +1,369 @@ +use clap::{Parser, Subcommand}; +use serde_json::json; + +use crate::api::client::SteelClient; +use crate::config::auth; +use crate::config::settings::{ApiMode, EnvVars}; + +#[derive(Subcommand)] +pub enum Command { + /// List stored credentials + List(ListArgs), + + /// Create a new credential + Create(CreateArgs), + + /// Update an existing credential + Update(UpdateArgs), + + /// Delete a credential + Delete(DeleteArgs), +} + +#[derive(Parser)] +pub struct ListArgs { + /// Filter by namespace + #[arg(short, long)] + pub namespace: Option, + + /// Filter by origin URL + #[arg(long)] + pub origin: Option, + + /// Use local runtime + #[arg(short, long)] + pub local: bool, + + /// Explicit self-hosted API endpoint URL + #[arg(long)] + pub api_url: Option, +} + +#[derive(Parser)] +pub struct CreateArgs { + /// Origin URL to associate the credential with + #[arg(long)] + pub origin: Option, + + /// Username + #[arg(short, long)] + pub username: Option, + + /// Password + #[arg(short, long)] + pub password: Option, + + /// TOTP secret for two-factor authentication + #[arg(long)] + pub totp_secret: Option, + + /// Credential namespace + #[arg(short, long)] + pub namespace: Option, + + /// Human-readable label + #[arg(long)] + pub label: Option, + + /// Use local runtime + #[arg(short, long)] + pub local: bool, + + /// Explicit self-hosted API endpoint URL + #[arg(long)] + pub api_url: Option, +} + +#[derive(Parser)] +pub struct UpdateArgs { + /// Origin URL of the credential to update + #[arg(long)] + pub origin: Option, + + /// New username + #[arg(short, long)] + pub username: Option, + + /// New password + #[arg(short, long)] + pub password: Option, + + /// New TOTP secret + #[arg(long)] + pub totp_secret: Option, + + /// Credential namespace + #[arg(short, long)] + pub namespace: Option, + + /// New human-readable label + #[arg(long)] + pub label: Option, + + /// Use local runtime + #[arg(short, long)] + pub local: bool, + + /// Explicit self-hosted API endpoint URL + #[arg(long)] + pub api_url: Option, +} + +#[derive(Parser)] +pub struct DeleteArgs { + /// Origin URL of the credential to delete + #[arg(long)] + pub origin: Option, + + /// Credential namespace + #[arg(short, long)] + pub namespace: Option, + + /// Use local runtime + #[arg(short, long)] + pub local: bool, + + /// Explicit self-hosted API endpoint URL + #[arg(long)] + pub api_url: Option, +} + +fn resolve_common(local: bool, api_url: Option<&str>) -> (ApiMode, auth::Auth, String) { + let mode = ApiMode::resolve(local, api_url); + let auth_info = auth::resolve_auth(); + let env_vars = EnvVars::from_env(); + let config = crate::config::settings::read_config().ok(); + let local_config_url = config.as_ref().and_then(|c| c.local_api_url()); + let base_url = mode.resolve_base_url(api_url, &env_vars, local_config_url); + (mode, auth_info, base_url) +} + +pub async fn run(command: Command) -> anyhow::Result<()> { + match command { + Command::List(args) => run_list(args).await, + Command::Create(args) => run_create(args).await, + Command::Update(args) => run_update(args).await, + Command::Delete(args) => run_delete(args).await, + } +} + +async fn run_list(args: ListArgs) -> anyhow::Result<()> { + let (mode, auth_info, base_url) = resolve_common(args.local, args.api_url.as_deref()); + let client = SteelClient::new()?; + + let mut query_params = Vec::new(); + if let Some(ref ns) = args.namespace { + query_params.push(format!("namespace={}", urlencoding::encode(ns))); + } + if let Some(ref origin) = args.origin { + query_params.push(format!("origin={}", urlencoding::encode(origin))); + } + + let path = if query_params.is_empty() { + "/credentials".to_string() + } else { + format!("/credentials?{}", query_params.join("&")) + }; + + let data = client + .request(&base_url, mode, reqwest::Method::GET, &path, None, &auth_info) + .await + .map_err(|e| anyhow::anyhow!("{e}"))?; + + // Normalize response — could be array or { credentials: [...] } + let credentials = if let Some(arr) = data.as_array() { + arr.clone() + } else if let Some(arr) = data.get("credentials").and_then(|v| v.as_array()) { + arr.clone() + } else { + vec![data] + }; + + println!("{}", serde_json::to_string_pretty(&credentials)?); + + Ok(()) +} + +async fn run_create(args: CreateArgs) -> anyhow::Result<()> { + let origin = args + .origin + .as_deref() + .map(|s| s.trim()) + .filter(|s| !s.is_empty()) + .ok_or_else(|| anyhow::anyhow!("Missing required flag: --origin"))?; + let username = args + .username + .as_deref() + .map(|s| s.trim()) + .filter(|s| !s.is_empty()) + .ok_or_else(|| anyhow::anyhow!("Missing required flag: --username"))?; + let password = args + .password + .as_deref() + .map(|s| s.trim()) + .filter(|s| !s.is_empty()) + .ok_or_else(|| anyhow::anyhow!("Missing required flag: --password"))?; + + let (mode, auth_info, base_url) = resolve_common(args.local, args.api_url.as_deref()); + let client = SteelClient::new()?; + + let mut value = json!({ + "username": username, + "password": password, + }); + if let Some(ref secret) = args.totp_secret { + let trimmed = secret.trim(); + if !trimmed.is_empty() { + value["totpSecret"] = json!(trimmed); + } + } + + let mut body = json!({ + "origin": origin, + "value": value, + }); + if let Some(ref ns) = args.namespace { + let trimmed = ns.trim(); + if !trimmed.is_empty() { + body["namespace"] = json!(trimmed); + } + } + if let Some(ref label) = args.label { + let trimmed = label.trim(); + if !trimmed.is_empty() { + body["label"] = json!(trimmed); + } + } + + let result = client + .request(&base_url, mode, reqwest::Method::POST, "/credentials", Some(body), &auth_info) + .await + .map_err(|e| anyhow::anyhow!("{e}"))?; + + println!("origin: {origin}"); + println!("username: {username}"); + if let Some(ref ns) = args.namespace { + let trimmed = ns.trim(); + if !trimmed.is_empty() { + println!("namespace: {trimmed}"); + } + } + if let Some(ref label) = args.label { + let trimmed = label.trim(); + if !trimmed.is_empty() { + println!("label: {trimmed}"); + } + } + if let Some(id) = result.get("id").and_then(|v| v.as_str()) { + println!("id: {id}"); + } + println!("Credential created successfully."); + + Ok(()) +} + +async fn run_update(args: UpdateArgs) -> anyhow::Result<()> { + let origin = args + .origin + .as_deref() + .map(|s| s.trim()) + .filter(|s| !s.is_empty()) + .ok_or_else(|| anyhow::anyhow!("Missing required flag: --origin"))?; + + let (mode, auth_info, base_url) = resolve_common(args.local, args.api_url.as_deref()); + let client = SteelClient::new()?; + + let mut body = json!({"origin": origin}); + let obj = body.as_object_mut().unwrap(); + + let has_value = args.username.is_some() || args.password.is_some() || args.totp_secret.is_some(); + if has_value { + let mut value = json!({}); + if let Some(ref u) = args.username { + let trimmed = u.trim(); + if !trimmed.is_empty() { + value["username"] = json!(trimmed); + } + } + if let Some(ref p) = args.password { + let trimmed = p.trim(); + if !trimmed.is_empty() { + value["password"] = json!(trimmed); + } + } + if let Some(ref t) = args.totp_secret { + let trimmed = t.trim(); + if !trimmed.is_empty() { + value["totpSecret"] = json!(trimmed); + } + } + obj.insert("value".into(), value); + } + if let Some(ref ns) = args.namespace { + let trimmed = ns.trim(); + if !trimmed.is_empty() { + obj.insert("namespace".into(), json!(trimmed)); + } + } + if let Some(ref label) = args.label { + let trimmed = label.trim(); + if !trimmed.is_empty() { + obj.insert("label".into(), json!(trimmed)); + } + } + + let result = client + .request(&base_url, mode, reqwest::Method::PUT, "/credentials", Some(body), &auth_info) + .await + .map_err(|e| anyhow::anyhow!("{e}"))?; + + println!("origin: {origin}"); + if let Some(ref ns) = args.namespace { + let trimmed = ns.trim(); + if !trimmed.is_empty() { + println!("namespace: {trimmed}"); + } + } + if let Some(id) = result.get("id").and_then(|v| v.as_str()) { + println!("id: {id}"); + } + println!("Credential updated successfully."); + + Ok(()) +} + +async fn run_delete(args: DeleteArgs) -> anyhow::Result<()> { + let origin = args + .origin + .as_deref() + .map(|s| s.trim()) + .filter(|s| !s.is_empty()) + .ok_or_else(|| anyhow::anyhow!("Missing required flag: --origin"))?; + + let (mode, auth_info, base_url) = resolve_common(args.local, args.api_url.as_deref()); + let client = SteelClient::new()?; + + let mut body = json!({"origin": origin}); + if let Some(ref ns) = args.namespace { + let trimmed = ns.trim(); + if !trimmed.is_empty() { + body["namespace"] = json!(trimmed); + } + } + + client + .request(&base_url, mode, reqwest::Method::DELETE, "/credentials", Some(body), &auth_info) + .await + .map_err(|e| anyhow::anyhow!("{e}"))?; + + println!("origin: {origin}"); + if let Some(ref ns) = args.namespace { + let trimmed = ns.trim(); + if !trimmed.is_empty() { + println!("namespace: {trimmed}"); + } + } + println!("Credential deleted successfully."); + + Ok(()) +} diff --git a/src/commands/dev.rs b/src/commands/dev.rs new file mode 100644 index 0000000..30560df --- /dev/null +++ b/src/commands/dev.rs @@ -0,0 +1,173 @@ +use std::process::Command as ProcessCommand; + +use clap::{Parser, Subcommand}; + +use crate::config; + +#[derive(Subcommand)] +pub enum Command { + /// Install the local Steel Browser runtime + Install(InstallArgs), + + /// Start the local runtime containers + Start(StartArgs), + + /// Stop the local runtime containers + Stop(StopArgs), +} + +#[derive(Parser)] +pub struct InstallArgs { + /// Git repository URL for local Steel Browser runtime + #[arg(long)] + pub repo_url: Option, + + /// Enable verbose git command output + #[arg(short = 'V', long)] + pub verbose: bool, +} + +#[derive(Parser)] +pub struct StartArgs { + /// API port for local Steel Browser runtime + #[arg(short, long)] + pub port: Option, + + /// Enable verbose Docker command output + #[arg(short = 'V', long)] + pub verbose: bool, + + /// Only verify Docker availability and exit + #[arg(short, long)] + pub docker_check: bool, +} + +#[derive(Parser)] +pub struct StopArgs { + /// Enable verbose Docker command output + #[arg(short = 'V', long)] + pub verbose: bool, +} + +fn repo_path() -> std::path::PathBuf { + config::config_dir().join("steel-browser") +} + +pub async fn run(command: Command) -> anyhow::Result<()> { + match command { + Command::Install(args) => run_install(args), + Command::Start(args) => run_start(args), + Command::Stop(args) => run_stop(args), + } +} + +fn run_install(args: InstallArgs) -> anyhow::Result<()> { + let repo_url = args + .repo_url + .as_deref() + .unwrap_or(config::REPO_URL); + let path = repo_path(); + + if path.exists() { + println!("Local Steel Browser runtime already installed."); + println!("repo_path: {}", path.display()); + println!("repo_url: {repo_url}"); + return Ok(()); + } + + let mut cmd = ProcessCommand::new("git"); + cmd.args(["clone", repo_url, &path.to_string_lossy()]); + + if !args.verbose { + cmd.stdout(std::process::Stdio::null()) + .stderr(std::process::Stdio::null()); + } + + let status = cmd.status()?; + if !status.success() { + anyhow::bail!("Failed to clone repository."); + } + + println!("Local Steel Browser runtime installed."); + println!("repo_path: {}", path.display()); + println!("repo_url: {repo_url}"); + + Ok(()) +} + +fn run_start(args: StartArgs) -> anyhow::Result<()> { + if args.docker_check { + return if is_docker_running() { + println!("Docker is running."); + Ok(()) + } else { + anyhow::bail!("Docker is not running."); + }; + } + + let path = repo_path(); + if !path.exists() { + anyhow::bail!( + "Local Steel Browser runtime not installed. Run `steel dev install` first." + ); + } + + let port = args.port.unwrap_or(3000); + + let mut cmd = ProcessCommand::new("docker"); + cmd.args(["compose", "up", "-d"]) + .current_dir(&path) + .env("STEEL_API_PORT", port.to_string()); + + if !args.verbose { + cmd.stdout(std::process::Stdio::null()) + .stderr(std::process::Stdio::null()); + } + + let status = cmd.status()?; + if !status.success() { + anyhow::bail!("Failed to start local Steel Browser runtime."); + } + + println!("Local Steel Browser runtime started."); + println!("repo_path: {}", path.display()); + println!("api_port: {port}"); + + Ok(()) +} + +fn run_stop(args: StopArgs) -> anyhow::Result<()> { + let path = repo_path(); + if !path.exists() { + anyhow::bail!( + "Local Steel Browser runtime not installed. Run `steel dev install` first." + ); + } + + let mut cmd = ProcessCommand::new("docker"); + cmd.args(["compose", "down"]).current_dir(&path); + + if !args.verbose { + cmd.stdout(std::process::Stdio::null()) + .stderr(std::process::Stdio::null()); + } + + let status = cmd.status()?; + if !status.success() { + anyhow::bail!("Failed to stop local Steel Browser runtime."); + } + + println!("Local Steel Browser runtime stopped."); + println!("repo_path: {}", path.display()); + + Ok(()) +} + +fn is_docker_running() -> bool { + ProcessCommand::new("docker") + .args(["info"]) + .stdout(std::process::Stdio::null()) + .stderr(std::process::Stdio::null()) + .status() + .is_ok_and(|s| s.success()) +} diff --git a/src/commands/docs.rs b/src/commands/docs.rs new file mode 100644 index 0000000..b3833eb --- /dev/null +++ b/src/commands/docs.rs @@ -0,0 +1,10 @@ +use clap::Parser; + +#[derive(Parser)] +pub struct Args; + +pub async fn run(_args: Args) -> anyhow::Result<()> { + println!("Opening Docs..."); + open::that("https://docs.steel.dev/overview/intro-to-steel")?; + Ok(()) +} diff --git a/src/commands/forge.rs b/src/commands/forge.rs new file mode 100644 index 0000000..6329cb9 --- /dev/null +++ b/src/commands/forge.rs @@ -0,0 +1,176 @@ +use std::io::Write; + +use clap::Parser; +use dialoguer::{Input, Select}; +use serde::Deserialize; + +#[derive(Parser)] +pub struct Args { + /// Template to start from + pub template: Option, + + /// Project name + #[arg(short, long)] + pub name: Option, + + /// API URL for Steel API + #[arg(short = 'a', long)] + pub api_url: Option, + + /// API Key for Steel API + #[arg(long)] + pub api_key: Option, + + /// API Key for OpenAI + #[arg(long)] + pub openai_key: Option, + + /// API Key for Anthropic + #[arg(long)] + pub anthropic_key: Option, + + /// Skip authentication + #[arg(long)] + pub skip_auth: bool, +} + +#[derive(Deserialize)] +struct Manifest { + examples: Vec, + version: String, +} + +#[derive(Deserialize)] +struct ManifestExample { + slug: String, + title: String, + #[serde(default)] + shorthand: Option, + #[serde(default)] + template: Option, + #[serde(default)] + language: Option, + #[serde(default)] + flags: Vec, +} + +fn load_manifest() -> anyhow::Result { + let manifest_bytes = include_bytes!("../../manifest.json"); + let manifest: Manifest = serde_json::from_slice(manifest_bytes)?; + Ok(manifest) +} + +pub async fn run(args: Args) -> anyhow::Result<()> { + let manifest = load_manifest()?; + + // Filter to CLI-available templates + let cli_examples: Vec<&ManifestExample> = manifest + .examples + .iter() + .filter(|e| e.flags.contains(&"cli".to_string())) + .collect(); + + if cli_examples.is_empty() { + anyhow::bail!("No templates available."); + } + + // Select template + let example = if let Some(ref template_arg) = args.template { + cli_examples + .iter() + .find(|e| { + e.slug == *template_arg + || e.shorthand.as_deref() == Some(template_arg) + }) + .copied() + .ok_or_else(|| anyhow::anyhow!("Template not found: {template_arg}"))? + } else { + let items: Vec = cli_examples + .iter() + .map(|e| { + let lang = e.language.as_deref().unwrap_or("unknown"); + format!("{} [{}]", e.title, lang) + }) + .collect(); + + let selection = Select::new() + .with_prompt("Select a template") + .items(&items) + .default(0) + .interact()?; + + cli_examples[selection] + }; + + // Get project name + let project_name = if let Some(ref name) = args.name { + name.clone() + } else { + Input::new() + .with_prompt("Project name") + .default(example.slug.clone()) + .interact_text()? + }; + + // Download template + let Some(ref template_path) = example.template else { + anyhow::bail!("Template '{}' has no download path.", example.slug); + }; + + let download_url = format!( + "https://raw.githubusercontent.com/steel-dev/steel-cookbook/{}/{}", + manifest.version, template_path + ); + + println!("Downloading template '{}'...", example.title); + + let client = reqwest::Client::new(); + let response = client.get(&download_url).send().await?; + + if !response.status().is_success() { + anyhow::bail!("Failed to download template: HTTP {}", response.status()); + } + + let bytes = response.bytes().await?; + + // Extract tarball using system tar + let target_dir = std::env::current_dir()?.join(&project_name); + if target_dir.exists() { + anyhow::bail!("Directory '{}' already exists.", project_name); + } + + std::fs::create_dir_all(&target_dir)?; + + // Write to temp file then extract + let tmp = target_dir.join(".template.tar.gz"); + { + let mut f = std::fs::File::create(&tmp)?; + f.write_all(&bytes)?; + } + + let status = std::process::Command::new("tar") + .args(["xzf", &tmp.to_string_lossy(), "--strip-components=1"]) + .current_dir(&target_dir) + .status()?; + + let _ = std::fs::remove_file(&tmp); + + if !status.success() { + anyhow::bail!("Failed to extract template archive."); + } + + println!("Project '{}' created at {}", project_name, target_dir.display()); + println!("\nNext steps:"); + println!(" cd {project_name}"); + + match example.language.as_deref() { + Some("python") => { + println!(" pip install -r requirements.txt"); + } + _ => { + println!(" npm install"); + } + } + + Ok(()) +} diff --git a/src/commands/login.rs b/src/commands/login.rs new file mode 100644 index 0000000..81f4f14 --- /dev/null +++ b/src/commands/login.rs @@ -0,0 +1,208 @@ +use std::io::{BufRead, BufReader, Write as IoWrite}; + +use clap::Parser; +use tokio::net::TcpListener; + +use crate::config; +use crate::config::auth; +use crate::config::settings::{read_config_from, write_config_to, Config}; + +#[derive(Parser)] +pub struct Args {} + +const LOGIN_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(5 * 60); + +pub async fn run(_args: Args) -> anyhow::Result<()> { + // Check if already logged in + let existing_auth = auth::resolve_auth(); + if existing_auth.api_key.is_some() { + println!("You are already logged in."); + return Ok(()); + } + + println!("Launching browser for authentication..."); + + let (api_key, name) = login_flow().await?; + + save_api_key(&api_key, &name)?; + + println!("Authentication successful! Your API key has been saved."); + + Ok(()) +} + +async fn login_flow() -> anyhow::Result<(String, String)> { + let state = generate_random_hex(16); + + // Bind to random port on localhost + let listener = TcpListener::bind("127.0.0.1:0").await?; + let port = listener.local_addr()?.port(); + + let auth_url = format!( + "{}?cli_redirect=true&port={}&state={}", + config::LOGIN_URL, + port, + state + ); + + println!("Opening your browser for authentication..."); + println!("If it does not open automatically, please click:"); + println!("{auth_url}"); + + if let Err(e) = open::that(&auth_url) { + anyhow::bail!("Failed to open browser: {e}"); + } + + // Wait for the callback with timeout + let result = tokio::time::timeout(LOGIN_TIMEOUT, async { + let (stream, _) = listener.accept().await?; + stream.readable().await?; + + let std_stream = stream.into_std()?; + let mut reader = BufReader::new(&std_stream); + + let mut request_line = String::new(); + reader.read_line(&mut request_line)?; + + // Parse query params from GET /callback?jwt=...&state=... + let query = parse_query_from_request(&request_line); + + let received_state = query + .iter() + .find(|(k, _)| k == "state") + .map(|(_, v)| v.as_str()); + + if received_state != Some(&state) { + send_response(&std_stream, 400, "Error: Invalid state parameter.")?; + anyhow::bail!("Invalid state parameter. Possible CSRF attack."); + } + + let jwt = query + .iter() + .find(|(k, _)| k == "jwt") + .map(|(_, v)| v.clone()); + + let Some(jwt) = jwt else { + send_response(&std_stream, 400, "Error: JWT not found in callback.")?; + anyhow::bail!("Callback did not include a JWT."); + }; + + // Redirect browser to success page + let redirect = format!( + "HTTP/1.1 302 Found\r\nLocation: {}\r\nConnection: close\r\n\r\n", + config::SUCCESS_URL + ); + (&std_stream).write_all(redirect.as_bytes())?; + (&std_stream).flush()?; + + // Exchange JWT for API key + create_api_key_using_jwt(&jwt).await + }) + .await; + + match result { + Ok(inner) => inner, + Err(_) => anyhow::bail!("Login timed out. Please try again."), + } +} + +async fn create_api_key_using_jwt(jwt: &str) -> anyhow::Result<(String, String)> { + let client = reqwest::Client::new(); + let response = client + .post(config::API_KEYS_URL) + .header("Content-Type", "application/json") + .header("Authorization", format!("Bearer {jwt}")) + .json(&serde_json::json!({"name": "CLI"})) + .send() + .await?; + + if !response.status().is_success() { + anyhow::bail!( + "Failed to get API key: {} {}", + response.status().as_u16(), + response.status().canonical_reason().unwrap_or("") + ); + } + + let data: serde_json::Value = response.json().await?; + let key = data + .get("key") + .and_then(|v| v.as_str()) + .ok_or_else(|| anyhow::anyhow!("No API key found in response"))?; + let name = data + .get("name") + .and_then(|v| v.as_str()) + .ok_or_else(|| anyhow::anyhow!("No name found in response"))?; + + Ok((key.to_string(), name.to_string())) +} + +fn save_api_key(api_key: &str, name: &str) -> anyhow::Result<()> { + let config_dir = config::config_dir(); + std::fs::create_dir_all(&config_dir)?; + let config_path = config::config_path_in(&config_dir); + + let mut config = read_config_from(&config_path).unwrap_or_else(|_| Config::default()); + config.api_key = Some(api_key.to_string()); + config.name = Some(name.to_string()); + config.instance = Some("cloud".to_string()); + + write_config_to(&config_path, &config)?; + + Ok(()) +} + +fn parse_query_from_request(request_line: &str) -> Vec<(String, String)> { + // "GET /callback?jwt=xxx&state=yyy HTTP/1.1" + let parts: Vec<&str> = request_line.split_whitespace().collect(); + if parts.len() < 2 { + return vec![]; + } + + let path = parts[1]; + let query_start = match path.find('?') { + Some(i) => i + 1, + None => return vec![], + }; + + let query_str = &path[query_start..]; + query_str + .split('&') + .filter_map(|pair| { + let mut kv = pair.splitn(2, '='); + let key = kv.next()?; + let value = kv.next().unwrap_or(""); + Some(( + urlencoding::decode(key).unwrap_or_default().to_string(), + urlencoding::decode(value).unwrap_or_default().to_string(), + )) + }) + .collect() +} + +fn send_response( + stream: &std::net::TcpStream, + status: u16, + body: &str, +) -> anyhow::Result<()> { + let response = format!( + "HTTP/1.1 {status} Error\r\nContent-Type: text/plain\r\nConnection: close\r\n\r\n{body}" + ); + let mut stream = stream; + stream.write_all(response.as_bytes())?; + stream.flush()?; + Ok(()) +} + +fn generate_random_hex(bytes: usize) -> String { + use std::time::{SystemTime, UNIX_EPOCH}; + // Simple pseudo-random hex using timestamps and process info + let seed = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default() + .as_nanos(); + let pid = std::process::id() as u128; + let combined = seed ^ (pid << 64); + let hex = format!("{:032x}", combined); + hex[..bytes * 2].to_string() +} diff --git a/src/commands/logout.rs b/src/commands/logout.rs new file mode 100644 index 0000000..461b03c --- /dev/null +++ b/src/commands/logout.rs @@ -0,0 +1,33 @@ +use clap::Parser; + +use crate::config; +use crate::config::settings::{read_config_from, write_config_to}; + +#[derive(Parser)] +pub struct Args {} + +pub async fn run(_args: Args) -> anyhow::Result<()> { + let config_path = config::config_path(); + + let mut cfg = match read_config_from(&config_path) { + Ok(c) => c, + Err(_) => { + println!("You are not logged in."); + return Ok(()); + } + }; + + if cfg.api_key.is_none() { + println!("You are not logged in."); + return Ok(()); + } + + cfg.api_key = None; + cfg.name = None; + + write_config_to(&config_path, &cfg)?; + + println!("Successfully logged out. Have a great day!"); + + Ok(()) +} diff --git a/src/commands/mod.rs b/src/commands/mod.rs new file mode 100644 index 0000000..37b3c24 --- /dev/null +++ b/src/commands/mod.rs @@ -0,0 +1,116 @@ +pub mod browser; +pub mod cache; +pub mod config; +pub mod credentials; +pub mod dev; +pub mod docs; +pub mod forge; +pub mod login; +pub mod logout; +pub mod pdf; +pub mod run; +pub mod scrape; +pub mod screenshot; +pub mod settings; +pub mod star; +pub mod support; +pub mod update; + +use clap::{Parser, Subcommand}; + +#[derive(Parser)] +#[command(name = "steel", version, about = "Steel CLI")] +pub struct Cli { + #[command(subcommand)] + pub command: Command, + + /// Skip update check + #[arg(long, global = true)] + pub no_update_check: bool, +} + +#[derive(Subcommand)] +pub enum Command { + /// Scrape webpage content (markdown output by default) + Scrape(scrape::Args), + + /// Capture a screenshot of a webpage + Screenshot(screenshot::Args), + + /// Generate a PDF from a webpage + Pdf(pdf::Args), + + /// Browser session management and automation + Browser { + #[command(subcommand)] + command: browser::Command, + }, + + /// Login to Steel CLI + #[command(alias = "auth")] + Login(login::Args), + + /// Logout from Steel CLI + Logout(logout::Args), + + /// Manage stored credentials + Credentials { + #[command(subcommand)] + command: credentials::Command, + }, + + /// Local development runtime + Dev { + #[command(subcommand)] + command: dev::Command, + }, + + /// Start a new project using the Steel CLI + Forge(forge::Args), + + /// Run a Steel Cookbook automation + Run(run::Args), + + /// Show current configuration + Config(config::Args), + + /// Check for updates and install the latest version + Update(update::Args), + + /// Manage Steel CLI cache + Cache(cache::Args), + + /// Open Steel documentation in browser + Docs(docs::Args), + + /// Open Steel Browser GitHub repository + Star(star::Args), + + /// Open Steel Discord server + Support(support::Args), + + /// Display and modify current settings + Settings(settings::Args), +} + +pub async fn run(cli: Cli) -> anyhow::Result<()> { + match cli.command { + Command::Scrape(args) => scrape::run(args).await, + Command::Screenshot(args) => screenshot::run(args).await, + Command::Pdf(args) => pdf::run(args).await, + Command::Browser { command } => browser::run(command).await, + Command::Login(args) => login::run(args).await, + Command::Logout(args) => logout::run(args).await, + Command::Credentials { command } => credentials::run(command).await, + Command::Dev { command } => dev::run(command).await, + Command::Forge(args) => forge::run(args).await, + Command::Run(args) => run::run(args).await, + Command::Config(args) => config::run(args).await, + Command::Update(args) => update::run(args).await, + Command::Cache(args) => cache::run(args).await, + Command::Docs(args) => docs::run(args).await, + Command::Star(args) => star::run(args).await, + Command::Support(args) => support::run(args).await, + Command::Settings(args) => settings::run(args).await, + } +} diff --git a/src/commands/pdf.rs b/src/commands/pdf.rs new file mode 100644 index 0000000..94e090a --- /dev/null +++ b/src/commands/pdf.rs @@ -0,0 +1,68 @@ +use clap::Parser; + +use crate::api::client::SteelClient; +use crate::api::top_level::get_hosted_url; +use crate::config::auth; +use crate::config::settings::{ApiMode, EnvVars}; +use crate::util::url::resolve_tool_url; + +#[derive(Parser)] +pub struct Args { + /// Target URL to generate PDF from + pub url: Option, + + /// Target URL to generate PDF from + #[arg(short = 'u', long = "url")] + pub url_flag: Option, + + /// Delay before generating in milliseconds + #[arg(short, long)] + pub delay: Option, + + /// Use a Steel-managed residential proxy + #[arg(long)] + pub use_proxy: bool, + + /// Region identifier for request execution + #[arg(short, long)] + pub region: Option, + + /// Send request to local Steel runtime + #[arg(short, long)] + pub local: bool, + + /// Explicit self-hosted API endpoint URL + #[arg(long)] + pub api_url: Option, +} + +pub async fn run(args: Args) -> anyhow::Result<()> { + let url = resolve_tool_url(args.url_flag.as_deref(), args.url.as_deref())?; + + let mode = ApiMode::resolve(args.local, args.api_url.as_deref()); + let auth = auth::resolve_auth(); + let env_vars = EnvVars::from_env(); + let config = crate::config::settings::read_config().ok(); + let local_config_url = config.as_ref().and_then(|c| c.local_api_url()); + let base_url = mode.resolve_base_url(args.api_url.as_deref(), &env_vars, local_config_url); + + let client = SteelClient::new()?; + let response = client + .pdf( + &base_url, + mode, + &auth, + &url, + args.delay, + args.use_proxy, + args.region.as_deref(), + ) + .await?; + + match get_hosted_url(&response) { + Some(hosted_url) => println!("{hosted_url}"), + None => println!("{}", serde_json::to_string_pretty(&response)?), + } + + Ok(()) +} diff --git a/src/commands/run.rs b/src/commands/run.rs new file mode 100644 index 0000000..e20254d --- /dev/null +++ b/src/commands/run.rs @@ -0,0 +1,223 @@ +use clap::Parser; +use dialoguer::Select; +use serde::Deserialize; + +#[derive(Parser)] +pub struct Args { + /// Template to run + pub template: Option, + + /// Task to run + #[arg(short, long)] + pub task: Option, + + /// Open live session viewer + #[arg(short = 'o', long)] + pub view: bool, + + /// API URL for Steel API + #[arg(short = 'a', long)] + pub api_url: Option, + + /// API Key for Steel API + #[arg(long)] + pub api_key: Option, + + /// API Key for OpenAI + #[arg(long)] + pub openai_key: Option, + + /// API Key for Anthropic + #[arg(long)] + pub anthropic_key: Option, + + /// API Key for Gemini + #[arg(long)] + pub gemini_key: Option, + + /// Skip authentication + #[arg(long)] + pub skip_auth: bool, +} + +#[derive(Deserialize)] +struct Manifest { + examples: Vec, + version: String, +} + +#[derive(Deserialize)] +struct ManifestExample { + slug: String, + title: String, + #[serde(default)] + shorthand: Option, + #[serde(default)] + template: Option, + #[serde(default)] + language: Option, + #[serde(default)] + flags: Vec, + #[serde(default)] + env: Vec, + #[serde(default)] + run: Option, +} + +#[derive(Deserialize)] +struct ManifestEnvVar { + value: String, + label: String, + #[serde(default)] + required: Option, +} + +fn load_manifest() -> anyhow::Result { + let manifest_bytes = include_bytes!("../../manifest.json"); + let manifest: Manifest = serde_json::from_slice(manifest_bytes)?; + Ok(manifest) +} + +pub async fn run(args: Args) -> anyhow::Result<()> { + let manifest = load_manifest()?; + + // Filter to CLI-available templates + let cli_examples: Vec<&ManifestExample> = manifest + .examples + .iter() + .filter(|e| e.flags.contains(&"cli".to_string())) + .collect(); + + if cli_examples.is_empty() { + anyhow::bail!("No templates available."); + } + + // Select template + let example = if let Some(ref template_arg) = args.template { + cli_examples + .iter() + .find(|e| { + e.slug == *template_arg + || e.shorthand.as_deref() == Some(template_arg) + }) + .copied() + .ok_or_else(|| anyhow::anyhow!("Template not found: {template_arg}"))? + } else { + let items: Vec = cli_examples + .iter() + .map(|e| { + let lang = e.language.as_deref().unwrap_or("unknown"); + format!("{} [{}]", e.title, lang) + }) + .collect(); + + let selection = Select::new() + .with_prompt("Select a template to run") + .items(&items) + .default(0) + .interact()?; + + cli_examples[selection] + }; + + // Download template + let Some(ref template_path) = example.template else { + anyhow::bail!("Template '{}' has no run command.", example.slug); + }; + + let download_url = format!( + "https://raw.githubusercontent.com/steel-dev/steel-cookbook/{}/{}", + manifest.version, template_path + ); + + println!("Downloading template '{}'...", example.title); + + let client = reqwest::Client::new(); + let response = client.get(&download_url).send().await?; + + if !response.status().is_success() { + anyhow::bail!("Failed to download template: HTTP {}", response.status()); + } + + let bytes = response.bytes().await?; + + // Extract to temp directory + let tmp_dir = std::env::temp_dir().join(format!("steel-run-{}", example.slug)); + if tmp_dir.exists() { + std::fs::remove_dir_all(&tmp_dir)?; + } + std::fs::create_dir_all(&tmp_dir)?; + + let tmp_archive = tmp_dir.join("template.tar.gz"); + std::fs::write(&tmp_archive, &bytes)?; + + let status = std::process::Command::new("tar") + .args(["xzf", &tmp_archive.to_string_lossy(), "--strip-components=1"]) + .current_dir(&tmp_dir) + .status()?; + + let _ = std::fs::remove_file(&tmp_archive); + + if !status.success() { + anyhow::bail!("Failed to extract template archive."); + } + + // Collect environment variables + let auth = crate::config::auth::resolve_auth(); + let mut env_vars: Vec<(String, String)> = Vec::new(); + + if let Some(ref key) = auth.api_key { + env_vars.push(("STEEL_API_KEY".to_string(), key.clone())); + } + + if let Some(ref task) = args.task { + env_vars.push(("TASK".to_string(), task.clone())); + } + + // Prompt for required env vars that aren't set + for env_var in &example.env { + if env_var.value == "STEEL_API_KEY" || env_var.value == "TASK" { + continue; + } + if std::env::var(&env_var.value).is_ok() { + continue; + } + if env_var.required == Some(true) { + let val: String = dialoguer::Input::new() + .with_prompt(&env_var.label) + .interact_text()?; + env_vars.push((env_var.value.clone(), val)); + } + } + + // Install dependencies and run + println!("Running '{}'...", example.title); + + let run_cmd = example.run.as_deref().unwrap_or( + match example.language.as_deref() { + Some("python") => "pip install -r requirements.txt && python main.py", + _ => "npm install && npm start", + } + ); + + let mut cmd = std::process::Command::new("sh"); + cmd.args(["-c", run_cmd]) + .current_dir(&tmp_dir) + .stdout(std::process::Stdio::inherit()) + .stderr(std::process::Stdio::inherit()); + + for (k, v) in &env_vars { + cmd.env(k, v); + } + + let status = cmd.status()?; + + // Cleanup + let _ = std::fs::remove_dir_all(&tmp_dir); + + if !status.success() { + std::process::exit(status.code().unwrap_or(1)); + } + + Ok(()) +} diff --git a/src/commands/scrape.rs b/src/commands/scrape.rs new file mode 100644 index 0000000..e312d8e --- /dev/null +++ b/src/commands/scrape.rs @@ -0,0 +1,97 @@ +use clap::Parser; + +use crate::api::client::SteelClient; +use crate::api::top_level::{get_scrape_output_text, parse_scrape_formats}; +use crate::config::auth; +use crate::config::settings::{ApiMode, EnvVars}; +use crate::util::url::resolve_tool_url; + +#[derive(Parser)] +pub struct Args { + /// Target URL to scrape + pub url: Option, + + /// Target URL to scrape + #[arg(short = 'u', long = "url")] + pub url_flag: Option, + + /// Comma-separated output formats: html, readability, cleaned_html, markdown + #[arg(long)] + pub format: Option, + + /// Print full JSON response payload + #[arg(long)] + pub raw: bool, + + /// Delay before scraping in milliseconds + #[arg(short, long)] + pub delay: Option, + + /// Include a generated PDF in the response + #[arg(long)] + pub pdf: bool, + + /// Include a generated screenshot in the response + #[arg(long)] + pub screenshot: bool, + + /// Use a Steel-managed residential proxy + #[arg(long)] + pub use_proxy: bool, + + /// Region identifier for request execution + #[arg(short, long)] + pub region: Option, + + /// Send request to local Steel runtime + #[arg(short, long)] + pub local: bool, + + /// Explicit self-hosted API endpoint URL + #[arg(long)] + pub api_url: Option, +} + +pub async fn run(args: Args) -> anyhow::Result<()> { + let url = resolve_tool_url(args.url_flag.as_deref(), args.url.as_deref())?; + + let formats = match &args.format { + Some(f) => parse_scrape_formats(f).map_err(|e| anyhow::anyhow!(e))?, + None => vec!["markdown".into()], + }; + + let mode = ApiMode::resolve(args.local, args.api_url.as_deref()); + let auth = auth::resolve_auth(); + let env_vars = EnvVars::from_env(); + let config = crate::config::settings::read_config().ok(); + let local_config_url = config.as_ref().and_then(|c| c.local_api_url()); + let base_url = mode.resolve_base_url(args.api_url.as_deref(), &env_vars, local_config_url); + + let client = SteelClient::new()?; + let response = client + .scrape( + &base_url, + mode, + &auth, + &url, + &formats, + args.delay, + args.pdf, + args.screenshot, + args.use_proxy, + args.region.as_deref(), + ) + .await?; + + if args.raw { + println!("{}", serde_json::to_string_pretty(&response)?); + return Ok(()); + } + + match get_scrape_output_text(&response, &formats) { + Some(text) => println!("{text}"), + None => println!("{}", serde_json::to_string_pretty(&response)?), + } + + Ok(()) +} diff --git a/src/commands/screenshot.rs b/src/commands/screenshot.rs new file mode 100644 index 0000000..7494c66 --- /dev/null +++ b/src/commands/screenshot.rs @@ -0,0 +1,73 @@ +use clap::Parser; + +use crate::api::client::SteelClient; +use crate::api::top_level::get_hosted_url; +use crate::config::auth; +use crate::config::settings::{ApiMode, EnvVars}; +use crate::util::url::resolve_tool_url; + +#[derive(Parser)] +pub struct Args { + /// Target URL to capture + pub url: Option, + + /// Target URL to capture + #[arg(short = 'u', long = "url")] + pub url_flag: Option, + + /// Delay before capturing in milliseconds + #[arg(short, long)] + pub delay: Option, + + /// Capture a full-page screenshot + #[arg(short = 'f', long)] + pub full_page: bool, + + /// Use a Steel-managed residential proxy + #[arg(long)] + pub use_proxy: bool, + + /// Region identifier for request execution + #[arg(short, long)] + pub region: Option, + + /// Send request to local Steel runtime + #[arg(short, long)] + pub local: bool, + + /// Explicit self-hosted API endpoint URL + #[arg(long)] + pub api_url: Option, +} + +pub async fn run(args: Args) -> anyhow::Result<()> { + let url = resolve_tool_url(args.url_flag.as_deref(), args.url.as_deref())?; + + let mode = ApiMode::resolve(args.local, args.api_url.as_deref()); + let auth = auth::resolve_auth(); + let env_vars = EnvVars::from_env(); + let config = crate::config::settings::read_config().ok(); + let local_config_url = config.as_ref().and_then(|c| c.local_api_url()); + let base_url = mode.resolve_base_url(args.api_url.as_deref(), &env_vars, local_config_url); + + let client = SteelClient::new()?; + let response = client + .screenshot( + &base_url, + mode, + &auth, + &url, + args.delay, + args.full_page, + args.use_proxy, + args.region.as_deref(), + ) + .await?; + + match get_hosted_url(&response) { + Some(hosted_url) => println!("{hosted_url}"), + None => println!("{}", serde_json::to_string_pretty(&response)?), + } + + Ok(()) +} diff --git a/src/commands/settings.rs b/src/commands/settings.rs new file mode 100644 index 0000000..a75c666 --- /dev/null +++ b/src/commands/settings.rs @@ -0,0 +1,48 @@ +use clap::Parser; +use dialoguer::Select; + +#[derive(Parser)] +pub struct Args; + +pub async fn run(_args: Args) -> anyhow::Result<()> { + let config = crate::config::settings::read_config().ok(); + let current_instance = config + .as_ref() + .and_then(|c| c.instance.as_deref()) + .unwrap_or("cloud"); + + let items = vec![ + format!( + "Cloud{}", + if current_instance == "cloud" { + " (current)" + } else { + "" + } + ), + format!( + "Local{}", + if current_instance == "local" { + " (current)" + } else { + "" + } + ), + ]; + + let selection = Select::new() + .with_prompt("Select instance type") + .items(&items) + .default(if current_instance == "local" { 1 } else { 0 }) + .interact()?; + + let value = if selection == 0 { "cloud" } else { "local" }; + + let mut config = crate::config::settings::read_config().unwrap_or_default(); + config.instance = Some(value.to_string()); + crate::config::settings::write_config(&config)?; + + println!("Instance set to: {value}"); + + Ok(()) +} diff --git a/src/commands/star.rs b/src/commands/star.rs new file mode 100644 index 0000000..46cd4e2 --- /dev/null +++ b/src/commands/star.rs @@ -0,0 +1,10 @@ +use clap::Parser; + +#[derive(Parser)] +pub struct Args; + +pub async fn run(_args: Args) -> anyhow::Result<()> { + println!("Opening Repository..."); + open::that("https://github.com/steel-dev/steel-browser")?; + Ok(()) +} diff --git a/src/commands/support.rs b/src/commands/support.rs new file mode 100644 index 0000000..9924dbf --- /dev/null +++ b/src/commands/support.rs @@ -0,0 +1,10 @@ +use clap::Parser; + +#[derive(Parser)] +pub struct Args; + +pub async fn run(_args: Args) -> anyhow::Result<()> { + println!("Opening Discord..."); + open::that("https://discord.com/invite/steel-dev")?; + Ok(()) +} diff --git a/src/commands/update.rs b/src/commands/update.rs new file mode 100644 index 0000000..36d7da5 --- /dev/null +++ b/src/commands/update.rs @@ -0,0 +1,79 @@ +use clap::Parser; + +#[derive(Parser)] +pub struct Args { + /// Force update even if already on latest version + #[arg(short, long)] + pub force: bool, + + /// Only check for updates without installing + #[arg(short, long)] + pub check: bool, +} + +pub async fn run(args: Args) -> anyhow::Result<()> { + println!("Checking for updates..."); + + let client = reqwest::Client::new(); + + // Check npm registry for latest version + let response = client + .get("https://registry.npmjs.org/@steel-dev/cli/latest") + .header("Accept", "application/json") + .send() + .await; + + let current_version = env!("CARGO_PKG_VERSION"); + + let latest_version = match response { + Ok(resp) if resp.status().is_success() => { + let data: serde_json::Value = resp.json().await.unwrap_or_default(); + data.get("version") + .and_then(|v| v.as_str()) + .map(|s| s.to_string()) + } + _ => None, + }; + + let Some(latest) = latest_version else { + println!("Could not check for updates. Please check your network connection."); + return Ok(()); + }; + + if args.check { + if latest != current_version { + println!("Update available!"); + println!("Current: v{current_version}"); + println!("Latest: v{latest}"); + println!("Run `steel update` to update to the latest version."); + } else { + println!("Current version: v{current_version}"); + println!("You're already on the latest version!"); + } + return Ok(()); + } + + if latest == current_version && !args.force { + println!("Current version: v{current_version}"); + println!("You're already on the latest version!"); + return Ok(()); + } + + // Update via npm + let status = std::process::Command::new("npm") + .args(["install", "-g", "@steel-dev/cli@latest"]) + .stdout(std::process::Stdio::inherit()) + .stderr(std::process::Stdio::inherit()) + .status(); + + match status { + Ok(s) if s.success() => { + println!("Updated from v{current_version} to v{latest}"); + } + _ => { + anyhow::bail!("Failed to update. Try running: npm install -g @steel-dev/cli@latest"); + } + } + + Ok(()) +} diff --git a/src/config/auth.rs b/src/config/auth.rs new file mode 100644 index 0000000..0347b58 --- /dev/null +++ b/src/config/auth.rs @@ -0,0 +1,141 @@ +use std::path::Path; + +use crate::config::settings; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum AuthSource { + Env, + Config, + None, +} + +#[derive(Debug, Clone)] +pub struct Auth { + pub api_key: Option, + pub source: AuthSource, +} + +/// Resolve API key with explicit inputs (testable). +/// +/// Priority: env var → config file → none. +/// Matches TS `resolveBrowserAuth()` in `auth.ts`. +pub fn resolve_auth_with( + env_api_key: Option<&str>, + config_api_key: Option<&str>, +) -> Auth { + // 1. STEEL_API_KEY env var + if let Some(key) = env_api_key { + let trimmed = key.trim(); + if !trimmed.is_empty() { + return Auth { + api_key: Some(trimmed.to_string()), + source: AuthSource::Env, + }; + } + } + + // 2. config.json apiKey + if let Some(key) = config_api_key { + let trimmed = key.trim(); + if !trimmed.is_empty() { + return Auth { + api_key: Some(trimmed.to_string()), + source: AuthSource::Config, + }; + } + } + + Auth { + api_key: None, + source: AuthSource::None, + } +} + +/// Read the API key from a config file at the given path. +pub fn read_api_key_from_config(path: &Path) -> Option { + settings::read_config_from(path) + .ok() + .and_then(|c| c.api_key) + .filter(|k| !k.trim().is_empty()) +} + +/// Resolve API key from environment and default config path. +pub fn resolve_auth() -> Auth { + let env_key = std::env::var("STEEL_API_KEY").ok(); + let config_key = read_api_key_from_config(&super::config_path()); + + resolve_auth_with(env_key.as_deref(), config_key.as_deref()) +} + +#[cfg(test)] +mod tests { + use super::*; + use tempfile::TempDir; + + #[test] + fn env_key_takes_priority() { + let auth = resolve_auth_with(Some("env-key"), Some("config-key")); + assert_eq!(auth.api_key.as_deref(), Some("env-key")); + assert_eq!(auth.source, AuthSource::Env); + } + + #[test] + fn falls_back_to_config_key() { + let auth = resolve_auth_with(None, Some("config-key")); + assert_eq!(auth.api_key.as_deref(), Some("config-key")); + assert_eq!(auth.source, AuthSource::Config); + } + + #[test] + fn no_key_returns_none() { + let auth = resolve_auth_with(None, None); + assert_eq!(auth.api_key, None); + assert_eq!(auth.source, AuthSource::None); + } + + #[test] + fn empty_env_key_skipped() { + let auth = resolve_auth_with(Some(" "), Some("config-key")); + assert_eq!(auth.api_key.as_deref(), Some("config-key")); + assert_eq!(auth.source, AuthSource::Config); + } + + #[test] + fn empty_config_key_skipped() { + let auth = resolve_auth_with(None, Some(" ")); + assert_eq!(auth.api_key, None); + assert_eq!(auth.source, AuthSource::None); + } + + #[test] + fn keys_are_trimmed() { + let auth = resolve_auth_with(Some(" trimmed-key "), None); + assert_eq!(auth.api_key.as_deref(), Some("trimmed-key")); + } + + #[test] + fn read_api_key_from_config_file() { + let dir = TempDir::new().unwrap(); + let path = dir.path().join("config.json"); + std::fs::write(&path, r#"{"apiKey": "from-file"}"#).unwrap(); + + assert_eq!(read_api_key_from_config(&path).as_deref(), Some("from-file")); + } + + #[test] + fn read_api_key_missing_file() { + assert_eq!( + read_api_key_from_config(Path::new("/nonexistent/config.json")), + None + ); + } + + #[test] + fn read_api_key_empty_value() { + let dir = TempDir::new().unwrap(); + let path = dir.path().join("config.json"); + std::fs::write(&path, r#"{"apiKey": " "}"#).unwrap(); + + assert_eq!(read_api_key_from_config(&path), None); + } +} diff --git a/src/config/mod.rs b/src/config/mod.rs new file mode 100644 index 0000000..32d19d5 --- /dev/null +++ b/src/config/mod.rs @@ -0,0 +1,69 @@ +pub mod auth; +pub mod session_state; +pub mod settings; + +use std::path::{Path, PathBuf}; + +pub const DEFAULT_API_URL: &str = "https://api.steel.dev/v1"; +pub const DEFAULT_LOCAL_API_URL: &str = "http://localhost:3000/v1"; +pub const LOGIN_URL: &str = "https://app.steel.dev/sign-in"; +pub const SUCCESS_URL: &str = "https://app.steel.dev/sign-in/cli-success"; +pub const API_KEYS_URL: &str = "https://api.steel.dev/v1/api-keys"; +pub const REPO_URL: &str = "https://github.com/steel-dev/steel-browser.git"; + +/// Resolve the Steel config directory. +/// `STEEL_CONFIG_DIR` env var → `~/.config/steel` +pub fn config_dir_with(env_val: Option<&str>) -> PathBuf { + if let Some(dir) = env_val { + let trimmed = dir.trim(); + if !trimmed.is_empty() { + return PathBuf::from(trimmed); + } + } + dirs::home_dir() + .unwrap_or_else(|| PathBuf::from(".")) + .join(".config") + .join("steel") +} + +pub fn config_dir() -> PathBuf { + config_dir_with(std::env::var("STEEL_CONFIG_DIR").ok().as_deref()) +} + +pub fn config_path_in(dir: &Path) -> PathBuf { + dir.join("config.json") +} + +pub fn config_path() -> PathBuf { + config_path_in(&config_dir()) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn config_dir_with_env() { + let dir = config_dir_with(Some("/tmp/steel-test")); + assert_eq!(dir, PathBuf::from("/tmp/steel-test")); + } + + #[test] + fn config_dir_with_empty_env() { + let dir = config_dir_with(Some(" ")); + // Falls back to ~/.config/steel + assert!(dir.ends_with(".config/steel")); + } + + #[test] + fn config_dir_with_none() { + let dir = config_dir_with(None); + assert!(dir.ends_with(".config/steel")); + } + + #[test] + fn config_path_in_dir() { + let path = config_path_in(Path::new("/tmp/steel")); + assert_eq!(path, PathBuf::from("/tmp/steel/config.json")); + } +} diff --git a/src/config/session_state.rs b/src/config/session_state.rs new file mode 100644 index 0000000..78abdf7 --- /dev/null +++ b/src/config/session_state.rs @@ -0,0 +1,496 @@ +use std::collections::HashMap; +use std::path::{Path, PathBuf}; +use std::time::{Duration, SystemTime}; + +use anyhow::{Context, Result, bail}; +use serde::{Deserialize, Serialize}; + +const LOCK_TIMEOUT: Duration = Duration::from_millis(5000); +const LOCK_RETRY: Duration = Duration::from_millis(50); +const LOCK_STALE: Duration = Duration::from_millis(15_000); + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] +pub enum SessionMode { + Cloud, + Local, +} + +/// Persistent session state. Matches TS `BrowserSessionState`. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SessionState { + pub active_session_id: Option, + pub active_session_mode: Option, + pub active_session_name: Option, + pub named_sessions: NamedSessions, + pub updated_at: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize, Default)] +pub struct NamedSessions { + pub cloud: HashMap, + pub local: HashMap, +} + +impl NamedSessions { + pub fn get(&self, mode: SessionMode) -> &HashMap { + match mode { + SessionMode::Cloud => &self.cloud, + SessionMode::Local => &self.local, + } + } + + pub fn get_mut(&mut self, mode: SessionMode) -> &mut HashMap { + match mode { + SessionMode::Cloud => &mut self.cloud, + SessionMode::Local => &mut self.local, + } + } +} + +impl Default for SessionState { + fn default() -> Self { + Self { + active_session_id: None, + active_session_mode: None, + active_session_name: None, + named_sessions: NamedSessions::default(), + updated_at: None, + } + } +} + +impl SessionState { + /// Set the active session. Matches TS `setActiveSessionState()`. + pub fn set_active( + &mut self, + mode: SessionMode, + session_id: &str, + session_name: Option<&str>, + ) { + self.active_session_mode = Some(mode); + self.active_session_id = Some(session_id.to_string()); + self.active_session_name = session_name.map(|s| s.to_string()); + } + + /// Clear the active session. Matches TS `clearActiveSessionState()`. + pub fn clear_active(&mut self, mode: SessionMode, session_id: &str) { + if self.active_session_mode == Some(mode) + && self.active_session_id.as_deref() == Some(session_id) + { + self.active_session_mode = None; + self.active_session_id = None; + self.active_session_name = None; + } + + // Remove from named sessions + self.named_sessions + .get_mut(mode) + .retain(|_, v| v != session_id); + } + + /// Find a candidate session ID. Matches TS `resolveCandidateSessionId()`. + pub fn resolve_candidate( + &self, + mode: SessionMode, + session_name: Option<&str>, + ) -> Option<&str> { + if let Some(name) = session_name { + return self.named_sessions.get(mode).get(name).map(|s| s.as_str()); + } + + if self.active_session_mode == Some(mode) { + return self.active_session_id.as_deref(); + } + + None + } + + /// Find the name for a session ID. Matches TS `resolveNameFromState()`. + pub fn resolve_name(&self, mode: SessionMode, session_id: &str) -> Option<&str> { + for (name, id) in self.named_sessions.get(mode) { + if id == session_id { + return Some(name.as_str()); + } + } + + if self.active_session_mode == Some(mode) + && self.active_session_id.as_deref() == Some(session_id) + { + return self.active_session_name.as_deref(); + } + + None + } +} + +/// File paths for session state storage. +pub struct SessionStatePaths { + pub state_path: PathBuf, + pub lock_path: PathBuf, + pub dir: PathBuf, +} + +impl SessionStatePaths { + pub fn new(config_dir: &Path) -> Self { + let state_path = config_dir.join("browser-session-state.json"); + let lock_path = config_dir.join("browser-session-state.json.lock"); + Self { + state_path, + lock_path, + dir: config_dir.to_path_buf(), + } + } + + pub fn default_paths() -> Self { + Self::new(&crate::config::config_dir()) + } +} + +/// Read session state from disk. Returns default if file doesn't exist or is invalid. +pub fn read_state(path: &Path) -> SessionState { + let contents = match std::fs::read_to_string(path) { + Ok(c) => c, + Err(_) => return SessionState::default(), + }; + + serde_json::from_str(&contents).unwrap_or_default() +} + +/// Write session state to disk. +fn write_state(path: &Path, state: &mut SessionState) -> Result<()> { + state.updated_at = Some(now_iso()); + if let Some(dir) = path.parent() { + std::fs::create_dir_all(dir)?; + } + let contents = serde_json::to_string_pretty(state)?; + std::fs::write(path, contents)?; + Ok(()) +} + +fn now_iso() -> String { + // Simple ISO 8601 timestamp + let now = SystemTime::now() + .duration_since(SystemTime::UNIX_EPOCH) + .unwrap_or_default(); + let secs = now.as_secs(); + // Format as basic ISO string (good enough for state tracking) + format!("{secs}") +} + +/// Acquire an exclusive file lock. Matches TS `acquireLock()`. +fn acquire_lock(lock_path: &Path) -> Result<()> { + let started = std::time::Instant::now(); + + loop { + // Try exclusive create (O_CREAT | O_EXCL) + match std::fs::OpenOptions::new() + .write(true) + .create_new(true) + .open(lock_path) + { + Ok(_) => return Ok(()), + Err(e) if e.kind() == std::io::ErrorKind::AlreadyExists => { + // Check if lock is stale + if let Ok(metadata) = std::fs::metadata(lock_path) { + if let Ok(modified) = metadata.modified() { + if let Ok(age) = SystemTime::now().duration_since(modified) { + if age > LOCK_STALE { + let _ = std::fs::remove_file(lock_path); + continue; + } + } + } + } + + if started.elapsed() >= LOCK_TIMEOUT { + bail!("Timed out waiting for browser session state lock."); + } + + std::thread::sleep(LOCK_RETRY); + } + Err(e) => { + return Err(e).context("Failed to acquire session state lock"); + } + } + } +} + +/// Release the file lock. +fn release_lock(lock_path: &Path) { + let _ = std::fs::remove_file(lock_path); +} + +/// Execute an operation under the session state lock. +/// Matches TS `withSessionStateLock()`. +/// +/// If `write` is true (default), the state is written back after the operation. +pub fn with_lock(paths: &SessionStatePaths, write: bool, operation: F) -> Result +where + F: FnOnce(&mut SessionState) -> T, +{ + std::fs::create_dir_all(&paths.dir)?; + acquire_lock(&paths.lock_path)?; + + let result = (|| { + let mut state = read_state(&paths.state_path); + let result = operation(&mut state); + if write { + write_state(&paths.state_path, &mut state)?; + } + Ok(result) + })(); + + release_lock(&paths.lock_path); + result +} + +#[cfg(test)] +mod tests { + use super::*; + use tempfile::TempDir; + + fn tmp_paths() -> (TempDir, SessionStatePaths) { + let dir = TempDir::new().unwrap(); + let paths = SessionStatePaths::new(dir.path()); + (dir, paths) + } + + // --- SessionState unit tests --- + + #[test] + fn default_state() { + let state = SessionState::default(); + assert!(state.active_session_id.is_none()); + assert!(state.active_session_mode.is_none()); + assert!(state.named_sessions.cloud.is_empty()); + assert!(state.named_sessions.local.is_empty()); + } + + #[test] + fn set_and_resolve_active() { + let mut state = SessionState::default(); + state.set_active(SessionMode::Cloud, "sess-1", Some("work")); + + assert_eq!(state.active_session_id.as_deref(), Some("sess-1")); + assert_eq!(state.active_session_mode, Some(SessionMode::Cloud)); + assert_eq!(state.active_session_name.as_deref(), Some("work")); + } + + #[test] + fn clear_active_matching() { + let mut state = SessionState::default(); + state.set_active(SessionMode::Cloud, "sess-1", Some("work")); + state + .named_sessions + .cloud + .insert("work".into(), "sess-1".into()); + + state.clear_active(SessionMode::Cloud, "sess-1"); + + assert!(state.active_session_id.is_none()); + assert!(state.named_sessions.cloud.is_empty()); + } + + #[test] + fn clear_active_non_matching_mode_preserved() { + let mut state = SessionState::default(); + state.set_active(SessionMode::Cloud, "sess-1", None); + + state.clear_active(SessionMode::Local, "sess-1"); + + assert_eq!(state.active_session_id.as_deref(), Some("sess-1")); + } + + #[test] + fn resolve_candidate_by_name() { + let mut state = SessionState::default(); + state + .named_sessions + .cloud + .insert("work".into(), "sess-1".into()); + + assert_eq!( + state.resolve_candidate(SessionMode::Cloud, Some("work")), + Some("sess-1") + ); + assert_eq!( + state.resolve_candidate(SessionMode::Cloud, Some("missing")), + None + ); + } + + #[test] + fn resolve_candidate_by_active() { + let mut state = SessionState::default(); + state.set_active(SessionMode::Local, "sess-2", None); + + assert_eq!( + state.resolve_candidate(SessionMode::Local, None), + Some("sess-2") + ); + assert_eq!(state.resolve_candidate(SessionMode::Cloud, None), None); + } + + #[test] + fn resolve_name_from_named_sessions() { + let mut state = SessionState::default(); + state + .named_sessions + .cloud + .insert("work".into(), "sess-1".into()); + + assert_eq!( + state.resolve_name(SessionMode::Cloud, "sess-1"), + Some("work") + ); + assert_eq!(state.resolve_name(SessionMode::Cloud, "other"), None); + } + + #[test] + fn resolve_name_falls_back_to_active() { + let mut state = SessionState::default(); + state.set_active(SessionMode::Cloud, "sess-1", Some("dev")); + + assert_eq!( + state.resolve_name(SessionMode::Cloud, "sess-1"), + Some("dev") + ); + } + + // --- Serialization --- + + #[test] + fn state_json_roundtrip() { + let mut state = SessionState::default(); + state.set_active(SessionMode::Cloud, "abc-123", Some("main")); + state + .named_sessions + .cloud + .insert("main".into(), "abc-123".into()); + + let json = serde_json::to_string_pretty(&state).unwrap(); + let parsed: SessionState = serde_json::from_str(&json).unwrap(); + + assert_eq!(parsed.active_session_id.as_deref(), Some("abc-123")); + assert_eq!(parsed.active_session_mode, Some(SessionMode::Cloud)); + assert_eq!( + parsed.named_sessions.cloud.get("main").map(|s| s.as_str()), + Some("abc-123") + ); + } + + #[test] + fn state_reads_ts_camel_case() { + let json = r#"{ + "activeSessionId": "s1", + "activeSessionMode": "local", + "activeSessionName": "test", + "namedSessions": { + "cloud": {}, + "local": {"test": "s1"} + }, + "updatedAt": "2025-01-01T00:00:00.000Z" + }"#; + + let state: SessionState = serde_json::from_str(json).unwrap(); + assert_eq!(state.active_session_id.as_deref(), Some("s1")); + assert_eq!(state.active_session_mode, Some(SessionMode::Local)); + assert_eq!( + state.named_sessions.local.get("test").map(|s| s.as_str()), + Some("s1") + ); + } + + #[test] + fn read_state_missing_file() { + let state = read_state(Path::new("/nonexistent/state.json")); + assert!(state.active_session_id.is_none()); + } + + #[test] + fn read_state_invalid_json() { + let dir = TempDir::new().unwrap(); + let path = dir.path().join("state.json"); + std::fs::write(&path, "not json").unwrap(); + + let state = read_state(&path); + assert!(state.active_session_id.is_none()); + } + + // --- File lock --- + + #[test] + fn with_lock_read_only() { + let (_dir, paths) = tmp_paths(); + + let result = with_lock(&paths, false, |state| { + state + .resolve_candidate(SessionMode::Cloud, None) + .map(|s| s.to_string()) + }) + .unwrap(); + + assert_eq!(result, None); + assert!(!paths.state_path.exists()); + } + + #[test] + fn with_lock_write() { + let (_dir, paths) = tmp_paths(); + + with_lock(&paths, true, |state| { + state.set_active(SessionMode::Cloud, "sess-1", Some("work")); + state + .named_sessions + .cloud + .insert("work".into(), "sess-1".into()); + }) + .unwrap(); + + let state = read_state(&paths.state_path); + assert_eq!(state.active_session_id.as_deref(), Some("sess-1")); + assert_eq!( + state.named_sessions.cloud.get("work").map(|s| s.as_str()), + Some("sess-1") + ); + } + + #[test] + fn lock_released_after_operation() { + let (_dir, paths) = tmp_paths(); + + with_lock(&paths, true, |state| { + state.set_active(SessionMode::Local, "s1", None); + }) + .unwrap(); + + assert!(!paths.lock_path.exists()); + + // Second lock should succeed + with_lock(&paths, false, |_| {}).unwrap(); + } + + #[test] + fn state_persists_across_calls() { + let (_dir, paths) = tmp_paths(); + + with_lock(&paths, true, |state| { + state + .named_sessions + .local + .insert("dev".into(), "sess-a".into()); + }) + .unwrap(); + + let id = with_lock(&paths, false, |state| { + state + .resolve_candidate(SessionMode::Local, Some("dev")) + .map(|s| s.to_string()) + }) + .unwrap(); + + assert_eq!(id.as_deref(), Some("sess-a")); + } +} diff --git a/src/config/settings.rs b/src/config/settings.rs new file mode 100644 index 0000000..2d8e559 --- /dev/null +++ b/src/config/settings.rs @@ -0,0 +1,322 @@ +use std::path::Path; + +use anyhow::Result; +use serde::{Deserialize, Serialize}; + +use crate::config::{DEFAULT_API_URL, DEFAULT_LOCAL_API_URL}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum ApiMode { + Cloud, + Local, +} + +impl ApiMode { + /// Resolve the base URL for API requests. + /// + /// Priority: explicit `--api-url` → env var → config → default. + /// Matches TS `resolveApiBaseUrl()` in `apiConfig.ts`. + pub fn resolve_base_url( + &self, + explicit_url: Option<&str>, + env_vars: &EnvVars, + local_config_url: Option<&str>, + ) -> String { + if let Some(url) = explicit_url { + return normalize_api_url(url); + } + + match self { + ApiMode::Cloud => { + let url = env_vars + .steel_api_url + .as_deref() + .filter(|s| !s.trim().is_empty()) + .unwrap_or(DEFAULT_API_URL); + normalize_api_url(url) + } + ApiMode::Local => { + // STEEL_BROWSER_API_URL → STEEL_LOCAL_API_URL → config → default + let url = env_vars + .steel_browser_api_url + .as_deref() + .filter(|s| !s.trim().is_empty()) + .or_else(|| { + env_vars + .steel_local_api_url + .as_deref() + .filter(|s| !s.trim().is_empty()) + }) + .or_else(|| local_config_url.filter(|s| !s.trim().is_empty())) + .unwrap_or(DEFAULT_LOCAL_API_URL); + normalize_api_url(url) + } + } + } + + /// Determine mode from CLI flags. + /// Matches TS `resolveSessionMode()` / `resolveMode()`. + pub fn resolve(local: bool, api_url: Option<&str>) -> Self { + if local { + return ApiMode::Local; + } + if api_url.is_some() { + return ApiMode::Local; + } + ApiMode::Cloud + } +} + +/// Env vars relevant to API URL resolution (injectable for testing). +#[derive(Debug, Default)] +pub struct EnvVars { + pub steel_api_url: Option, + pub steel_browser_api_url: Option, + pub steel_local_api_url: Option, +} + +impl EnvVars { + pub fn from_env() -> Self { + Self { + steel_api_url: std::env::var("STEEL_API_URL").ok(), + steel_browser_api_url: std::env::var("STEEL_BROWSER_API_URL").ok(), + steel_local_api_url: std::env::var("STEEL_LOCAL_API_URL").ok(), + } + } +} + +fn normalize_api_url(url: &str) -> String { + url.trim_end_matches('/').to_string() +} + +#[derive(Debug, Serialize, Deserialize, Default, Clone)] +#[serde(rename_all = "camelCase")] +pub struct Config { + #[serde(skip_serializing_if = "Option::is_none")] + pub api_key: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub instance: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub browser: Option, +} + +#[derive(Debug, Serialize, Deserialize, Default, Clone)] +#[serde(rename_all = "camelCase")] +pub struct BrowserConfig { + #[serde(skip_serializing_if = "Option::is_none")] + pub api_url: Option, +} + +impl Config { + /// Extract the local API URL from config.browser.apiUrl + pub fn local_api_url(&self) -> Option<&str> { + self.browser + .as_ref() + .and_then(|b| b.api_url.as_deref()) + .filter(|s| !s.trim().is_empty()) + } +} + +pub fn read_config_from(path: &Path) -> Result { + let contents = std::fs::read_to_string(path)?; + let config: Config = serde_json::from_str(&contents)?; + Ok(config) +} + +pub fn read_config() -> Result { + read_config_from(&super::config_path()) +} + +pub fn write_config_to(path: &Path, config: &Config) -> Result<()> { + if let Some(dir) = path.parent() { + std::fs::create_dir_all(dir)?; + } + let contents = serde_json::to_string_pretty(config)?; + std::fs::write(path, contents)?; + Ok(()) +} + +pub fn write_config(config: &Config) -> Result<()> { + write_config_to(&super::config_path(), config) +} + +#[cfg(test)] +mod tests { + use super::*; + use tempfile::TempDir; + + #[test] + fn config_roundtrip() { + let dir = TempDir::new().unwrap(); + let path = dir.path().join("config.json"); + + let config = Config { + api_key: Some("sk-test-123".into()), + name: Some("CLI".into()), + instance: Some("cloud".into()), + browser: Some(BrowserConfig { + api_url: Some("http://localhost:4000/v1".into()), + }), + }; + + write_config_to(&path, &config).unwrap(); + let loaded = read_config_from(&path).unwrap(); + + assert_eq!(loaded.api_key.as_deref(), Some("sk-test-123")); + assert_eq!(loaded.name.as_deref(), Some("CLI")); + assert_eq!(loaded.instance.as_deref(), Some("cloud")); + assert_eq!(loaded.local_api_url(), Some("http://localhost:4000/v1")); + } + + #[test] + fn config_camel_case_serialization() { + let config = Config { + api_key: Some("key".into()), + ..Default::default() + }; + let json = serde_json::to_string(&config).unwrap(); + assert!(json.contains("apiKey")); + assert!(!json.contains("api_key")); + } + + #[test] + fn config_reads_camel_case_json() { + let dir = TempDir::new().unwrap(); + let path = dir.path().join("config.json"); + std::fs::write( + &path, + r#"{"apiKey":"k","name":"n","instance":"cloud","browser":{"apiUrl":"http://x"}}"#, + ) + .unwrap(); + + let config = read_config_from(&path).unwrap(); + assert_eq!(config.api_key.as_deref(), Some("k")); + assert_eq!(config.local_api_url(), Some("http://x")); + } + + #[test] + fn config_missing_file_returns_error() { + let result = read_config_from(Path::new("/nonexistent/config.json")); + assert!(result.is_err()); + } + + #[test] + fn config_empty_fields_not_serialized() { + let config = Config::default(); + let json = serde_json::to_string(&config).unwrap(); + assert_eq!(json, "{}"); + } + + #[test] + fn local_api_url_empty_string_returns_none() { + let config = Config { + browser: Some(BrowserConfig { + api_url: Some(" ".into()), + }), + ..Default::default() + }; + assert_eq!(config.local_api_url(), None); + } + + // --- ApiMode tests --- + + #[test] + fn resolve_mode_default_is_cloud() { + assert_eq!(ApiMode::resolve(false, None), ApiMode::Cloud); + } + + #[test] + fn resolve_mode_local_flag() { + assert_eq!(ApiMode::resolve(true, None), ApiMode::Local); + } + + #[test] + fn resolve_mode_api_url_implies_local() { + assert_eq!( + ApiMode::resolve(false, Some("http://localhost:3000")), + ApiMode::Local + ); + } + + #[test] + fn cloud_base_url_default() { + let env = EnvVars::default(); + let url = ApiMode::Cloud.resolve_base_url(None, &env, None); + assert_eq!(url, "https://api.steel.dev/v1"); + } + + #[test] + fn cloud_base_url_from_env() { + let env = EnvVars { + steel_api_url: Some("https://custom.api.dev/v1/".into()), + ..Default::default() + }; + let url = ApiMode::Cloud.resolve_base_url(None, &env, None); + assert_eq!(url, "https://custom.api.dev/v1"); + } + + #[test] + fn cloud_base_url_explicit_overrides_env() { + let env = EnvVars { + steel_api_url: Some("https://from-env.dev/".into()), + ..Default::default() + }; + let url = ApiMode::Cloud.resolve_base_url(Some("https://explicit.dev/v1/"), &env, None); + assert_eq!(url, "https://explicit.dev/v1"); + } + + #[test] + fn local_base_url_default() { + let env = EnvVars::default(); + let url = ApiMode::Local.resolve_base_url(None, &env, None); + assert_eq!(url, "http://localhost:3000/v1"); + } + + #[test] + fn local_base_url_browser_api_url_takes_priority() { + let env = EnvVars { + steel_browser_api_url: Some("http://browser:4000/v1".into()), + steel_local_api_url: Some("http://local:5000/v1".into()), + ..Default::default() + }; + let url = ApiMode::Local.resolve_base_url(None, &env, None); + assert_eq!(url, "http://browser:4000/v1"); + } + + #[test] + fn local_base_url_falls_to_local_env() { + let env = EnvVars { + steel_local_api_url: Some("http://local:5000/v1".into()), + ..Default::default() + }; + let url = ApiMode::Local.resolve_base_url(None, &env, None); + assert_eq!(url, "http://local:5000/v1"); + } + + #[test] + fn local_base_url_falls_to_config() { + let env = EnvVars::default(); + let url = ApiMode::Local.resolve_base_url(None, &env, Some("http://from-config:6000/v1")); + assert_eq!(url, "http://from-config:6000/v1"); + } + + #[test] + fn local_base_url_empty_env_skipped() { + let env = EnvVars { + steel_browser_api_url: Some(" ".into()), + steel_local_api_url: Some("".into()), + ..Default::default() + }; + let url = ApiMode::Local.resolve_base_url(None, &env, None); + assert_eq!(url, "http://localhost:3000/v1"); + } + + #[test] + fn trailing_slashes_stripped() { + let env = EnvVars::default(); + let url = ApiMode::Cloud.resolve_base_url(Some("https://api.dev///"), &env, None); + assert_eq!(url, "https://api.dev"); + } +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..52b734d --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,5 @@ +pub mod api; +pub mod browser; +pub mod commands; +pub mod config; +pub mod util; diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..48bda1d --- /dev/null +++ b/src/main.rs @@ -0,0 +1,8 @@ +use clap::Parser; +use steel_cli::commands::{self, Cli}; + +#[tokio::main] +async fn main() -> anyhow::Result<()> { + let cli = Cli::parse(); + commands::run(cli).await +} diff --git a/src/util/mod.rs b/src/util/mod.rs new file mode 100644 index 0000000..da83769 --- /dev/null +++ b/src/util/mod.rs @@ -0,0 +1,2 @@ +pub mod output; +pub mod url; diff --git a/src/util/output.rs b/src/util/output.rs new file mode 100644 index 0000000..ff61fd6 --- /dev/null +++ b/src/util/output.rs @@ -0,0 +1 @@ +// JSON/human-readable output formatting diff --git a/src/util/url.rs b/src/util/url.rs new file mode 100644 index 0000000..026d861 --- /dev/null +++ b/src/util/url.rs @@ -0,0 +1,158 @@ +//! URL normalization with https fallback. +//! Ported from: cli/source/utils/topLevelTools.ts (resolveTopLevelToolUrl, normalizeUrlWithHttpsFallback) + +use url::Url; + +/// Check if the URL already has a protocol. +fn has_explicit_protocol(input: &str) -> bool { + let lower = input.to_lowercase(); + lower.contains("://") + || lower.starts_with("about:") + || lower.starts_with("data:") + || lower.starts_with("file:") + || lower.starts_with("blob:") + || lower.starts_with("javascript:") +} + +/// Check if the input looks like a hostname without protocol. +fn looks_like_host(input: &str) -> bool { + let host = input.split('/').next().unwrap_or(""); + let lower = host.to_lowercase(); + + lower == "localhost" + || lower.starts_with("localhost:") + || (lower.starts_with('[') && lower.contains(']')) + || is_ipv4_like(&lower) + || host.contains('.') +} + +fn is_ipv4_like(s: &str) -> bool { + // Simple check: digits and dots, optionally with port + let (host_part, _) = s.split_once(':').unwrap_or((s, "")); + let parts: Vec<&str> = host_part.split('.').collect(); + parts.len() == 4 && parts.iter().all(|p| p.parse::().is_ok()) +} + +/// Normalize a URL by prepending https:// if missing. +/// Matches TS `normalizeUrlWithHttpsFallback()`. +pub fn normalize_url(input: &str) -> String { + let trimmed = input.trim(); + if trimmed.is_empty() || has_explicit_protocol(trimmed) || !looks_like_host(trimmed) { + return trimmed.to_string(); + } + + let candidate = format!("https://{trimmed}"); + match Url::parse(&candidate) { + Ok(_) => candidate, + Err(_) => trimmed.to_string(), + } +} + +/// Resolve a URL from positional arg or --url flag. +/// Matches TS `resolveTopLevelToolUrl()`. +pub fn resolve_tool_url(url_flag: Option<&str>, url_arg: Option<&str>) -> anyhow::Result { + let candidate = url_flag + .or(url_arg) + .map(|s| s.trim()) + .filter(|s| !s.is_empty()) + .ok_or_else(|| { + anyhow::anyhow!( + "Missing URL. Provide a target URL as the first argument or with --url." + ) + })?; + + let normalized = normalize_url(candidate); + + // Validate it's a proper URL + Url::parse(&normalized).map_err(|_| anyhow::anyhow!("Invalid URL: {candidate}"))?; + + Ok(normalized) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn normalize_adds_https() { + assert_eq!(normalize_url("example.com"), "https://example.com"); + } + + #[test] + fn normalize_preserves_https() { + assert_eq!(normalize_url("https://example.com"), "https://example.com"); + } + + #[test] + fn normalize_preserves_http() { + assert_eq!(normalize_url("http://example.com"), "http://example.com"); + } + + #[test] + fn normalize_localhost() { + assert_eq!(normalize_url("localhost:3000"), "https://localhost:3000"); + } + + #[test] + fn normalize_ip_address() { + assert_eq!( + normalize_url("192.168.1.1:8080"), + "https://192.168.1.1:8080" + ); + } + + #[test] + fn normalize_with_path() { + assert_eq!( + normalize_url("example.com/path"), + "https://example.com/path" + ); + } + + #[test] + fn normalize_empty_returns_empty() { + assert_eq!(normalize_url(""), ""); + } + + #[test] + fn normalize_trims_whitespace() { + assert_eq!(normalize_url(" example.com "), "https://example.com"); + } + + #[test] + fn normalize_preserves_about() { + assert_eq!(normalize_url("about:blank"), "about:blank"); + } + + #[test] + fn normalize_no_dot_passthrough() { + // "foobar" doesn't look like a host + assert_eq!(normalize_url("foobar"), "foobar"); + } + + // --- resolve_tool_url --- + + #[test] + fn resolve_from_arg() { + let url = resolve_tool_url(None, Some("example.com")).unwrap(); + assert_eq!(url, "https://example.com"); + } + + #[test] + fn resolve_flag_takes_priority() { + let url = resolve_tool_url(Some("a.com"), Some("b.com")).unwrap(); + assert_eq!(url, "https://a.com"); + } + + #[test] + fn resolve_missing_url_error() { + let err = resolve_tool_url(None, None).unwrap_err(); + assert!(err.to_string().contains("Missing URL")); + } + + #[test] + fn resolve_empty_url_error() { + let err = resolve_tool_url(Some(" "), None).unwrap_err(); + assert!(err.to_string().contains("Missing URL")); + } +} diff --git a/tests/cli_compat.rs b/tests/cli_compat.rs new file mode 100644 index 0000000..60d861e --- /dev/null +++ b/tests/cli_compat.rs @@ -0,0 +1,603 @@ +//! Contract tests: verify that Rust CLI flags are 100% compatible with the TypeScript CLI. +//! +//! Each test defines the expected flags (extracted from TS source) and asserts +//! that the Rust clap parser exposes exactly those flags with correct names, +//! short aliases, and required/optional status. + +use clap::{ArgAction, Command, CommandFactory}; + +// Re-use the clap-derived structs from the binary. +// We need CommandFactory to introspect without running. +use steel_cli::commands; + +/// Describes a single CLI flag as defined in the TypeScript source. +#[derive(Debug)] +struct ExpectedFlag { + /// Long name on the CLI (e.g., "use-proxy") + long: &'static str, + /// Short alias character, if any (e.g., 'u') + short: Option, + /// Whether the flag is required (clap will reject the command without it) + required: bool, + /// Whether the flag takes a value (true) or is a boolean switch (false) + takes_value: bool, +} + +fn flag(long: &'static str) -> ExpectedFlag { + ExpectedFlag { + long, + short: None, + required: false, + takes_value: false, + } +} + +fn flag_val(long: &'static str) -> ExpectedFlag { + ExpectedFlag { + long, + short: None, + required: false, + takes_value: true, + } +} + +fn flag_short(long: &'static str, short: char) -> ExpectedFlag { + ExpectedFlag { + long, + short: Some(short), + required: false, + takes_value: false, + } +} + +fn flag_val_short(long: &'static str, short: char) -> ExpectedFlag { + ExpectedFlag { + long, + short: Some(short), + required: false, + takes_value: true, + } +} + +/// Assert that a clap Command has exactly the expected flags. +fn assert_flags(cmd: &Command, expected: &[ExpectedFlag], cmd_name: &str) { + // Collect actual flags (skip "help" and "version" — clap adds those automatically) + let skip = ["help", "version", "no-update-check"]; + + let actual_args: Vec<_> = cmd + .get_arguments() + .filter(|a| !skip.contains(&a.get_id().as_str())) + .filter(|a| a.get_long().is_some()) // skip positional args + .collect(); + + // Check each expected flag exists + for ef in expected { + let actual = actual_args + .iter() + .find(|a| a.get_long().map(|l| l == ef.long).unwrap_or(false)); + + let actual = match actual { + Some(a) => a, + None => { + panic!("[{cmd_name}] Missing expected flag --{}", ef.long); + } + }; + + // Check short alias + let actual_short = actual.get_short(); + assert_eq!( + actual_short, ef.short, + "[{cmd_name}] --{}: expected short={:?}, got short={:?}", + ef.long, ef.short, actual_short + ); + + // Check required + let actual_required = actual.is_required_set(); + assert_eq!( + actual_required, ef.required, + "[{cmd_name}] --{}: expected required={}, got required={}", + ef.long, ef.required, actual_required + ); + + // Check takes_value via action type (Set/Append take values; SetTrue/SetFalse/Count don't) + let actual_takes_value = matches!(actual.get_action(), ArgAction::Set | ArgAction::Append); + assert_eq!( + actual_takes_value, ef.takes_value, + "[{cmd_name}] --{}: expected takes_value={}, got takes_value={}", + ef.long, ef.takes_value, actual_takes_value + ); + } + + // Check no unexpected flags + for actual in &actual_args { + let long = actual.get_long().unwrap_or(""); + let found = expected.iter().any(|ef| ef.long == long); + if !found { + panic!("[{cmd_name}] Unexpected flag --{long} not in TypeScript CLI"); + } + } +} + +/// Get a subcommand from the top-level CLI command. +fn get_subcommand(root: &Command, path: &[&str]) -> Command { + let mut cmd = root.clone(); + for name in path { + let next = cmd + .get_subcommands() + .find(|s| s.get_name() == *name) + .unwrap_or_else(|| panic!("subcommand '{}' not found", name)) + .clone(); + cmd = next; + } + cmd +} + +// ─── Tests ─────────────────────────────────────────────────────────────────── + +fn root_cmd() -> Command { + commands::Cli::command() +} + +/// Verify the complete subcommand tree matches the TypeScript CLI. +#[test] +fn subcommand_tree_matches_ts() { + let root = root_cmd(); + let top_level: Vec<&str> = root + .get_subcommands() + .map(|s| s.get_name()) + .filter(|n| *n != "help") + .collect(); + + let expected_top = vec![ + "scrape", + "screenshot", + "pdf", + "browser", + "login", + "logout", + "credentials", + "dev", + "forge", + "run", + "config", + "update", + "cache", + "docs", + "star", + "support", + "settings", + ]; + + for name in &expected_top { + assert!( + top_level.contains(name), + "Missing top-level command: {name}" + ); + } + for name in &top_level { + assert!( + expected_top.contains(name), + "Unexpected top-level command: {name}" + ); + } + + // browser subcommands + let browser = get_subcommand(&root, &["browser"]); + let browser_subs: Vec<&str> = browser + .get_subcommands() + .map(|s| s.get_name()) + .filter(|n| *n != "help") + .collect(); + let expected_browser = vec!["start", "stop", "sessions", "live", "captcha"]; + for name in &expected_browser { + assert!( + browser_subs.contains(name), + "Missing browser subcommand: {name}" + ); + } + for name in &browser_subs { + assert!( + expected_browser.contains(name), + "Unexpected browser subcommand: {name}" + ); + } + + // browser captcha subcommands + let captcha = get_subcommand(&root, &["browser", "captcha"]); + let captcha_subs: Vec<&str> = captcha + .get_subcommands() + .map(|s| s.get_name()) + .filter(|n| *n != "help") + .collect(); + let expected_captcha = vec!["solve", "status"]; + for name in &expected_captcha { + assert!( + captcha_subs.contains(name), + "Missing captcha subcommand: {name}" + ); + } + for name in &captcha_subs { + assert!( + expected_captcha.contains(name), + "Unexpected captcha subcommand: {name}" + ); + } + + // credentials subcommands + let creds = get_subcommand(&root, &["credentials"]); + let creds_subs: Vec<&str> = creds + .get_subcommands() + .map(|s| s.get_name()) + .filter(|n| *n != "help") + .collect(); + let expected_creds = vec!["list", "create", "update", "delete"]; + for name in &expected_creds { + assert!( + creds_subs.contains(name), + "Missing credentials subcommand: {name}" + ); + } + for name in &creds_subs { + assert!( + expected_creds.contains(name), + "Unexpected credentials subcommand: {name}" + ); + } + + // dev subcommands + let dev = get_subcommand(&root, &["dev"]); + let dev_subs: Vec<&str> = dev + .get_subcommands() + .map(|s| s.get_name()) + .filter(|n| *n != "help") + .collect(); + let expected_dev = vec!["install", "start", "stop"]; + for name in &expected_dev { + assert!( + dev_subs.contains(name), + "Missing dev subcommand: {name}" + ); + } + for name in &dev_subs { + assert!( + expected_dev.contains(name), + "Unexpected dev subcommand: {name}" + ); + } +} + +#[test] +fn scrape_flags() { + let cmd = get_subcommand(&root_cmd(), &["scrape"]); + assert_flags( + &cmd, + &[ + // positional `url` is not a flag + flag_val_short("url", 'u'), + flag_val("format"), + flag("raw"), + flag_val_short("delay", 'd'), + flag("pdf"), + flag("screenshot"), + flag("use-proxy"), + flag_val_short("region", 'r'), + flag_short("local", 'l'), + flag_val("api-url"), + ], + "scrape", + ); +} + +#[test] +fn screenshot_flags() { + let cmd = get_subcommand(&root_cmd(), &["screenshot"]); + assert_flags( + &cmd, + &[ + flag_val_short("url", 'u'), + flag_val_short("delay", 'd'), + flag_short("full-page", 'f'), + flag("use-proxy"), + flag_val_short("region", 'r'), + flag_short("local", 'l'), + flag_val("api-url"), + ], + "screenshot", + ); +} + +#[test] +fn pdf_flags() { + let cmd = get_subcommand(&root_cmd(), &["pdf"]); + assert_flags( + &cmd, + &[ + flag_val_short("url", 'u'), + flag_val_short("delay", 'd'), + flag("use-proxy"), + flag_val_short("region", 'r'), + flag_short("local", 'l'), + flag_val("api-url"), + ], + "pdf", + ); +} + +#[test] +fn browser_start_flags() { + let cmd = get_subcommand(&root_cmd(), &["browser", "start"]); + assert_flags( + &cmd, + &[ + flag_val_short("session", 's'), + flag_short("local", 'l'), + flag_val("api-url"), + flag("stealth"), + flag_val_short("proxy", 'p'), + flag_val("session-timeout"), + flag_val("session-headless"), + flag_val("session-region"), + flag("session-solve-captcha"), + flag_val("namespace"), + flag("credentials"), + ], + "browser start", + ); +} + +#[test] +fn browser_stop_flags() { + let cmd = get_subcommand(&root_cmd(), &["browser", "stop"]); + assert_flags( + &cmd, + &[ + flag_val_short("session", 's'), + flag_short("all", 'a'), + flag_short("local", 'l'), + flag_val("api-url"), + ], + "browser stop", + ); +} + +#[test] +fn browser_sessions_flags() { + let cmd = get_subcommand(&root_cmd(), &["browser", "sessions"]); + assert_flags( + &cmd, + &[flag_short("local", 'l'), flag_val("api-url"), flag("raw")], + "browser sessions", + ); +} + +#[test] +fn browser_live_flags() { + let cmd = get_subcommand(&root_cmd(), &["browser", "live"]); + assert_flags( + &cmd, + &[ + flag_val_short("session", 's'), + flag_short("local", 'l'), + flag_val("api-url"), + ], + "browser live", + ); +} + +#[test] +fn browser_captcha_solve_flags() { + let cmd = get_subcommand(&root_cmd(), &["browser", "captcha", "solve"]); + assert_flags( + &cmd, + &[ + flag_val_short("session", 's'), + flag_val("session-id"), + flag_val("page-id"), + flag_val("url"), + flag_val("task-id"), + flag("raw"), + flag_short("local", 'l'), + flag_val("api-url"), + ], + "browser captcha solve", + ); +} + +#[test] +fn browser_captcha_status_flags() { + let cmd = get_subcommand(&root_cmd(), &["browser", "captcha", "status"]); + assert_flags( + &cmd, + &[ + flag_val_short("session", 's'), + flag_val("session-id"), + flag_val("page-id"), + flag_short("wait", 'w'), + flag_val("timeout"), + flag_val("interval"), + flag("raw"), + flag_short("local", 'l'), + flag_val("api-url"), + ], + "browser captcha status", + ); +} + +#[test] +fn credentials_list_flags() { + let cmd = get_subcommand(&root_cmd(), &["credentials", "list"]); + assert_flags( + &cmd, + &[ + flag_val_short("namespace", 'n'), + flag_val("origin"), + flag_short("local", 'l'), + flag_val("api-url"), + ], + "credentials list", + ); +} + +#[test] +fn credentials_create_flags() { + let cmd = get_subcommand(&root_cmd(), &["credentials", "create"]); + assert_flags( + &cmd, + &[ + flag_val("origin"), + flag_val_short("username", 'u'), + flag_val_short("password", 'p'), + flag_val("totp-secret"), + flag_val_short("namespace", 'n'), + flag_val("label"), + flag_short("local", 'l'), + flag_val("api-url"), + ], + "credentials create", + ); +} + +#[test] +fn credentials_update_flags() { + let cmd = get_subcommand(&root_cmd(), &["credentials", "update"]); + assert_flags( + &cmd, + &[ + flag_val("origin"), + flag_val_short("username", 'u'), + flag_val_short("password", 'p'), + flag_val("totp-secret"), + flag_val_short("namespace", 'n'), + flag_val("label"), + flag_short("local", 'l'), + flag_val("api-url"), + ], + "credentials update", + ); +} + +#[test] +fn credentials_delete_flags() { + let cmd = get_subcommand(&root_cmd(), &["credentials", "delete"]); + assert_flags( + &cmd, + &[ + flag_val("origin"), + flag_val_short("namespace", 'n'), + flag_short("local", 'l'), + flag_val("api-url"), + ], + "credentials delete", + ); +} + +#[test] +fn dev_install_flags() { + let cmd = get_subcommand(&root_cmd(), &["dev", "install"]); + assert_flags( + &cmd, + &[flag_val("repo-url"), flag_short("verbose", 'V')], + "dev install", + ); +} + +#[test] +fn dev_start_flags() { + let cmd = get_subcommand(&root_cmd(), &["dev", "start"]); + assert_flags( + &cmd, + &[ + flag_val_short("port", 'p'), + flag_short("verbose", 'V'), + flag_short("docker-check", 'd'), + ], + "dev start", + ); +} + +#[test] +fn dev_stop_flags() { + let cmd = get_subcommand(&root_cmd(), &["dev", "stop"]); + assert_flags(&cmd, &[flag_short("verbose", 'V')], "dev stop"); +} + +#[test] +fn forge_flags() { + let cmd = get_subcommand(&root_cmd(), &["forge"]); + assert_flags( + &cmd, + &[ + flag_val_short("name", 'n'), + flag_val_short("api-url", 'a'), + flag_val("api-key"), + flag_val("openai-key"), + flag_val("anthropic-key"), + flag("skip-auth"), + ], + "forge", + ); +} + +#[test] +fn run_flags() { + let cmd = get_subcommand(&root_cmd(), &["run"]); + assert_flags( + &cmd, + &[ + flag_val_short("task", 't'), + flag_short("view", 'o'), + flag_val_short("api-url", 'a'), + flag_val("api-key"), + flag_val("openai-key"), + flag_val("anthropic-key"), + flag_val("gemini-key"), + flag("skip-auth"), + ], + "run", + ); +} + +#[test] +fn cache_flags() { + let cmd = get_subcommand(&root_cmd(), &["cache"]); + assert_flags(&cmd, &[flag_short("clean", 'c')], "cache"); +} + +#[test] +fn docs_flags() { + let cmd = get_subcommand(&root_cmd(), &["docs"]); + assert_flags(&cmd, &[], "docs"); +} + +#[test] +fn star_flags() { + let cmd = get_subcommand(&root_cmd(), &["star"]); + assert_flags(&cmd, &[], "star"); +} + +#[test] +fn support_flags() { + let cmd = get_subcommand(&root_cmd(), &["support"]); + assert_flags(&cmd, &[], "support"); +} + +#[test] +fn settings_flags() { + let cmd = get_subcommand(&root_cmd(), &["settings"]); + assert_flags(&cmd, &[], "settings"); +} + +#[test] +fn login_has_auth_alias() { + let root = root_cmd(); + let login = root + .get_subcommands() + .find(|s| s.get_name() == "login") + .expect("login command not found"); + let aliases: Vec<&str> = login.get_all_aliases().collect(); + assert!( + aliases.contains(&"auth"), + "login command should have 'auth' alias, got: {:?}", + aliases + ); +} From ffba6765f15f4da536b5ae7dccad1c2331b8bacb Mon Sep 17 00:00:00 2001 From: junhsss Date: Sun, 15 Mar 2026 15:33:08 +0900 Subject: [PATCH 02/16] test: dynamic command retrieval --- tests/cli-spec.json | 832 ++++++++++++++++++++++++++++++++++++++++++++ tests/cli_compat.rs | 210 ++++++----- 2 files changed, 934 insertions(+), 108 deletions(-) create mode 100644 tests/cli-spec.json diff --git a/tests/cli-spec.json b/tests/cli-spec.json new file mode 100644 index 0000000..a805a31 --- /dev/null +++ b/tests/cli-spec.json @@ -0,0 +1,832 @@ +{ + "_generated": "Auto-generated from TypeScript CLI. Do not edit manually. Run: node scripts/generate-cli-spec.js", + "commands": [ + { + "name": "browser", + "subcommands": [ + { + "name": "captcha", + "subcommands": [ + { + "name": "solve", + "flags": [ + { + "long": "session-id", + "short": null, + "required": false, + "takes_value": true + }, + { + "long": "session", + "short": "s", + "required": false, + "takes_value": true + }, + { + "long": "local", + "short": "l", + "required": false, + "takes_value": false + }, + { + "long": "api-url", + "short": null, + "required": false, + "takes_value": true + }, + { + "long": "page-id", + "short": null, + "required": false, + "takes_value": true + }, + { + "long": "url", + "short": null, + "required": false, + "takes_value": true + }, + { + "long": "task-id", + "short": null, + "required": false, + "takes_value": true + }, + { + "long": "raw", + "short": null, + "required": false, + "takes_value": false + } + ], + "args": [], + "alias": null + }, + { + "name": "status", + "flags": [ + { + "long": "session-id", + "short": null, + "required": false, + "takes_value": true + }, + { + "long": "session", + "short": "s", + "required": false, + "takes_value": true + }, + { + "long": "local", + "short": "l", + "required": false, + "takes_value": false + }, + { + "long": "api-url", + "short": null, + "required": false, + "takes_value": true + }, + { + "long": "page-id", + "short": null, + "required": false, + "takes_value": true + }, + { + "long": "wait", + "short": "w", + "required": false, + "takes_value": false + }, + { + "long": "timeout", + "short": null, + "required": false, + "takes_value": true + }, + { + "long": "interval", + "short": null, + "required": false, + "takes_value": true + }, + { + "long": "raw", + "short": null, + "required": false, + "takes_value": false + } + ], + "args": [], + "alias": null + } + ] + }, + { + "name": "live", + "flags": [ + { + "long": "session", + "short": "s", + "required": false, + "takes_value": true + }, + { + "long": "local", + "short": "l", + "required": false, + "takes_value": false + }, + { + "long": "api-url", + "short": null, + "required": false, + "takes_value": true + } + ], + "args": [], + "alias": null + }, + { + "name": "sessions", + "flags": [ + { + "long": "local", + "short": "l", + "required": false, + "takes_value": false + }, + { + "long": "api-url", + "short": null, + "required": false, + "takes_value": true + }, + { + "long": "raw", + "short": null, + "required": false, + "takes_value": false + } + ], + "args": [], + "alias": null + }, + { + "name": "start", + "flags": [ + { + "long": "local", + "short": "l", + "required": false, + "takes_value": false + }, + { + "long": "api-url", + "short": null, + "required": false, + "takes_value": true + }, + { + "long": "session", + "short": "s", + "required": false, + "takes_value": true + }, + { + "long": "stealth", + "short": null, + "required": false, + "takes_value": false + }, + { + "long": "proxy", + "short": "p", + "required": false, + "takes_value": true + }, + { + "long": "session-timeout", + "short": null, + "required": false, + "takes_value": true + }, + { + "long": "session-headless", + "short": null, + "required": false, + "takes_value": false + }, + { + "long": "session-region", + "short": null, + "required": false, + "takes_value": true + }, + { + "long": "session-solve-captcha", + "short": null, + "required": false, + "takes_value": false + }, + { + "long": "namespace", + "short": null, + "required": false, + "takes_value": true + }, + { + "long": "credentials", + "short": null, + "required": false, + "takes_value": false + } + ], + "args": [], + "alias": null + }, + { + "name": "stop", + "flags": [ + { + "long": "all", + "short": "a", + "required": false, + "takes_value": false + }, + { + "long": "session", + "short": "s", + "required": false, + "takes_value": true + }, + { + "long": "local", + "short": "l", + "required": false, + "takes_value": false + }, + { + "long": "api-url", + "short": null, + "required": false, + "takes_value": true + } + ], + "args": [], + "alias": null + } + ] + }, + { + "name": "cache", + "flags": [ + { + "long": "clean", + "short": "c", + "required": false, + "takes_value": false + } + ], + "args": [], + "alias": null + }, + { + "name": "config", + "flags": [], + "args": [], + "alias": null + }, + { + "name": "credentials", + "subcommands": [ + { + "name": "create", + "flags": [ + { + "long": "origin", + "short": null, + "required": false, + "takes_value": true + }, + { + "long": "username", + "short": "u", + "required": false, + "takes_value": true + }, + { + "long": "password", + "short": "p", + "required": false, + "takes_value": true + }, + { + "long": "totp-secret", + "short": null, + "required": false, + "takes_value": true + }, + { + "long": "namespace", + "short": "n", + "required": false, + "takes_value": true + }, + { + "long": "label", + "short": null, + "required": false, + "takes_value": true + } + ], + "args": [], + "alias": null + }, + { + "name": "delete", + "flags": [ + { + "long": "origin", + "short": null, + "required": false, + "takes_value": true + }, + { + "long": "namespace", + "short": "n", + "required": false, + "takes_value": true + } + ], + "args": [], + "alias": null + }, + { + "name": "list", + "flags": [ + { + "long": "namespace", + "short": "n", + "required": false, + "takes_value": true + }, + { + "long": "origin", + "short": null, + "required": false, + "takes_value": true + } + ], + "args": [], + "alias": null + }, + { + "name": "update", + "flags": [ + { + "long": "origin", + "short": null, + "required": false, + "takes_value": true + }, + { + "long": "username", + "short": "u", + "required": false, + "takes_value": true + }, + { + "long": "password", + "short": "p", + "required": false, + "takes_value": true + }, + { + "long": "totp-secret", + "short": null, + "required": false, + "takes_value": true + }, + { + "long": "namespace", + "short": "n", + "required": false, + "takes_value": true + }, + { + "long": "label", + "short": null, + "required": false, + "takes_value": true + } + ], + "args": [], + "alias": null + } + ] + }, + { + "name": "dev", + "subcommands": [ + { + "name": "install", + "flags": [ + { + "long": "repo-url", + "short": null, + "required": false, + "takes_value": true + }, + { + "long": "verbose", + "short": "V", + "required": false, + "takes_value": false + } + ], + "args": [], + "alias": null + }, + { + "name": "start", + "flags": [ + { + "long": "port", + "short": "p", + "required": false, + "takes_value": true + }, + { + "long": "verbose", + "short": "V", + "required": false, + "takes_value": false + }, + { + "long": "docker_check", + "short": "d", + "required": false, + "takes_value": false + } + ], + "args": [], + "alias": null + }, + { + "name": "stop", + "flags": [ + { + "long": "verbose", + "short": "V", + "required": false, + "takes_value": false + } + ], + "args": [], + "alias": null + } + ] + }, + { + "name": "docs", + "flags": [], + "args": [], + "alias": null + }, + { + "name": "forge", + "flags": [ + { + "long": "name", + "short": "n", + "required": false, + "takes_value": true + }, + { + "long": "api_url", + "short": "a", + "required": false, + "takes_value": true + }, + { + "long": "api_key", + "short": null, + "required": false, + "takes_value": true + }, + { + "long": "openai_key", + "short": null, + "required": false, + "takes_value": true + }, + { + "long": "anthropic_key", + "short": null, + "required": false, + "takes_value": true + }, + { + "long": "skip_auth", + "short": null, + "required": false, + "takes_value": false + } + ], + "args": [ + { + "name": "template", + "required": false + } + ], + "alias": null + }, + { + "name": "login", + "flags": [], + "args": [], + "alias": "auth" + }, + { + "name": "logout", + "flags": [], + "args": [], + "alias": null + }, + { + "name": "pdf", + "flags": [ + { + "long": "url", + "short": "u", + "required": false, + "takes_value": true + }, + { + "long": "delay", + "short": "d", + "required": false, + "takes_value": true + }, + { + "long": "use-proxy", + "short": null, + "required": false, + "takes_value": false + }, + { + "long": "region", + "short": "r", + "required": false, + "takes_value": true + }, + { + "long": "local", + "short": "l", + "required": false, + "takes_value": false + }, + { + "long": "api-url", + "short": null, + "required": false, + "takes_value": true + } + ], + "args": [ + { + "name": "url", + "required": false + } + ], + "alias": null + }, + { + "name": "run", + "flags": [ + { + "long": "api_url", + "short": "a", + "required": false, + "takes_value": true + }, + { + "long": "view", + "short": "o", + "required": false, + "takes_value": false + }, + { + "long": "task", + "short": "t", + "required": false, + "takes_value": true + }, + { + "long": "api_key", + "short": null, + "required": false, + "takes_value": true + }, + { + "long": "openai_key", + "short": null, + "required": false, + "takes_value": true + }, + { + "long": "anthropic_key", + "short": null, + "required": false, + "takes_value": true + }, + { + "long": "gemini_key", + "short": null, + "required": false, + "takes_value": true + }, + { + "long": "skip_auth", + "short": null, + "required": false, + "takes_value": false + } + ], + "args": [ + { + "name": "template", + "required": false + } + ], + "alias": null + }, + { + "name": "scrape", + "flags": [ + { + "long": "url", + "short": "u", + "required": false, + "takes_value": true + }, + { + "long": "format", + "short": null, + "required": false, + "takes_value": true + }, + { + "long": "raw", + "short": null, + "required": false, + "takes_value": false + }, + { + "long": "delay", + "short": "d", + "required": false, + "takes_value": true + }, + { + "long": "pdf", + "short": null, + "required": false, + "takes_value": false + }, + { + "long": "screenshot", + "short": null, + "required": false, + "takes_value": false + }, + { + "long": "use-proxy", + "short": null, + "required": false, + "takes_value": false + }, + { + "long": "region", + "short": "r", + "required": false, + "takes_value": true + }, + { + "long": "local", + "short": "l", + "required": false, + "takes_value": false + }, + { + "long": "api-url", + "short": null, + "required": false, + "takes_value": true + } + ], + "args": [ + { + "name": "url", + "required": false + } + ], + "alias": null + }, + { + "name": "screenshot", + "flags": [ + { + "long": "url", + "short": "u", + "required": false, + "takes_value": true + }, + { + "long": "delay", + "short": "d", + "required": false, + "takes_value": true + }, + { + "long": "full-page", + "short": "f", + "required": false, + "takes_value": false + }, + { + "long": "use-proxy", + "short": null, + "required": false, + "takes_value": false + }, + { + "long": "region", + "short": "r", + "required": false, + "takes_value": true + }, + { + "long": "local", + "short": "l", + "required": false, + "takes_value": false + }, + { + "long": "api-url", + "short": null, + "required": false, + "takes_value": true + } + ], + "args": [ + { + "name": "url", + "required": false + } + ], + "alias": null + }, + { + "name": "settings", + "flags": [], + "args": [], + "alias": null + }, + { + "name": "star", + "flags": [], + "args": [], + "alias": null + }, + { + "name": "support", + "flags": [], + "args": [], + "alias": null + }, + { + "name": "update", + "flags": [ + { + "long": "force", + "short": "f", + "required": false, + "takes_value": false + }, + { + "long": "check", + "short": "c", + "required": false, + "takes_value": false + } + ], + "args": [], + "alias": null + } + ] +} diff --git a/tests/cli_compat.rs b/tests/cli_compat.rs index 60d861e..be8cab5 100644 --- a/tests/cli_compat.rs +++ b/tests/cli_compat.rs @@ -4,12 +4,37 @@ //! that the Rust clap parser exposes exactly those flags with correct names, //! short aliases, and required/optional status. +use std::collections::BTreeSet; +use std::path::Path; + use clap::{ArgAction, Command, CommandFactory}; // Re-use the clap-derived structs from the binary. // We need CommandFactory to introspect without running. use steel_cli::commands; +/// Scan a Pastel commands directory and return the set of command names. +/// Convention: .tsx files (excluding index.tsx) are commands, directories are parent commands. +fn discover_pastel_commands(dir: &Path) -> BTreeSet { + let mut commands = BTreeSet::new(); + let entries = match std::fs::read_dir(dir) { + Ok(e) => e, + Err(_) => return commands, + }; + for entry in entries.flatten() { + let path = entry.path(); + let name = entry.file_name(); + let name_str = name.to_string_lossy(); + + if path.is_file() && name_str.ends_with(".tsx") && name_str != "index.tsx" { + commands.insert(name_str.trim_end_matches(".tsx").to_string()); + } else if path.is_dir() { + commands.insert(name_str.to_string()); + } + } + commands +} + /// Describes a single CLI flag as defined in the TypeScript source. #[derive(Debug)] struct ExpectedFlag { @@ -139,130 +164,99 @@ fn root_cmd() -> Command { } /// Verify the complete subcommand tree matches the TypeScript CLI. +/// Commands are discovered dynamically from the Pastel source/commands/ directory. #[test] fn subcommand_tree_matches_ts() { + let ts_commands_dir = + Path::new(env!("CARGO_MANIFEST_DIR")).join("source/commands"); + + // Discover top-level TS commands from filesystem + let ts_top = discover_pastel_commands(&ts_commands_dir); + assert!( + !ts_top.is_empty(), + "Failed to discover TS commands from {}", + ts_commands_dir.display() + ); + + // Get Rust top-level commands let root = root_cmd(); - let top_level: Vec<&str> = root + let rust_top: BTreeSet = root .get_subcommands() - .map(|s| s.get_name()) - .filter(|n| *n != "help") + .map(|s| s.get_name().to_string()) + .filter(|n| n != "help") .collect(); - let expected_top = vec![ - "scrape", - "screenshot", - "pdf", - "browser", - "login", - "logout", - "credentials", - "dev", - "forge", - "run", - "config", - "update", - "cache", - "docs", - "star", - "support", - "settings", - ]; - - for name in &expected_top { + // Check both directions + for name in &ts_top { assert!( - top_level.contains(name), - "Missing top-level command: {name}" + rust_top.contains(name), + "TS has command '{name}' but Rust does not" ); } - for name in &top_level { + for name in &rust_top { assert!( - expected_top.contains(name), - "Unexpected top-level command: {name}" + ts_top.contains(name), + "Rust has command '{name}' but TS does not" ); } - // browser subcommands - let browser = get_subcommand(&root, &["browser"]); - let browser_subs: Vec<&str> = browser - .get_subcommands() - .map(|s| s.get_name()) - .filter(|n| *n != "help") - .collect(); - let expected_browser = vec!["start", "stop", "sessions", "live", "captcha"]; - for name in &expected_browser { - assert!( - browser_subs.contains(name), - "Missing browser subcommand: {name}" - ); - } - for name in &browser_subs { - assert!( - expected_browser.contains(name), - "Unexpected browser subcommand: {name}" - ); - } + // Recurse into directories (subcommands) + for name in &ts_top { + let sub_dir = ts_commands_dir.join(name); + if !sub_dir.is_dir() { + continue; + } - // browser captcha subcommands - let captcha = get_subcommand(&root, &["browser", "captcha"]); - let captcha_subs: Vec<&str> = captcha - .get_subcommands() - .map(|s| s.get_name()) - .filter(|n| *n != "help") - .collect(); - let expected_captcha = vec!["solve", "status"]; - for name in &expected_captcha { - assert!( - captcha_subs.contains(name), - "Missing captcha subcommand: {name}" - ); - } - for name in &captcha_subs { - assert!( - expected_captcha.contains(name), - "Unexpected captcha subcommand: {name}" - ); - } + let ts_subs = discover_pastel_commands(&sub_dir); + let rust_parent = get_subcommand(&root, &[name.as_str()]); + let rust_subs: BTreeSet = rust_parent + .get_subcommands() + .map(|s| s.get_name().to_string()) + .filter(|n| n != "help") + .collect(); + + for sub in &ts_subs { + assert!( + rust_subs.contains(sub), + "TS has '{name} {sub}' but Rust does not" + ); + } + for sub in &rust_subs { + assert!( + ts_subs.contains(sub), + "Rust has '{name} {sub}' but TS does not" + ); + } - // credentials subcommands - let creds = get_subcommand(&root, &["credentials"]); - let creds_subs: Vec<&str> = creds - .get_subcommands() - .map(|s| s.get_name()) - .filter(|n| *n != "help") - .collect(); - let expected_creds = vec!["list", "create", "update", "delete"]; - for name in &expected_creds { - assert!( - creds_subs.contains(name), - "Missing credentials subcommand: {name}" - ); - } - for name in &creds_subs { - assert!( - expected_creds.contains(name), - "Unexpected credentials subcommand: {name}" - ); - } + // One more level (e.g., browser/captcha/) + for sub in &ts_subs { + let nested_dir = sub_dir.join(sub); + if !nested_dir.is_dir() { + continue; + } - // dev subcommands - let dev = get_subcommand(&root, &["dev"]); - let dev_subs: Vec<&str> = dev - .get_subcommands() - .map(|s| s.get_name()) - .filter(|n| *n != "help") - .collect(); - let expected_dev = vec!["install", "start", "stop"]; - for name in &expected_dev { - assert!( - dev_subs.contains(name), - "Missing dev subcommand: {name}" - ); - } - for name in &dev_subs { - assert!( - expected_dev.contains(name), - "Unexpected dev subcommand: {name}" - ); + let ts_nested = discover_pastel_commands(&nested_dir); + let rust_nested_parent = + get_subcommand(&root, &[name.as_str(), sub.as_str()]); + let rust_nested: BTreeSet = rust_nested_parent + .get_subcommands() + .map(|s| s.get_name().to_string()) + .filter(|n| n != "help") + .collect(); + + for n in &ts_nested { + assert!( + rust_nested.contains(n), + "TS has '{name} {sub} {n}' but Rust does not" + ); + } + for n in &rust_nested { + assert!( + ts_nested.contains(n), + "Rust has '{name} {sub} {n}' but TS does not" + ); + } + } } } From f3892dca969eda141439b8b6df84e6bbfb068211 Mon Sep 17 00:00:00 2001 From: junhsss Date: Sun, 15 Mar 2026 20:18:33 +0900 Subject: [PATCH 03/16] feat: profiles --- Cargo.lock | 337 ++++++++++++++++++++ Cargo.toml | 10 +- src/browser/mod.rs | 2 + src/browser/profile_porter.rs | 567 ++++++++++++++++++++++++++++++++++ src/browser/profile_store.rs | 265 ++++++++++++++++ src/commands/mod.rs | 8 + src/commands/profile.rs | 312 +++++++++++++++++++ tests/cli_compat.rs | 41 +++ 8 files changed, 1541 insertions(+), 1 deletion(-) create mode 100644 src/browser/profile_porter.rs create mode 100644 src/browser/profile_store.rs create mode 100644 src/commands/profile.rs diff --git a/Cargo.lock b/Cargo.lock index 0b59531..46facf3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,23 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + [[package]] name = "aho-corasick" version = "1.1.4" @@ -67,6 +84,15 @@ version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +dependencies = [ + "derive_arbitrary", +] + [[package]] name = "assert-json-diff" version = "2.0.2" @@ -95,6 +121,24 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-padding" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" +dependencies = [ + "generic-array", +] + [[package]] name = "bumpalo" version = "3.20.2" @@ -107,6 +151,15 @@ version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +[[package]] +name = "cbc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" +dependencies = [ + "cipher", +] + [[package]] name = "cc" version = "1.2.56" @@ -129,6 +182,16 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + [[package]] name = "clap" version = "4.6.0" @@ -197,6 +260,40 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + [[package]] name = "deadpool" version = "0.12.3" @@ -215,6 +312,17 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "092966b41edc516079bdf31ec78a2e0588d1d0c08f78b91d8307215928642b2b" +[[package]] +name = "derive_arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "dialoguer" version = "0.11.0" @@ -228,6 +336,17 @@ dependencies = [ "zeroize", ] +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + [[package]] name = "dirs" version = "6.0.0" @@ -282,6 +401,18 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fallible-streaming-iterator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" + [[package]] name = "fastrand" version = "2.3.0" @@ -294,6 +425,16 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + [[package]] name = "fnv" version = "1.0.7" @@ -403,6 +544,16 @@ dependencies = [ "slab", ] +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "getrandom" version = "0.2.17" @@ -477,6 +628,15 @@ version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +[[package]] +name = "hashlink" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +dependencies = [ + "hashbrown 0.15.5", +] + [[package]] name = "heck" version = "0.5.0" @@ -489,6 +649,15 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + [[package]] name = "http" version = "1.4.0" @@ -730,6 +899,16 @@ dependencies = [ "web-time", ] +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "block-padding", + "generic-array", +] + [[package]] name = "ipnet" version = "2.12.0" @@ -814,6 +993,17 @@ dependencies = [ "libc", ] +[[package]] +name = "libsqlite3-sys" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8935b44e7c13394a179a438e0cebba0fe08fe01b54f152e29a93b5cf993fd4" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + [[package]] name = "linux-raw-sys" version = "0.12.1" @@ -853,6 +1043,32 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + [[package]] name = "mio" version = "1.1.1" @@ -938,6 +1154,16 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest", + "hmac", +] + [[package]] name = "percent-encoding" version = "2.3.2" @@ -956,6 +1182,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + [[package]] name = "portable-atomic" version = "1.13.1" @@ -1162,6 +1394,7 @@ dependencies = [ "base64", "bytes", "futures-core", + "futures-util", "http", "http-body", "http-body-util", @@ -1170,6 +1403,7 @@ dependencies = [ "hyper-util", "js-sys", "log", + "mime_guess", "percent-encoding", "pin-project-lite", "quinn", @@ -1205,6 +1439,20 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rusqlite" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c6d5e5acb6f6129fe3f7ba0a7fc77bca1942cb568535e18e7bc40262baf3110" +dependencies = [ + "bitflags", + "fallible-iterator", + "fallible-streaming-iterator", + "hashlink", + "libsqlite3-sys", + "smallvec", +] + [[package]] name = "rustc-hash" version = "2.1.1" @@ -1338,6 +1586,28 @@ dependencies = [ "serde", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "shell-words" version = "1.1.1" @@ -1360,6 +1630,12 @@ dependencies = [ "libc", ] +[[package]] +name = "simd-adler32" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" + [[package]] name = "slab" version = "0.4.12" @@ -1392,22 +1668,30 @@ checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" name = "steel-cli" version = "0.1.0" dependencies = [ + "aes", "anyhow", + "cbc", "clap", "colored", "dialoguer", "dirs", + "hmac", "indicatif", "open", + "pbkdf2", "reqwest", + "rusqlite", "serde", "serde_json", + "sha1", + "sha2", "tempfile", "thiserror 2.0.18", "tokio", "url", "urlencoding", "wiremock", + "zip", ] [[package]] @@ -1652,6 +1936,18 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "unicase" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" + [[package]] name = "unicode-ident" version = "1.0.24" @@ -1706,6 +2002,18 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + [[package]] name = "want" version = "0.3.1" @@ -2252,8 +2560,37 @@ dependencies = [ "syn", ] +[[package]] +name = "zip" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabe6324e908f85a1c52063ce7aa26b68dcb7eb6dbc83a2d148403c9bc3eba50" +dependencies = [ + "arbitrary", + "crc32fast", + "crossbeam-utils", + "displaydoc", + "flate2", + "indexmap", + "memchr", + "thiserror 2.0.18", + "zopfli", +] + [[package]] name = "zmij" version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zopfli" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" +dependencies = [ + "bumpalo", + "crc32fast", + "log", + "simd-adler32", +] diff --git a/Cargo.toml b/Cargo.toml index 7148ee4..fade1df 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,7 +15,7 @@ path = "src/main.rs" [dependencies] clap = { version = "4.5", features = ["derive"] } -reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls"] } +reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls", "multipart"] } serde = { version = "1", features = ["derive"] } serde_json = "1" tokio = { version = "1", features = ["full"] } @@ -28,6 +28,14 @@ indicatif = "0.17" colored = "3" urlencoding = "2" url = "2" +rusqlite = { version = "0.33", features = ["bundled"] } +zip = { version = "2", default-features = false, features = ["deflate"] } +aes = "0.8" +cbc = "0.1" +pbkdf2 = "0.12" +sha1 = "0.10" +sha2 = "0.10" +hmac = "0.12" [dev-dependencies] tempfile = "3" diff --git a/src/browser/mod.rs b/src/browser/mod.rs index 0673413..2911574 100644 --- a/src/browser/mod.rs +++ b/src/browser/mod.rs @@ -1,4 +1,6 @@ pub mod lifecycle; pub mod passthrough; +pub mod profile_porter; +pub mod profile_store; pub mod routing; pub mod runtime; diff --git a/src/browser/profile_porter.rs b/src/browser/profile_porter.rs new file mode 100644 index 0000000..17473e7 --- /dev/null +++ b/src/browser/profile_porter.rs @@ -0,0 +1,567 @@ +use std::collections::HashMap; +use std::io::Write; +use std::path::{Path, PathBuf}; + +use anyhow::{Context, Result}; + +// ─── Constants ─────────────────────────────────────────────────────────────── + +fn chrome_base_dir() -> PathBuf { + dirs::home_dir() + .unwrap_or_else(|| PathBuf::from(".")) + .join("Library/Application Support/Google/Chrome") +} + +const IV: [u8; 16] = [0x20; 16]; // 16 space bytes + +const INCLUDE_ENTRIES: &[&str] = &[ + "Cookies", + "Local Storage", + "IndexedDB", + "Preferences", + "Bookmarks", + "Favicons", + "History", + "Web Data", +]; + +const SKIP_NAMES: &[&str] = &["LOCK", "SingletonLock", "SingletonCookie", "SingletonSocket"]; +const SKIP_EXTS: &[&str] = &[".log", ".pma"]; + +// ─── Chrome profile discovery ──────────────────────────────────────────────── + +#[derive(Debug, Clone)] +pub struct ChromeProfile { + pub dir_name: String, + pub display_name: String, +} + +pub fn find_chrome_profiles() -> Vec { + let base = chrome_base_dir(); + if !base.exists() { + return Vec::new(); + } + + let Ok(entries) = std::fs::read_dir(&base) else { + return Vec::new(); + }; + + let mut profiles = Vec::new(); + for entry in entries.flatten() { + let path = entry.path(); + if !path.is_dir() { + continue; + } + if !path.join("Cookies").exists() { + continue; + } + let dir_name = entry.file_name().to_string_lossy().to_string(); + let display_name = get_chrome_profile_display_name(&base, &dir_name); + profiles.push(ChromeProfile { + dir_name, + display_name, + }); + } + profiles.sort_by(|a, b| a.dir_name.cmp(&b.dir_name)); + profiles +} + +fn get_chrome_profile_display_name(base: &Path, dir_name: &str) -> String { + let prefs_path = base.join(dir_name).join("Preferences"); + if let Ok(contents) = std::fs::read_to_string(&prefs_path) { + if let Ok(prefs) = serde_json::from_str::(&contents) { + if let Some(name) = prefs + .get("profile") + .and_then(|p| p.get("name")) + .and_then(|n| n.as_str()) + { + if !name.is_empty() && name != dir_name { + return name.to_string(); + } + } + if let Some(full_name) = prefs + .get("account_info") + .and_then(|a| a.as_array()) + .and_then(|a| a.first()) + .and_then(|a| a.get("full_name")) + .and_then(|n| n.as_str()) + { + if !full_name.is_empty() { + return full_name.to_string(); + } + } + } + } + dir_name.to_string() +} + +pub fn is_chrome_running() -> bool { + std::process::Command::new("pgrep") + .args(["-x", "Google Chrome"]) + .stdout(std::process::Stdio::null()) + .stderr(std::process::Stdio::null()) + .status() + .map(|s| s.success()) + .unwrap_or(false) +} + +// ─── Keychain ──────────────────────────────────────────────────────────────── + +fn get_keychain_passphrase() -> Result { + let output = std::process::Command::new("security") + .args([ + "find-generic-password", + "-w", + "-s", + "Chrome Safe Storage", + ]) + .output() + .context("Failed to run `security` command")?; + + if !output.status.success() { + anyhow::bail!("Failed to retrieve Chrome Safe Storage password from Keychain"); + } + + Ok(String::from_utf8(output.stdout)?.trim().to_string()) +} + +// ─── Crypto ────────────────────────────────────────────────────────────────── + +fn derive_key(passphrase: &str, iterations: u32) -> [u8; 16] { + use hmac::Hmac; + use sha1::Sha1; + + let mut key = [0u8; 16]; + pbkdf2::pbkdf2::>(passphrase.as_bytes(), b"saltysalt", iterations, &mut key) + .expect("HMAC can be initialized with any key length"); + key +} + +fn decrypt_cookie( + encrypted_value: &[u8], + key: &[u8; 16], + host_key: &str, + meta_version: i64, +) -> Option { + use aes::Aes128; + use cbc::cipher::{BlockDecryptMut, KeyIvInit, block_padding::Pkcs7}; + + if encrypted_value.len() < 3 { + return None; + } + if &encrypted_value[..3] != b"v10" { + return None; + } + + type Aes128CbcDec = cbc::Decryptor; + + let mut buf = encrypted_value[3..].to_vec(); + let plaintext = Aes128CbcDec::new(key.into(), &IV.into()) + .decrypt_padded_mut::(&mut buf) + .ok()?; + + if meta_version >= 24 && plaintext.len() >= 32 { + use sha2::{Digest, Sha256}; + let expected_hash = Sha256::digest(host_key.as_bytes()); + if expected_hash.as_slice() == &plaintext[..32] { + return Some(String::from_utf8_lossy(&plaintext[32..]).to_string()); + } + } + + Some(String::from_utf8_lossy(plaintext).to_string()) +} + +fn encrypt_cookie( + value: &str, + key: &[u8; 16], + host_key: &str, + meta_version: i64, +) -> Vec { + use aes::Aes128; + use cbc::cipher::{BlockEncryptMut, KeyIvInit, block_padding::Pkcs7}; + + let mut plaintext = Vec::new(); + + if meta_version >= 24 { + use sha2::{Digest, Sha256}; + let domain_hash = Sha256::digest(host_key.as_bytes()); + plaintext.extend_from_slice(&domain_hash); + } + plaintext.extend_from_slice(value.as_bytes()); + + type Aes128CbcEnc = cbc::Encryptor; + + // encrypt_padded_mut requires a buffer with enough space for padding + let block_size = 16; + let padded_len = ((plaintext.len() / block_size) + 1) * block_size; + let mut buf = vec![0u8; padded_len]; + buf[..plaintext.len()].copy_from_slice(&plaintext); + + let encrypted = Aes128CbcEnc::new(key.into(), &IV.into()) + .encrypt_padded_mut::(&mut buf, plaintext.len()) + .expect("buffer is large enough for PKCS7 padding"); + + let mut result = Vec::with_capacity(3 + encrypted.len()); + result.extend_from_slice(b"v10"); + result.extend_from_slice(encrypted); + result +} + +// ─── Cookie re-encryption ──────────────────────────────────────────────────── + +fn reencrypt_cookies_db( + original_path: &Path, + macos_key: &[u8; 16], + peanuts_key: &[u8; 16], +) -> Result<(Vec, u64)> { + let tmp_path = std::env::temp_dir().join(format!( + "steel-cookies-{}-{}.db", + std::process::id(), + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap_or_default() + .as_millis() + )); + + std::fs::copy(original_path, &tmp_path)?; + + let result = (|| -> Result<(Vec, u64)> { + let conn = rusqlite::Connection::open(&tmp_path)?; + + let meta_version: i64 = conn + .query_row( + "SELECT value FROM meta WHERE key='version'", + [], + |row| row.get(0), + ) + .unwrap_or(0); + + let mut stmt = conn.prepare( + "SELECT rowid, host_key, encrypted_value FROM cookies WHERE length(encrypted_value) > 3", + )?; + + let rows: Vec<(i64, String, Vec)> = stmt + .query_map([], |row| Ok((row.get(0)?, row.get(1)?, row.get(2)?)))? + .collect::>()?; + + let mut converted: u64 = 0; + let tx = conn.unchecked_transaction()?; + { + let mut update = + tx.prepare("UPDATE cookies SET encrypted_value = ? WHERE rowid = ?")?; + + for (rowid, host_key, encrypted_value) in &rows { + let Some(plaintext) = + decrypt_cookie(encrypted_value, macos_key, host_key, meta_version) + else { + continue; + }; + + let reencrypted = encrypt_cookie(&plaintext, peanuts_key, host_key, meta_version); + update.execute(rusqlite::params![reencrypted, rowid])?; + converted += 1; + } + } + tx.commit()?; + + drop(stmt); + conn.close().map_err(|(_, e)| e)?; + + let buffer = std::fs::read(&tmp_path)?; + Ok((buffer, converted)) + })(); + + // Best-effort cleanup + let _ = std::fs::remove_file(&tmp_path); + + result +} + +// ─── File collection ───────────────────────────────────────────────────────── + +fn collect_files(dir_path: &Path, base_dir: &Path) -> HashMap> { + let mut files = HashMap::new(); + collect_files_recursive(dir_path, base_dir, &mut files); + files +} + +fn collect_files_recursive(dir_path: &Path, base_dir: &Path, files: &mut HashMap>) { + let Ok(entries) = std::fs::read_dir(dir_path) else { + return; + }; + + for entry in entries.flatten() { + let path = entry.path(); + let name = entry.file_name(); + let name_str = name.to_string_lossy(); + + if SKIP_NAMES.contains(&name_str.as_ref()) { + continue; + } + if let Some(ext) = path.extension().and_then(|e| e.to_str()) { + let dot_ext = format!(".{ext}"); + if SKIP_EXTS.contains(&dot_ext.as_str()) { + continue; + } + } + + if path.is_dir() { + collect_files_recursive(&path, base_dir, files); + } else if path.is_file() { + if let Ok(rel) = path.strip_prefix(base_dir) { + if let Ok(data) = std::fs::read(&path) { + files.insert(rel.to_string_lossy().to_string(), data); + } + } + } + } +} + +// ─── Package ───────────────────────────────────────────────────────────────── + +pub struct PackageResult { + pub zip_buffer: Vec, + pub cookies_reencrypted: u64, +} + +pub fn package_chrome_profile( + chrome_profile: &str, + on_progress: &dyn Fn(&str), +) -> Result { + let profile_dir = chrome_base_dir().join(chrome_profile); + + if !profile_dir.join("Cookies").exists() { + anyhow::bail!( + "Chrome profile \"{}\" not found at {}", + chrome_profile, + profile_dir.display() + ); + } + + on_progress("Reading Keychain..."); + let passphrase = get_keychain_passphrase()?; + let macos_key = derive_key(&passphrase, 1003); + let peanuts_key = derive_key("peanuts", 1); + + let mut zip_files: Vec<(String, Vec)> = Vec::new(); + let mut cookies_reencrypted: u64 = 0; + + for entry_name in INCLUDE_ENTRIES { + let full_path = profile_dir.join(entry_name); + if !full_path.exists() { + continue; + } + + let meta = std::fs::metadata(&full_path)?; + + if meta.is_file() { + if *entry_name == "Cookies" { + on_progress("Re-encrypting Cookies..."); + let (buffer, converted) = + reencrypt_cookies_db(&full_path, &macos_key, &peanuts_key)?; + zip_files.push((format!("Default/{entry_name}"), buffer)); + cookies_reencrypted = converted; + } else { + let data = std::fs::read(&full_path)?; + zip_files.push((format!("Default/{entry_name}"), data)); + } + } else if meta.is_dir() { + on_progress(&format!("Collecting {entry_name}/...")); + let dir_files = collect_files(&full_path, &full_path); + for (rel_path, data) in dir_files { + zip_files.push((format!("Default/{entry_name}/{rel_path}"), data)); + } + } + } + + on_progress("Zipping..."); + let mut cursor = std::io::Cursor::new(Vec::new()); + { + let mut zip = zip::ZipWriter::new(&mut cursor); + let options = zip::write::SimpleFileOptions::default() + .compression_method(zip::CompressionMethod::Deflated); + + for (name, data) in &zip_files { + zip.start_file(name, options)?; + zip.write_all(data)?; + } + zip.finish()?; + } + + Ok(PackageResult { + zip_buffer: cursor.into_inner(), + cookies_reencrypted, + }) +} + +// ─── Steel API ─────────────────────────────────────────────────────────────── + +pub async fn upload_profile_to_steel( + zip_buffer: Vec, + api_key: &str, + api_base: &str, +) -> Result { + let part = reqwest::multipart::Part::bytes(zip_buffer) + .file_name("userDataDir.zip") + .mime_str("application/zip")?; + let form = reqwest::multipart::Form::new().part("userDataDir", part); + + let client = reqwest::Client::new(); + let res = client + .post(format!("{api_base}/profiles")) + .header("Steel-Api-Key", api_key) + .multipart(form) + .send() + .await?; + + let status = res.status(); + let body: serde_json::Value = res.json().await?; + + if !status.is_success() { + let msg = body + .get("message") + .and_then(|m| m.as_str()) + .map(|s| s.to_string()) + .unwrap_or_else(|| body.to_string()); + anyhow::bail!("Profile upload failed ({status}): {msg}"); + } + + body.get("id") + .and_then(|id| id.as_str()) + .map(|s| s.to_string()) + .ok_or_else(|| anyhow::anyhow!("Profile upload response missing id")) +} + +pub async fn update_profile_on_steel( + profile_id: &str, + zip_buffer: Vec, + api_key: &str, + api_base: &str, +) -> Result<()> { + let part = reqwest::multipart::Part::bytes(zip_buffer) + .file_name("userDataDir.zip") + .mime_str("application/zip")?; + let form = reqwest::multipart::Form::new().part("userDataDir", part); + + let client = reqwest::Client::new(); + let res = client + .patch(format!("{api_base}/profiles/{profile_id}")) + .header("Steel-Api-Key", api_key) + .multipart(form) + .send() + .await?; + + if !res.status().is_success() { + let status = res.status(); + let body: serde_json::Value = res.json().await?; + let msg = body + .get("message") + .and_then(|m| m.as_str()) + .map(|s| s.to_string()) + .unwrap_or_else(|| body.to_string()); + anyhow::bail!("Profile update failed ({status}): {msg}"); + } + + Ok(()) +} + +// ─── Tests ─────────────────────────────────────────────────────────────────── + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn derive_key_peanuts() { + let key = derive_key("peanuts", 1); + assert_eq!(key.len(), 16); + // Deterministic — same input always produces same output + assert_eq!(derive_key("peanuts", 1), key); + } + + #[test] + fn derive_key_different_iterations() { + let k1 = derive_key("peanuts", 1); + let k2 = derive_key("peanuts", 1003); + assert_ne!(k1, k2); + } + + #[test] + fn encrypt_decrypt_roundtrip() { + let key = derive_key("testkey", 1); + let value = "hello world"; + let host_key = ".example.com"; + + // meta_version < 24: no domain hash + let encrypted = encrypt_cookie(value, &key, host_key, 20); + assert_eq!(&encrypted[..3], b"v10"); + let decrypted = decrypt_cookie(&encrypted, &key, host_key, 20); + assert_eq!(decrypted.as_deref(), Some(value)); + } + + #[test] + fn encrypt_decrypt_roundtrip_v24() { + let key = derive_key("testkey", 1); + let value = "secret cookie"; + let host_key = ".google.com"; + + // meta_version >= 24: with domain hash + let encrypted = encrypt_cookie(value, &key, host_key, 24); + let decrypted = decrypt_cookie(&encrypted, &key, host_key, 24); + assert_eq!(decrypted.as_deref(), Some(value)); + } + + #[test] + fn decrypt_wrong_key_returns_none() { + let key1 = derive_key("key1", 1); + let key2 = derive_key("key2", 1); + let encrypted = encrypt_cookie("data", &key1, ".test.com", 20); + // Wrong key — PKCS7 unpadding will fail + let result = decrypt_cookie(&encrypted, &key2, ".test.com", 20); + assert!(result.is_none()); + } + + #[test] + fn decrypt_no_v10_prefix_returns_none() { + let key = derive_key("k", 1); + assert!(decrypt_cookie(b"xyz_data", &key, "host", 20).is_none()); + } + + #[test] + fn decrypt_short_data_returns_none() { + let key = derive_key("k", 1); + assert!(decrypt_cookie(b"v1", &key, "host", 20).is_none()); + } + + #[test] + fn collect_files_skips_lock_and_log() { + let tmp = tempfile::TempDir::new().unwrap(); + let dir = tmp.path(); + + std::fs::write(dir.join("good.txt"), "data").unwrap(); + std::fs::write(dir.join("LOCK"), "lock").unwrap(); + std::fs::write(dir.join("SingletonLock"), "lock").unwrap(); + std::fs::write(dir.join("something.log"), "log").unwrap(); + std::fs::write(dir.join("data.pma"), "pma").unwrap(); + + let files = collect_files(dir, dir); + assert_eq!(files.len(), 1); + assert!(files.contains_key("good.txt")); + } + + #[test] + fn collect_files_recursive_subdir() { + let tmp = tempfile::TempDir::new().unwrap(); + let dir = tmp.path(); + let sub = dir.join("sub"); + std::fs::create_dir(&sub).unwrap(); + + std::fs::write(dir.join("a.txt"), "a").unwrap(); + std::fs::write(sub.join("b.txt"), "b").unwrap(); + + let files = collect_files(dir, dir); + assert_eq!(files.len(), 2); + assert!(files.contains_key("a.txt")); + assert!(files.contains_key("sub/b.txt")); + } +} diff --git a/src/browser/profile_store.rs b/src/browser/profile_store.rs new file mode 100644 index 0000000..6af1385 --- /dev/null +++ b/src/browser/profile_store.rs @@ -0,0 +1,265 @@ +use std::path::{Path, PathBuf}; + +use anyhow::Result; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ProfileData { + pub profile_id: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub chrome_profile: Option, +} + +/// Validate a profile name. Returns `Some(error_message)` if invalid. +pub fn validate_profile_name(name: &str) -> Option { + if name.is_empty() { + return Some("Profile name cannot be empty.".to_string()); + } + + let first = name.chars().next().unwrap(); + if !first.is_ascii_alphanumeric() { + return Some("Profile name must start with a letter or number.".to_string()); + } + + if !name + .chars() + .all(|c| c.is_ascii_alphanumeric() || c == '-' || c == '_') + { + return Some( + "Profile name can only contain letters, numbers, hyphens, and underscores.".to_string(), + ); + } + + None +} + +fn profiles_dir() -> PathBuf { + crate::config::config_dir().join("profiles") +} + +pub fn read_profile(name: &str) -> Result> { + read_profile_in(name, &profiles_dir()) +} + +pub fn write_profile(name: &str, profile_id: &str, chrome_profile: Option<&str>) -> Result<()> { + write_profile_in(name, profile_id, chrome_profile, &profiles_dir()) +} + +pub fn list_profiles() -> Result> { + list_profiles_in(&profiles_dir()) +} + +pub fn delete_profile(name: &str) -> Result { + delete_profile_in(name, &profiles_dir()) +} + +// --- internal helpers that accept an explicit directory --- + +fn read_profile_in(name: &str, dir: &Path) -> Result> { + let path = dir.join(format!("{name}.json")); + if !path.exists() { + return Ok(None); + } + let contents = std::fs::read_to_string(&path)?; + let data: ProfileData = serde_json::from_str(&contents)?; + Ok(Some(data)) +} + +fn write_profile_in( + name: &str, + profile_id: &str, + chrome_profile: Option<&str>, + dir: &Path, +) -> Result<()> { + std::fs::create_dir_all(dir)?; + + let data = ProfileData { + profile_id: profile_id.to_string(), + chrome_profile: chrome_profile.map(|s| s.to_string()), + }; + + let contents = serde_json::to_string_pretty(&data)?; + std::fs::write(dir.join(format!("{name}.json")), contents)?; + Ok(()) +} + +#[derive(Debug, Clone)] +pub struct ProfileEntry { + pub name: String, + pub profile_id: String, +} + +fn list_profiles_in(dir: &Path) -> Result> { + if !dir.exists() { + return Ok(Vec::new()); + } + + let mut entries = Vec::new(); + for entry in std::fs::read_dir(dir)? { + let entry = entry?; + let path = entry.path(); + if path.extension().and_then(|e| e.to_str()) != Some("json") { + continue; + } + + let name = path + .file_stem() + .and_then(|s| s.to_str()) + .unwrap_or("") + .to_string(); + + if name.is_empty() { + continue; + } + + // Skip corrupt files silently + let Ok(contents) = std::fs::read_to_string(&path) else { + continue; + }; + let Ok(data) = serde_json::from_str::(&contents) else { + continue; + }; + + entries.push(ProfileEntry { + name, + profile_id: data.profile_id, + }); + } + + entries.sort_by(|a, b| a.name.cmp(&b.name)); + Ok(entries) +} + +fn delete_profile_in(name: &str, dir: &Path) -> Result { + let path = dir.join(format!("{name}.json")); + if !path.exists() { + return Ok(false); + } + std::fs::remove_file(&path)?; + Ok(true) +} + +#[cfg(test)] +mod tests { + use super::*; + + // --- validate_profile_name --- + + #[test] + fn valid_names() { + assert!(validate_profile_name("myprof").is_none()); + assert!(validate_profile_name("my-prof").is_none()); + assert!(validate_profile_name("my_prof").is_none()); + assert!(validate_profile_name("a").is_none()); + assert!(validate_profile_name("1abc").is_none()); + assert!(validate_profile_name("A-b_C-3").is_none()); + } + + #[test] + fn empty_name() { + assert!(validate_profile_name("").is_some()); + } + + #[test] + fn invalid_start() { + assert!(validate_profile_name("-foo").is_some()); + assert!(validate_profile_name("_foo").is_some()); + assert!(validate_profile_name(".foo").is_some()); + } + + #[test] + fn invalid_chars() { + assert!(validate_profile_name("foo bar").is_some()); + assert!(validate_profile_name("foo.bar").is_some()); + assert!(validate_profile_name("foo/bar").is_some()); + } + + // --- file-based operations --- + + fn tmp_profiles_dir() -> (tempfile::TempDir, PathBuf) { + let tmp = tempfile::TempDir::new().unwrap(); + let dir = tmp.path().join("profiles"); + (tmp, dir) + } + + #[test] + fn write_read_delete_roundtrip() { + let (_tmp, dir) = tmp_profiles_dir(); + + write_profile_in("test-prof", "prof_123", Some("Default"), &dir).unwrap(); + + let data = read_profile_in("test-prof", &dir).unwrap().unwrap(); + assert_eq!(data.profile_id, "prof_123"); + assert_eq!(data.chrome_profile.as_deref(), Some("Default")); + + let entries = list_profiles_in(&dir).unwrap(); + assert_eq!(entries.len(), 1); + assert_eq!(entries[0].name, "test-prof"); + assert_eq!(entries[0].profile_id, "prof_123"); + + assert!(delete_profile_in("test-prof", &dir).unwrap()); + assert!(!delete_profile_in("test-prof", &dir).unwrap()); + assert!(read_profile_in("test-prof", &dir).unwrap().is_none()); + } + + #[test] + fn read_nonexistent() { + let (_tmp, dir) = tmp_profiles_dir(); + assert!(read_profile_in("nope", &dir).unwrap().is_none()); + } + + #[test] + fn list_skips_corrupt() { + let (_tmp, dir) = tmp_profiles_dir(); + std::fs::create_dir_all(&dir).unwrap(); + std::fs::write(dir.join("good.json"), r#"{"profileId":"p1"}"#).unwrap(); + std::fs::write(dir.join("bad.json"), "not json").unwrap(); + std::fs::write(dir.join("skip.txt"), "not a profile").unwrap(); + + let entries = list_profiles_in(&dir).unwrap(); + assert_eq!(entries.len(), 1); + assert_eq!(entries[0].name, "good"); + } + + #[test] + fn write_without_chrome_profile() { + let (_tmp, dir) = tmp_profiles_dir(); + + write_profile_in("minimal", "prof_456", None, &dir).unwrap(); + let data = read_profile_in("minimal", &dir).unwrap().unwrap(); + assert_eq!(data.profile_id, "prof_456"); + assert!(data.chrome_profile.is_none()); + + // Verify chromeProfile is omitted from JSON + let json = std::fs::read_to_string(dir.join("minimal.json")).unwrap(); + assert!(!json.contains("chromeProfile")); + } + + #[test] + fn list_empty_dir() { + let (_tmp, dir) = tmp_profiles_dir(); + let entries = list_profiles_in(&dir).unwrap(); + assert!(entries.is_empty()); + } + + #[test] + fn profiles_dir_is_under_config_dir() { + let dir = profiles_dir(); + let config = crate::config::config_dir(); + assert_eq!(dir, config.join("profiles")); + } + + #[test] + fn list_sorted_by_name() { + let (_tmp, dir) = tmp_profiles_dir(); + std::fs::create_dir_all(&dir).unwrap(); + std::fs::write(dir.join("zz.json"), r#"{"profileId":"p3"}"#).unwrap(); + std::fs::write(dir.join("aa.json"), r#"{"profileId":"p1"}"#).unwrap(); + std::fs::write(dir.join("mm.json"), r#"{"profileId":"p2"}"#).unwrap(); + + let entries = list_profiles_in(&dir).unwrap(); + let names: Vec<&str> = entries.iter().map(|e| e.name.as_str()).collect(); + assert_eq!(names, vec!["aa", "mm", "zz"]); + } +} diff --git a/src/commands/mod.rs b/src/commands/mod.rs index 37b3c24..2d73980 100644 --- a/src/commands/mod.rs +++ b/src/commands/mod.rs @@ -8,6 +8,7 @@ pub mod forge; pub mod login; pub mod logout; pub mod pdf; +pub mod profile; pub mod run; pub mod scrape; pub mod screenshot; @@ -91,6 +92,12 @@ pub enum Command { /// Display and modify current settings Settings(settings::Args), + + /// Manage named Steel browser profiles + Profile { + #[command(subcommand)] + command: profile::Command, + }, } pub async fn run(cli: Cli) -> anyhow::Result<()> { @@ -112,5 +119,6 @@ pub async fn run(cli: Cli) -> anyhow::Result<()> { Command::Star(args) => star::run(args).await, Command::Support(args) => support::run(args).await, Command::Settings(args) => settings::run(args).await, + Command::Profile { command } => profile::run(command).await, } } diff --git a/src/commands/profile.rs b/src/commands/profile.rs new file mode 100644 index 0000000..033cb40 --- /dev/null +++ b/src/commands/profile.rs @@ -0,0 +1,312 @@ +use clap::{Parser, Subcommand}; + +use crate::browser::{profile_porter, profile_store}; +use crate::config::auth; +use crate::config::settings::{ApiMode, EnvVars}; + +#[derive(Subcommand)] +pub enum Command { + /// List all saved Steel browser profiles + List(ListArgs), + + /// Import a local Chrome profile into Steel (macOS only) + Import(ImportArgs), + + /// Sync a local Chrome profile to an existing Steel profile + Sync(SyncArgs), + + /// Delete a saved Steel browser profile + Delete(DeleteArgs), +} + +#[derive(Parser)] +pub struct ListArgs { + /// Output profiles as JSON + #[arg(long)] + pub json: bool, +} + +#[derive(Parser)] +pub struct ImportArgs { + /// Steel profile name to save as + #[arg(long)] + pub name: String, + + /// Chrome profile to import from (e.g. "Default", "Profile 1") + #[arg(long)] + pub from: Option, +} + +#[derive(Parser)] +pub struct SyncArgs { + /// Steel profile name to sync + #[arg(long)] + pub name: String, + + /// Chrome profile to sync from (overrides stored source) + #[arg(long)] + pub from: Option, +} + +#[derive(Parser)] +pub struct DeleteArgs { + /// Name of the profile to delete + #[arg(long)] + pub name: String, +} + +pub async fn run(command: Command) -> anyhow::Result<()> { + match command { + Command::List(args) => run_list(args).await, + Command::Import(args) => run_import(args).await, + Command::Sync(args) => run_sync(args).await, + Command::Delete(args) => run_delete(args).await, + } +} + +async fn run_list(args: ListArgs) -> anyhow::Result<()> { + let profiles = profile_store::list_profiles()?; + + if args.json { + let json: Vec = profiles + .iter() + .map(|p| { + serde_json::json!({ + "name": p.name, + "profileId": p.profile_id, + }) + }) + .collect(); + println!("{}", serde_json::to_string_pretty(&json)?); + return Ok(()); + } + + if profiles.is_empty() { + println!( + "No profiles found. Use --profile with steel browser start to create one." + ); + return Ok(()); + } + + let max_name = profiles + .iter() + .map(|p| p.name.len()) + .max() + .unwrap_or(4) + .max(4); + + println!("{: anyhow::Result<()> { + if let Some(err) = profile_store::validate_profile_name(&args.name) { + eprintln!("{err}"); + std::process::exit(1); + } + + if profile_store::delete_profile(&args.name)? { + println!( + "Deleted profile \"{}\". Note: Browser state on Steel servers is not affected.", + args.name + ); + } else { + eprintln!("Profile \"{}\" not found.", args.name); + std::process::exit(1); + } + + Ok(()) +} + +fn resolve_api_key() -> anyhow::Result { + let auth_info = auth::resolve_auth(); + auth_info + .api_key + .ok_or_else(|| anyhow::anyhow!("Not authenticated. Run `steel login` or set STEEL_API_KEY.")) +} + +fn resolve_api_base() -> String { + let mode = ApiMode::Cloud; + let env_vars = EnvVars::from_env(); + let config = crate::config::settings::read_config().ok(); + let local_url = config.as_ref().and_then(|c| c.local_api_url()); + mode.resolve_base_url(None, &env_vars, local_url) +} + +async fn run_import(args: ImportArgs) -> anyhow::Result<()> { + // Validate + if let Some(err) = profile_store::validate_profile_name(&args.name) { + eprintln!("{err}"); + std::process::exit(1); + } + + if std::env::consts::OS != "macos" { + anyhow::bail!("Profile import is only supported on macOS."); + } + + let api_key = resolve_api_key()?; + let api_base = resolve_api_base(); + + // Find Chrome profiles + let chrome_profiles = profile_porter::find_chrome_profiles(); + if chrome_profiles.is_empty() { + anyhow::bail!("No Chrome profiles found."); + } + + // Select Chrome profile + let chrome_profile = if let Some(ref from) = args.from { + chrome_profiles + .iter() + .find(|p| p.dir_name == *from) + .ok_or_else(|| { + anyhow::anyhow!( + "Chrome profile \"{}\" not found. Available: {}", + from, + chrome_profiles + .iter() + .map(|p| p.dir_name.as_str()) + .collect::>() + .join(", ") + ) + })? + .clone() + } else { + // Interactive selection + if profile_porter::is_chrome_running() { + eprintln!("Warning: Chrome is currently running. Some data may be locked."); + } + + let items: Vec = chrome_profiles + .iter() + .map(|p| { + if p.display_name != p.dir_name { + format!("{} ({})", p.display_name, p.dir_name) + } else { + p.dir_name.clone() + } + }) + .collect(); + + let selection = dialoguer::Select::new() + .with_prompt("Select Chrome profile to import") + .items(&items) + .default(0) + .interact()?; + + chrome_profiles[selection].clone() + }; + + // Package + println!("Importing {} → {}...", chrome_profile.dir_name, args.name); + let result = profile_porter::package_chrome_profile(&chrome_profile.dir_name, &|msg| { + println!(" {msg}"); + })?; + + let size_mb = result.zip_buffer.len() as f64 / 1024.0 / 1024.0; + + // Upload + println!(" Uploading..."); + let profile_id = + profile_porter::upload_profile_to_steel(result.zip_buffer, &api_key, &api_base).await?; + + // Save metadata + profile_store::write_profile(&args.name, &profile_id, Some(&chrome_profile.dir_name))?; + + println!(); + println!(" {}", args.name); + println!(" id: {profile_id}"); + println!( + " cookies: {} re-encrypted · {:.1} MB", + result.cookies_reencrypted, size_mb + ); + println!(); + println!(" steel browser start --profile {}", args.name); + + Ok(()) +} + +async fn run_sync(args: SyncArgs) -> anyhow::Result<()> { + // Validate + if let Some(err) = profile_store::validate_profile_name(&args.name) { + eprintln!("{err}"); + std::process::exit(1); + } + + if std::env::consts::OS != "macos" { + anyhow::bail!("Profile sync is only supported on macOS."); + } + + let api_key = resolve_api_key()?; + let api_base = resolve_api_base(); + + // Read existing profile + let stored = profile_store::read_profile(&args.name)?.ok_or_else(|| { + anyhow::anyhow!( + "Profile \"{}\" not found. Run `steel profile import --name {}` first.", + args.name, + args.name, + ) + })?; + + // Determine Chrome source + let chrome_source = args + .from + .as_deref() + .or(stored.chrome_profile.as_deref()) + .ok_or_else(|| { + anyhow::anyhow!( + "No source Chrome profile stored. Use --from to specify one." + ) + })? + .to_string(); + + // Verify Chrome profile exists + let chrome_profiles = profile_porter::find_chrome_profiles(); + if !chrome_profiles.iter().any(|p| p.dir_name == chrome_source) { + anyhow::bail!("Chrome profile \"{}\" not found.", chrome_source); + } + + if profile_porter::is_chrome_running() { + eprintln!("Warning: Chrome is currently running. Some data may be locked."); + } + + // Package + println!("Syncing {} → {}...", chrome_source, args.name); + let result = profile_porter::package_chrome_profile(&chrome_source, &|msg| { + println!(" {msg}"); + })?; + + let size_mb = result.zip_buffer.len() as f64 / 1024.0 / 1024.0; + + // Update on Steel + println!(" Uploading..."); + profile_porter::update_profile_on_steel( + &stored.profile_id, + result.zip_buffer, + &api_key, + &api_base, + ) + .await?; + + // Update stored metadata if --from changed the source + if args.from.is_some() && args.from.as_deref() != stored.chrome_profile.as_deref() { + profile_store::write_profile( + &args.name, + &stored.profile_id, + Some(&chrome_source), + )?; + } + + println!(); + println!(" Synced {}", args.name); + println!( + " {} cookies re-encrypted · {:.1} MB", + result.cookies_reencrypted, size_mb + ); + + Ok(()) +} diff --git a/tests/cli_compat.rs b/tests/cli_compat.rs index be8cab5..c746f5e 100644 --- a/tests/cli_compat.rs +++ b/tests/cli_compat.rs @@ -75,6 +75,15 @@ fn flag_short(long: &'static str, short: char) -> ExpectedFlag { } } +fn flag_val_required(long: &'static str) -> ExpectedFlag { + ExpectedFlag { + long, + short: None, + required: true, + takes_value: true, + } +} + fn flag_val_short(long: &'static str, short: char) -> ExpectedFlag { ExpectedFlag { long, @@ -595,3 +604,35 @@ fn login_has_auth_alias() { aliases ); } + +#[test] +fn profile_list_flags() { + let cmd = get_subcommand(&root_cmd(), &["profile", "list"]); + assert_flags(&cmd, &[flag("json")], "profile list"); +} + +#[test] +fn profile_import_flags() { + let cmd = get_subcommand(&root_cmd(), &["profile", "import"]); + assert_flags( + &cmd, + &[flag_val_required("name"), flag_val("from")], + "profile import", + ); +} + +#[test] +fn profile_sync_flags() { + let cmd = get_subcommand(&root_cmd(), &["profile", "sync"]); + assert_flags( + &cmd, + &[flag_val_required("name"), flag_val("from")], + "profile sync", + ); +} + +#[test] +fn profile_delete_flags() { + let cmd = get_subcommand(&root_cmd(), &["profile", "delete"]); + assert_flags(&cmd, &[flag_val_required("name")], "profile delete"); +} From 1f03b53de7bf4c66ef6d9f6b8fd1dc5099034d9c Mon Sep 17 00:00:00 2001 From: junhsss Date: Mon, 16 Mar 2026 19:32:53 +0900 Subject: [PATCH 04/16] feat: agent-browser integration --- Cargo.lock | 1022 +++++++- Cargo.toml | 4 + LICENSE | 21 + skills/steel-browser/SKILL.md | 49 +- .../references/migration-agent-browser.md | 101 +- .../references/steel-browser-commands.md | 189 +- src/browser/daemon/client.rs | 52 + src/browser/daemon/mod.rs | 4 + src/browser/daemon/process.rs | 76 + src/browser/daemon/protocol.rs | 174 ++ src/browser/daemon/server.rs | 366 +++ src/browser/engine.rs | 610 +++++ src/browser/mod.rs | 2 + src/commands/browser/action.rs | 837 +++++++ src/commands/browser/mod.rs | 6 + src/commands/browser/start.rs | 13 + src/commands/browser/stop.rs | 5 + src/commands/mod.rs | 12 + tests/action_coverage.rs | 627 +++++ tests/cli_compat.rs | 6 + tests/native_api_coverage.rs | 315 +++ vendor/agent-browser/README.md | 38 - vendor/agent-browser/dist/action-policy.d.ts | 14 - .../agent-browser/dist/action-policy.d.ts.map | 1 - vendor/agent-browser/dist/action-policy.js | 253 -- .../agent-browser/dist/action-policy.js.map | 1 - vendor/agent-browser/dist/actions.d.ts | 18 - vendor/agent-browser/dist/actions.d.ts.map | 1 - vendor/agent-browser/dist/actions.js | 2037 ---------------- vendor/agent-browser/dist/actions.js.map | 1 - vendor/agent-browser/dist/auth-cli.d.ts | 2 - vendor/agent-browser/dist/auth-cli.d.ts.map | 1 - vendor/agent-browser/dist/auth-cli.js | 97 - vendor/agent-browser/dist/auth-cli.js.map | 1 - vendor/agent-browser/dist/auth-vault.d.ts | 36 - vendor/agent-browser/dist/auth-vault.d.ts.map | 1 - vendor/agent-browser/dist/auth-vault.js | 125 - vendor/agent-browser/dist/auth-vault.js.map | 1 - vendor/agent-browser/dist/browser.d.ts | 583 ----- vendor/agent-browser/dist/browser.d.ts.map | 1 - vendor/agent-browser/dist/browser.js | 2135 ----------------- vendor/agent-browser/dist/browser.js.map | 1 - vendor/agent-browser/dist/confirmation.d.ts | 8 - .../agent-browser/dist/confirmation.d.ts.map | 1 - vendor/agent-browser/dist/confirmation.js | 30 - vendor/agent-browser/dist/confirmation.js.map | 1 - vendor/agent-browser/dist/daemon.d.ts | 66 - vendor/agent-browser/dist/daemon.d.ts.map | 1 - vendor/agent-browser/dist/daemon.js | 609 ----- vendor/agent-browser/dist/daemon.js.map | 1 - vendor/agent-browser/dist/diff.d.ts | 18 - vendor/agent-browser/dist/diff.d.ts.map | 1 - vendor/agent-browser/dist/diff.js | 271 --- vendor/agent-browser/dist/diff.js.map | 1 - vendor/agent-browser/dist/domain-filter.d.ts | 28 - .../agent-browser/dist/domain-filter.d.ts.map | 1 - vendor/agent-browser/dist/domain-filter.js | 149 -- .../agent-browser/dist/domain-filter.js.map | 1 - vendor/agent-browser/dist/encryption.d.ts | 73 - vendor/agent-browser/dist/encryption.d.ts.map | 1 - vendor/agent-browser/dist/encryption.js | 171 -- vendor/agent-browser/dist/encryption.js.map | 1 - vendor/agent-browser/dist/ios-actions.d.ts | 11 - .../agent-browser/dist/ios-actions.d.ts.map | 1 - vendor/agent-browser/dist/ios-actions.js | 228 -- vendor/agent-browser/dist/ios-actions.js.map | 1 - vendor/agent-browser/dist/ios-manager.d.ts | 266 -- .../agent-browser/dist/ios-manager.d.ts.map | 1 - vendor/agent-browser/dist/ios-manager.js | 1073 --------- vendor/agent-browser/dist/ios-manager.js.map | 1 - vendor/agent-browser/dist/protocol.d.ts | 26 - vendor/agent-browser/dist/protocol.d.ts.map | 1 - vendor/agent-browser/dist/protocol.js | 982 -------- vendor/agent-browser/dist/protocol.js.map | 1 - vendor/agent-browser/dist/snapshot.d.ts | 67 - vendor/agent-browser/dist/snapshot.d.ts.map | 1 - vendor/agent-browser/dist/snapshot.js | 514 ---- vendor/agent-browser/dist/snapshot.js.map | 1 - vendor/agent-browser/dist/state-utils.d.ts | 77 - .../agent-browser/dist/state-utils.d.ts.map | 1 - vendor/agent-browser/dist/state-utils.js | 178 -- vendor/agent-browser/dist/state-utils.js.map | 1 - vendor/agent-browser/dist/stream-server.d.ts | 117 - .../agent-browser/dist/stream-server.d.ts.map | 1 - vendor/agent-browser/dist/stream-server.js | 309 --- .../agent-browser/dist/stream-server.js.map | 1 - vendor/agent-browser/dist/types.d.ts | 917 ------- vendor/agent-browser/dist/types.d.ts.map | 1 - vendor/agent-browser/dist/types.js | 2 - vendor/agent-browser/dist/types.js.map | 1 - vendor/agent-browser/runtime-manifest.json | 32 - .../runtimes/darwin-arm64/agent-browser | Bin 867776 -> 0 bytes .../runtimes/darwin-x64/agent-browser | Bin 942880 -> 0 bytes .../runtimes/linux-arm64/agent-browser | Bin 892664 -> 0 bytes .../runtimes/linux-x64/agent-browser | Bin 1008568 -> 0 bytes .../runtimes/win32-x64/agent-browser.exe | Bin 982016 -> 0 bytes 96 files changed, 4305 insertions(+), 11780 deletions(-) create mode 100644 LICENSE create mode 100644 src/browser/daemon/client.rs create mode 100644 src/browser/daemon/mod.rs create mode 100644 src/browser/daemon/process.rs create mode 100644 src/browser/daemon/protocol.rs create mode 100644 src/browser/daemon/server.rs create mode 100644 src/browser/engine.rs create mode 100644 src/commands/browser/action.rs create mode 100644 tests/action_coverage.rs create mode 100644 tests/native_api_coverage.rs delete mode 100644 vendor/agent-browser/README.md delete mode 100644 vendor/agent-browser/dist/action-policy.d.ts delete mode 100644 vendor/agent-browser/dist/action-policy.d.ts.map delete mode 100644 vendor/agent-browser/dist/action-policy.js delete mode 100644 vendor/agent-browser/dist/action-policy.js.map delete mode 100644 vendor/agent-browser/dist/actions.d.ts delete mode 100644 vendor/agent-browser/dist/actions.d.ts.map delete mode 100644 vendor/agent-browser/dist/actions.js delete mode 100644 vendor/agent-browser/dist/actions.js.map delete mode 100644 vendor/agent-browser/dist/auth-cli.d.ts delete mode 100644 vendor/agent-browser/dist/auth-cli.d.ts.map delete mode 100644 vendor/agent-browser/dist/auth-cli.js delete mode 100644 vendor/agent-browser/dist/auth-cli.js.map delete mode 100644 vendor/agent-browser/dist/auth-vault.d.ts delete mode 100644 vendor/agent-browser/dist/auth-vault.d.ts.map delete mode 100644 vendor/agent-browser/dist/auth-vault.js delete mode 100644 vendor/agent-browser/dist/auth-vault.js.map delete mode 100644 vendor/agent-browser/dist/browser.d.ts delete mode 100644 vendor/agent-browser/dist/browser.d.ts.map delete mode 100644 vendor/agent-browser/dist/browser.js delete mode 100644 vendor/agent-browser/dist/browser.js.map delete mode 100644 vendor/agent-browser/dist/confirmation.d.ts delete mode 100644 vendor/agent-browser/dist/confirmation.d.ts.map delete mode 100644 vendor/agent-browser/dist/confirmation.js delete mode 100644 vendor/agent-browser/dist/confirmation.js.map delete mode 100644 vendor/agent-browser/dist/daemon.d.ts delete mode 100644 vendor/agent-browser/dist/daemon.d.ts.map delete mode 100644 vendor/agent-browser/dist/daemon.js delete mode 100644 vendor/agent-browser/dist/daemon.js.map delete mode 100644 vendor/agent-browser/dist/diff.d.ts delete mode 100644 vendor/agent-browser/dist/diff.d.ts.map delete mode 100644 vendor/agent-browser/dist/diff.js delete mode 100644 vendor/agent-browser/dist/diff.js.map delete mode 100644 vendor/agent-browser/dist/domain-filter.d.ts delete mode 100644 vendor/agent-browser/dist/domain-filter.d.ts.map delete mode 100644 vendor/agent-browser/dist/domain-filter.js delete mode 100644 vendor/agent-browser/dist/domain-filter.js.map delete mode 100644 vendor/agent-browser/dist/encryption.d.ts delete mode 100644 vendor/agent-browser/dist/encryption.d.ts.map delete mode 100644 vendor/agent-browser/dist/encryption.js delete mode 100644 vendor/agent-browser/dist/encryption.js.map delete mode 100644 vendor/agent-browser/dist/ios-actions.d.ts delete mode 100644 vendor/agent-browser/dist/ios-actions.d.ts.map delete mode 100644 vendor/agent-browser/dist/ios-actions.js delete mode 100644 vendor/agent-browser/dist/ios-actions.js.map delete mode 100644 vendor/agent-browser/dist/ios-manager.d.ts delete mode 100644 vendor/agent-browser/dist/ios-manager.d.ts.map delete mode 100644 vendor/agent-browser/dist/ios-manager.js delete mode 100644 vendor/agent-browser/dist/ios-manager.js.map delete mode 100644 vendor/agent-browser/dist/protocol.d.ts delete mode 100644 vendor/agent-browser/dist/protocol.d.ts.map delete mode 100644 vendor/agent-browser/dist/protocol.js delete mode 100644 vendor/agent-browser/dist/protocol.js.map delete mode 100644 vendor/agent-browser/dist/snapshot.d.ts delete mode 100644 vendor/agent-browser/dist/snapshot.d.ts.map delete mode 100644 vendor/agent-browser/dist/snapshot.js delete mode 100644 vendor/agent-browser/dist/snapshot.js.map delete mode 100644 vendor/agent-browser/dist/state-utils.d.ts delete mode 100644 vendor/agent-browser/dist/state-utils.d.ts.map delete mode 100644 vendor/agent-browser/dist/state-utils.js delete mode 100644 vendor/agent-browser/dist/state-utils.js.map delete mode 100644 vendor/agent-browser/dist/stream-server.d.ts delete mode 100644 vendor/agent-browser/dist/stream-server.d.ts.map delete mode 100644 vendor/agent-browser/dist/stream-server.js delete mode 100644 vendor/agent-browser/dist/stream-server.js.map delete mode 100644 vendor/agent-browser/dist/types.d.ts delete mode 100644 vendor/agent-browser/dist/types.d.ts.map delete mode 100644 vendor/agent-browser/dist/types.js delete mode 100644 vendor/agent-browser/dist/types.js.map delete mode 100644 vendor/agent-browser/runtime-manifest.json delete mode 100755 vendor/agent-browser/runtimes/darwin-arm64/agent-browser delete mode 100755 vendor/agent-browser/runtimes/darwin-x64/agent-browser delete mode 100755 vendor/agent-browser/runtimes/linux-arm64/agent-browser delete mode 100755 vendor/agent-browser/runtimes/linux-x64/agent-browser delete mode 100644 vendor/agent-browser/runtimes/win32-x64/agent-browser.exe diff --git a/Cargo.lock b/Cargo.lock index 46facf3..bcfb80d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,6 +8,16 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array", +] + [[package]] name = "aes" version = "0.8.4" @@ -19,6 +29,46 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "aes-gcm" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + +[[package]] +name = "agent-browser" +version = "0.20.10" +source = "git+https://github.com/steel-dev/agent-browser?branch=as-lib#cef1e8b3d54b82daed220679b58316aa2c5e43a1" +dependencies = [ + "aes-gcm", + "async-trait", + "base64", + "dirs 5.0.1", + "futures-util", + "getrandom 0.2.17", + "image", + "libc", + "reqwest", + "serde", + "serde_json", + "sha2", + "similar", + "tokio", + "tokio-tungstenite", + "url", + "uuid", + "windows-sys 0.52.0", + "zip 8.2.0", +] + [[package]] name = "aho-corasick" version = "1.1.4" @@ -28,6 +78,24 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685" +dependencies = [ + "as-slice", +] + +[[package]] +name = "aligned-vec" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" +dependencies = [ + "equator", +] + [[package]] name = "anstream" version = "1.0.0" @@ -93,6 +161,32 @@ dependencies = [ "derive_arbitrary", ] +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "as-slice" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" +dependencies = [ + "stable_deref_trait", +] + [[package]] name = "assert-json-diff" version = "2.0.2" @@ -103,24 +197,99 @@ dependencies = [ "serde_json", ] +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "atomic-waker" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "av-scenechange" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f321d77c20e19b92c39e7471cf986812cbb46659d2af674adc4331ef3f18394" +dependencies = [ + "aligned", + "anyhow", + "arg_enum_proc_macro", + "arrayvec", + "log", + "num-rational", + "num-traits", + "pastey", + "rayon", + "thiserror 2.0.18", + "v_frame", + "y4m", +] + +[[package]] +name = "av1-grain" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "375082f007bd67184fb9c0374614b29f9aaa604ec301635f72338bb65386a53d" +dependencies = [ + "arrayvec", +] + [[package]] name = "base64" version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "bit_field" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" + [[package]] name = "bitflags" version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +[[package]] +name = "bitstream-io" +version = "4.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60d4bd9d1db2c6bdf285e223a7fa369d5ce98ec767dec949c6ca62863ce61757" +dependencies = [ + "core2", +] + [[package]] name = "block-buffer" version = "0.10.4" @@ -139,12 +308,36 @@ dependencies = [ "generic-array", ] +[[package]] +name = "built" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4ad8f11f288f48ca24471bbd51ac257aaeaaa07adae295591266b792902ae64" + [[package]] name = "bumpalo" version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + [[package]] name = "bytes" version = "1.11.1" @@ -167,6 +360,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" dependencies = [ "find-msvc-tools", + "jobserver", + "libc", "shlex", ] @@ -232,6 +427,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + [[package]] name = "colorchoice" version = "1.0.4" @@ -260,6 +461,15 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "core2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] + [[package]] name = "cpufeatures" version = "0.2.17" @@ -278,12 +488,37 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + [[package]] name = "crypto-common" version = "0.1.7" @@ -291,9 +526,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", + "rand_core 0.6.4", "typenum", ] +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "data-encoding" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" + [[package]] name = "deadpool" version = "0.12.3" @@ -347,13 +598,34 @@ dependencies = [ "subtle", ] +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys 0.4.1", +] + [[package]] name = "dirs" version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" dependencies = [ - "dirs-sys", + "dirs-sys 0.5.0", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users 0.4.6", + "windows-sys 0.48.0", ] [[package]] @@ -364,7 +636,7 @@ checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" dependencies = [ "libc", "option-ext", - "redox_users", + "redox_users 0.5.2", "windows-sys 0.61.2", ] @@ -379,12 +651,38 @@ dependencies = [ "syn", ] +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + [[package]] name = "encode_unicode" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" +[[package]] +name = "equator" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" +dependencies = [ + "equator-macro", +] + +[[package]] +name = "equator-macro" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "equivalent" version = "1.0.2" @@ -401,6 +699,21 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "exr" +version = "1.74.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4300e043a56aa2cb633c01af81ca8f699a321879a7854d3896a0ba89056363be" +dependencies = [ + "bit_field", + "half", + "lebe", + "miniz_oxide", + "rayon-core", + "smallvec", + "zune-inflate", +] + [[package]] name = "fallible-iterator" version = "0.3.0" @@ -419,6 +732,35 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "fax" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05de7d48f37cd6730705cbca900770cab77a89f413d23e100ad7fad7795a0ab" +dependencies = [ + "fax_derive", +] + +[[package]] +name = "fax_derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + [[package]] name = "find-msvc-tools" version = "0.1.9" @@ -433,6 +775,7 @@ checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" dependencies = [ "crc32fast", "miniz_oxide", + "zlib-rs", ] [[package]] @@ -594,6 +937,26 @@ dependencies = [ "wasip3", ] +[[package]] +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", +] + +[[package]] +name = "gif" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5df2ba84018d80c213569363bdcd0c64e6933c67fe4c1d60ecf822971a3c35e" +dependencies = [ + "color_quant", + "weezl", +] + [[package]] name = "h2" version = "0.4.13" @@ -613,6 +976,17 @@ dependencies = [ "tracing", ] +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "zerocopy", +] + [[package]] name = "hashbrown" version = "0.15.5" @@ -740,7 +1114,7 @@ dependencies = [ "tokio", "tokio-rustls", "tower-service", - "webpki-roots", + "webpki-roots 1.0.6", ] [[package]] @@ -874,6 +1248,46 @@ dependencies = [ "icu_properties", ] +[[package]] +name = "image" +version = "0.25.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" +dependencies = [ + "bytemuck", + "byteorder-lite", + "color_quant", + "exr", + "gif", + "image-webp", + "moxcms", + "num-traits", + "png", + "qoi", + "ravif", + "rayon", + "rgb", + "tiff", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "image-webp" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" +dependencies = [ + "byteorder-lite", + "quick-error", +] + +[[package]] +name = "imgref" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c5cedc30da3a610cac6b4ba17597bdf7152cf974e8aab3afb3d54455e371c8" + [[package]] name = "indexmap" version = "2.13.0" @@ -909,6 +1323,17 @@ dependencies = [ "generic-array", ] +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "ipnet" version = "2.12.0" @@ -950,12 +1375,31 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + [[package]] name = "js-sys" version = "0.3.91" @@ -978,12 +1422,28 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" +[[package]] +name = "lebe" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" + [[package]] name = "libc" version = "0.2.183" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" +[[package]] +name = "libfuzzer-sys" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f12a681b7dd8ce12bff52488013ba614b869148d54dd79836ab85aafdd53f08d" +dependencies = [ + "arbitrary", + "cc", +] + [[package]] name = "libredox" version = "0.1.14" @@ -1031,12 +1491,31 @@ version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + [[package]] name = "lru-slab" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] + [[package]] name = "memchr" version = "2.8.0" @@ -1080,6 +1559,87 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "moxcms" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" +dependencies = [ + "num-traits", + "pxfm", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + [[package]] name = "num_cpus" version = "1.17.0" @@ -1108,6 +1668,12 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + [[package]] name = "open" version = "5.3.3" @@ -1148,6 +1714,18 @@ dependencies = [ "windows-link", ] +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pastey" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" + [[package]] name = "pathdiff" version = "0.2.3" @@ -1188,6 +1766,31 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + [[package]] name = "portable-atomic" version = "1.13.1" @@ -1231,6 +1834,46 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "profiling" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "pxfm" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a041e753da8b807c9255f28de81879c78c876392ff2469cde94799b2896b9d" + +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + [[package]] name = "quinn" version = "0.11.9" @@ -1260,7 +1903,7 @@ dependencies = [ "bytes", "getrandom 0.3.4", "lru-slab", - "rand", + "rand 0.9.2", "ring", "rustc-hash", "rustls", @@ -1307,14 +1950,35 @@ version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + [[package]] name = "rand" version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ - "rand_chacha", - "rand_core", + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", ] [[package]] @@ -1324,7 +1988,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", ] [[package]] @@ -1336,6 +2009,76 @@ dependencies = [ "getrandom 0.3.4", ] +[[package]] +name = "rav1e" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b" +dependencies = [ + "aligned-vec", + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av-scenechange", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "paste", + "profiling", + "rand 0.9.2", + "rand_chacha 0.9.0", + "simd_helpers", + "thiserror 2.0.18", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e52310197d971b0f5be7fe6b57530dcd27beb35c1b013f29d66c1ad73fbbcc45" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + +[[package]] +name = "rayon" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "redox_syscall" version = "0.5.18" @@ -1345,6 +2088,17 @@ dependencies = [ "bitflags", ] +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 1.0.69", +] + [[package]] name = "redox_users" version = "0.5.2" @@ -1422,9 +2176,15 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots", + "webpki-roots 1.0.6", ] +[[package]] +name = "rgb" +version = "0.8.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" + [[package]] name = "ring" version = "0.17.14" @@ -1636,6 +2396,21 @@ version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + +[[package]] +name = "similar" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" + [[package]] name = "slab" version = "0.4.12" @@ -1669,12 +2444,14 @@ name = "steel-cli" version = "0.1.0" dependencies = [ "aes", + "agent-browser", "anyhow", + "base64", "cbc", "clap", "colored", "dialoguer", - "dirs", + "dirs 6.0.0", "hmac", "indicatif", "open", @@ -1691,7 +2468,7 @@ dependencies = [ "url", "urlencoding", "wiremock", - "zip", + "zip 2.4.2", ] [[package]] @@ -1790,6 +2567,20 @@ dependencies = [ "syn", ] +[[package]] +name = "tiff" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63feaf3343d35b6ca4d50483f94843803b0f51634937cc2ec519fc32232bc52" +dependencies = [ + "fax", + "flate2", + "half", + "quick-error", + "weezl", + "zune-jpeg", +] + [[package]] name = "tinystr" version = "0.8.2" @@ -1853,6 +2644,22 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-tungstenite" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" +dependencies = [ + "futures-util", + "log", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tungstenite", + "webpki-roots 0.26.11", +] + [[package]] name = "tokio-util" version = "0.7.18" @@ -1936,6 +2743,32 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "tungstenite" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.8.5", + "rustls", + "rustls-pki-types", + "sha1", + "thiserror 1.0.69", + "utf-8", +] + +[[package]] +name = "typed-path" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e28f89b80c87b8fb0cf04ab448d5dd0dd0ade2f8891bae878de66a75a28600e" + [[package]] name = "typenum" version = "1.19.0" @@ -1966,6 +2799,16 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + [[package]] name = "untrusted" version = "0.9.0" @@ -1990,6 +2833,12 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + [[package]] name = "utf8_iter" version = "1.0.4" @@ -2002,6 +2851,28 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "uuid" +version = "1.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37" +dependencies = [ + "getrandom 0.4.2", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "v_frame" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + [[package]] name = "vcpkg" version = "0.2.15" @@ -2160,6 +3031,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki-roots" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.6", +] + [[package]] name = "webpki-roots" version = "1.0.6" @@ -2169,12 +3049,27 @@ dependencies = [ "rustls-pki-types", ] +[[package]] +name = "weezl" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" + [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + [[package]] name = "windows-sys" version = "0.52.0" @@ -2211,6 +3106,21 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + [[package]] name = "windows-targets" version = "0.52.6" @@ -2244,6 +3154,12 @@ dependencies = [ "windows_x86_64_msvc 0.53.1", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" @@ -2256,6 +3172,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" @@ -2268,6 +3190,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -2292,6 +3220,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + [[package]] name = "windows_i686_msvc" version = "0.52.6" @@ -2304,6 +3238,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" @@ -2316,6 +3256,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" @@ -2328,6 +3274,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -2457,6 +3409,12 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +[[package]] +name = "y4m" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" + [[package]] name = "yoke" version = "0.8.1" @@ -2577,6 +3535,26 @@ dependencies = [ "zopfli", ] +[[package]] +name = "zip" +version = "8.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b680f2a0cd479b4cff6e1233c483fdead418106eae419dc60200ae9850f6d004" +dependencies = [ + "crc32fast", + "flate2", + "indexmap", + "memchr", + "typed-path", + "zopfli", +] + +[[package]] +name = "zlib-rs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be3d40e40a133f9c916ee3f9f4fa2d9d63435b5fbe1bfc6d9dae0aa0ada1513" + [[package]] name = "zmij" version = "1.0.21" @@ -2594,3 +3572,27 @@ dependencies = [ "log", "simd-adler32", ] + +[[package]] +name = "zune-core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9" + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "zune-jpeg" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec5f41c76397b7da451efd19915684f727d7e1d516384ca6bd0ec43ec94de23c" +dependencies = [ + "zune-core", +] diff --git a/Cargo.toml b/Cargo.toml index fade1df..fe7acba 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,7 @@ serde = { version = "1", features = ["derive"] } serde_json = "1" tokio = { version = "1", features = ["full"] } anyhow = "1" +base64 = "0.22" thiserror = "2" dirs = "6" open = "5" @@ -37,6 +38,9 @@ sha1 = "0.10" sha2 = "0.10" hmac = "0.12" +# Browser engine +browser-engine = { git = "https://github.com/steel-dev/agent-browser", branch = "as-lib", package = "agent-browser" } + [dev-dependencies] tempfile = "3" wiremock = "0.6" diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..1c11434 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Nenlabs + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/skills/steel-browser/SKILL.md b/skills/steel-browser/SKILL.md index 8bfa548..bdeedf0 100644 --- a/skills/steel-browser/SKILL.md +++ b/skills/steel-browser/SKILL.md @@ -43,7 +43,7 @@ Follow this sequence: 1. Choose command family: extraction (`steel scrape`) or interaction (`steel browser`). 2. For interactive work, start/attach a named session. -3. Inspect page state (`snapshot -i`), then interact in small steps. +3. Inspect page state (`snapshot`), then interact in small steps. 4. Re-snapshot after meaningful DOM changes/navigation. 5. Verify with `wait`, `get ...`, `snapshot`, or screenshot/PDF output. 6. Stop sessions when done unless user asks to keep them running. @@ -58,12 +58,11 @@ steel scrape https://example.com --format markdown,html --use-proxy ### Interactive playbook ```bash -SESSION="task-$(date +%s)" -steel browser start --session "$SESSION" -steel browser open --session "$SESSION" -steel browser snapshot -i --session "$SESSION" +steel browser start --session my-task +steel browser open +steel browser snapshot # click/fill/wait/get/snapshot loop -steel browser stop --session "$SESSION" +steel browser stop ``` ### Parallel sessions playbook @@ -73,12 +72,12 @@ steel browser stop --session "$SESSION" steel browser start --session job-a steel browser start --session job-b -# Each session runs an isolated Steel cloud browser -- commands stay independent +# Each session runs an isolated Steel cloud browser steel browser open https://site-a.com --session job-a steel browser open https://site-b.com --session job-b -steel browser snapshot -i --session job-a -steel browser snapshot -i --session job-b +steel browser snapshot --session job-a +steel browser snapshot --session job-b # Clean up steel browser stop --session job-a @@ -104,32 +103,32 @@ steel browser stop --all ### Navigation and inspection ```bash -steel browser open --session -steel browser snapshot -i --session -steel browser snapshot -c --session -steel browser get url --session -steel browser get title --session -steel browser get text --session +steel browser open +steel browser snapshot # all elements (default) +steel browser snapshot -i # interactive elements only +steel browser snapshot -c # compact output +steel browser get url +steel browser get title +steel browser get text ``` ### Interaction and sync ```bash -steel browser click --session -steel browser fill "text" --session -steel browser press Enter --session -steel browser select "value" --session -steel browser wait --load networkidle --session -steel browser wait --session +steel browser click +steel browser fill "text" +steel browser press Enter +steel browser select "value" +steel browser wait --load-state networkidle +steel browser wait --selector --state visible +steel browser wait --text "Success" ``` ### CAPTCHA and anti-bot ```bash -steel browser start --session --stealth --proxy -# If session has auto-captcha enabled, and there's a captcha on the page, you can get the status of the solve (and wait until its finished) like so -steel browser captcha status --wait --session -# If the session has manual solving on, you can invoke a captcha solving on the page like so +steel browser start --session --stealth +steel browser captcha status --wait steel browser captcha solve --session ``` diff --git a/skills/steel-browser/references/migration-agent-browser.md b/skills/steel-browser/references/migration-agent-browser.md index 2b0d59d..bb80e83 100644 --- a/skills/steel-browser/references/migration-agent-browser.md +++ b/skills/steel-browser/references/migration-agent-browser.md @@ -4,24 +4,46 @@ Use this reference when users bring existing upstream scripts or habits. ## Core migration rule -For most scripts, replace command prefix only: +Replace the command prefix: - Before: `agent-browser ...` - After: `steel browser ...` -Steel keeps inherited runtime command behavior and adds lifecycle controls. - -## Recommended migration process - -1. Ensure Steel CLI is installed and authenticated (`steel login` or `STEEL_API_KEY`). -2. Replace command prefixes in scripts. -3. Run smoke validation: - - `start` - - `open` - - `snapshot -i` - - `stop` -4. Add explicit `--session ` for multi-step scripts. -5. If self-hosted, set `--api-url` for deterministic endpoint selection. +Steel keeps the same CLI interface as agent-browser and adds lifecycle controls. + +## Command mapping + +Most commands work with a direct prefix swap. Key equivalences: + +| agent-browser | steel browser | +| ------------------------- | ----------------------------------------- | +| `open ` | `open ` (alias for `navigate`) | +| `snapshot` | `snapshot` (both default to all elements) | +| `snapshot -i` | `snapshot -i` (interactive-only) | +| `get text @e1` | `get text @e1` | +| `get html @e1` | `get html @e1` | +| `get url` | `get url` | +| `is visible @e1` | `is visible @e1` | +| `tab new` | `tab new` | +| `tab 2` | `tab switch 2` | +| `scroll down 500` | `scroll down 500` | +| `wait @e1` | `wait --selector @e1` | +| `wait 2000` | `wait --timeout 2000` | +| `wait --load networkidle` | `wait --load-state networkidle` | +| `wait --fn "expr"` | `wait --function "expr"` | +| `screenshot ./page.png` | `screenshot -o ./page.png` | +| `screenshot --full` | `screenshot --full-page` | + +## Snapshot flag differences + +Snapshot flags now match agent-browser 1:1: + +| agent-browser | steel browser | +| ------------------- | ---------------------- | +| `-i, --interactive` | `-i, --interactive` | +| `-c` | `-c, --compact` | +| `-d ` | `-d, --max-depth ` | +| `-s ` | `-s, --selector ` | ## Example conversion @@ -31,40 +53,45 @@ agent-browser open https://example.com agent-browser snapshot -i agent-browser click @e3 agent-browser get text @e7 +agent-browser wait --load networkidle +agent-browser screenshot ./page.png # After +steel browser start steel browser open https://example.com steel browser snapshot -i steel browser click @e3 steel browser get text @e7 +steel browser wait --load-state networkidle +steel browser screenshot -o ./page.png +steel browser stop ``` -## Steel-native commands to introduce when helpful - -- `steel browser start` -- `steel browser stop` -- `steel browser sessions` -- `steel browser live` - -These are helpful for explicit session lifecycle management and debugging. - -## Auth and environment differences - -Cloud mode: - -- Use `steel login` locally. -- Use `STEEL_API_KEY` in CI/automation. +## Steel-only commands -Self-hosted mode: +These are Steel additions not present in agent-browser: -- Prefer `--api-url `. -- Alternative precedence still applies through env/config: - `STEEL_BROWSER_API_URL`, `STEEL_LOCAL_API_URL`, config file. +- `steel browser start` — create/attach a cloud browser session +- `steel browser stop` — release the session +- `steel browser sessions` — list active sessions +- `steel browser live` — open the live session viewer +- `steel browser captcha status/solve` — CAPTCHA management -## Attach behavior note +## Not yet implemented -If a command already provides `--cdp` or `--auto-connect`, Steel forwards passthrough without adding bootstrap attach flags. Do not combine both flags in one call. +These agent-browser commands are not yet available in Steel: -## Security note for logs +- `set viewport/device/geo/offline/headers/credentials/media` — browser configuration +- `cookies get/set/clear` — cookie management +- `storage local/session` — web storage +- `network route/unroute/requests` — network interception +- `find role/text/label/...` — semantic locators (Steel `find` uses CSS selectors only) +- `dialog accept/dismiss` — dialog handling +- `upload`, `drag` — file upload, drag and drop +- `pdf` — PDF export +- `console`, `errors` — debug log capture +- `frame`, `window new` — frame/window management +- `keydown`, `keyup` — low-level keyboard input +- `record start/stop` — video recording -`steel browser start` and `steel browser sessions` output display-safe connect URLs with sensitive values redacted. Use session `id` + environment secrets for raw credentialed URLs when needed. +Use `steel browser --help` to see all currently available commands. diff --git a/skills/steel-browser/references/steel-browser-commands.md b/skills/steel-browser/references/steel-browser-commands.md index 8583dac..103451a 100644 --- a/skills/steel-browser/references/steel-browser-commands.md +++ b/skills/steel-browser/references/steel-browser-commands.md @@ -2,66 +2,66 @@ Use this reference when you need command-level patterns for navigation, interaction, extraction, and debugging. +For any command, run `steel browser --help` for full flag details. + ## Navigation ```bash steel browser open +steel browser navigate --wait-until networkidle +steel browser navigate --header "Authorization: Bearer ..." steel browser back steel browser forward steel browser reload steel browser close -steel browser connect 9222 ``` +`open` is an alias for `navigate`. + ## Snapshot and element discovery ```bash -steel browser snapshot -steel browser snapshot -i -steel browser snapshot -c -steel browser snapshot -d 3 -steel browser snapshot -s "#main" +steel browser snapshot # all elements (default) +steel browser snapshot -i # interactive elements only +steel browser snapshot -c # compact output +steel browser snapshot -d 3 # limit tree depth +steel browser snapshot -s "#main" # scope to subtree +steel browser snapshot -i -c -d 3 # combine short flags ``` +Snapshot returns an accessibility tree with element refs (`@e1`, `@e2`, ...). +Use these refs in subsequent commands instead of CSS selectors. + ## Interactions with element refs ```bash steel browser click @e1 steel browser click @e1 --new-tab +steel browser click @e1 --button right +steel browser click @e1 --count 2 steel browser dblclick @e1 steel browser focus @e1 steel browser fill @e2 "text" steel browser type @e2 "text" +steel browser type @e2 "text" --clear steel browser press Enter steel browser press Control+a -steel browser keydown Shift -steel browser keyup Shift steel browser hover @e1 steel browser check @e1 steel browser uncheck @e1 steel browser select @e1 "value" steel browser select @e1 "a" "b" +steel browser clear @e1 +steel browser selectall @e1 steel browser scroll down 500 +steel browser scroll up +steel browser scroll down 200 --selector ".panel" steel browser scrollintoview @e1 -steel browser drag @e1 @e2 -steel browser upload @e1 ./file.pdf +steel browser setvalue @e1 "raw value" ``` -## Semantic locator alternatives - -```bash -steel browser find role button click --name "Submit" -steel browser find text "Sign In" click -steel browser find text "Sign In" click --exact -steel browser find label "Email" fill "user@test.com" -steel browser find placeholder "Search" type "query" -steel browser find alt "Logo" click -steel browser find title "Close" click -steel browser find testid "submit-btn" click -steel browser find first ".item" click -steel browser find last ".item" click -steel browser find nth 2 "a" hover -``` +`setvalue` sets the DOM value property directly without triggering input events. +Use `fill` or `type` for normal form interaction. ## Information extraction @@ -75,6 +75,7 @@ steel browser get url steel browser get count ".item" steel browser get box @e1 steel browser get styles @e1 +steel browser get styles @e1 --property color --property font-size ``` There is no top-level `steel browser extract` command. @@ -88,132 +89,92 @@ steel browser is enabled @e1 steel browser is checked @e1 ``` -## Waiting and synchronization - -```bash -steel browser wait @e1 -steel browser wait 2000 -steel browser wait --text "Success" -steel browser wait --url "**/dashboard" -steel browser wait --load networkidle -steel browser wait --fn "window.ready" -``` - -## Screenshots, PDFs, and recording +## Find elements ```bash -steel browser screenshot -steel browser screenshot ./page.png -steel browser screenshot --full -steel browser pdf ./output.pdf -steel browser record start ./demo.webm -steel browser record stop -steel browser record restart ./take2.webm +steel browser find ".item" +steel browser find "a[href*=login]" ``` -Use a positional file path for screenshot output. -Do not use `-o`/`--output` with `steel browser screenshot`. +Returns a list of matching elements with index, tag name, text, and visibility. -## Browser settings +## Waiting and synchronization ```bash -steel browser set viewport 1920 1080 -steel browser set device "iPhone 14" -steel browser set geo 37.7749 -122.4194 -steel browser set offline on -steel browser set headers '{"X-Key":"v"}' -steel browser set credentials user pass -steel browser set media dark -steel browser set media light reduced-motion +steel browser wait --text "Success" +steel browser wait --selector ".loaded" +steel browser wait --selector ".modal" --state hidden +steel browser wait --url "/dashboard" +steel browser wait --function "window.ready" +steel browser wait --load-state networkidle +steel browser wait --timeout 5000 --text "Done" ``` -## Cookies and storage +All wait conditions default to 30 second timeout. Override with `--timeout `. + +## Screenshots ```bash -steel browser cookies -steel browser cookies set name value -steel browser cookies clear -steel browser storage local -steel browser storage local key -steel browser storage local set k v -steel browser storage local clear +steel browser screenshot +steel browser screenshot -o ./page.png +steel browser screenshot --full-page +steel browser screenshot --selector "#chart" +steel browser screenshot --annotate +steel browser screenshot --format jpeg --quality 80 ``` -## Network controls +## Page content ```bash -steel browser network route -steel browser network route --abort -steel browser network route --body '{}' -steel browser network unroute [url] -steel browser network requests -steel browser network requests --filter api +steel browser content +steel browser eval "document.title" +steel browser eval "document.querySelectorAll('a').length" ``` -## Tabs, windows, frames, and dialogs +## Tabs ```bash -steel browser tab -steel browser tab new [url] -steel browser tab 2 +steel browser tab list +steel browser tab new +steel browser tab new https://example.com +steel browser tab switch 2 steel browser tab close steel browser tab close 2 -steel browser window new -steel browser frame "#iframe" -steel browser frame main -steel browser dialog accept [text] -steel browser dialog dismiss -``` - -## JavaScript evaluation - -```bash -steel browser eval "document.title" -steel browser eval -b "" -steel browser eval --stdin ``` -Prefer `-b` or `--stdin` when script complexity makes shell escaping brittle. - -## Session and global options +## Window ```bash -steel browser --session ... -steel browser --json ... -steel browser --headed ... -steel browser --full ... -steel browser --cdp ... -steel browser --proxy ... -steel browser --proxy-bypass ... -steel browser --headers ... -steel browser --ignore-https-errors ... -steel browser --help -steel browser --version -steel browser --help +steel browser bringtofront ``` -## Debugging quick set +## Session lifecycle ```bash -steel browser --headed open example.com -steel browser --cdp 9222 snapshot -steel browser console -steel browser console --clear -steel browser errors -steel browser errors --clear -steel browser highlight @e1 +steel browser start +steel browser start --session +steel browser sessions +steel browser live +steel browser stop +steel browser stop --all ``` ## CAPTCHA control ```bash -steel browser start --session --session-solve-captcha steel browser start --session --stealth steel browser captcha status steel browser captcha status --wait steel browser captcha status --wait --timeout 120000 -steel browser captcha status --raw steel browser captcha solve --session -steel browser captcha solve --session --page-id --task-id -steel browser screenshot /tmp/captcha-progress.png --session +``` + +## Quick help + +```bash +steel browser --help +steel browser --help +steel browser get --help +steel browser is --help +steel browser tab --help ``` diff --git a/src/browser/daemon/client.rs b/src/browser/daemon/client.rs new file mode 100644 index 0000000..0be1298 --- /dev/null +++ b/src/browser/daemon/client.rs @@ -0,0 +1,52 @@ +use anyhow::{Result, bail}; +use tokio::io::{AsyncBufReadExt, AsyncWriteExt, BufReader}; +use tokio::net::UnixStream; + +use super::process; +use super::protocol::*; + +pub struct DaemonClient { + reader: BufReader>, + writer: tokio::io::WriteHalf, + next_id: u64, +} + +impl DaemonClient { + pub async fn connect(session_id: &str) -> Result { + let sock = process::socket_path(session_id); + let stream = UnixStream::connect(&sock) + .await + .map_err(|_| anyhow::anyhow!("Cannot connect to browser daemon. Is a session running?"))?; + let (read_half, write_half) = tokio::io::split(stream); + Ok(Self { + reader: BufReader::new(read_half), + writer: write_half, + next_id: 1, + }) + } + + pub async fn send(&mut self, command: DaemonCommand) -> Result { + let request = DaemonRequest { + id: self.next_id, + command, + }; + self.next_id += 1; + + let mut json = serde_json::to_string(&request)?; + json.push('\n'); + self.writer.write_all(json.as_bytes()).await?; + self.writer.flush().await?; + + let mut line = String::new(); + let n = self.reader.read_line(&mut line).await?; + if n == 0 { + bail!("Daemon disconnected unexpectedly"); + } + + let response: DaemonResponse = serde_json::from_str(&line)?; + match response.result { + DaemonResult::Ok { data } => Ok(data), + DaemonResult::Error { message } => bail!("{message}"), + } + } +} diff --git a/src/browser/daemon/mod.rs b/src/browser/daemon/mod.rs new file mode 100644 index 0000000..bbeb648 --- /dev/null +++ b/src/browser/daemon/mod.rs @@ -0,0 +1,4 @@ +pub mod client; +pub mod process; +pub mod protocol; +pub mod server; diff --git a/src/browser/daemon/process.rs b/src/browser/daemon/process.rs new file mode 100644 index 0000000..7b8349f --- /dev/null +++ b/src/browser/daemon/process.rs @@ -0,0 +1,76 @@ +use std::path::PathBuf; +use std::time::Duration; + +use anyhow::{Result, bail}; + +pub fn socket_path(session_id: &str) -> PathBuf { + crate::config::config_dir().join(format!("daemon-{session_id}.sock")) +} + +pub fn pid_path(session_id: &str) -> PathBuf { + crate::config::config_dir().join(format!("daemon-{session_id}.pid")) +} + +fn log_path(session_id: &str) -> PathBuf { + crate::config::config_dir().join(format!("daemon-{session_id}.log")) +} + +pub fn cleanup_stale(session_id: &str) { + let _ = std::fs::remove_file(socket_path(session_id)); + let _ = std::fs::remove_file(pid_path(session_id)); +} + +/// Spawn a daemon process for the given session. The CDP URL is passed via +/// environment variable to avoid leaking API keys in the process list. +pub fn spawn_daemon(session_id: &str, cdp_url: &str) -> Result<()> { + let exe = std::env::current_exe()?; + + cleanup_stale(session_id); + + let config_dir = crate::config::config_dir(); + std::fs::create_dir_all(&config_dir)?; + + let log = std::fs::File::create(log_path(session_id))?; + + std::process::Command::new(exe) + .args(["__daemon", "--session-id", session_id]) + .env("STEEL_DAEMON_CDP_URL", cdp_url) + .stdin(std::process::Stdio::null()) + .stdout(log.try_clone()?) + .stderr(log) + .spawn()?; + + Ok(()) +} + +/// Wait until the daemon socket is connectable. +pub async fn wait_for_daemon(session_id: &str, timeout: Duration) -> Result<()> { + let sock = socket_path(session_id); + let start = std::time::Instant::now(); + + while start.elapsed() < timeout { + if sock.exists() { + if tokio::net::UnixStream::connect(&sock).await.is_ok() { + return Ok(()); + } + } + tokio::time::sleep(Duration::from_millis(50)).await; + } + + bail!("Browser daemon failed to start within {}s", timeout.as_secs()); +} + +/// Send a shutdown command to a running daemon and clean up files. +pub async fn stop_daemon(session_id: &str) -> Result<()> { + use super::client::DaemonClient; + use super::protocol::DaemonCommand; + + if let Ok(mut client) = DaemonClient::connect(session_id).await { + let _ = client.send(DaemonCommand::Shutdown).await; + } + + tokio::time::sleep(Duration::from_millis(200)).await; + cleanup_stale(session_id); + + Ok(()) +} diff --git a/src/browser/daemon/protocol.rs b/src/browser/daemon/protocol.rs new file mode 100644 index 0000000..7a28278 --- /dev/null +++ b/src/browser/daemon/protocol.rs @@ -0,0 +1,174 @@ +use std::collections::HashMap; + +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize)] +pub struct DaemonRequest { + pub id: u64, + pub command: DaemonCommand, +} + +#[derive(Serialize, Deserialize)] +#[serde(tag = "action", rename_all = "snake_case")] +pub enum DaemonCommand { + Navigate { + url: String, + wait_until: Option, + headers: Option>, + }, + Click { + selector: String, + button: Option, + click_count: Option, + new_tab: bool, + }, + Fill { + selector: String, + value: String, + }, + TypeText { + selector: String, + text: String, + clear: bool, + delay_ms: Option, + }, + Snapshot { + interactive_only: bool, + selector: Option, + compact: bool, + max_depth: Option, + cursor: bool, + }, + Screenshot { + full_page: bool, + selector: Option, + format: Option, + quality: Option, + annotate: bool, + path: Option, + screenshot_dir: Option, + }, + Press { + key: String, + }, + Hover { + selector: String, + }, + Scroll { + selector: Option, + delta_x: f64, + delta_y: f64, + }, + Select { + selector: String, + values: Vec, + }, + Check { + selector: String, + }, + Uncheck { + selector: String, + }, + Eval { + script: String, + }, + GetText { + selector: String, + }, + GetAttribute { + selector: String, + attribute: String, + }, + IsVisible { + selector: String, + }, + IsEnabled { + selector: String, + }, + IsChecked { + selector: String, + }, + Wait { + timeout: Option, + text: Option, + selector: Option, + state: Option, + url: Option, + function: Option, + load_state: Option, + }, + Url, + Title, + Back, + Forward, + Reload, + Focus { + selector: String, + }, + Clear { + selector: String, + }, + SelectAll { + selector: String, + }, + ScrollIntoView { + selector: String, + }, + DblClick { + selector: String, + }, + InnerText { + selector: String, + }, + InnerHtml { + selector: String, + }, + InputValue { + selector: String, + }, + SetValue { + selector: String, + value: String, + }, + Count { + selector: String, + }, + BoundingBox { + selector: String, + }, + Styles { + selector: String, + properties: Option>, + }, + Content, + Find { + selector: String, + }, + BringToFront, + TabList, + TabNew { + url: Option, + }, + TabSwitch { + index: usize, + }, + TabClose { + index: Option, + }, + Close, + Ping, + Shutdown, +} + +#[derive(Serialize, Deserialize)] +pub struct DaemonResponse { + pub id: u64, + pub result: DaemonResult, +} + +#[derive(Serialize, Deserialize)] +#[serde(tag = "status", rename_all = "snake_case")] +pub enum DaemonResult { + Ok { data: serde_json::Value }, + Error { message: String }, +} diff --git a/src/browser/daemon/server.rs b/src/browser/daemon/server.rs new file mode 100644 index 0000000..8373a66 --- /dev/null +++ b/src/browser/daemon/server.rs @@ -0,0 +1,366 @@ +use std::time::Duration; + +use anyhow::Result; +use serde_json::{Value, json}; +use tokio::io::{AsyncBufReadExt, AsyncWriteExt, BufReader}; +use tokio::net::UnixListener; + +use crate::browser::engine::BrowserEngine; + +use super::process; +use super::protocol::*; + +const IDLE_TIMEOUT: Duration = Duration::from_secs(300); + +pub async fn run(session_id: String, cdp_url: String) -> Result<()> { + let pid_path = process::pid_path(&session_id); + std::fs::create_dir_all(pid_path.parent().unwrap())?; + std::fs::write(&pid_path, std::process::id().to_string())?; + + let mut engine = match BrowserEngine::connect(&cdp_url).await { + Ok(e) => e, + Err(e) => { + cleanup(&session_id); + return Err(e); + } + }; + + let socket_path = process::socket_path(&session_id); + let _ = std::fs::remove_file(&socket_path); + let listener = UnixListener::bind(&socket_path)?; + + loop { + match tokio::time::timeout(IDLE_TIMEOUT, listener.accept()).await { + Err(_) => break, + Ok(Err(_)) => continue, + Ok(Ok((stream, _))) => { + if handle_connection(&mut engine, stream).await { + break; + } + } + } + } + + engine.close().await.ok(); + cleanup(&session_id); + Ok(()) +} + +/// Returns true if the daemon should shut down. +async fn handle_connection( + engine: &mut BrowserEngine, + stream: tokio::net::UnixStream, +) -> bool { + let (read_half, mut write_half) = tokio::io::split(stream); + let mut reader = BufReader::new(read_half); + let mut line = String::new(); + + loop { + line.clear(); + match reader.read_line(&mut line).await { + Err(_) | Ok(0) => return false, + Ok(_) => { + let request: DaemonRequest = match serde_json::from_str(&line) { + Ok(r) => r, + Err(e) => { + let resp = DaemonResponse { + id: 0, + result: DaemonResult::Error { + message: e.to_string(), + }, + }; + let json = serde_json::to_string(&resp).unwrap() + "\n"; + let _ = write_half.write_all(json.as_bytes()).await; + continue; + } + }; + + let is_shutdown = + matches!(request.command, DaemonCommand::Shutdown | DaemonCommand::Close); + let result = dispatch(engine, request.command).await; + let resp = DaemonResponse { + id: request.id, + result, + }; + let json = serde_json::to_string(&resp).unwrap() + "\n"; + let _ = write_half.write_all(json.as_bytes()).await; + let _ = write_half.flush().await; + + if is_shutdown { + return true; + } + } + } + } +} + +async fn dispatch(engine: &mut BrowserEngine, cmd: DaemonCommand) -> DaemonResult { + match dispatch_inner(engine, cmd).await { + Ok(data) => DaemonResult::Ok { data }, + Err(e) => DaemonResult::Error { + message: e.to_string(), + }, + } +} + +async fn dispatch_inner(engine: &mut BrowserEngine, cmd: DaemonCommand) -> Result { + use browser_engine::native::screenshot::ScreenshotOptions; + use browser_engine::native::snapshot::SnapshotOptions; + + match cmd { + DaemonCommand::Navigate { + url, + wait_until, + headers, + } => { + engine + .navigate(&url, wait_until.as_deref(), headers.as_ref()) + .await?; + Ok(Value::Null) + } + DaemonCommand::Click { + selector, + button, + click_count, + new_tab, + } => { + engine + .click(&selector, button.as_deref(), click_count, new_tab) + .await?; + Ok(Value::Null) + } + DaemonCommand::Fill { selector, value } => { + engine.fill(&selector, &value).await?; + Ok(Value::Null) + } + DaemonCommand::TypeText { + selector, + text, + clear, + delay_ms, + } => { + engine.type_text(&selector, &text, clear, delay_ms).await?; + Ok(Value::Null) + } + DaemonCommand::Snapshot { + interactive_only, + selector, + compact, + max_depth, + cursor, + } => { + let options = SnapshotOptions { + selector: selector, + interactive: interactive_only, + compact, + depth: max_depth, + cursor, + }; + let text = engine.snapshot(options).await?; + Ok(Value::String(text)) + } + DaemonCommand::Screenshot { + full_page, + selector, + format, + quality, + annotate, + path, + screenshot_dir, + } => { + let options = ScreenshotOptions { + selector, + path, + full_page, + format: format.unwrap_or_else(|| "png".to_string()), + quality, + annotate, + output_dir: screenshot_dir, + }; + let result = engine.take_screenshot(options).await?; + Ok(json!({ "path": result.path })) + } + DaemonCommand::Press { key } => { + engine.press(&key).await?; + Ok(Value::Null) + } + DaemonCommand::Hover { selector } => { + engine.hover(&selector).await?; + Ok(Value::Null) + } + DaemonCommand::Scroll { + selector, + delta_x, + delta_y, + } => { + engine + .scroll(selector.as_deref(), delta_x, delta_y) + .await?; + Ok(Value::Null) + } + DaemonCommand::Select { selector, values } => { + engine.select(&selector, &values).await?; + Ok(Value::Null) + } + DaemonCommand::Check { selector } => { + engine.check(&selector).await?; + Ok(Value::Null) + } + DaemonCommand::Uncheck { selector } => { + engine.uncheck(&selector).await?; + Ok(Value::Null) + } + DaemonCommand::Eval { script } => { + let val = engine.evaluate(&script).await?; + Ok(val) + } + DaemonCommand::GetText { selector } => { + let text = engine.get_text(&selector).await?; + Ok(json!({ "text": text })) + } + DaemonCommand::GetAttribute { + selector, + attribute, + } => { + let value = engine.get_attribute(&selector, &attribute).await?; + Ok(json!({ "value": value })) + } + DaemonCommand::IsVisible { selector } => { + let visible = engine.is_visible(&selector).await?; + Ok(json!({ "visible": visible })) + } + DaemonCommand::IsEnabled { selector } => { + let enabled = engine.is_enabled(&selector).await?; + Ok(json!({ "enabled": enabled })) + } + DaemonCommand::IsChecked { selector } => { + let checked = engine.is_checked(&selector).await?; + Ok(json!({ "checked": checked })) + } + DaemonCommand::Wait { + timeout, + text, + selector, + state, + url, + function, + load_state, + } => { + let result = engine + .wait( + timeout.unwrap_or(30000), + text.as_deref(), + selector.as_deref(), + state.as_deref(), + url.as_deref(), + function.as_deref(), + load_state.as_deref(), + ) + .await?; + Ok(result) + } + DaemonCommand::Url => { + let url = engine.url().await?; + Ok(Value::String(url)) + } + DaemonCommand::Title => { + let title = engine.title().await?; + Ok(Value::String(title)) + } + DaemonCommand::Back => { + engine.evaluate("history.back()").await?; + Ok(Value::Null) + } + DaemonCommand::Forward => { + engine.evaluate("history.forward()").await?; + Ok(Value::Null) + } + DaemonCommand::Reload => { + engine.evaluate("location.reload()").await?; + Ok(Value::Null) + } + DaemonCommand::Focus { selector } => { + engine.focus(&selector).await?; + Ok(Value::Null) + } + DaemonCommand::Clear { selector } => { + engine.clear(&selector).await?; + Ok(Value::Null) + } + DaemonCommand::SelectAll { selector } => { + engine.select_all(&selector).await?; + Ok(Value::Null) + } + DaemonCommand::ScrollIntoView { selector } => { + engine.scroll_into_view(&selector).await?; + Ok(Value::Null) + } + DaemonCommand::DblClick { selector } => { + engine.dblclick(&selector).await?; + Ok(Value::Null) + } + DaemonCommand::InnerText { selector } => { + let text = engine.inner_text(&selector).await?; + Ok(json!({ "text": text })) + } + DaemonCommand::InnerHtml { selector } => { + let html = engine.inner_html(&selector).await?; + Ok(json!({ "html": html })) + } + DaemonCommand::InputValue { selector } => { + let value = engine.input_value(&selector).await?; + Ok(json!({ "value": value })) + } + DaemonCommand::SetValue { selector, value } => { + engine.set_value(&selector, &value).await?; + Ok(Value::Null) + } + DaemonCommand::Count { selector } => { + let count = engine.count(&selector).await?; + Ok(json!({ "count": count, "selector": selector })) + } + DaemonCommand::BoundingBox { selector } => { + engine.bounding_box(&selector).await + } + DaemonCommand::Styles { selector, properties } => { + engine.styles(&selector, properties).await + } + DaemonCommand::Content => { + let html = engine.content().await?; + Ok(Value::String(html)) + } + DaemonCommand::Find { selector } => { + engine.find(&selector).await + } + DaemonCommand::BringToFront => { + engine.bring_to_front().await?; + Ok(Value::Null) + } + DaemonCommand::TabList => { + let data = engine.tab_list(); + Ok(data) + } + DaemonCommand::TabNew { url } => { + let result = engine.tab_new(url.as_deref()).await?; + Ok(result) + } + DaemonCommand::TabSwitch { index } => { + let result = engine.tab_switch(index).await?; + Ok(result) + } + DaemonCommand::TabClose { index } => { + let result = engine.tab_close(index).await?; + Ok(result) + } + DaemonCommand::Close | DaemonCommand::Shutdown => { + engine.close().await.ok(); + Ok(Value::Null) + } + DaemonCommand::Ping => Ok(json!("pong")), + } +} + +fn cleanup(session_id: &str) { + let _ = std::fs::remove_file(process::socket_path(session_id)); + let _ = std::fs::remove_file(process::pid_path(session_id)); +} diff --git a/src/browser/engine.rs b/src/browser/engine.rs new file mode 100644 index 0000000..dffe34d --- /dev/null +++ b/src/browser/engine.rs @@ -0,0 +1,610 @@ +//! Browser engine: direct integration with agent-browser native modules. +//! +//! Replaces the subprocess-spawning passthrough model with in-process +//! browser automation via CDP. + +use std::collections::HashMap; + +use anyhow::Result; + +use browser_engine::native::browser::{BrowserManager, WaitUntil}; +use browser_engine::native::cdp::client::CdpClient; +use browser_engine::native::element::{self, RefMap}; +use browser_engine::native::interaction; +use browser_engine::native::network; +use browser_engine::native::screenshot::{self, ScreenshotOptions, ScreenshotResult}; +use browser_engine::native::snapshot::{self, SnapshotOptions}; + +/// Holds the browser state for a Steel session. +/// This replaces the daemon model — state is owned by the CLI process. +pub struct BrowserEngine { + pub manager: BrowserManager, + pub ref_map: RefMap, +} + +impl BrowserEngine { + /// Connect to an existing browser via CDP endpoint. + pub async fn connect(cdp_url: &str) -> Result { + let manager = BrowserManager::connect_cdp(cdp_url) + .await + .map_err(|e| anyhow::anyhow!(e))?; + Ok(Self { + manager, + ref_map: RefMap::new(), + }) + } + + /// Get the active CDP client and session ID, or bail. + fn active_client_and_session(&self) -> Result<(&CdpClient, &str)> { + let client = &*self.manager.client; + let session_id = self + .manager + .active_session_id() + .map_err(|e| anyhow::anyhow!(e))?; + Ok((client, session_id)) + } + + /// Take an accessibility snapshot of the current page. + pub async fn snapshot(&mut self, options: SnapshotOptions) -> Result { + let client = &*self.manager.client; + let session_id = self + .manager + .active_session_id() + .map_err(|e| anyhow::anyhow!(e))?; + snapshot::take_snapshot(client, session_id, &options, &mut self.ref_map) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Navigate to a URL. + pub async fn navigate( + &mut self, + url: &str, + wait_until: Option<&str>, + headers: Option<&HashMap>, + ) -> Result { + self.ref_map.clear(); + let wu = wait_until + .map(WaitUntil::from_str) + .unwrap_or(WaitUntil::Load); + + // Set scoped headers if provided + let has_headers = headers.is_some_and(|h| !h.is_empty()); + if let Some(h) = headers { + if !h.is_empty() { + let client = &*self.manager.client; + let session_id = self + .manager + .active_session_id() + .map_err(|e| anyhow::anyhow!(e))?; + network::set_extra_headers(client, session_id, h) + .await + .map_err(|e| anyhow::anyhow!(e))?; + } + } + + let result = self + .manager + .navigate(url, wu) + .await + .map_err(|e| anyhow::anyhow!(e)); + + // Clear scoped headers after navigation + if has_headers { + let client = &*self.manager.client; + if let Ok(session_id) = self.manager.active_session_id() { + let empty = HashMap::new(); + let _ = network::set_extra_headers(client, session_id, &empty).await; + } + } + + result + } + + /// Click an element by ref or CSS selector. + pub async fn click( + &mut self, + selector: &str, + button: Option<&str>, + click_count: Option, + new_tab: bool, + ) -> Result<()> { + let client = &*self.manager.client; + let session_id = self + .manager + .active_session_id() + .map_err(|e| anyhow::anyhow!(e))?; + + if new_tab { + // Resolve element's href and open in new tab + let object_id = + element::resolve_element_object_id(client, session_id, &self.ref_map, selector) + .await + .map_err(|e| anyhow::anyhow!(e))?; + let call_params = serde_json::json!({ + "objectId": object_id, + "functionDeclaration": "function() { var h = this.getAttribute('href'); if (!h) return null; try { return new URL(h, document.baseURI).toString(); } catch(e) { return null; } }", + "returnByValue": true + }); + let call_result = client + .send_command( + "Runtime.callFunctionOn", + Some(call_params), + Some(session_id), + ) + .await + .map_err(|e| anyhow::anyhow!(e))?; + let href = call_result + .get("result") + .and_then(|r| r.get("value")) + .and_then(|v| v.as_str()) + .ok_or_else(|| { + anyhow::anyhow!( + "Element '{}' does not have an href attribute. --new-tab only works on links.", + selector + ) + })?; + self.ref_map.clear(); + self.manager + .tab_new(Some(href)) + .await + .map_err(|e| anyhow::anyhow!(e))?; + return Ok(()); + } + + interaction::click( + client, + session_id, + &self.ref_map, + selector, + button.unwrap_or("left"), + click_count.unwrap_or(1), + ) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Fill an input field (clears first, then inserts text). + pub async fn fill(&self, selector: &str, value: &str) -> Result<()> { + let (client, session_id) = self.active_client_and_session()?; + interaction::fill(client, session_id, &self.ref_map, selector, value) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Type text character by character (simulates keystrokes). + pub async fn type_text( + &self, + selector: &str, + text: &str, + clear: bool, + delay_ms: Option, + ) -> Result<()> { + let (client, session_id) = self.active_client_and_session()?; + interaction::type_text( + client, session_id, &self.ref_map, selector, text, clear, delay_ms, + ) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Take a screenshot. + pub async fn take_screenshot(&mut self, options: ScreenshotOptions) -> Result { + let client = &*self.manager.client; + let session_id = self + .manager + .active_session_id() + .map_err(|e| anyhow::anyhow!(e))?; + if options.annotate { + self.ref_map.clear(); + let snap_opts = SnapshotOptions { + interactive: true, + ..SnapshotOptions::default() + }; + let _ = + snapshot::take_snapshot(client, session_id, &snap_opts, &mut self.ref_map).await; + } + screenshot::take_screenshot(client, session_id, &self.ref_map, &options) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Hover over an element. + pub async fn hover(&self, selector: &str) -> Result<()> { + let (client, session_id) = self.active_client_and_session()?; + interaction::hover(client, session_id, &self.ref_map, selector) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Scroll the page or a specific element. + pub async fn scroll( + &self, + selector: Option<&str>, + delta_x: f64, + delta_y: f64, + ) -> Result<()> { + let (client, session_id) = self.active_client_and_session()?; + interaction::scroll(client, session_id, &self.ref_map, selector, delta_x, delta_y) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Select dropdown option(s). + pub async fn select(&self, selector: &str, values: &[String]) -> Result<()> { + let (client, session_id) = self.active_client_and_session()?; + interaction::select_option(client, session_id, &self.ref_map, selector, values) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Press a key (e.g. "Enter", "Tab", "Escape"). + pub async fn press(&self, key: &str) -> Result<()> { + let (client, session_id) = self.active_client_and_session()?; + interaction::press_key(client, session_id, key) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Check a checkbox. + pub async fn check(&self, selector: &str) -> Result<()> { + let (client, session_id) = self.active_client_and_session()?; + interaction::check(client, session_id, &self.ref_map, selector) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Uncheck a checkbox. + pub async fn uncheck(&self, selector: &str) -> Result<()> { + let (client, session_id) = self.active_client_and_session()?; + interaction::uncheck(client, session_id, &self.ref_map, selector) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Get the text content of an element. + pub async fn get_text(&self, selector: &str) -> Result { + let (client, session_id) = self.active_client_and_session()?; + element::get_element_text(client, session_id, &self.ref_map, selector) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Get an attribute value of an element. + pub async fn get_attribute( + &self, + selector: &str, + attribute: &str, + ) -> Result { + let (client, session_id) = self.active_client_and_session()?; + element::get_element_attribute(client, session_id, &self.ref_map, selector, attribute) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Check if an element is visible. + pub async fn is_visible(&self, selector: &str) -> Result { + let (client, session_id) = self.active_client_and_session()?; + element::is_element_visible(client, session_id, &self.ref_map, selector) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Check if an element is enabled. + pub async fn is_enabled(&self, selector: &str) -> Result { + let (client, session_id) = self.active_client_and_session()?; + element::is_element_enabled(client, session_id, &self.ref_map, selector) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Check if a checkbox/radio is checked. + pub async fn is_checked(&self, selector: &str) -> Result { + let (client, session_id) = self.active_client_and_session()?; + element::is_element_checked(client, session_id, &self.ref_map, selector) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Evaluate JavaScript in the page. + pub async fn evaluate(&self, script: &str) -> Result { + self.manager + .evaluate(script, None) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Get current page URL. + pub async fn url(&self) -> Result { + self.manager + .get_url() + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Get current page title. + pub async fn title(&self) -> Result { + self.manager + .get_title() + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Close the browser. + pub async fn close(&mut self) -> Result<()> { + self.ref_map.clear(); + self.manager + .close() + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Wait for a condition to be met. + pub async fn wait( + &self, + timeout_ms: u64, + text: Option<&str>, + selector: Option<&str>, + state: Option<&str>, + url: Option<&str>, + function: Option<&str>, + load_state: Option<&str>, + ) -> Result { + if let Some(text) = text { + let expr = format!( + "(document.body.innerText || '').includes({})", + serde_json::to_string(text).unwrap_or_default() + ); + self.poll_until_true(&expr, timeout_ms).await?; + return Ok(serde_json::json!({ "waited": "text", "text": text })); + } + + if let Some(sel) = selector { + let state_str = state.unwrap_or("visible"); + let sel_json = serde_json::to_string(sel).unwrap_or_default(); + let expr = match state_str { + "attached" => format!("!!document.querySelector({sel_json})"), + "detached" => format!("!document.querySelector({sel_json})"), + "hidden" => format!( + r#"(() => {{ + const el = document.querySelector({sel_json}); + if (!el) return true; + const s = window.getComputedStyle(el); + return s.display === 'none' || s.visibility === 'hidden' || parseFloat(s.opacity) === 0; + }})()"# + ), + _ => format!( + r#"(() => {{ + const el = document.querySelector({sel_json}); + if (!el) return false; + const r = el.getBoundingClientRect(); + const s = window.getComputedStyle(el); + return r.width > 0 && r.height > 0 && s.visibility !== 'hidden' && s.display !== 'none'; + }})()"# + ), + }; + self.poll_until_true(&expr, timeout_ms).await?; + return Ok(serde_json::json!({ "waited": "selector", "selector": sel })); + } + + if let Some(url_pattern) = url { + let expr = format!( + "location.href.includes({})", + serde_json::to_string(url_pattern).unwrap_or_default() + ); + self.poll_until_true(&expr, timeout_ms).await?; + return Ok(serde_json::json!({ "waited": "url", "url": url_pattern })); + } + + if let Some(fn_str) = function { + let expr = format!("!!({})", fn_str); + self.poll_until_true(&expr, timeout_ms).await?; + return Ok(serde_json::json!({ "waited": "function" })); + } + + if let Some(ls) = load_state { + let wu = WaitUntil::from_str(ls); + let session_id = self + .manager + .active_session_id() + .map_err(|e| anyhow::anyhow!(e))?; + self.manager + .wait_for_lifecycle_external(wu, session_id) + .await + .map_err(|e| anyhow::anyhow!(e))?; + return Ok(serde_json::json!({ "waited": "load", "state": ls })); + } + + // Plain timeout wait + tokio::time::sleep(tokio::time::Duration::from_millis(timeout_ms)).await; + Ok(serde_json::json!({ "waited": "timeout", "ms": timeout_ms })) + } + + /// Poll a JS expression until it returns true. + async fn poll_until_true(&self, expression: &str, timeout_ms: u64) -> Result<()> { + let deadline = + tokio::time::Instant::now() + tokio::time::Duration::from_millis(timeout_ms); + loop { + let result = self.evaluate(expression).await?; + if result.as_bool().unwrap_or(false) { + return Ok(()); + } + if tokio::time::Instant::now() >= deadline { + anyhow::bail!("Wait timed out after {timeout_ms}ms"); + } + tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; + } + } + + /// Double-click an element. + pub async fn dblclick(&self, selector: &str) -> Result<()> { + let (client, session_id) = self.active_client_and_session()?; + interaction::dblclick(client, session_id, &self.ref_map, selector) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Focus an element. + pub async fn focus(&self, selector: &str) -> Result<()> { + let (client, session_id) = self.active_client_and_session()?; + interaction::focus(client, session_id, &self.ref_map, selector) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Clear an input field. + pub async fn clear(&self, selector: &str) -> Result<()> { + let (client, session_id) = self.active_client_and_session()?; + interaction::clear(client, session_id, &self.ref_map, selector) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Select all text in an input. + pub async fn select_all(&self, selector: &str) -> Result<()> { + let (client, session_id) = self.active_client_and_session()?; + interaction::select_all(client, session_id, &self.ref_map, selector) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Scroll an element into view. + pub async fn scroll_into_view(&self, selector: &str) -> Result<()> { + let (client, session_id) = self.active_client_and_session()?; + interaction::scroll_into_view(client, session_id, &self.ref_map, selector) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Get inner text of an element. + pub async fn inner_text(&self, selector: &str) -> Result { + let (client, session_id) = self.active_client_and_session()?; + element::get_element_inner_text(client, session_id, &self.ref_map, selector) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Get inner HTML of an element. + pub async fn inner_html(&self, selector: &str) -> Result { + let (client, session_id) = self.active_client_and_session()?; + element::get_element_inner_html(client, session_id, &self.ref_map, selector) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Get the value of an input/textarea. + pub async fn input_value(&self, selector: &str) -> Result { + let (client, session_id) = self.active_client_and_session()?; + element::get_element_input_value(client, session_id, &self.ref_map, selector) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Set the value of an input (without events). + pub async fn set_value(&self, selector: &str, value: &str) -> Result<()> { + let (client, session_id) = self.active_client_and_session()?; + element::set_element_value(client, session_id, &self.ref_map, selector, value) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Count elements matching a selector. + pub async fn count(&self, selector: &str) -> Result { + let (client, session_id) = self.active_client_and_session()?; + element::get_element_count(client, session_id, selector) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Get the bounding box of an element. + pub async fn bounding_box(&self, selector: &str) -> Result { + let (client, session_id) = self.active_client_and_session()?; + element::get_element_bounding_box(client, session_id, &self.ref_map, selector) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Get CSS styles of an element. + pub async fn styles( + &self, + selector: &str, + properties: Option>, + ) -> Result { + let (client, session_id) = self.active_client_and_session()?; + element::get_element_styles(client, session_id, &self.ref_map, selector, properties) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Get the page HTML content. + pub async fn content(&self) -> Result { + self.manager + .get_content() + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Find all elements matching a selector. + pub async fn find(&self, selector: &str) -> Result { + let sel_json = serde_json::to_string(selector).unwrap_or_default(); + let script = format!( + r#"(() => {{ + const els = document.querySelectorAll({sel_json}); + return Array.from(els).map((el, i) => ({{ + index: i, + tagName: el.tagName.toLowerCase(), + text: el.textContent?.trim().substring(0, 100) || '', + visible: el.offsetWidth > 0 && el.offsetHeight > 0, + }})); + }})()"# + ); + let result = self.evaluate(&script).await?; + Ok(serde_json::json!({ "elements": result, "selector": selector })) + } + + /// Bring the browser window to the foreground. + pub async fn bring_to_front(&self) -> Result<()> { + self.manager + .bring_to_front() + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// List open tabs. + pub fn tab_list(&self) -> serde_json::Value { + let tabs = self.manager.tab_list(); + serde_json::json!({ "tabs": tabs }) + } + + /// Open a new tab. + pub async fn tab_new(&mut self, url: Option<&str>) -> Result { + self.ref_map.clear(); + self.manager + .tab_new(url) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Switch to a tab by index. + pub async fn tab_switch(&mut self, index: usize) -> Result { + self.ref_map.clear(); + self.manager + .tab_switch(index) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Close a tab by index (or the active tab if None). + pub async fn tab_close(&mut self, index: Option) -> Result { + self.ref_map.clear(); + self.manager + .tab_close(index) + .await + .map_err(|e| anyhow::anyhow!(e)) + } + + /// Check if browser connection is alive. + pub async fn is_alive(&self) -> bool { + self.manager.is_connection_alive().await + } +} diff --git a/src/browser/mod.rs b/src/browser/mod.rs index 2911574..dd29cc0 100644 --- a/src/browser/mod.rs +++ b/src/browser/mod.rs @@ -1,3 +1,5 @@ +pub mod daemon; +pub mod engine; pub mod lifecycle; pub mod passthrough; pub mod profile_porter; diff --git a/src/commands/browser/action.rs b/src/commands/browser/action.rs new file mode 100644 index 0000000..0c305dc --- /dev/null +++ b/src/commands/browser/action.rs @@ -0,0 +1,837 @@ +//! Browser action handler: routes Clap subcommands to a persistent daemon +//! that holds the BrowserEngine (CDP connection + RefMap) alive between calls. + +use std::collections::HashMap; +use std::time::Duration; + +use anyhow::Result; +use clap::{Parser, Subcommand}; + +use crate::api::client::SteelClient; +use crate::browser::daemon::client::DaemonClient; +use crate::browser::daemon::process; +use crate::browser::daemon::protocol::DaemonCommand; +use crate::browser::lifecycle::{ + api_mode_to_session_mode, session_mode_to_api_mode, to_session_summary, +}; +use crate::config::auth; +use crate::config::session_state::{SessionStatePaths, read_state}; +use crate::config::settings::EnvVars; + +// ── Shared arg types ──────────────────────────────────────────────── + +#[derive(Parser)] +pub struct SelectorArg { + /// Element selector or ref (e.g. @e1) + pub selector: String, +} + +// ── Top-level action enum ─────────────────────────────────────────── + +#[derive(Subcommand)] +pub enum ActionCommand { + // --- Navigation --- + /// Navigate to a URL + #[command(aliases = ["open", "goto"])] + Navigate(NavigateArgs), + /// Navigate back in history + Back, + /// Navigate forward in history + Forward, + /// Reload the current page + Reload, + + // --- Interactions --- + /// Click an element + Click(ClickArgs), + /// Double-click an element + #[command(name = "dblclick")] + DblClick(SelectorArg), + /// Fill an input field (clears existing value first) + Fill(FillArgs), + /// Type text into an element (appends to existing value) + #[command(name = "type")] + Type(TypeArgs), + /// Press a keyboard key + #[command(aliases = ["key"])] + Press(PressArgs), + /// Hover over an element + Hover(SelectorArg), + /// Focus an element + Focus(SelectorArg), + /// Check a checkbox or radio button + Check(SelectorArg), + /// Uncheck a checkbox + Uncheck(SelectorArg), + /// Select option(s) from a dropdown + Select(SelectArgs), + /// Clear an input field + Clear(SelectorArg), + /// Select all text in an input + #[command(name = "selectall")] + SelectAll(SelectorArg), + /// Scroll the page or an element + Scroll(ScrollArgs), + /// Scroll an element into view + #[command(name = "scrollintoview")] + ScrollIntoView(SelectorArg), + /// Set the value of an input element (without triggering events) + #[command(name = "setvalue")] + SetValue(SetValueArgs), + + // --- Observation --- + /// Take an accessibility tree snapshot + Snapshot(SnapshotArgs), + /// Take a screenshot + Screenshot(ScreenshotArgs), + /// Evaluate JavaScript in the page + Eval(EvalArgs), + /// Find all elements matching a selector + Find(SelectorArg), + /// Get the page HTML content + Content, + + // --- Get info --- + /// Get information about elements or page + Get { + #[command(subcommand)] + command: GetCommand, + }, + + // --- Check state --- + /// Check element state + Is { + #[command(subcommand)] + command: IsCommand, + }, + + // --- Waiting --- + /// Wait for a condition (text, selector, URL, function, or timeout) + Wait(WaitArgs), + + // --- Tabs --- + /// Manage tabs + Tab { + #[command(subcommand)] + command: TabCommand, + }, + + // --- Window --- + /// Bring the browser window to the foreground + #[command(name = "bringtofront")] + BringToFront, + + // --- Session --- + /// Close the browser session + #[command(aliases = ["quit", "exit"])] + Close, +} + +// ── Get subcommands ───────────────────────────────────────────────── + +#[derive(Subcommand)] +pub enum GetCommand { + /// Get element text content + Text(SelectorArg), + /// Get element inner HTML + Html(SelectorArg), + /// Get input/textarea value + Value(SelectorArg), + /// Get element attribute value + Attr(GetAttrArgs), + /// Get current page URL + Url, + /// Get current page title + Title, + /// Count matching elements + Count(SelectorArg), + /// Get element bounding box + #[command(name = "box")] + Box(SelectorArg), + /// Get element CSS styles + Styles(StylesArgs), +} + +// ── Is subcommands ────────────────────────────────────────────────── + +#[derive(Subcommand)] +pub enum IsCommand { + /// Check if element is visible + Visible(SelectorArg), + /// Check if element is enabled + Enabled(SelectorArg), + /// Check if element is checked + Checked(SelectorArg), +} + +// ── Tab subcommands ───────────────────────────────────────────────── + +#[derive(Subcommand)] +pub enum TabCommand { + /// List open tabs + List, + /// Open a new tab + New(TabNewArgs), + /// Switch to a tab by index + Switch(TabSwitchArgs), + /// Close a tab (active tab if no index given) + Close(TabCloseArgs), +} + +// ── Arg structs ───────────────────────────────────────────────────── + +#[derive(Parser)] +pub struct NavigateArgs { + /// URL to navigate to + pub url: String, + /// Wait condition: load, domcontentloaded, networkidle + #[arg(long)] + pub wait_until: Option, + /// Set request header (repeatable, format: "Key: Value") + #[arg(long = "header")] + pub headers: Vec, +} + +#[derive(Parser)] +pub struct ClickArgs { + /// Element selector or ref (e.g. @e1) + pub selector: String, + /// Mouse button: left, right, middle + #[arg(long)] + pub button: Option, + /// Number of clicks (2 for double-click) + #[arg(long)] + pub count: Option, + /// Open the link in a new tab instead of clicking + #[arg(long)] + pub new_tab: bool, +} + +#[derive(Parser)] +pub struct FillArgs { + /// Element selector or ref + pub selector: String, + /// Value to fill + #[arg(trailing_var_arg = true, num_args = 1..)] + pub value: Vec, +} + +#[derive(Parser)] +pub struct TypeArgs { + /// Element selector or ref + pub selector: String, + /// Text to type + #[arg(trailing_var_arg = true, num_args = 1..)] + pub text: Vec, + /// Clear the field before typing + #[arg(long)] + pub clear: bool, + /// Delay between keystrokes in milliseconds + #[arg(long)] + pub delay: Option, +} + +#[derive(Parser)] +pub struct PressArgs { + /// Key to press (e.g. Enter, Escape, Tab, Control+a) + pub key: String, +} + +#[derive(Parser)] +pub struct SelectArgs { + /// Select element selector or ref + pub selector: String, + /// Option value(s) to select + #[arg(num_args = 1..)] + pub values: Vec, +} + +#[derive(Parser)] +pub struct ScrollArgs { + /// Direction: up, down, left, right + pub direction: Option, + /// Scroll amount in pixels (default: 300) + pub amount: Option, + /// Element selector to scroll + #[arg(long, short)] + pub selector: Option, +} + +#[derive(Parser)] +pub struct SetValueArgs { + /// Element selector or ref + pub selector: String, + /// Value to set + #[arg(trailing_var_arg = true, num_args = 1..)] + pub value: Vec, +} + +#[derive(Parser)] +pub struct SnapshotArgs { + /// Show only interactive elements + #[arg(short, long)] + pub interactive: bool, + /// Restrict snapshot to a subtree + #[arg(short, long)] + pub selector: Option, + /// Use compact output format + #[arg(short, long)] + pub compact: bool, + /// Maximum nesting depth + #[arg(short = 'd', long)] + pub max_depth: Option, + /// Include cursor position + #[arg(long)] + pub cursor: bool, +} + +#[derive(Parser)] +pub struct ScreenshotArgs { + /// Capture the full scrollable page + #[arg(long)] + pub full_page: bool, + /// Output file path + #[arg(short, long, default_value = "screenshot.png")] + pub output: String, + /// Restrict screenshot to an element + #[arg(long)] + pub selector: Option, + /// Image format: png, jpeg, webp + #[arg(long, alias = "type")] + pub format: Option, + /// JPEG/WebP quality (0-100) + #[arg(long)] + pub quality: Option, + /// Annotate interactive elements on the screenshot + #[arg(long)] + pub annotate: bool, +} + +#[derive(Parser)] +pub struct EvalArgs { + /// JavaScript expression to evaluate + #[arg(trailing_var_arg = true, num_args = 1..)] + pub script: Vec, +} + +#[derive(Parser)] +pub struct GetAttrArgs { + /// Element selector or ref + pub selector: String, + /// Attribute name + pub attribute: String, +} + +#[derive(Parser)] +pub struct StylesArgs { + /// Element selector or ref + pub selector: String, + /// CSS property names to query (returns all computed styles if omitted) + #[arg(long)] + pub property: Vec, +} + +#[derive(Parser)] +pub struct WaitArgs { + /// Timeout in milliseconds + #[arg(long, default_value_t = 30000)] + pub timeout: u64, + /// Wait for text to appear on page + #[arg(long)] + pub text: Option, + /// Wait for a CSS selector + #[arg(long)] + pub selector: Option, + /// Selector state: visible, hidden, attached, detached + #[arg(long)] + pub state: Option, + /// Wait for URL to contain this string + #[arg(long)] + pub url: Option, + /// Wait for a JS function to return truthy + #[arg(long)] + pub function: Option, + /// Wait for load state: load, domcontentloaded, networkidle + #[arg(long)] + pub load_state: Option, +} + +#[derive(Parser)] +pub struct TabNewArgs { + /// URL to open (defaults to about:blank) + pub url: Option, +} + +#[derive(Parser)] +pub struct TabSwitchArgs { + /// Tab index to switch to + pub index: usize, +} + +#[derive(Parser)] +pub struct TabCloseArgs { + /// Tab index to close (closes active tab if omitted) + pub index: Option, +} + +// ── Command dispatch ──────────────────────────────────────────────── + +pub async fn run(action: ActionCommand) -> Result<()> { + let mut client = ensure_daemon().await?; + + match action { + // --- Navigation --- + ActionCommand::Navigate(args) => { + let headers = if args.headers.is_empty() { + None + } else { + let mut map = HashMap::new(); + for h in &args.headers { + if let Some((k, v)) = h.split_once(':') { + map.insert(k.trim().to_string(), v.trim().to_string()); + } + } + Some(map) + }; + client + .send(DaemonCommand::Navigate { + url: args.url, + wait_until: args.wait_until, + headers, + }) + .await?; + } + ActionCommand::Back => { + client.send(DaemonCommand::Back).await?; + } + ActionCommand::Forward => { + client.send(DaemonCommand::Forward).await?; + } + ActionCommand::Reload => { + client.send(DaemonCommand::Reload).await?; + } + + // --- Interactions --- + ActionCommand::Click(args) => { + client + .send(DaemonCommand::Click { + selector: args.selector, + button: args.button, + click_count: args.count, + new_tab: args.new_tab, + }) + .await?; + } + ActionCommand::DblClick(args) => { + client + .send(DaemonCommand::DblClick { + selector: args.selector, + }) + .await?; + } + ActionCommand::Fill(args) => { + let value = args.value.join(" "); + client + .send(DaemonCommand::Fill { + selector: args.selector, + value, + }) + .await?; + } + ActionCommand::Type(args) => { + let text = args.text.join(" "); + client + .send(DaemonCommand::TypeText { + selector: args.selector, + text, + clear: args.clear, + delay_ms: args.delay, + }) + .await?; + } + ActionCommand::Press(args) => { + client + .send(DaemonCommand::Press { key: args.key }) + .await?; + } + ActionCommand::Hover(args) => { + client + .send(DaemonCommand::Hover { + selector: args.selector, + }) + .await?; + } + ActionCommand::Focus(args) => { + client + .send(DaemonCommand::Focus { + selector: args.selector, + }) + .await?; + } + ActionCommand::Check(args) => { + client + .send(DaemonCommand::Check { + selector: args.selector, + }) + .await?; + } + ActionCommand::Uncheck(args) => { + client + .send(DaemonCommand::Uncheck { + selector: args.selector, + }) + .await?; + } + ActionCommand::Select(args) => { + client + .send(DaemonCommand::Select { + selector: args.selector, + values: args.values, + }) + .await?; + } + ActionCommand::Clear(args) => { + client + .send(DaemonCommand::Clear { + selector: args.selector, + }) + .await?; + } + ActionCommand::SelectAll(args) => { + client + .send(DaemonCommand::SelectAll { + selector: args.selector, + }) + .await?; + } + ActionCommand::Scroll(args) => { + let dir = args.direction.as_deref().unwrap_or("down"); + let amt = args.amount.unwrap_or(300.0); + let (dx, dy) = match dir { + "up" => (0.0, -amt), + "down" => (0.0, amt), + "left" => (-amt, 0.0), + "right" => (amt, 0.0), + _ => (0.0, amt), + }; + client + .send(DaemonCommand::Scroll { + selector: args.selector, + delta_x: dx, + delta_y: dy, + }) + .await?; + } + ActionCommand::ScrollIntoView(args) => { + client + .send(DaemonCommand::ScrollIntoView { + selector: args.selector, + }) + .await?; + } + ActionCommand::SetValue(args) => { + let value = args.value.join(" "); + client + .send(DaemonCommand::SetValue { + selector: args.selector, + value, + }) + .await?; + } + + // --- Observation --- + ActionCommand::Snapshot(args) => { + let data = client + .send(DaemonCommand::Snapshot { + interactive_only: args.interactive, + selector: args.selector, + compact: args.compact, + max_depth: args.max_depth, + cursor: args.cursor, + }) + .await?; + if let Some(s) = data.as_str() { + println!("{s}"); + } + } + ActionCommand::Screenshot(args) => { + let path = std::path::Path::new(&args.output); + let abs_path = if path.is_absolute() { + args.output.clone() + } else { + std::env::current_dir()? + .join(path) + .to_string_lossy() + .to_string() + }; + let data = client + .send(DaemonCommand::Screenshot { + full_page: args.full_page, + selector: args.selector, + format: args.format, + quality: args.quality, + annotate: args.annotate, + path: Some(abs_path), + screenshot_dir: None, + }) + .await?; + let saved_path = data["path"].as_str().unwrap_or(&args.output); + println!("{saved_path}"); + } + ActionCommand::Eval(args) => { + let script = args.script.join(" "); + let data = client.send(DaemonCommand::Eval { script }).await?; + println!("{data}"); + } + ActionCommand::Find(args) => { + let data = client + .send(DaemonCommand::Find { + selector: args.selector, + }) + .await?; + if let Some(elements) = data["elements"].as_array() { + for el in elements { + let idx = el["index"].as_u64().unwrap_or(0); + let tag = el["tagName"].as_str().unwrap_or(""); + let text = el["text"].as_str().unwrap_or(""); + let visible = el["visible"].as_bool().unwrap_or(false); + let vis = if visible { "" } else { " (hidden)" }; + println!("[{idx}] <{tag}>{vis} {text}"); + } + } + } + ActionCommand::Content => { + let data = client.send(DaemonCommand::Content).await?; + if let Some(s) = data.as_str() { + println!("{s}"); + } + } + + // --- Get info --- + ActionCommand::Get { command } => match command { + GetCommand::Text(args) => { + let data = client + .send(DaemonCommand::GetText { + selector: args.selector, + }) + .await?; + if let Some(s) = data["text"].as_str() { + println!("{s}"); + } + } + GetCommand::Html(args) => { + let data = client + .send(DaemonCommand::InnerHtml { + selector: args.selector, + }) + .await?; + if let Some(s) = data["html"].as_str() { + println!("{s}"); + } + } + GetCommand::Value(args) => { + let data = client + .send(DaemonCommand::InputValue { + selector: args.selector, + }) + .await?; + if let Some(s) = data["value"].as_str() { + println!("{s}"); + } + } + GetCommand::Attr(args) => { + let data = client + .send(DaemonCommand::GetAttribute { + selector: args.selector, + attribute: args.attribute, + }) + .await?; + println!("{}", data["value"]); + } + GetCommand::Url => { + let data = client.send(DaemonCommand::Url).await?; + if let Some(s) = data.as_str() { + println!("{s}"); + } + } + GetCommand::Title => { + let data = client.send(DaemonCommand::Title).await?; + if let Some(s) = data.as_str() { + println!("{s}"); + } + } + GetCommand::Count(args) => { + let data = client + .send(DaemonCommand::Count { + selector: args.selector, + }) + .await?; + println!("{}", data["count"]); + } + GetCommand::Box(args) => { + let data = client + .send(DaemonCommand::BoundingBox { + selector: args.selector, + }) + .await?; + println!("{data}"); + } + GetCommand::Styles(args) => { + let properties = if args.property.is_empty() { + None + } else { + Some(args.property) + }; + let data = client + .send(DaemonCommand::Styles { + selector: args.selector, + properties, + }) + .await?; + println!("{data}"); + } + }, + + // --- Check state --- + ActionCommand::Is { command } => match command { + IsCommand::Visible(args) => { + let data = client + .send(DaemonCommand::IsVisible { + selector: args.selector, + }) + .await?; + println!("{}", data["visible"]); + } + IsCommand::Enabled(args) => { + let data = client + .send(DaemonCommand::IsEnabled { + selector: args.selector, + }) + .await?; + println!("{}", data["enabled"]); + } + IsCommand::Checked(args) => { + let data = client + .send(DaemonCommand::IsChecked { + selector: args.selector, + }) + .await?; + println!("{}", data["checked"]); + } + }, + + // --- Wait --- + ActionCommand::Wait(args) => { + let data = client + .send(DaemonCommand::Wait { + timeout: Some(args.timeout), + text: args.text, + selector: args.selector, + state: args.state, + url: args.url, + function: args.function, + load_state: args.load_state, + }) + .await?; + if let Some(s) = data["waited"].as_str() { + println!("{s}"); + } + } + + // --- Tabs --- + ActionCommand::Tab { command } => match command { + TabCommand::List => { + let data = client.send(DaemonCommand::TabList).await?; + if let Some(tabs) = data["tabs"].as_array() { + for tab in tabs { + let idx = tab["index"].as_u64().unwrap_or(0); + let title = tab["title"].as_str().unwrap_or(""); + let url = tab["url"].as_str().unwrap_or(""); + let active = tab["active"].as_bool().unwrap_or(false); + let marker = if active { " *" } else { "" }; + println!("[{idx}]{marker} {title} — {url}"); + } + } + } + TabCommand::New(args) => { + let data = client + .send(DaemonCommand::TabNew { url: args.url }) + .await?; + if let Some(url) = data["url"].as_str() { + println!("{url}"); + } + } + TabCommand::Switch(args) => { + let data = client + .send(DaemonCommand::TabSwitch { index: args.index }) + .await?; + if let Some(url) = data["url"].as_str() { + println!("{url}"); + } + } + TabCommand::Close(args) => { + client + .send(DaemonCommand::TabClose { index: args.index }) + .await?; + } + }, + + // --- Window --- + ActionCommand::BringToFront => { + client.send(DaemonCommand::BringToFront).await?; + } + + // --- Session --- + ActionCommand::Close => { + client.send(DaemonCommand::Close).await?; + } + } + + Ok(()) +} + +/// Ensure a daemon is running for the active session and return a connected client. +/// If no daemon exists, resolves the CDP URL via the API and spawns one. +async fn ensure_daemon() -> Result { + let paths = SessionStatePaths::default_paths(); + let state = read_state(&paths.state_path); + + let session_id = state + .active_session_id + .as_deref() + .ok_or_else(|| anyhow::anyhow!("No active browser session. Run `steel browser start` first."))?; + + // Fast path: daemon already running + if let Ok(client) = DaemonClient::connect(session_id).await { + return Ok(client); + } + + // Slow path: resolve CDP URL and spawn daemon + let session_mode = state + .active_session_mode + .ok_or_else(|| anyhow::anyhow!("No active browser session. Run `steel browser start` first."))?; + + let api_mode = session_mode_to_api_mode(session_mode); + let auth_info = auth::resolve_auth(); + let env_vars = EnvVars::from_env(); + let config = crate::config::settings::read_config().ok(); + let local_config_url = config.as_ref().and_then(|c| c.local_api_url()); + let base_url = api_mode.resolve_base_url(None, &env_vars, local_config_url); + + let api_client = SteelClient::new()?; + let session = api_client + .get_session(&base_url, api_mode, session_id, &auth_info) + .await + .map_err(|e| anyhow::anyhow!("{e}"))?; + + let mode = api_mode_to_session_mode(api_mode); + let summary = to_session_summary(&session, mode, None, &auth_info)?; + let cdp_url = summary + .connect_url + .ok_or_else(|| anyhow::anyhow!("Session {} has no CDP connect URL.", session_id))?; + + process::spawn_daemon(session_id, &cdp_url)?; + process::wait_for_daemon(session_id, Duration::from_secs(10)).await?; + + DaemonClient::connect(session_id).await +} diff --git a/src/commands/browser/mod.rs b/src/commands/browser/mod.rs index 00ec5fc..7c98d22 100644 --- a/src/commands/browser/mod.rs +++ b/src/commands/browser/mod.rs @@ -1,3 +1,4 @@ +pub mod action; pub mod captcha; pub mod live; pub mod sessions; @@ -25,6 +26,10 @@ pub enum Command { #[command(subcommand)] command: captcha::Command, }, + + /// Browser actions (navigate, click, fill, snapshot, screenshot, …) + #[command(flatten)] + Action(action::ActionCommand), } pub async fn run(command: Command) -> anyhow::Result<()> { @@ -34,5 +39,6 @@ pub async fn run(command: Command) -> anyhow::Result<()> { Command::Sessions(args) => sessions::run(args).await, Command::Live(args) => live::run(args).await, Command::Captcha { command } => captcha::run(command).await, + Command::Action(action) => action::run(action).await, } } diff --git a/src/commands/browser/start.rs b/src/commands/browser/start.rs index 66e87cb..bd5fbab 100644 --- a/src/commands/browser/start.rs +++ b/src/commands/browser/start.rs @@ -97,6 +97,19 @@ pub async fn run(args: Args) -> anyhow::Result<()> { } if let Some(ref url) = session.connect_url { println!("connect_url: {}", sanitize_connect_url(url)); + + // Eagerly spawn daemon so subsequent commands are fast + use crate::browser::daemon::process; + if !process::socket_path(&session.id).exists() { + if let Err(e) = process::spawn_daemon(&session.id, url) { + eprintln!("Warning: failed to start browser daemon: {e}"); + } else if let Err(e) = process::wait_for_daemon( + &session.id, + std::time::Duration::from_secs(10), + ).await { + eprintln!("Warning: browser daemon did not become ready: {e}"); + } + } } Ok(()) diff --git a/src/commands/browser/stop.rs b/src/commands/browser/stop.rs index 427d388..9c453c2 100644 --- a/src/commands/browser/stop.rs +++ b/src/commands/browser/stop.rs @@ -51,6 +51,11 @@ pub async fn run(args: Args) -> anyhow::Result<()> { ) .await?; + // Stop daemons for released sessions + for id in &result.stopped_session_ids { + let _ = crate::browser::daemon::process::stop_daemon(id).await; + } + if result.stopped_session_ids.is_empty() { println!("No active browser sessions to stop."); } else if result.all { diff --git a/src/commands/mod.rs b/src/commands/mod.rs index 2d73980..403c070 100644 --- a/src/commands/mod.rs +++ b/src/commands/mod.rs @@ -32,6 +32,13 @@ pub struct Cli { #[derive(Subcommand)] pub enum Command { + /// Internal daemon process + #[command(name = "__daemon", hide = true)] + Daemon { + #[arg(long)] + session_id: String, + }, + /// Scrape webpage content (markdown output by default) Scrape(scrape::Args), @@ -102,6 +109,11 @@ pub enum Command { pub async fn run(cli: Cli) -> anyhow::Result<()> { match cli.command { + Command::Daemon { session_id } => { + let cdp_url = std::env::var("STEEL_DAEMON_CDP_URL") + .map_err(|_| anyhow::anyhow!("Missing STEEL_DAEMON_CDP_URL"))?; + crate::browser::daemon::server::run(session_id, cdp_url).await + } Command::Scrape(args) => scrape::run(args).await, Command::Screenshot(args) => screenshot::run(args).await, Command::Pdf(args) => pdf::run(args).await, diff --git a/tests/action_coverage.rs b/tests/action_coverage.rs new file mode 100644 index 0000000..83c1504 --- /dev/null +++ b/tests/action_coverage.rs @@ -0,0 +1,627 @@ +//! Tracks coverage of agent-browser action names and parameters. +//! +//! When agent-browser adds new actions or new parameters to existing actions, +//! this test fails, forcing us to either implement them or explicitly skip them. + +use std::collections::{BTreeMap, BTreeSet}; +use std::path::{Path, PathBuf}; + +/// Actions we have proper Clap subcommands for. +const COVERED: &[&str] = &[ + "navigate", "click", "fill", "type", "press", "hover", "scroll", + "select", "check", "uncheck", "snapshot", "screenshot", "evaluate", + "gettext", "getattribute", "isvisible", "isenabled", "ischecked", + "wait", + "url", "title", "back", "forward", "reload", "close", + // Interactions + "dblclick", "focus", "clear", "selectall", "scrollintoview", + // Element queries + "innertext", "innerhtml", "inputvalue", "setvalue", + "count", "boundingbox", "styles", + // Page + "content", "find", "bringtofront", + // Tab management + "tab_list", "tab_new", "tab_switch", "tab_close", +]; + +/// Actions in agent-browser that we intentionally skip (not yet wrapped). +const SKIPPED: &[&str] = &[ + // Page content + "setcontent", + // Interactions not yet wrapped + "dispatch", "highlight", "tap", "drag", "swipe", "multiselect", + // Locators + "getbyrole", "getbytext", "getbylabel", "getbyplaceholder", + "getbyalttext", "getbytitle", "getbytestid", "nth", + // Cookies / storage + "cookies_get", "cookies_set", "cookies_clear", + "storage_get", "storage_set", "storage_clear", + // Network + "headers", "offline", "console", "errors", + "route", "unroute", "requests", "responsebody", "credentials", + // Profiling / tracing + "trace_start", "trace_stop", + "profiler_start", "profiler_stop", + "screencast_start", "screencast_stop", + "video_start", "video_stop", + "har_start", "har_stop", + // Export / capture + "pdf", + // Tabs + "window_new", + // Browser configuration + "viewport", "useragent", "user_agent", "set_media", "emulatemedia", + "timezone", "locale", "geolocation", "permissions", + "download", + // Diff + "diff_snapshot", "diff_url", "diff_screenshot", + // Input + "mouse", "keyboard", + "input_mouse", "input_keyboard", "input_touch", + "keydown", "keyup", "inserttext", + "mousemove", "mousedown", "mouseup", + // Dialog / file / scripts + "dialog", "upload", + "addscript", "addinitscript", "addstyle", + "clipboard", "wheel", "device", + // Frame / eval + "frame", "mainframe", "evalhandle", + // Wait variants + "waitforurl", "waitforloadstate", "waitforfunction", "waitfordownload", + // Policy + "confirm", "deny", +]; + +/// Actions that don't apply to Steel's remote session architecture. +const NOT_APPLICABLE: &[&str] = &[ + // Steel manages browser lifecycle via its API, not local launch + "launch", "cdp_url", "inspect", + // agent-browser's own credential/auth storage — Steel has its own + "credentials_set", "credentials_get", "credentials_delete", "credentials_list", + "auth_save", "auth_login", "auth_list", "auth_delete", "auth_show", + // agent-browser's session state management — Steel manages sessions via API + "state_save", "state_load", "state_list", "state_show", + "state_clear", "state_clean", "state_rename", + // agent-browser internals + "expose", "pause", "device_list", + // agent-browser's recording (codegen) — not applicable to remote sessions + "recording_start", "recording_stop", "recording_restart", +]; + +// ── Parameter coverage per covered action ─────────────────────────── + +struct ParamCoverage { + /// The handle function name in actions.rs (e.g. "handle_navigate") + handler: &'static str, + /// Parameters we expose as Clap flags/args + covered: &'static [&'static str], + /// Parameters in agent-browser we intentionally don't expose yet + skipped: &'static [&'static str], +} + +const PARAM_COVERAGE: &[ParamCoverage] = &[ + ParamCoverage { + handler: "handle_navigate", + covered: &["url", "waitUntil", "headers"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_click", + covered: &["selector", "button", "clickCount", "newTab"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_fill", + covered: &["selector", "value"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_type", + covered: &["selector", "text", "clear", "delay"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_press", + covered: &["key"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_hover", + covered: &["selector"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_scroll", + covered: &["selector", "x", "y", "direction", "amount"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_select", + covered: &["selector", "values", "value"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_check", + covered: &["selector"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_uncheck", + covered: &["selector"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_snapshot", + covered: &["interactive", "selector", "compact", "maxDepth", "cursor"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_screenshot", + covered: &["fullPage", "annotate", "selector", "format", "quality", "path", "screenshotDir", "type"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_evaluate", + covered: &["script"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_gettext", + covered: &["selector"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_getattribute", + covered: &["selector", "attribute"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_isvisible", + covered: &["selector"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_isenabled", + covered: &["selector"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_ischecked", + covered: &["selector"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_wait", + covered: &["timeout", "text", "selector", "state", "url", "function", "loadState"], + skipped: &[], + }, + // url, title, back, forward, reload, close: no cmd params + ParamCoverage { + handler: "handle_dblclick", + covered: &["selector"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_focus", + covered: &["selector"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_clear", + covered: &["selector"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_selectall", + covered: &["selector"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_scrollintoview", + covered: &["selector"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_innertext", + covered: &["selector"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_innerhtml", + covered: &["selector"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_inputvalue", + covered: &["selector"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_setvalue", + covered: &["selector", "value"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_count", + covered: &["selector"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_boundingbox", + covered: &["selector"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_styles", + covered: &["selector", "properties"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_find", + covered: &["selector"], + skipped: &[], + }, + // content, bringtofront: no cmd params + // tab_list: no cmd params + ParamCoverage { + handler: "handle_tab_new", + covered: &["url"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_tab_switch", + covered: &["index"], + skipped: &[], + }, + ParamCoverage { + handler: "handle_tab_close", + covered: &["index"], + skipped: &[], + }, +]; + +// ── Tests ─────────────────────────────────────────────────────────── + +#[test] +fn action_coverage() { + let Some(actions_path) = find_actions_rs() else { + eprintln!( + "Skipping action_coverage: agent-browser actions.rs not found. \ + Set AGENT_BROWSER_SRC or ensure ../agent-browser exists." + ); + return; + }; + + let actual_actions = extract_action_names(&actions_path); + let known: BTreeSet<&str> = COVERED.iter() + .chain(SKIPPED.iter()) + .chain(NOT_APPLICABLE.iter()) + .copied() + .collect(); + + let mut failures = Vec::new(); + + for action in &actual_actions { + if !known.contains(action.as_str()) { + failures.push(format!( + "New action `{action}` not in coverage list. \ + Add to COVERED or SKIPPED." + )); + } + } + + for &action in known.iter() { + if !actual_actions.contains(action) { + failures.push(format!( + "Action `{action}` in coverage list but not found \ + in execute_command(). Remove from list." + )); + } + } + + if !failures.is_empty() { + let report = failures.join("\n "); + panic!( + "Action coverage check failed:\n {report}\n\n\ + Coverage: {} covered, {} skipped, {} n/a", + COVERED.len(), + SKIPPED.len(), + NOT_APPLICABLE.len(), + ); + } + + eprintln!( + "Action coverage: {} covered, {} skipped, {} n/a, total {}", + COVERED.len(), + SKIPPED.len(), + NOT_APPLICABLE.len(), + COVERED.len() + SKIPPED.len() + NOT_APPLICABLE.len(), + ); +} + +#[test] +fn param_coverage() { + let Some(actions_path) = find_actions_rs() else { + eprintln!( + "Skipping param_coverage: agent-browser actions.rs not found. \ + Set AGENT_BROWSER_SRC or ensure ../agent-browser exists." + ); + return; + }; + + let content = std::fs::read_to_string(&actions_path).unwrap(); + let actual_params = extract_handler_params(&content); + + let mut failures = Vec::new(); + let mut total_covered = 0usize; + let mut total_skipped = 0usize; + + for pc in PARAM_COVERAGE { + let Some(actual) = actual_params.get(pc.handler) else { + failures.push(format!( + "{}: handler function not found in actions.rs", + pc.handler, + )); + continue; + }; + + let known: BTreeSet<&str> = pc.covered.iter().chain(pc.skipped.iter()).copied().collect(); + + // New params not in our lists + for param in actual { + if !known.contains(param.as_str()) { + failures.push(format!( + "{}: new param `{param}` not in coverage list. \ + Add to covered or skipped.", + pc.handler, + )); + } + } + + // Stale entries + for ¶m in &known { + if !actual.contains(param) { + failures.push(format!( + "{}: param `{param}` in coverage list but not found \ + in handler. Remove from list.", + pc.handler, + )); + } + } + + total_covered += pc.covered.len(); + total_skipped += pc.skipped.len(); + } + + if !failures.is_empty() { + let report = failures.join("\n "); + panic!( + "Param coverage check failed:\n {report}\n\n\ + Coverage: {total_covered} covered, {total_skipped} skipped", + ); + } + + eprintln!( + "Param coverage: {total_covered} covered, {total_skipped} skipped, \ + total {} across {} handlers", + total_covered + total_skipped, + PARAM_COVERAGE.len(), + ); +} + +// ── Helpers ───────────────────────────────────────────────────────── + +fn find_actions_rs() -> Option { + if let Ok(path) = std::env::var("AGENT_BROWSER_SRC") { + let p = PathBuf::from(&path).join("actions.rs"); + if p.exists() { + return Some(p); + } + } + + let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR")); + let sibling = manifest_dir + .parent()? + .join("agent-browser/cli/src/native/actions.rs"); + if sibling.exists() { + return Some(sibling); + } + + let home = dirs::home_dir()?; + let checkouts = home.join(".cargo/git/checkouts"); + if let Ok(entries) = std::fs::read_dir(&checkouts) { + for entry in entries.flatten() { + if entry + .file_name() + .to_string_lossy() + .starts_with("agent-browser-") + { + if let Ok(refs) = std::fs::read_dir(entry.path()) { + for ref_entry in refs.flatten() { + let p = ref_entry.path().join("cli/src/native/actions.rs"); + if p.exists() { + return Some(p); + } + } + } + } + } + } + + None +} + +/// Extract action names from the `match action { ... }` block in execute_command(). +fn extract_action_names(path: &Path) -> BTreeSet { + let content = std::fs::read_to_string(path).unwrap(); + let mut actions = BTreeSet::new(); + let mut in_match = false; + + for line in content.lines() { + let trimmed = line.trim(); + + if trimmed.starts_with("let result = match action {") { + in_match = true; + continue; + } + + if !in_match { + continue; + } + + if trimmed.starts_with("};") { + break; + } + + if let Some(arrow_pos) = trimmed.find("=>") { + let pattern = trimmed[..arrow_pos].trim(); + for alt in pattern.split('|') { + let alt = alt.trim().trim_matches('"'); + if !alt.is_empty() && alt != "_" { + actions.insert(alt.to_string()); + } + } + } + } + + actions +} + +/// Extract `cmd.get("param")` calls from each `handle_*` function. +/// Returns handler_name → set of param names. +/// +/// Handles multi-line chains like: +/// ```ignore +/// cmd +/// .get("url") +/// ``` +fn extract_handler_params(content: &str) -> BTreeMap> { + let mut result = BTreeMap::new(); + let lines: Vec<&str> = content.lines().collect(); + let mut i = 0; + + while i < lines.len() { + let trimmed = lines[i].trim(); + + if let Some(fn_name) = parse_handler_fn_name(trimmed) { + // Only track handlers that take `cmd` parameter + if !trimmed.contains("cmd:") && !trimmed.contains("cmd :") { + i += 1; + continue; + } + + // Collect the entire function body as one string + let mut body = String::new(); + let mut brace_depth = 0i32; + let mut started = false; + + for j in i..lines.len() { + for ch in lines[j].chars() { + if ch == '{' { + brace_depth += 1; + started = true; + } else if ch == '}' { + brace_depth -= 1; + } + } + + body.push_str(lines[j]); + body.push(' '); + + if started && brace_depth == 0 { + i = j + 1; + break; + } + } + + // Normalize `cmd\s+.` → `cmd.` so multi-line chains are matched + let normalized = normalize_cmd_chains(&body); + let mut params = BTreeSet::new(); + extract_cmd_get_params(&normalized, &mut params); + + params.remove("action"); + params.remove("id"); + + result.insert(fn_name, params); + continue; + } + + i += 1; + } + + result +} + +/// Parse a handler function name from a line like `async fn handle_navigate(cmd: ...` +fn parse_handler_fn_name(line: &str) -> Option { + let rest = line.strip_prefix("async fn ").or_else(|| line.strip_prefix("fn "))?; + if !rest.starts_with("handle_") { + return None; + } + let name = rest.split('(').next()?; + Some(name.to_string()) +} + +/// Collapse `cmd` + whitespace + `.` into `cmd.` so multi-line chains +/// like `cmd\n .get("url")` become `cmd.get("url")`. +fn normalize_cmd_chains(body: &str) -> String { + let mut result = String::with_capacity(body.len()); + let bytes = body.as_bytes(); + let mut i = 0; + + while i < bytes.len() { + if i + 3 <= bytes.len() && &bytes[i..i + 3] == b"cmd" { + result.push_str("cmd"); + i += 3; + // Skip whitespace between `cmd` and `.` + let ws_start = i; + while i < bytes.len() && (bytes[i] == b' ' || bytes[i] == b'\n' || bytes[i] == b'\t') + { + i += 1; + } + if i < bytes.len() && bytes[i] == b'.' { + // Found `cmd.` → collapse to `cmd.` + } else { + // Not followed by `.` — keep the whitespace + result.push_str(&body[ws_start..i]); + } + } else { + result.push(bytes[i] as char); + i += 1; + } + } + + result +} + +/// Extract all `cmd.get("key")` and `cmd["key"]` occurrences from text. +/// Expects pre-normalized text (see `normalize_cmd_chains`). +fn extract_cmd_get_params(text: &str, params: &mut BTreeSet) { + // Pattern: cmd.get("key") + let mut rest = text; + while let Some(pos) = rest.find("cmd.get(\"") { + let start = pos + "cmd.get(\"".len(); + rest = &rest[start..]; + if let Some(end) = rest.find('"') { + let key = &rest[..end]; + if !key.is_empty() { + params.insert(key.to_string()); + } + rest = &rest[end..]; + } + } + + // Pattern: cmd["key"] + rest = text; + while let Some(pos) = rest.find("cmd[\"") { + let start = pos + "cmd[\"".len(); + rest = &rest[start..]; + if let Some(end) = rest.find('"') { + let key = &rest[..end]; + if !key.is_empty() { + params.insert(key.to_string()); + } + rest = &rest[end..]; + } + } +} diff --git a/tests/cli_compat.rs b/tests/cli_compat.rs index c746f5e..b5c05ff 100644 --- a/tests/cli_compat.rs +++ b/tests/cli_compat.rs @@ -191,6 +191,7 @@ fn subcommand_tree_matches_ts() { let root = root_cmd(); let rust_top: BTreeSet = root .get_subcommands() + .filter(|s| !s.is_hide_set()) .map(|s| s.get_name().to_string()) .filter(|n| n != "help") .collect(); @@ -231,6 +232,11 @@ fn subcommand_tree_matches_ts() { ); } for sub in &rust_subs { + // Browser action subcommands (navigate, click, …) are Rust-native + // and have no TS equivalent — skip the reverse check for them. + if name == "browser" && !ts_subs.contains(sub) { + continue; + } assert!( ts_subs.contains(sub), "Rust has '{name} {sub}' but TS does not" diff --git a/tests/native_api_coverage.rs b/tests/native_api_coverage.rs new file mode 100644 index 0000000..171c244 --- /dev/null +++ b/tests/native_api_coverage.rs @@ -0,0 +1,315 @@ +//! Tracks coverage of agent-browser native module public API. +//! +//! When agent-browser adds new public functions, this test fails, +//! forcing us to either wrap them or explicitly skip them. + +use std::collections::BTreeSet; +use std::path::{Path, PathBuf}; + +/// Each module we track: the source file and its known functions. +struct ModuleCoverage { + file: &'static str, + /// Functions wrapped in BrowserEngine / exposed via DaemonCommand. + covered: &'static [&'static str], + /// Functions intentionally not wrapped (internal, infra, or out-of-scope). + skipped: &'static [&'static str], +} + +// ── interaction.rs ────────────────────────────────────────────────── + +const INTERACTION: ModuleCoverage = ModuleCoverage { + file: "interaction.rs", + covered: &[ + "click", "hover", "fill", "type_text", "press_key", "scroll", + "select_option", "check", "uncheck", + "dblclick", "focus", "clear", "select_all", "scroll_into_view", + ], + skipped: &[ + "press_key_with_modifiers",// TODO: modifier key combos + "dispatch_event", + "highlight", + "tap_touch", + ], +}; + +// ── element.rs ────────────────────────────────────────────────────── + +const ELEMENT: ModuleCoverage = ModuleCoverage { + file: "element.rs", + covered: &[ + // RefMap used internally by BrowserEngine + "new", "add", "add_selector", "get", "entries_sorted", "clear", + "next_ref_num", "set_next_ref_num", "parse_ref", + "resolve_element_object_id", + // Element queries + "get_element_text", "get_element_attribute", + "is_element_visible", "is_element_enabled", "is_element_checked", + "get_element_inner_text", "get_element_inner_html", + "get_element_input_value", "set_element_value", + "get_element_count", "get_element_bounding_box", "get_element_styles", + ], + skipped: &[ + "resolve_element_center", + ], +}; + +// ── cookies.rs ────────────────────────────────────────────────────── + +const COOKIES: ModuleCoverage = ModuleCoverage { + file: "cookies.rs", + covered: &[], + skipped: &["get_cookies", "set_cookies", "clear_cookies"], +}; + +// ── storage.rs ────────────────────────────────────────────────────── + +const STORAGE: ModuleCoverage = ModuleCoverage { + file: "storage.rs", + covered: &[], + skipped: &["storage_get", "storage_set", "storage_clear"], +}; + +// ── screenshot.rs ─────────────────────────────────────────────────── + +const SCREENSHOT: ModuleCoverage = ModuleCoverage { + file: "screenshot.rs", + covered: &["take_screenshot"], + skipped: &[], +}; + +// ── snapshot.rs ───────────────────────────────────────────────────── + +const SNAPSHOT: ModuleCoverage = ModuleCoverage { + file: "snapshot.rs", + covered: &["take_snapshot"], + skipped: &[], +}; + +// ── network.rs ────────────────────────────────────────────────────── + +const NETWORK: ModuleCoverage = ModuleCoverage { + file: "network.rs", + covered: &["set_extra_headers"], + skipped: &[ + // EventTracker methods + "new", "add_console", "add_error", "get_console_json", "get_errors_json", + // DomainFilter methods + "is_allowed", "check_url", + // Free functions + "set_offline", "set_content", + "sanitize_existing_pages", + "install_domain_filter", "install_domain_filter_script", + "install_domain_filter_fetch", + ], +}; + +// ── state.rs ──────────────────────────────────────────────────────── + +const STATE: ModuleCoverage = ModuleCoverage { + file: "state.rs", + covered: &[], + skipped: &[ + "save_state", "load_state", + "state_list", "state_show", "state_clear", "state_clean", "state_rename", + "find_auto_state_file", "get_sessions_dir", + ], +}; + +// ── diff.rs ───────────────────────────────────────────────────────── + +const DIFF: ModuleCoverage = ModuleCoverage { + file: "diff.rs", + covered: &[], + skipped: &["diff_screenshot", "diff_snapshots", "diff_text", "diff_unified"], +}; + +// ── browser.rs (BrowserManager + helpers) ─────────────────────────── + +const BROWSER: ModuleCoverage = ModuleCoverage { + file: "browser.rs", + covered: &[ + "connect_cdp", "active_session_id", "navigate", "get_url", "get_title", + "evaluate", "close", "is_connection_alive", + "tab_new", "tab_list", "tab_switch", "tab_close", + "wait_for_lifecycle_external", + "get_content", "bring_to_front", + ], + skipped: &[ + // Launch / connect + "launch", "connect_auto", "validate_launch_options", "to_ai_friendly_error", + // Page internals + "enable_domains_pub", "ensure_page", "update_active_page_if_needed", + "add_page", "remove_page_by_target_id", "has_target", "has_pages", + "page_count", "pages_list", + // Getters + "get_cdp_url", "chrome_host_port", "active_target_id", + "is_cdp_connection", + // Browser configuration + "set_viewport", "set_user_agent", "set_emulated_media", "set_timezone", + "set_locale", "set_geolocation", "set_download_behavior", + // Dialog / file / permissions + "handle_dialog", "upload_files", "grant_permissions", + "add_script_to_evaluate", + // BrowserState methods + "from_str", "kill", "wait_or_kill", + ], +}; + +// ── Test ──────────────────────────────────────────────────────────── + +const ALL_MODULES: &[&ModuleCoverage] = &[ + &INTERACTION, &ELEMENT, &COOKIES, &STORAGE, &SCREENSHOT, + &SNAPSHOT, &NETWORK, &STATE, &DIFF, &BROWSER, +]; + +#[test] +fn native_api_coverage() { + let Some(native_src) = find_native_src() else { + eprintln!( + "Skipping native_api_coverage: agent-browser source not found. \ + Set AGENT_BROWSER_SRC or ensure ../agent-browser exists." + ); + return; + }; + + let mut total_covered = 0usize; + let mut total_skipped = 0usize; + let mut failures = Vec::new(); + + for module in ALL_MODULES { + let path = native_src.join(module.file); + if !path.exists() { + failures.push(format!("{}: file not found at {}", module.file, path.display())); + continue; + } + + let actual_fns = extract_pub_fns(&path); + let known: BTreeSet<&str> = module + .covered + .iter() + .chain(module.skipped.iter()) + .copied() + .collect(); + + // Check for new functions not in our lists + for func in &actual_fns { + if !known.contains(func.as_str()) { + failures.push(format!( + "{}: new function `{func}` not in coverage list. \ + Add to `covered` or `skipped`.", + module.file + )); + } + } + + // Check for stale entries (function removed upstream) + for func in &known { + if !actual_fns.contains(*func) { + failures.push(format!( + "{}: function `{func}` in coverage list but not found in source. \ + Remove from list.", + module.file + )); + } + } + + total_covered += module.covered.len(); + total_skipped += module.skipped.len(); + } + + if !failures.is_empty() { + let report = failures.join("\n "); + panic!( + "Native API coverage check failed:\n {report}\n\n\ + Coverage: {total_covered} covered, {total_skipped} skipped" + ); + } + + eprintln!( + "Native API coverage: {total_covered} covered, {total_skipped} skipped, \ + total {total}", + total = total_covered + total_skipped + ); +} + +// ── Helpers ───────────────────────────────────────────────────────── + +fn find_native_src() -> Option { + // Env var override + if let Ok(path) = std::env::var("AGENT_BROWSER_SRC") { + let p = PathBuf::from(path); + if p.exists() { + return Some(p); + } + } + + // Sibling directory (workspace layout) + let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR")); + let sibling = manifest_dir + .parent()? + .join("agent-browser/cli/src/native"); + if sibling.exists() { + return Some(sibling); + } + + // Cargo git checkouts + let home = dirs::home_dir()?; + let checkouts = home.join(".cargo/git/checkouts"); + if let Ok(entries) = std::fs::read_dir(&checkouts) { + for entry in entries.flatten() { + if entry + .file_name() + .to_string_lossy() + .starts_with("agent-browser-") + { + if let Ok(refs) = std::fs::read_dir(entry.path()) { + for ref_entry in refs.flatten() { + let native = ref_entry.path().join("cli/src/native"); + if native.exists() { + return Some(native); + } + } + } + } + } + } + + None +} + +/// Extract public function names from a Rust source file. +/// Catches both free functions and methods in impl blocks. +fn extract_pub_fns(path: &Path) -> BTreeSet { + let content = std::fs::read_to_string(path).unwrap(); + let mut fns = BTreeSet::new(); + + for line in content.lines() { + let trimmed = line.trim(); + + // Skip lines inside #[cfg(test)] modules + // (simple heuristic: won't catch all cases but good enough) + if trimmed.starts_with("#[cfg(test)]") || trimmed.starts_with("#[test]") { + continue; + } + + // Match: pub fn name( or pub async fn name( + let rest = if let Some(r) = trimmed.strip_prefix("pub async fn ") { + Some(r) + } else if let Some(r) = trimmed.strip_prefix("pub fn ") { + Some(r) + } else { + None + }; + + if let Some(rest) = rest { + if let Some(name) = rest.split(['(', '<', ' ']).next() { + let name = name.trim(); + if !name.is_empty() { + fns.insert(name.to_string()); + } + } + } + } + + fns +} diff --git a/vendor/agent-browser/README.md b/vendor/agent-browser/README.md deleted file mode 100644 index 7cff963..0000000 --- a/vendor/agent-browser/README.md +++ /dev/null @@ -1,38 +0,0 @@ -# Vendored Agent Browser Runtime - -This directory contains vendored upstream `agent-browser` runtime binaries and -daemon assets. - -`npm run browser:runtime:package` copies artifacts from this directory into -`dist/vendor/agent-browser` using `runtime-manifest.json`. - -Current runtime source: - -- Repository: `https://github.com/vercel-labs/agent-browser` -- Release tag: `v0.14.0` - -Layout: - -``` -vendor/agent-browser/ - dist/ - daemon.js - browser.js - ... - runtime-manifest.json - runtimes/ - darwin-arm64/ - agent-browser - darwin-x64/ - agent-browser - linux-arm64/ - agent-browser - linux-x64/ - agent-browser - win32-x64/ - agent-browser.exe -``` - -`runtime-manifest.json` maps each platform target to its runtime entrypoint and -declares shared daemon assets (`dist/`) that are packaged into -`dist/vendor/agent-browser` for npm releases. diff --git a/vendor/agent-browser/dist/action-policy.d.ts b/vendor/agent-browser/dist/action-policy.d.ts deleted file mode 100644 index f484167..0000000 --- a/vendor/agent-browser/dist/action-policy.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -export interface ActionPolicy { - default: 'allow' | 'deny'; - allow?: string[]; - deny?: string[]; -} -export type PolicyDecision = 'allow' | 'deny' | 'confirm'; -export declare const KNOWN_CATEGORIES: Set; -export declare function getActionCategory(action: string): string; -export declare function loadPolicyFile(policyPath: string): ActionPolicy; -export declare function initPolicyReloader(policyPath: string, policy: ActionPolicy): void; -export declare function reloadPolicyIfChanged(): ActionPolicy | null; -export declare function checkPolicy(action: string, policy: ActionPolicy | null, confirmCategories: Set): PolicyDecision; -export declare function describeAction(action: string, command: Record): string; -//# sourceMappingURL=action-policy.d.ts.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/action-policy.d.ts.map b/vendor/agent-browser/dist/action-policy.d.ts.map deleted file mode 100644 index bb545f1..0000000 --- a/vendor/agent-browser/dist/action-policy.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"action-policy.d.ts","sourceRoot":"","sources":["../src/action-policy.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AA4K1D,eAAO,MAAM,gBAAgB,aAE5B,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAwB/D;AAQD,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAIjF;AAED,wBAAgB,qBAAqB,IAAI,YAAY,GAAG,IAAI,CAkB3D;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,YAAY,GAAG,IAAI,EAC3B,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,GAC7B,cAAc,CAkBhB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAyBvF"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/action-policy.js b/vendor/agent-browser/dist/action-policy.js deleted file mode 100644 index c103443..0000000 --- a/vendor/agent-browser/dist/action-policy.js +++ /dev/null @@ -1,253 +0,0 @@ -import { readFileSync, statSync } from 'node:fs'; -import { resolve } from 'node:path'; -const ACTION_CATEGORIES = { - navigate: 'navigate', - back: 'navigate', - forward: 'navigate', - reload: 'navigate', - tab_new: 'navigate', - click: 'click', - dblclick: 'click', - tap: 'click', - fill: 'fill', - type: 'fill', - // The `keyboard` action is a compound command that dispatches to sub-actions - // (type, inserttext, press, down, up). Its primary use is text input, so it - // maps to 'fill'. The interact-like sub-actions (press, down, up) are less - // common and don't have separate top-level action names in the protocol. - keyboard: 'fill', - inserttext: 'fill', - select: 'fill', - multiselect: 'fill', - check: 'fill', - uncheck: 'fill', - clear: 'fill', - selectall: 'fill', - setvalue: 'fill', - download: 'download', - waitfordownload: 'download', - upload: 'upload', - evaluate: 'eval', - evalhandle: 'eval', - addscript: 'eval', - addinitscript: 'eval', - snapshot: 'snapshot', - screenshot: 'snapshot', - pdf: 'snapshot', - diff_snapshot: 'snapshot', - diff_screenshot: 'snapshot', - diff_url: 'snapshot', - scroll: 'scroll', - scrollintoview: 'scroll', - wait: 'wait', - waitforurl: 'wait', - waitforloadstate: 'wait', - waitforfunction: 'wait', - gettext: 'get', - content: 'get', - innerhtml: 'get', - innertext: 'get', - inputvalue: 'get', - url: 'get', - title: 'get', - getattribute: 'get', - count: 'get', - boundingbox: 'get', - styles: 'get', - isvisible: 'get', - isenabled: 'get', - ischecked: 'get', - responsebody: 'get', - route: 'network', - unroute: 'network', - requests: 'network', - state_save: 'state', - state_load: 'state', - cookies_set: 'state', - storage_set: 'state', - credentials: 'state', - hover: 'interact', - focus: 'interact', - drag: 'interact', - press: 'interact', - keydown: 'interact', - keyup: 'interact', - mousemove: 'interact', - mousedown: 'interact', - mouseup: 'interact', - wheel: 'interact', - dispatch: 'interact', - // These are always allowed (internal/meta operations) - launch: '_internal', - close: '_internal', - tab_list: '_internal', - tab_switch: '_internal', - tab_close: '_internal', - window_new: '_internal', - frame: '_internal', - mainframe: '_internal', - dialog: '_internal', - session: '_internal', - console: '_internal', - errors: '_internal', - cookies_get: '_internal', - cookies_clear: '_internal', - storage_get: '_internal', - storage_clear: '_internal', - state_list: '_internal', - state_show: '_internal', - state_clear: '_internal', - state_clean: '_internal', - state_rename: '_internal', - highlight: '_internal', - bringtofront: '_internal', - trace_start: '_internal', - trace_stop: '_internal', - har_start: '_internal', - har_stop: '_internal', - video_start: '_internal', - video_stop: '_internal', - recording_start: '_internal', - recording_stop: '_internal', - recording_restart: '_internal', - profiler_start: '_internal', - profiler_stop: '_internal', - clipboard: '_internal', - viewport: '_internal', - useragent: '_internal', - device: '_internal', - geolocation: '_internal', - permissions: '_internal', - emulatemedia: '_internal', - offline: '_internal', - headers: '_internal', - addstyle: 'eval', - expose: 'eval', - timezone: '_internal', - locale: '_internal', - pause: '_internal', - setcontent: 'eval', - screencast_start: '_internal', - screencast_stop: '_internal', - input_mouse: '_internal', - input_keyboard: '_internal', - input_touch: '_internal', - auth_save: '_internal', - auth_login: '_internal', - auth_list: '_internal', - auth_delete: '_internal', - auth_show: '_internal', - confirm: '_internal', - deny: '_internal', - // Find/semantic locator actions (read-only element resolution) - getbyrole: 'get', - getbytext: 'get', - getbylabel: 'get', - getbyplaceholder: 'get', - getbyalttext: 'get', - getbytitle: 'get', - getbytestid: 'get', - nth: 'get', -}; -// User-facing categories used in policy files. '_internal' is excluded because -// internal actions always bypass policy. 'unknown' is intentionally not a value -// in ACTION_CATEGORIES -- it is only the fallback return of getActionCategory() -// for unrecognized actions. If a user puts "unknown" in a policy file, -// loadPolicyFile will warn about it as unrecognized, which is correct. -export const KNOWN_CATEGORIES = new Set(Object.values(ACTION_CATEGORIES).filter((c) => c !== '_internal')); -export function getActionCategory(action) { - return ACTION_CATEGORIES[action] ?? 'unknown'; -} -export function loadPolicyFile(policyPath) { - const resolved = resolve(policyPath); - const content = readFileSync(resolved, 'utf-8'); - const policy = JSON.parse(content); - if (policy.default !== 'allow' && policy.default !== 'deny') { - throw new Error(`Invalid action policy: "default" must be "allow" or "deny", got "${policy.default}"`); - } - for (const list of [policy.allow, policy.deny]) { - if (!list) - continue; - for (const category of list) { - if (!KNOWN_CATEGORIES.has(category)) { - console.warn(`[agent-browser] Warning: unrecognized action category "${category}" in policy file. ` + - `Known categories: ${[...KNOWN_CATEGORIES].sort().join(', ')}`); - } - } - } - return policy; -} -let cachedPolicyPath = null; -let cachedPolicyMtimeMs = 0; -let cachedPolicy = null; -const RELOAD_CHECK_INTERVAL_MS = 5_000; -let lastCheckMs = 0; -export function initPolicyReloader(policyPath, policy) { - cachedPolicyPath = resolve(policyPath); - cachedPolicyMtimeMs = statSync(cachedPolicyPath).mtimeMs; - cachedPolicy = policy; -} -export function reloadPolicyIfChanged() { - if (!cachedPolicyPath) - return cachedPolicy; - const now = Date.now(); - if (now - lastCheckMs < RELOAD_CHECK_INTERVAL_MS) - return cachedPolicy; - lastCheckMs = now; - try { - const currentMtime = statSync(cachedPolicyPath).mtimeMs; - if (currentMtime !== cachedPolicyMtimeMs) { - cachedPolicy = loadPolicyFile(cachedPolicyPath); - cachedPolicyMtimeMs = currentMtime; - } - } - catch { - // File may have been removed; keep using cached policy - } - return cachedPolicy; -} -export function checkPolicy(action, policy, confirmCategories) { - const category = getActionCategory(action); - // Internal actions are always allowed - if (category === '_internal') - return 'allow'; - // Explicit deny takes precedence over confirmation - if (policy?.deny?.includes(category)) - return 'deny'; - // Check if this category requires confirmation - if (confirmCategories.has(category)) - return 'confirm'; - if (!policy) - return 'allow'; - // Explicit allow list - if (policy.allow?.includes(category)) - return 'allow'; - return policy.default; -} -export function describeAction(action, command) { - const category = getActionCategory(action); - switch (action) { - case 'navigate': - return `Navigate to ${command.url}`; - case 'evaluate': - case 'evalhandle': - return `Evaluate JavaScript: ${String(command.script ?? '').slice(0, 80)}`; - case 'fill': - return `Fill ${command.selector}`; - case 'type': - return `Type into ${command.selector}`; - case 'click': - return `Click ${command.selector}`; - case 'dblclick': - return `Double-click ${command.selector}`; - case 'tap': - return `Tap ${command.selector}`; - case 'download': - return `Download via ${command.selector} to ${command.path}`; - case 'upload': - return `Upload files to ${command.selector}`; - default: - return `${category}: ${action}`; - } -} -//# sourceMappingURL=action-policy.js.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/action-policy.js.map b/vendor/agent-browser/dist/action-policy.js.map deleted file mode 100644 index 83fa468..0000000 --- a/vendor/agent-browser/dist/action-policy.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"action-policy.js","sourceRoot":"","sources":["../src/action-policy.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/actions.d.ts b/vendor/agent-browser/dist/actions.d.ts deleted file mode 100644 index 39640df..0000000 --- a/vendor/agent-browser/dist/actions.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { BrowserManager, ScreencastFrame } from './browser.js'; -import type { Command, Response } from './types.js'; -/** - * Set the callback for screencast frames - * This is called by the daemon to set up frame streaming - */ -export declare function setScreencastFrameCallback(callback: ((frame: ScreencastFrame) => void) | null): void; -/** - * Convert Playwright errors to AI-friendly messages - * @internal Exported for testing - */ -export declare function toAIFriendlyError(error: unknown, selector: string): Error; -export declare function initActionPolicy(): void; -/** - * Execute a command and return a response - */ -export declare function executeCommand(command: Command, browser: BrowserManager): Promise; -//# sourceMappingURL=actions.d.ts.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/actions.d.ts.map b/vendor/agent-browser/dist/actions.d.ts.map deleted file mode 100644 index a1ba78e..0000000 --- a/vendor/agent-browser/dist/actions.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAqBpE,OAAO,KAAK,EACV,OAAO,EACP,QAAQ,EAsIT,MAAM,YAAY,CAAC;AAQpB;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC,GAAG,IAAI,GAClD,IAAI,CAEN;AAQD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,CAqDzE;AAKD,wBAAgB,gBAAgB,IAAI,IAAI,CAuBvC;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,CA6CjG"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/actions.js b/vendor/agent-browser/dist/actions.js deleted file mode 100644 index ed855d5..0000000 --- a/vendor/agent-browser/dist/actions.js +++ /dev/null @@ -1,2037 +0,0 @@ -import * as fs from 'fs'; -import * as path from 'path'; -import { mkdirSync } from 'node:fs'; -import { getAppDir } from './daemon.js'; -import { checkPolicy, describeAction, getActionCategory, loadPolicyFile, initPolicyReloader, reloadPolicyIfChanged, } from './action-policy.js'; -import { requestConfirmation, getAndRemovePending } from './confirmation.js'; -import { getAuthProfile, updateLastLogin } from './auth-vault.js'; -import { getSessionsDir, readStateFile, isValidSessionName, isEncryptedPayload, listStateFiles, cleanupExpiredStates, } from './state-utils.js'; -import { successResponse, errorResponse, parseCommand } from './protocol.js'; -import { diffSnapshots, diffScreenshots } from './diff.js'; -import { getEnhancedSnapshot } from './snapshot.js'; -// Callback for screencast frames - will be set by the daemon when streaming is active -let screencastFrameCallback = null; -/** - * Set the callback for screencast frames - * This is called by the daemon to set up frame streaming - */ -export function setScreencastFrameCallback(callback) { - screencastFrameCallback = callback; -} -/** - * Convert Playwright errors to AI-friendly messages - * @internal Exported for testing - */ -export function toAIFriendlyError(error, selector) { - const message = error instanceof Error ? error.message : String(error); - // Handle strict mode violation (multiple elements match) - if (message.includes('strict mode violation')) { - // Extract count if available - const countMatch = message.match(/resolved to (\d+) elements/); - const count = countMatch ? countMatch[1] : 'multiple'; - return new Error(`Selector "${selector}" matched ${count} elements. ` + - `Run 'snapshot' to get updated refs, or use a more specific CSS selector.`); - } - // Handle element not interactable (must be checked BEFORE timeout case) - // This includes cases where an overlay/modal blocks the element - if (message.includes('intercepts pointer events')) { - return new Error(`Element "${selector}" is blocked by another element (likely a modal or overlay). ` + - `Try dismissing any modals/cookie banners first.`); - } - // Handle element not visible - if (message.includes('not visible') && !message.includes('Timeout')) { - return new Error(`Element "${selector}" is not visible. ` + - `Try scrolling it into view or check if it's hidden.`); - } - // Handle general timeout (element exists but action couldn't complete) - if (message.includes('Timeout') && message.includes('exceeded')) { - return new Error(`Action on "${selector}" timed out. The element may be blocked, still loading, or not interactable. ` + - `Run 'snapshot' to check the current page state.`); - } - // Handle element not found (timeout waiting for element) - if (message.includes('waiting for') && - (message.includes('to be visible') || message.includes('Timeout'))) { - return new Error(`Element "${selector}" not found or not visible. ` + - `Run 'snapshot' to see current page elements.`); - } - // Return original error for unknown cases - return error instanceof Error ? error : new Error(message); -} -let actionPolicy = null; -let confirmCategories = new Set(); -export function initActionPolicy() { - const policyPath = process.env.AGENT_BROWSER_ACTION_POLICY; - if (policyPath) { - try { - actionPolicy = loadPolicyFile(policyPath); - initPolicyReloader(policyPath, actionPolicy); - } - catch (err) { - console.error(`[ERROR] Failed to load action policy from ${policyPath}: ${err instanceof Error ? err.message : err}`); - process.exit(1); - } - } - const confirmActionsEnv = process.env.AGENT_BROWSER_CONFIRM_ACTIONS; - if (confirmActionsEnv) { - confirmCategories = new Set(confirmActionsEnv - .split(',') - .map((c) => c.trim().toLowerCase()) - .filter((c) => c.length > 0)); - } -} -/** - * Execute a command and return a response - */ -export async function executeCommand(command, browser) { - try { - // Handle confirm/deny actions (bypass policy check) - if (command.action === 'confirm') { - return await handleConfirm(command, browser); - } - if (command.action === 'deny') { - return handleDeny(command); - } - // Hot-reload policy file if it changed on disk - actionPolicy = reloadPolicyIfChanged(); - // Policy enforcement - const decision = checkPolicy(command.action, actionPolicy, confirmCategories); - if (decision === 'deny') { - const category = getActionCategory(command.action); - return errorResponse(command.id, `Action denied by policy: '${category}' is not allowed`); - } - if (decision === 'confirm') { - const category = getActionCategory(command.action); - const description = describeAction(command.action, command); - const { confirmationId } = requestConfirmation(command.action, category, description, command); - return successResponse(command.id, { - confirmation_required: true, - action: command.action, - category, - description, - confirmation_id: confirmationId, - }); - } - return await dispatchAction(command, browser); - } - catch (error) { - const message = error instanceof Error ? error.message : String(error); - return errorResponse(command.id, message); - } -} -/** - * Dispatch a command to its handler after policy checks have passed. - */ -async function dispatchAction(command, browser) { - switch (command.action) { - case 'launch': - return await handleLaunch(command, browser); - case 'navigate': - return await handleNavigate(command, browser); - case 'click': - return await handleClick(command, browser); - case 'type': - return await handleType(command, browser); - case 'fill': - return await handleFill(command, browser); - case 'check': - return await handleCheck(command, browser); - case 'uncheck': - return await handleUncheck(command, browser); - case 'upload': - return await handleUpload(command, browser); - case 'dblclick': - return await handleDoubleClick(command, browser); - case 'focus': - return await handleFocus(command, browser); - case 'drag': - return await handleDrag(command, browser); - case 'frame': - return await handleFrame(command, browser); - case 'mainframe': - return await handleMainFrame(command, browser); - case 'getbyrole': - return await handleGetByRole(command, browser); - case 'getbytext': - return await handleGetByText(command, browser); - case 'getbylabel': - return await handleGetByLabel(command, browser); - case 'getbyplaceholder': - return await handleGetByPlaceholder(command, browser); - case 'press': - return await handlePress(command, browser); - case 'screenshot': - return await handleScreenshot(command, browser); - case 'snapshot': - return await handleSnapshot(command, browser); - case 'evaluate': - return await handleEvaluate(command, browser); - case 'wait': - return await handleWait(command, browser); - case 'scroll': - return await handleScroll(command, browser); - case 'select': - return await handleSelect(command, browser); - case 'hover': - return await handleHover(command, browser); - case 'content': - return await handleContent(command, browser); - case 'close': - return await handleClose(command, browser); - case 'tab_new': - return await handleTabNew(command, browser); - case 'tab_list': - return await handleTabList(command, browser); - case 'tab_switch': - return await handleTabSwitch(command, browser); - case 'tab_close': - return await handleTabClose(command, browser); - case 'window_new': - return await handleWindowNew(command, browser); - case 'cookies_get': - return await handleCookiesGet(command, browser); - case 'cookies_set': - return await handleCookiesSet(command, browser); - case 'cookies_clear': - return await handleCookiesClear(command, browser); - case 'storage_get': - return await handleStorageGet(command, browser); - case 'storage_set': - return await handleStorageSet(command, browser); - case 'storage_clear': - return await handleStorageClear(command, browser); - case 'dialog': - return await handleDialog(command, browser); - case 'pdf': - return await handlePdf(command, browser); - case 'route': - return await handleRoute(command, browser); - case 'unroute': - return await handleUnroute(command, browser); - case 'requests': - return await handleRequests(command, browser); - case 'download': - return await handleDownload(command, browser); - case 'geolocation': - return await handleGeolocation(command, browser); - case 'permissions': - return await handlePermissions(command, browser); - case 'viewport': - return await handleViewport(command, browser); - case 'useragent': - return await handleUserAgent(command, browser); - case 'device': - return await handleDevice(command, browser); - case 'back': - return await handleBack(command, browser); - case 'forward': - return await handleForward(command, browser); - case 'reload': - return await handleReload(command, browser); - case 'url': - return await handleUrl(command, browser); - case 'title': - return await handleTitle(command, browser); - case 'getattribute': - return await handleGetAttribute(command, browser); - case 'gettext': - return await handleGetText(command, browser); - case 'isvisible': - return await handleIsVisible(command, browser); - case 'isenabled': - return await handleIsEnabled(command, browser); - case 'ischecked': - return await handleIsChecked(command, browser); - case 'count': - return await handleCount(command, browser); - case 'boundingbox': - return await handleBoundingBox(command, browser); - case 'styles': - return await handleStyles(command, browser); - case 'video_start': - return await handleVideoStart(command, browser); - case 'video_stop': - return await handleVideoStop(command, browser); - case 'trace_start': - return await handleTraceStart(command, browser); - case 'trace_stop': - return await handleTraceStop(command, browser); - case 'profiler_start': - return await handleProfilerStart(command, browser); - case 'profiler_stop': - return await handleProfilerStop(command, browser); - case 'har_start': - return await handleHarStart(command, browser); - case 'har_stop': - return await handleHarStop(command, browser); - case 'state_save': - return await handleStateSave(command, browser); - case 'state_load': - return await handleStateLoad(command, browser); - case 'state_list': - return await handleStateList(command); - case 'state_clear': - return await handleStateClear(command); - case 'state_show': - return await handleStateShow(command); - case 'state_clean': - return await handleStateClean(command); - case 'state_rename': - return await handleStateRename(command); - case 'console': - return await handleConsole(command, browser); - case 'errors': - return await handleErrors(command, browser); - case 'keyboard': - return await handleKeyboard(command, browser); - case 'wheel': - return await handleWheel(command, browser); - case 'tap': - return await handleTap(command, browser); - case 'clipboard': - return await handleClipboard(command, browser); - case 'highlight': - return await handleHighlight(command, browser); - case 'clear': - return await handleClear(command, browser); - case 'selectall': - return await handleSelectAll(command, browser); - case 'innertext': - return await handleInnerText(command, browser); - case 'innerhtml': - return await handleInnerHtml(command, browser); - case 'inputvalue': - return await handleInputValue(command, browser); - case 'setvalue': - return await handleSetValue(command, browser); - case 'dispatch': - return await handleDispatch(command, browser); - case 'evalhandle': - return await handleEvalHandle(command, browser); - case 'expose': - return await handleExpose(command, browser); - case 'addscript': - return await handleAddScript(command, browser); - case 'addstyle': - return await handleAddStyle(command, browser); - case 'emulatemedia': - return await handleEmulateMedia(command, browser); - case 'offline': - return await handleOffline(command, browser); - case 'headers': - return await handleHeaders(command, browser); - case 'pause': - return await handlePause(command, browser); - case 'getbyalttext': - return await handleGetByAltText(command, browser); - case 'getbytitle': - return await handleGetByTitle(command, browser); - case 'getbytestid': - return await handleGetByTestId(command, browser); - case 'nth': - return await handleNth(command, browser); - case 'waitforurl': - return await handleWaitForUrl(command, browser); - case 'waitforloadstate': - return await handleWaitForLoadState(command, browser); - case 'setcontent': - return await handleSetContent(command, browser); - case 'timezone': - return await handleTimezone(command, browser); - case 'locale': - return await handleLocale(command, browser); - case 'credentials': - return await handleCredentials(command, browser); - case 'mousemove': - return await handleMouseMove(command, browser); - case 'mousedown': - return await handleMouseDown(command, browser); - case 'mouseup': - return await handleMouseUp(command, browser); - case 'bringtofront': - return await handleBringToFront(command, browser); - case 'waitforfunction': - return await handleWaitForFunction(command, browser); - case 'scrollintoview': - return await handleScrollIntoView(command, browser); - case 'addinitscript': - return await handleAddInitScript(command, browser); - case 'keydown': - return await handleKeyDown(command, browser); - case 'keyup': - return await handleKeyUp(command, browser); - case 'inserttext': - return await handleInsertText(command, browser); - case 'multiselect': - return await handleMultiSelect(command, browser); - case 'waitfordownload': - return await handleWaitForDownload(command, browser); - case 'responsebody': - return await handleResponseBody(command, browser); - case 'screencast_start': - return await handleScreencastStart(command, browser); - case 'screencast_stop': - return await handleScreencastStop(command, browser); - case 'input_mouse': - return await handleInputMouse(command, browser); - case 'input_keyboard': - return await handleInputKeyboard(command, browser); - case 'input_touch': - return await handleInputTouch(command, browser); - case 'recording_start': - return await handleRecordingStart(command, browser); - case 'recording_stop': - return await handleRecordingStop(command, browser); - case 'recording_restart': - return await handleRecordingRestart(command, browser); - case 'diff_snapshot': - return await handleDiffSnapshot(command, browser); - case 'diff_screenshot': - return await handleDiffScreenshot(command, browser); - case 'diff_url': - return await handleDiffUrl(command, browser); - case 'auth_login': - return await handleAuthLogin(command, browser); - default: { - // TypeScript narrows to never here, but we handle it for safety - const unknownCommand = command; - return errorResponse(unknownCommand.id, `Unknown action: ${unknownCommand.action}`); - } - } -} -async function handleLaunch(command, browser) { - await browser.launch(command); - return successResponse(command.id, { launched: true }); -} -async function handleNavigate(command, browser) { - browser.checkDomainAllowed(command.url); - const page = browser.getPage(); - // If headers are provided, set up scoped headers for this origin - if (command.headers && Object.keys(command.headers).length > 0) { - await browser.setScopedHeaders(command.url, command.headers); - } - await page.goto(command.url, { - waitUntil: command.waitUntil ?? 'load', - }); - return successResponse(command.id, { - url: page.url(), - title: await page.title(), - }); -} -async function handleClick(command, browser) { - // Support both refs (@e1) and regular selectors - const locator = browser.getLocator(command.selector); - try { - // If --new-tab flag is set, get the href and open in a new tab - if (command.newTab) { - const fullUrl = await locator.evaluate((el) => { - const href = el.getAttribute('href'); - // URL and document.baseURI are available in the browser context - return href - ? new globalThis.URL(href, globalThis.document.baseURI).toString() - : ''; - }); - if (!fullUrl) { - throw new Error(`Element '${command.selector}' does not have an href attribute. --new-tab only works on links.`); - } - await browser.newTab(); - const newPage = browser.getPage(); - await newPage.goto(fullUrl); - return successResponse(command.id, { - clicked: true, - newTab: true, - url: fullUrl, - }); - } - await locator.click({ - button: command.button, - clickCount: command.clickCount, - delay: command.delay, - }); - } - catch (error) { - throw toAIFriendlyError(error, command.selector); - } - return successResponse(command.id, { clicked: true }); -} -async function handleType(command, browser) { - const locator = browser.getLocator(command.selector); - try { - if (command.clear) { - await locator.fill(''); - } - await locator.pressSequentially(command.text, { - delay: command.delay, - }); - } - catch (error) { - throw toAIFriendlyError(error, command.selector); - } - return successResponse(command.id, { typed: true }); -} -async function handlePress(command, browser) { - const page = browser.getPage(); - if (command.selector) { - await page.press(command.selector, command.key); - } - else { - await page.keyboard.press(command.key); - } - return successResponse(command.id, { pressed: true }); -} -const ANNOTATION_OVERLAY_ID = '__agent_browser_annotations__'; -async function removeAnnotationOverlay(page) { - await page - .evaluate(`(() => { const el = document.getElementById(${JSON.stringify(ANNOTATION_OVERLAY_ID)}); if (el) el.remove(); })()`) - .catch(() => { }); -} -async function handleScreenshot(command, browser) { - const page = browser.getPage(); - const options = { - fullPage: command.fullPage, - type: command.format ?? 'png', - }; - if (command.format === 'jpeg' && command.quality !== undefined) { - options.quality = command.quality; - } - let target = page; - if (command.selector) { - target = browser.getLocator(command.selector); - } - let overlayInjected = false; - try { - let savePath = command.path; - if (!savePath) { - const ext = command.format === 'jpeg' ? 'jpg' : 'png'; - const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); - const random = Math.random().toString(36).substring(2, 8); - const filename = `screenshot-${timestamp}-${random}.${ext}`; - const screenshotDir = path.join(getAppDir(), 'tmp', 'screenshots'); - mkdirSync(screenshotDir, { recursive: true }); - savePath = path.join(screenshotDir, filename); - } - let annotations; - if (command.annotate) { - const { refs } = await browser.getSnapshot({ interactive: true }); - const entries = Object.entries(refs); - const results = await Promise.all(entries.map(async ([ref, data]) => { - try { - const locator = browser.getLocatorFromRef(ref); - if (!locator) - return null; - const box = await locator.boundingBox(); - if (!box || box.width === 0 || box.height === 0) - return null; - const num = parseInt(ref.replace('e', ''), 10); - return { - ref, - number: num, - role: data.role, - name: data.name || undefined, - box: { - x: Math.round(box.x), - y: Math.round(box.y), - width: Math.round(box.width), - height: Math.round(box.height), - }, - }; - } - catch { - return null; - } - })); - // When a selector is provided the screenshot is cropped to that element, - // so filter to annotations that overlap the target and shift coordinates. - let targetBox = null; - if (command.selector) { - const raw = await browser.getLocator(command.selector).boundingBox(); - if (raw) { - targetBox = { - x: Math.round(raw.x), - y: Math.round(raw.y), - width: Math.round(raw.width), - height: Math.round(raw.height), - }; - } - } - const filtered = results.filter((a) => a !== null); - // Filter by selector overlap if needed, but keep viewport-relative coords - // for overlay positioning. Coordinate shifting happens later for metadata only. - let overlayItems; - if (targetBox) { - const tb = targetBox; - overlayItems = filtered - .filter((a) => { - const ax2 = a.box.x + a.box.width; - const ay2 = a.box.y + a.box.height; - const bx2 = tb.x + tb.width; - const by2 = tb.y + tb.height; - return a.box.x < bx2 && ax2 > tb.x && a.box.y < by2 && ay2 > tb.y; - }) - .sort((a, b) => a.number - b.number); - } - else { - overlayItems = filtered.sort((a, b) => a.number - b.number); - } - if (overlayItems.length > 0) { - const overlayData = overlayItems.map((a) => ({ - number: a.number, - x: a.box.x, - y: a.box.y, - width: a.box.width, - height: a.box.height, - })); - // Uses position:absolute with document-relative coords so labels render - // correctly for both viewport and fullPage screenshots, and when the - // screenshot is scoped to a selector element. - await page.evaluate(`(() => { - var items = ${JSON.stringify(overlayData)}; - var id = ${JSON.stringify(ANNOTATION_OVERLAY_ID)}; - var sx = window.scrollX || 0; - var sy = window.scrollY || 0; - var c = document.createElement('div'); - c.id = id; - c.style.cssText = 'position:absolute;top:0;left:0;width:0;height:0;pointer-events:none;z-index:2147483647;'; - for (var i = 0; i < items.length; i++) { - var it = items[i]; - var dx = it.x + sx; - var dy = it.y + sy; - var b = document.createElement('div'); - b.style.cssText = 'position:absolute;left:' + dx + 'px;top:' + dy + 'px;width:' + it.width + 'px;height:' + it.height + 'px;border:2px solid rgba(255,0,0,0.8);box-sizing:border-box;pointer-events:none;'; - var l = document.createElement('div'); - l.textContent = String(it.number); - var labelTop = dy < 14 ? '2px' : '-14px'; - l.style.cssText = 'position:absolute;top:' + labelTop + ';left:-2px;background:rgba(255,0,0,0.9);color:#fff;font:bold 11px/14px monospace;padding:0 4px;border-radius:2px;white-space:nowrap;'; - b.appendChild(l); - c.appendChild(b); - } - document.documentElement.appendChild(c); - })()`); - overlayInjected = true; - } - // Build returned annotation metadata with image-relative coordinates. - // Selector: shift to target-element-relative. - // fullPage: convert to document-relative (matching fullPage image origin). - // Default: viewport-relative (unchanged). - if (targetBox) { - const tb = targetBox; - annotations = overlayItems.map((a) => ({ - ...a, - box: { - x: a.box.x - tb.x, - y: a.box.y - tb.y, - width: a.box.width, - height: a.box.height, - }, - })); - } - else if (command.fullPage) { - const scroll = (await page.evaluate(`({x: window.scrollX || 0, y: window.scrollY || 0})`)); - annotations = overlayItems.map((a) => ({ - ...a, - box: { - x: a.box.x + scroll.x, - y: a.box.y + scroll.y, - width: a.box.width, - height: a.box.height, - }, - })); - } - else { - annotations = overlayItems; - } - } - await target.screenshot({ ...options, path: savePath }); - if (overlayInjected) { - await removeAnnotationOverlay(page); - } - return successResponse(command.id, { - path: savePath, - ...(annotations && annotations.length > 0 ? { annotations } : {}), - }); - } - catch (error) { - if (overlayInjected) { - await removeAnnotationOverlay(page); - } - if (command.selector) { - throw toAIFriendlyError(error, command.selector); - } - throw error; - } -} -async function handleSnapshot(command, browser) { - // Use enhanced snapshot with refs and optional filtering - const { tree, refs } = await browser.getSnapshot({ - interactive: command.interactive, - cursor: command.cursor, - maxDepth: command.maxDepth, - compact: command.compact, - selector: command.selector, - }); - // Simplify refs for output (just role and name) - const simpleRefs = {}; - for (const [ref, data] of Object.entries(refs)) { - simpleRefs[ref] = { role: data.role, name: data.name }; - } - const page = browser.getPage(); - return successResponse(command.id, { - snapshot: tree || 'Empty page', - refs: Object.keys(simpleRefs).length > 0 ? simpleRefs : undefined, - origin: page.url(), - }); -} -async function handleEvaluate(command, browser) { - const page = browser.getPage(); - // Evaluate the script directly as a string expression - const result = await page.evaluate(command.script); - return successResponse(command.id, { result, origin: page.url() }); -} -async function handleWait(command, browser) { - const page = browser.getPage(); - if (command.selector) { - await page.waitForSelector(command.selector, { - state: command.state ?? 'visible', - timeout: command.timeout, - }); - } - else if (command.timeout) { - await page.waitForTimeout(command.timeout); - } - else { - // Default: wait for load state - await page.waitForLoadState('load'); - } - return successResponse(command.id, { waited: true }); -} -async function handleScroll(command, browser) { - const page = browser.getPage(); - let deltaX = command.x ?? 0; - let deltaY = command.y ?? 0; - const hasExplicitDelta = command.x !== undefined || command.y !== undefined; - if (command.direction) { - const amount = command.amount ?? 100; - switch (command.direction) { - case 'up': - deltaY = -amount; - break; - case 'down': - deltaY = amount; - break; - case 'left': - deltaX = -amount; - break; - case 'right': - deltaX = amount; - break; - } - } - if (command.selector) { - const element = browser.getLocator(command.selector); - await element.scrollIntoViewIfNeeded(); - if (hasExplicitDelta || deltaX !== 0 || deltaY !== 0) { - await element.evaluate((el, { x, y }) => { - el.scrollBy(x, y); - }, { x: deltaX, y: deltaY }); - } - } - else { - await page.evaluate(`window.scrollBy(${deltaX}, ${deltaY})`); - } - return successResponse(command.id, { scrolled: true }); -} -async function handleSelect(command, browser) { - const locator = browser.getLocator(command.selector); - const values = Array.isArray(command.values) ? command.values : [command.values]; - try { - await locator.selectOption(values); - } - catch (error) { - throw toAIFriendlyError(error, command.selector); - } - return successResponse(command.id, { selected: values }); -} -async function handleHover(command, browser) { - const locator = browser.getLocator(command.selector); - try { - await locator.hover(); - } - catch (error) { - throw toAIFriendlyError(error, command.selector); - } - return successResponse(command.id, { hovered: true }); -} -async function handleContent(command, browser) { - const page = browser.getPage(); - let html; - if (command.selector) { - html = await page.locator(command.selector).innerHTML(); - } - else { - html = await page.content(); - } - return successResponse(command.id, { html, origin: page.url() }); -} -async function handleClose(command, browser) { - await browser.close(); - return successResponse(command.id, { closed: true }); -} -async function handleTabNew(command, browser) { - const result = await browser.newTab(); - // Navigate to URL if provided (same pattern as handleNavigate) - if (command.url) { - const page = browser.getPage(); - await page.goto(command.url, { waitUntil: 'domcontentloaded' }); - } - return successResponse(command.id, result); -} -async function handleTabList(command, browser) { - const tabs = await browser.listTabs(); - return successResponse(command.id, { - tabs, - active: browser.getActiveIndex(), - }); -} -async function handleTabSwitch(command, browser) { - const result = await browser.switchTo(command.index); - const page = browser.getPage(); - return successResponse(command.id, { - ...result, - title: await page.title(), - }); -} -async function handleTabClose(command, browser) { - const result = await browser.closeTab(command.index); - return successResponse(command.id, result); -} -async function handleWindowNew(command, browser) { - const result = await browser.newWindow(command.viewport); - return successResponse(command.id, result); -} -// New handlers for enhanced Playwright parity -async function handleFill(command, browser) { - const locator = browser.getLocator(command.selector); - try { - await locator.fill(command.value); - } - catch (error) { - throw toAIFriendlyError(error, command.selector); - } - return successResponse(command.id, { filled: true }); -} -async function handleCheck(command, browser) { - const locator = browser.getLocator(command.selector); - try { - await locator.check(); - } - catch (error) { - throw toAIFriendlyError(error, command.selector); - } - return successResponse(command.id, { checked: true }); -} -async function handleUncheck(command, browser) { - const locator = browser.getLocator(command.selector); - try { - await locator.uncheck(); - } - catch (error) { - throw toAIFriendlyError(error, command.selector); - } - return successResponse(command.id, { unchecked: true }); -} -async function handleUpload(command, browser) { - const locator = browser.getLocator(command.selector); - const files = Array.isArray(command.files) ? command.files : [command.files]; - try { - await locator.setInputFiles(files); - } - catch (error) { - throw toAIFriendlyError(error, command.selector); - } - return successResponse(command.id, { uploaded: files }); -} -async function handleDoubleClick(command, browser) { - const locator = browser.getLocator(command.selector); - try { - await locator.dblclick(); - } - catch (error) { - throw toAIFriendlyError(error, command.selector); - } - return successResponse(command.id, { clicked: true }); -} -async function handleFocus(command, browser) { - const locator = browser.getLocator(command.selector); - try { - await locator.focus(); - } - catch (error) { - throw toAIFriendlyError(error, command.selector); - } - return successResponse(command.id, { focused: true }); -} -async function handleDrag(command, browser) { - const frame = browser.getFrame(); - await frame.dragAndDrop(command.source, command.target); - return successResponse(command.id, { dragged: true }); -} -async function handleFrame(command, browser) { - await browser.switchToFrame({ - selector: command.selector, - name: command.name, - url: command.url, - }); - return successResponse(command.id, { switched: true }); -} -async function handleMainFrame(command, browser) { - browser.switchToMainFrame(); - return successResponse(command.id, { switched: true }); -} -async function handleGetByRole(command, browser) { - const page = browser.getPage(); - const locator = page.getByRole(command.role, { name: command.name, exact: command.exact }); - switch (command.subaction) { - case 'click': - await locator.click(); - return successResponse(command.id, { clicked: true }); - case 'fill': - await locator.fill(command.value ?? ''); - return successResponse(command.id, { filled: true }); - case 'check': - await locator.check(); - return successResponse(command.id, { checked: true }); - case 'hover': - await locator.hover(); - return successResponse(command.id, { hovered: true }); - } -} -async function handleGetByText(command, browser) { - const page = browser.getPage(); - const locator = page.getByText(command.text, { exact: command.exact }); - switch (command.subaction) { - case 'click': - await locator.click(); - return successResponse(command.id, { clicked: true }); - case 'hover': - await locator.hover(); - return successResponse(command.id, { hovered: true }); - } -} -async function handleGetByLabel(command, browser) { - const page = browser.getPage(); - const locator = page.getByLabel(command.label, { exact: command.exact }); - switch (command.subaction) { - case 'click': - await locator.click(); - return successResponse(command.id, { clicked: true }); - case 'fill': - await locator.fill(command.value ?? ''); - return successResponse(command.id, { filled: true }); - case 'check': - await locator.check(); - return successResponse(command.id, { checked: true }); - } -} -async function handleGetByPlaceholder(command, browser) { - const page = browser.getPage(); - const locator = page.getByPlaceholder(command.placeholder, { exact: command.exact }); - switch (command.subaction) { - case 'click': - await locator.click(); - return successResponse(command.id, { clicked: true }); - case 'fill': - await locator.fill(command.value ?? ''); - return successResponse(command.id, { filled: true }); - } -} -async function handleCookiesGet(command, browser) { - const page = browser.getPage(); - const context = page.context(); - const cookies = await context.cookies(command.urls); - return successResponse(command.id, { cookies }); -} -async function handleCookiesSet(command, browser) { - const page = browser.getPage(); - const context = page.context(); - // Auto-fill URL for cookies that don't have domain/path/url set - const pageUrl = page.url(); - const cookies = command.cookies.map((cookie) => { - if (!cookie.url && !cookie.domain && !cookie.path) { - return { ...cookie, url: pageUrl }; - } - return cookie; - }); - await context.addCookies(cookies); - return successResponse(command.id, { set: true }); -} -async function handleCookiesClear(command, browser) { - const page = browser.getPage(); - const context = page.context(); - await context.clearCookies(); - return successResponse(command.id, { cleared: true }); -} -async function handleStorageGet(command, browser) { - const page = browser.getPage(); - const storageType = command.type === 'local' ? 'localStorage' : 'sessionStorage'; - if (command.key) { - const value = await page.evaluate(`${storageType}.getItem(${JSON.stringify(command.key)})`); - return successResponse(command.id, { key: command.key, value }); - } - else { - const data = await page.evaluate(` - (() => { - const storage = ${storageType}; - const result = {}; - for (let i = 0; i < storage.length; i++) { - const key = storage.key(i); - if (key) result[key] = storage.getItem(key); - } - return result; - })() - `); - return successResponse(command.id, { data }); - } -} -async function handleStorageSet(command, browser) { - const page = browser.getPage(); - const storageType = command.type === 'local' ? 'localStorage' : 'sessionStorage'; - await page.evaluate(`${storageType}.setItem(${JSON.stringify(command.key)}, ${JSON.stringify(command.value)})`); - return successResponse(command.id, { set: true }); -} -async function handleStorageClear(command, browser) { - const page = browser.getPage(); - const storageType = command.type === 'local' ? 'localStorage' : 'sessionStorage'; - await page.evaluate(`${storageType}.clear()`); - return successResponse(command.id, { cleared: true }); -} -async function handleDialog(command, browser) { - browser.setDialogHandler(command.response, command.promptText); - return successResponse(command.id, { handler: 'set', response: command.response }); -} -async function handlePdf(command, browser) { - const page = browser.getPage(); - await page.pdf({ - path: command.path, - format: command.format ?? 'Letter', - }); - return successResponse(command.id, { path: command.path }); -} -// Network & Request handlers -async function handleRoute(command, browser) { - await browser.addRoute(command.url, { - response: command.response, - abort: command.abort, - }); - return successResponse(command.id, { routed: command.url }); -} -async function handleUnroute(command, browser) { - await browser.removeRoute(command.url); - return successResponse(command.id, { unrouted: command.url ?? 'all' }); -} -async function handleRequests(command, browser) { - if (command.clear) { - browser.clearRequests(); - return successResponse(command.id, { cleared: true }); - } - // Start tracking if not already - browser.startRequestTracking(); - const requests = browser.getRequests(command.filter); - return successResponse(command.id, { requests }); -} -async function handleDownload(command, browser) { - const page = browser.getPage(); - const locator = browser.getLocator(command.selector); - const [download] = await Promise.all([page.waitForEvent('download'), locator.click()]); - await download.saveAs(command.path); - return successResponse(command.id, { - path: command.path, - suggestedFilename: download.suggestedFilename(), - }); -} -async function handleGeolocation(command, browser) { - await browser.setGeolocation(command.latitude, command.longitude, command.accuracy); - return successResponse(command.id, { - latitude: command.latitude, - longitude: command.longitude, - }); -} -async function handlePermissions(command, browser) { - await browser.setPermissions(command.permissions, command.grant); - return successResponse(command.id, { - permissions: command.permissions, - granted: command.grant, - }); -} -async function handleViewport(command, browser) { - await browser.setViewport(command.width, command.height); - return successResponse(command.id, { - width: command.width, - height: command.height, - }); -} -async function handleUserAgent(command, browser) { - const page = browser.getPage(); - const context = page.context(); - // Note: Can't change user agent after context is created, but we can for new pages - return successResponse(command.id, { - note: 'User agent can only be set at launch time. Use device command instead.', - }); -} -async function handleDevice(command, browser) { - const device = browser.getDevice(command.device); - if (!device) { - const available = browser.listDevices().slice(0, 10).join(', '); - throw new Error(`Unknown device: ${command.device}. Available: ${available}...`); - } - // Apply device viewport - await browser.setViewport(device.viewport.width, device.viewport.height); - // Apply or clear device scale factor - if (device.deviceScaleFactor && device.deviceScaleFactor !== 1) { - // Apply device scale factor for HiDPI/retina displays - await browser.setDeviceScaleFactor(device.deviceScaleFactor, device.viewport.width, device.viewport.height, device.isMobile ?? false); - } - else { - // Clear device scale factor override to restore default (1x) - try { - await browser.clearDeviceMetricsOverride(); - } - catch { - // Ignore error if override was never set - } - } - return successResponse(command.id, { - device: command.device, - viewport: device.viewport, - userAgent: device.userAgent, - deviceScaleFactor: device.deviceScaleFactor, - }); -} -async function handleBack(command, browser) { - const page = browser.getPage(); - await page.goBack(); - return successResponse(command.id, { url: page.url() }); -} -async function handleForward(command, browser) { - const page = browser.getPage(); - await page.goForward(); - return successResponse(command.id, { url: page.url() }); -} -async function handleReload(command, browser) { - const page = browser.getPage(); - await page.reload(); - return successResponse(command.id, { url: page.url() }); -} -async function handleUrl(command, browser) { - const page = browser.getPage(); - return successResponse(command.id, { url: page.url() }); -} -async function handleTitle(command, browser) { - const page = browser.getPage(); - const title = await page.title(); - return successResponse(command.id, { title }); -} -async function handleGetAttribute(command, browser) { - const page = browser.getPage(); - const locator = browser.getLocator(command.selector); - const value = await locator.getAttribute(command.attribute); - return successResponse(command.id, { attribute: command.attribute, value, origin: page.url() }); -} -async function handleGetText(command, browser) { - const page = browser.getPage(); - const locator = browser.getLocator(command.selector); - const text = await locator.textContent(); - return successResponse(command.id, { text, origin: page.url() }); -} -async function handleIsVisible(command, browser) { - const locator = browser.getLocator(command.selector); - const visible = await locator.isVisible(); - return successResponse(command.id, { visible }); -} -async function handleIsEnabled(command, browser) { - const locator = browser.getLocator(command.selector); - const enabled = await locator.isEnabled(); - return successResponse(command.id, { enabled }); -} -async function handleIsChecked(command, browser) { - const locator = browser.getLocator(command.selector); - const checked = await locator.isChecked(); - return successResponse(command.id, { checked }); -} -async function handleCount(command, browser) { - const page = browser.getPage(); - const count = await page.locator(command.selector).count(); - return successResponse(command.id, { count }); -} -async function handleBoundingBox(command, browser) { - const page = browser.getPage(); - const box = await page.locator(command.selector).boundingBox(); - return successResponse(command.id, { box }); -} -async function handleStyles(command, browser) { - const page = browser.getPage(); - // Shared extraction logic as a string to be eval'd in browser context - const extractStylesScript = `(function(el) { - const s = getComputedStyle(el); - const r = el.getBoundingClientRect(); - return { - tag: el.tagName.toLowerCase(), - text: el.innerText?.trim().slice(0, 80) || null, - box: { - x: Math.round(r.x), - y: Math.round(r.y), - width: Math.round(r.width), - height: Math.round(r.height), - }, - styles: { - fontSize: s.fontSize, - fontWeight: s.fontWeight, - fontFamily: s.fontFamily.split(',')[0].trim().replace(/"/g, ''), - color: s.color, - backgroundColor: s.backgroundColor, - borderRadius: s.borderRadius, - border: s.border !== 'none' && s.borderWidth !== '0px' ? s.border : null, - boxShadow: s.boxShadow !== 'none' ? s.boxShadow : null, - padding: s.padding, - }, - }; - })`; - // Check if it's a ref - single element - if (browser.isRef(command.selector)) { - const locator = browser.getLocator(command.selector); - const element = (await locator.evaluate((el, script) => { - const fn = eval(script); - return fn(el); - }, extractStylesScript)); - return successResponse(command.id, { elements: [element] }); - } - // CSS selector - can match multiple elements - const elements = (await page.$$eval(command.selector, (els, script) => { - const fn = eval(script); - return els.map((el) => fn(el)); - }, extractStylesScript)); - return successResponse(command.id, { elements }); -} -// Advanced handlers -async function handleVideoStart(command, browser) { - // Video recording requires context-level setup at launch - // For now, return a note about this limitation - return successResponse(command.id, { - note: 'Video recording must be enabled at browser launch. Use --video flag when starting.', - path: command.path, - }); -} -async function handleVideoStop(command, browser) { - const page = browser.getPage(); - const video = page.video(); - if (video) { - const path = await video.path(); - return successResponse(command.id, { path }); - } - return successResponse(command.id, { note: 'No video recording active' }); -} -async function handleTraceStart(command, browser) { - await browser.startTracing({ - screenshots: command.screenshots, - snapshots: command.snapshots, - }); - return successResponse(command.id, { started: true }); -} -async function handleTraceStop(command, browser) { - await browser.stopTracing(command.path); - return successResponse(command.id, command.path ? { path: command.path } : { traceStopped: true }); -} -async function handleProfilerStart(command, browser) { - await browser.startProfiling({ categories: command.categories }); - return successResponse(command.id, { started: true }); -} -async function handleProfilerStop(command, browser) { - let outputPath = command.path; - if (!outputPath) { - const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); - const random = Math.random().toString(36).substring(2, 8); - const filename = `profile-${timestamp}-${random}.json`; - const profileDir = path.join(getAppDir(), 'tmp', 'profiles'); - mkdirSync(profileDir, { recursive: true }); - outputPath = path.join(profileDir, filename); - } - const result = await browser.stopProfiling(outputPath); - return successResponse(command.id, result); -} -async function handleHarStart(command, browser) { - await browser.startHarRecording(); - browser.startRequestTracking(); - return successResponse(command.id, { started: true }); -} -async function handleHarStop(command, browser) { - // HAR recording is handled at context level - // For now, we save tracked requests as a simplified HAR-like format - const requests = browser.getRequests(); - return successResponse(command.id, { - path: command.path, - requestCount: requests.length, - }); -} -async function handleStateSave(command, browser) { - await browser.saveStorageState(command.path); - return successResponse(command.id, { path: command.path }); -} -async function handleStateLoad(command, browser) { - if (browser.isLaunched()) { - return errorResponse(command.id, 'Cannot load state while browser is running. Close browser first, then relaunch with loaded state.'); - } - if (!fs.existsSync(command.path)) { - return errorResponse(command.id, `State file not found: ${command.path}`); - } - await browser.launch({ - id: command.id, - action: 'launch', - headless: true, - autoStateFilePath: command.path, - }); - return successResponse(command.id, { - loaded: true, - path: command.path, - }); -} -async function handleStateList(command) { - const sessionsDir = getSessionsDir(); - const files = listStateFiles(); - if (files.length === 0) { - return successResponse(command.id, { files: [], directory: sessionsDir }); - } - const stateFiles = files - .map((filename) => { - const filepath = path.join(sessionsDir, filename); - const stats = fs.statSync(filepath); - let encrypted = false; - try { - const content = fs.readFileSync(filepath, 'utf-8'); - const parsed = JSON.parse(content); - encrypted = isEncryptedPayload(parsed); - } - catch { - // Ignore parse errors - } - return { - filename, - path: filepath, - size: stats.size, - modified: stats.mtime.toISOString(), - encrypted, - }; - }) - .sort((a, b) => new Date(b.modified).getTime() - new Date(a.modified).getTime()); - return successResponse(command.id, { files: stateFiles, directory: sessionsDir }); -} -async function handleStateClear(command) { - const sessionsDir = getSessionsDir(); - if (command.sessionName && !isValidSessionName(command.sessionName)) { - return errorResponse(command.id, 'Invalid session name. Use only letters, numbers, dashes, and underscores.'); - } - const files = listStateFiles(); - if (files.length === 0) { - return successResponse(command.id, { cleared: 0, deleted: [] }); - } - const deleted = []; - if (command.all) { - for (const file of files) { - fs.unlinkSync(path.join(sessionsDir, file)); - deleted.push(file); - } - } - else if (command.sessionName) { - for (const file of files) { - if (file.startsWith(`${command.sessionName}-`)) { - fs.unlinkSync(path.join(sessionsDir, file)); - deleted.push(file); - } - } - } - return successResponse(command.id, { cleared: deleted.length, deleted }); -} -async function handleStateShow(command) { - const sessionsDir = getSessionsDir(); - const baseName = command.filename.replace(/\.json$/, ''); - if (!command.filename.endsWith('.json') || !isValidSessionName(baseName)) { - return errorResponse(command.id, 'Invalid filename. Use only letters, numbers, dashes, and underscores (with .json extension).'); - } - const filepath = path.join(sessionsDir, command.filename); - if (!fs.existsSync(filepath)) { - return errorResponse(command.id, `State file not found: ${command.filename}`); - } - try { - const { data: state, wasEncrypted } = readStateFile(filepath); - const stats = fs.statSync(filepath); - const stateObj = state; - const cookies = stateObj.cookies?.length || 0; - const origins = stateObj.origins?.length || 0; - const domains = [...new Set((stateObj.cookies || []).map((c) => c.domain))]; - return successResponse(command.id, { - filename: command.filename, - path: filepath, - size: stats.size, - modified: stats.mtime.toISOString(), - encrypted: wasEncrypted, - summary: { - cookies, - origins, - domains, - }, - state, - }); - } - catch (e) { - return errorResponse(command.id, `Failed to parse state file: ${e.message}`); - } -} -async function handleStateClean(command) { - const deleted = cleanupExpiredStates(command.days); - const keptCount = listStateFiles().length; - return successResponse(command.id, { - cleaned: deleted.length, - deleted, - keptCount, - days: command.days, - }); -} -async function handleStateRename(command) { - const sessionsDir = getSessionsDir(); - if (!isValidSessionName(command.oldName) || !isValidSessionName(command.newName)) { - return errorResponse(command.id, 'Invalid name. Use only letters, numbers, dashes, and underscores.'); - } - const oldPath = path.join(sessionsDir, `${command.oldName}.json`); - const newPath = path.join(sessionsDir, `${command.newName}.json`); - if (!fs.existsSync(oldPath)) { - return errorResponse(command.id, `State file not found: ${command.oldName}.json`); - } - if (fs.existsSync(newPath)) { - return errorResponse(command.id, `Destination already exists: ${command.newName}.json`); - } - fs.renameSync(oldPath, newPath); - return successResponse(command.id, { - renamed: true, - oldName: `${command.oldName}.json`, - newName: `${command.newName}.json`, - path: newPath, - }); -} -async function handleConsole(command, browser) { - if (command.clear) { - browser.clearConsoleMessages(); - return successResponse(command.id, { cleared: true }); - } - const page = browser.getPage(); - const messages = browser.getConsoleMessages(); - return successResponse(command.id, { messages, origin: page.url() }); -} -async function handleErrors(command, browser) { - if (command.clear) { - browser.clearPageErrors(); - return successResponse(command.id, { cleared: true }); - } - const errors = browser.getPageErrors(); - return successResponse(command.id, { errors }); -} -async function handleKeyboard(command, browser) { - const page = browser.getPage(); - const sub = command.subaction ?? 'press'; - switch (sub) { - case 'type': - await page.keyboard.type(command.text ?? '', { delay: command.delay }); - return successResponse(command.id, { typed: true, text: command.text }); - case 'press': - await page.keyboard.press(command.keys ?? ''); - return successResponse(command.id, { pressed: command.keys }); - case 'insertText': - await page.keyboard.insertText(command.text ?? ''); - return successResponse(command.id, { inserted: true, text: command.text }); - default: - return errorResponse(command.id, `Unknown keyboard subaction: ${sub}`); - } -} -async function handleWheel(command, browser) { - const page = browser.getPage(); - if (command.selector) { - const element = page.locator(command.selector); - await element.hover(); - } - await page.mouse.wheel(command.deltaX ?? 0, command.deltaY ?? 0); - return successResponse(command.id, { scrolled: true }); -} -async function handleTap(command, browser) { - const page = browser.getPage(); - await page.tap(command.selector); - return successResponse(command.id, { tapped: true }); -} -async function handleClipboard(command, browser) { - const page = browser.getPage(); - switch (command.operation) { - case 'copy': - await page.keyboard.press('Control+c'); - return successResponse(command.id, { copied: true }); - case 'paste': - await page.keyboard.press('Control+v'); - return successResponse(command.id, { pasted: true }); - case 'read': - const text = await page.evaluate('navigator.clipboard.readText()'); - return successResponse(command.id, { text }); - default: - return errorResponse(command.id, 'Unknown clipboard operation'); - } -} -async function handleHighlight(command, browser) { - const page = browser.getPage(); - await page.locator(command.selector).highlight(); - return successResponse(command.id, { highlighted: true }); -} -async function handleClear(command, browser) { - const page = browser.getPage(); - await page.locator(command.selector).clear(); - return successResponse(command.id, { cleared: true }); -} -async function handleSelectAll(command, browser) { - const page = browser.getPage(); - await page.locator(command.selector).selectText(); - return successResponse(command.id, { selected: true }); -} -async function handleInnerText(command, browser) { - const page = browser.getPage(); - const text = await page.locator(command.selector).innerText(); - return successResponse(command.id, { text }); -} -async function handleInnerHtml(command, browser) { - const page = browser.getPage(); - const html = await page.locator(command.selector).innerHTML(); - return successResponse(command.id, { html, origin: page.url() }); -} -async function handleInputValue(command, browser) { - const page = browser.getPage(); - const locator = browser.getLocator(command.selector); - const value = await locator.inputValue(); - return successResponse(command.id, { value, origin: page.url() }); -} -async function handleSetValue(command, browser) { - const page = browser.getPage(); - await page.locator(command.selector).fill(command.value); - return successResponse(command.id, { set: true }); -} -async function handleDispatch(command, browser) { - const page = browser.getPage(); - await page.locator(command.selector).dispatchEvent(command.event, command.eventInit); - return successResponse(command.id, { dispatched: command.event }); -} -async function handleEvalHandle(command, browser) { - const page = browser.getPage(); - const handle = await page.evaluateHandle(command.script); - const result = await handle.jsonValue().catch(() => 'Handle (non-serializable)'); - return successResponse(command.id, { result }); -} -async function handleExpose(command, browser) { - const page = browser.getPage(); - await page.exposeFunction(command.name, () => { - // Exposed function - can be extended - return `Function ${command.name} called`; - }); - return successResponse(command.id, { exposed: command.name }); -} -async function handleAddScript(command, browser) { - const page = browser.getPage(); - if (command.content) { - await page.addScriptTag({ content: command.content }); - } - else if (command.url) { - await page.addScriptTag({ url: command.url }); - } - return successResponse(command.id, { added: true }); -} -async function handleAddStyle(command, browser) { - const page = browser.getPage(); - if (command.content) { - await page.addStyleTag({ content: command.content }); - } - else if (command.url) { - await page.addStyleTag({ url: command.url }); - } - return successResponse(command.id, { added: true }); -} -async function handleEmulateMedia(command, browser) { - const page = browser.getPage(); - await page.emulateMedia({ - media: command.media, - colorScheme: command.colorScheme, - reducedMotion: command.reducedMotion, - forcedColors: command.forcedColors, - }); - if (command.colorScheme) { - browser.setColorScheme(command.colorScheme); - } - return successResponse(command.id, { emulated: true }); -} -async function handleOffline(command, browser) { - await browser.setOffline(command.offline); - return successResponse(command.id, { offline: command.offline }); -} -async function handleHeaders(command, browser) { - await browser.setExtraHeaders(command.headers); - return successResponse(command.id, { set: true }); -} -async function handlePause(command, browser) { - const page = browser.getPage(); - await page.pause(); - return successResponse(command.id, { paused: true }); -} -async function handleGetByAltText(command, browser) { - const page = browser.getPage(); - const locator = page.getByAltText(command.text, { exact: command.exact }); - switch (command.subaction) { - case 'click': - await locator.click(); - return successResponse(command.id, { clicked: true }); - case 'hover': - await locator.hover(); - return successResponse(command.id, { hovered: true }); - } -} -async function handleGetByTitle(command, browser) { - const page = browser.getPage(); - const locator = page.getByTitle(command.text, { exact: command.exact }); - switch (command.subaction) { - case 'click': - await locator.click(); - return successResponse(command.id, { clicked: true }); - case 'hover': - await locator.hover(); - return successResponse(command.id, { hovered: true }); - } -} -async function handleGetByTestId(command, browser) { - const page = browser.getPage(); - const locator = page.getByTestId(command.testId); - switch (command.subaction) { - case 'click': - await locator.click(); - return successResponse(command.id, { clicked: true }); - case 'fill': - await locator.fill(command.value ?? ''); - return successResponse(command.id, { filled: true }); - case 'check': - await locator.check(); - return successResponse(command.id, { checked: true }); - case 'hover': - await locator.hover(); - return successResponse(command.id, { hovered: true }); - } -} -async function handleNth(command, browser) { - const page = browser.getPage(); - const base = page.locator(command.selector); - const locator = command.index === -1 ? base.last() : base.nth(command.index); - switch (command.subaction) { - case 'click': - await locator.click(); - return successResponse(command.id, { clicked: true }); - case 'fill': - await locator.fill(command.value ?? ''); - return successResponse(command.id, { filled: true }); - case 'check': - await locator.check(); - return successResponse(command.id, { checked: true }); - case 'hover': - await locator.hover(); - return successResponse(command.id, { hovered: true }); - case 'text': - const text = await locator.textContent(); - return successResponse(command.id, { text }); - } -} -async function handleWaitForUrl(command, browser) { - const page = browser.getPage(); - await page.waitForURL(command.url, { timeout: command.timeout }); - return successResponse(command.id, { url: page.url() }); -} -async function handleWaitForLoadState(command, browser) { - const page = browser.getPage(); - await page.waitForLoadState(command.state, { timeout: command.timeout }); - return successResponse(command.id, { state: command.state }); -} -async function handleSetContent(command, browser) { - const page = browser.getPage(); - await page.setContent(command.html); - return successResponse(command.id, { set: true }); -} -async function handleTimezone(command, browser) { - // Timezone must be set at context level before navigation - // This is a limitation - it sets for the current context - const page = browser.getPage(); - await page.context().setGeolocation({ latitude: 0, longitude: 0 }); // Trigger context awareness - return successResponse(command.id, { - note: 'Timezone must be set at browser launch. Use --timezone flag.', - timezone: command.timezone, - }); -} -async function handleLocale(command, browser) { - // Locale must be set at context creation - return successResponse(command.id, { - note: 'Locale must be set at browser launch. Use --locale flag.', - locale: command.locale, - }); -} -async function handleCredentials(command, browser) { - const context = browser.getPage().context(); - await context.setHTTPCredentials({ - username: command.username, - password: command.password, - }); - return successResponse(command.id, { set: true }); -} -async function handleMouseMove(command, browser) { - const page = browser.getPage(); - await page.mouse.move(command.x, command.y); - return successResponse(command.id, { moved: true, x: command.x, y: command.y }); -} -async function handleMouseDown(command, browser) { - const page = browser.getPage(); - await page.mouse.down({ button: command.button ?? 'left' }); - return successResponse(command.id, { down: true }); -} -async function handleMouseUp(command, browser) { - const page = browser.getPage(); - await page.mouse.up({ button: command.button ?? 'left' }); - return successResponse(command.id, { up: true }); -} -async function handleBringToFront(command, browser) { - const page = browser.getPage(); - await page.bringToFront(); - return successResponse(command.id, { focused: true }); -} -async function handleWaitForFunction(command, browser) { - const page = browser.getPage(); - await page.waitForFunction(command.expression, { timeout: command.timeout }); - return successResponse(command.id, { waited: true }); -} -async function handleScrollIntoView(command, browser) { - await browser.getLocator(command.selector).scrollIntoViewIfNeeded(); - return successResponse(command.id, { scrolled: true }); -} -async function handleAddInitScript(command, browser) { - const context = browser.getPage().context(); - await context.addInitScript(command.script); - return successResponse(command.id, { added: true }); -} -async function handleKeyDown(command, browser) { - const page = browser.getPage(); - await page.keyboard.down(command.key); - return successResponse(command.id, { down: true, key: command.key }); -} -async function handleKeyUp(command, browser) { - const page = browser.getPage(); - await page.keyboard.up(command.key); - return successResponse(command.id, { up: true, key: command.key }); -} -async function handleInsertText(command, browser) { - const page = browser.getPage(); - await page.keyboard.insertText(command.text); - return successResponse(command.id, { inserted: true }); -} -async function handleMultiSelect(command, browser) { - const page = browser.getPage(); - const selected = await page.locator(command.selector).selectOption(command.values); - return successResponse(command.id, { selected }); -} -async function handleWaitForDownload(command, browser) { - const page = browser.getPage(); - const download = await page.waitForEvent('download', { timeout: command.timeout }); - let filePath; - if (command.path) { - filePath = command.path; - await download.saveAs(filePath); - } - else { - filePath = (await download.path()) || download.suggestedFilename(); - } - return successResponse(command.id, { - path: filePath, - filename: download.suggestedFilename(), - url: download.url(), - }); -} -async function handleResponseBody(command, browser) { - const page = browser.getPage(); - const response = await page.waitForResponse((resp) => resp.url().includes(command.url), { - timeout: command.timeout, - }); - const body = await response.text(); - let parsed = body; - try { - parsed = JSON.parse(body); - } - catch { - // Keep as string if not JSON - } - return successResponse(command.id, { - url: response.url(), - status: response.status(), - body: parsed, - }); -} -// Screencast and input injection handlers -async function handleScreencastStart(command, browser) { - if (!screencastFrameCallback) { - throw new Error('Screencast frame callback not set. Start the streaming server first.'); - } - await browser.startScreencast(screencastFrameCallback, { - format: command.format, - quality: command.quality, - maxWidth: command.maxWidth, - maxHeight: command.maxHeight, - everyNthFrame: command.everyNthFrame, - }); - return successResponse(command.id, { - started: true, - format: command.format ?? 'jpeg', - quality: command.quality ?? 80, - }); -} -async function handleScreencastStop(command, browser) { - await browser.stopScreencast(); - return successResponse(command.id, { stopped: true }); -} -async function handleInputMouse(command, browser) { - await browser.injectMouseEvent({ - type: command.type, - x: command.x, - y: command.y, - button: command.button, - clickCount: command.clickCount, - deltaX: command.deltaX, - deltaY: command.deltaY, - modifiers: command.modifiers, - }); - return successResponse(command.id, { injected: true }); -} -async function handleInputKeyboard(command, browser) { - await browser.injectKeyboardEvent({ - type: command.type, - key: command.key, - code: command.code, - text: command.text, - modifiers: command.modifiers, - }); - return successResponse(command.id, { injected: true }); -} -async function handleInputTouch(command, browser) { - await browser.injectTouchEvent({ - type: command.type, - touchPoints: command.touchPoints, - modifiers: command.modifiers, - }); - return successResponse(command.id, { injected: true }); -} -// Recording handlers (Playwright native video recording) -async function handleRecordingStart(command, browser) { - await browser.startRecording(command.path, command.url); - return successResponse(command.id, { - started: true, - path: command.path, - }); -} -async function handleRecordingStop(command, browser) { - const result = await browser.stopRecording(); - return successResponse(command.id, result); -} -async function handleRecordingRestart(command, browser) { - const result = await browser.restartRecording(command.path, command.url); - return successResponse(command.id, { - started: true, - path: command.path, - previousPath: result.previousPath, - stopped: result.stopped, - }); -} -// Diff handlers -async function handleDiffSnapshot(command, browser) { - let before; - if (command.baseline) { - try { - before = fs.readFileSync(command.baseline, 'utf-8'); - } - catch { - return errorResponse(command.id, `Cannot read baseline file: ${command.baseline}`); - } - } - else { - before = browser.getLastSnapshot(); - if (!before) { - return errorResponse(command.id, 'No previous snapshot in this session. Take a snapshot first, or use --baseline .'); - } - } - const page = browser.getPage(); - const { tree } = await getEnhancedSnapshot(page, { - selector: command.selector, - compact: command.compact, - maxDepth: command.maxDepth, - }); - const after = tree || 'Empty page'; - const result = diffSnapshots(before, after); - browser.setLastSnapshot(after); - return successResponse(command.id, result); -} -async function handleDiffScreenshot(command, browser) { - if (!fs.existsSync(command.baseline)) { - return errorResponse(command.id, `Baseline file not found: ${command.baseline}`); - } - const page = browser.getPage(); - let screenshotBuffer; - if (command.selector) { - const locator = browser.getLocatorFromRef(command.selector) || page.locator(command.selector); - screenshotBuffer = await locator.screenshot({ type: 'png' }); - } - else { - screenshotBuffer = await page.screenshot({ fullPage: command.fullPage, type: 'png' }); - } - const baselineBuffer = fs.readFileSync(command.baseline); - const ext = path.extname(command.baseline).toLowerCase(); - const baselineMime = ext === '.jpg' || ext === '.jpeg' ? 'image/jpeg' : 'image/png'; - const result = await diffScreenshots(page.context(), baselineBuffer, screenshotBuffer, { - threshold: command.threshold, - outputPath: command.output, - baselineMime, - }); - return successResponse(command.id, result); -} -async function handleDiffUrl(command, browser) { - const page = browser.getPage(); - const waitUntil = command.waitUntil ?? 'load'; - const snapshotOpts = { - selector: command.selector, - compact: command.compact, - maxDepth: command.maxDepth, - }; - // Capture state of url1 - await page.goto(command.url1, { waitUntil }); - const { tree: tree1 } = await getEnhancedSnapshot(page, snapshotOpts); - const snapshot1 = tree1 || 'Empty page'; - let screenshot1; - if (command.screenshot) { - screenshot1 = await page.screenshot({ fullPage: command.fullPage, type: 'png' }); - } - // Capture state of url2 - await page.goto(command.url2, { waitUntil }); - const { tree: tree2 } = await getEnhancedSnapshot(page, snapshotOpts); - const snapshot2 = tree2 || 'Empty page'; - const snapshotDiff = diffSnapshots(snapshot1, snapshot2); - const result = { snapshot: snapshotDiff }; - if (command.screenshot && screenshot1) { - const screenshot2 = await page.screenshot({ fullPage: command.fullPage, type: 'png' }); - result.screenshot = await diffScreenshots(page.context(), screenshot1, screenshot2, {}); - } - return successResponse(command.id, result); -} -async function handleAuthLogin(command, browser) { - const profile = getAuthProfile(command.name); - if (!profile) { - return errorResponse(command.id, `Auth profile '${command.name}' not found`); - } - browser.checkDomainAllowed(profile.url); - const page = browser.getPage(); - await page.goto(profile.url, { waitUntil: 'load' }); - const usingAutoDetect = !profile.usernameSelector && !profile.passwordSelector && !profile.submitSelector; - if (usingAutoDetect) { - console.error(`[agent-browser] Auth login '${command.name}': using auto-detected form selectors. ` + - `If login fails, specify --username-selector/--password-selector/--submit-selector with auth save.`); - } - const passSel = profile.passwordSelector || 'input[type="password"]:visible'; - // Auto-detect selectors ordered from most specific to broadest. - // Locale-dependent text matchers (e.g. "Sign in") are intentionally - // excluded -- they break on non-English pages. - const AUTO_USER_SELECTORS = [ - 'input[autocomplete="username"]:visible', - 'input[type="email"]:visible', - 'input[name="username"]:visible', - 'input[name="email"]:visible', - ]; - const AUTO_SUBMIT_SELECTORS = ['button[type="submit"]:visible', 'input[type="submit"]:visible']; - try { - // Resolve username field: custom selector or sequential auto-detect - let userLocator; - if (profile.usernameSelector) { - userLocator = page.locator(profile.usernameSelector).first(); - } - else { - userLocator = null; - for (const sel of AUTO_USER_SELECTORS) { - const loc = page.locator(sel).first(); - if (await loc.isVisible({ timeout: 1000 }).catch(() => false)) { - userLocator = loc; - break; - } - } - if (!userLocator) { - return errorResponse(command.id, `Auth login failed for '${command.name}': could not find username field. ` + - `Specify --username-selector with auth save.`); - } - } - // Resolve submit button: custom selector or sequential auto-detect - let submitLocator; - if (profile.submitSelector) { - submitLocator = page.locator(profile.submitSelector).first(); - } - else { - submitLocator = null; - for (const sel of AUTO_SUBMIT_SELECTORS) { - const loc = page.locator(sel).first(); - if (await loc.isVisible({ timeout: 1000 }).catch(() => false)) { - submitLocator = loc; - break; - } - } - if (!submitLocator) { - return errorResponse(command.id, `Auth login failed for '${command.name}': could not find submit button. ` + - `Specify --submit-selector with auth save.`); - } - } - await userLocator.fill(profile.username); - await page.locator(passSel).first().fill(profile.password); - await submitLocator.click(); - await page.waitForLoadState('load'); - } - catch (err) { - return errorResponse(command.id, `Auth login failed for '${command.name}': ${err instanceof Error ? err.message : err}. ` + - `Try specifying custom selectors with auth save --username-selector/--password-selector/--submit-selector`); - } - updateLastLogin(command.name); - return successResponse(command.id, { - loggedIn: true, - name: command.name, - url: page.url(), - title: await page.title(), - }); -} -async function handleConfirm(command, browser) { - const entry = getAndRemovePending(command.confirmationId); - if (!entry) { - return errorResponse(command.id, `No pending confirmation with id '${command.confirmationId}'`); - } - // Re-validate the stored command through the schema to guard against - // shape drift between when the confirmation was issued and now. - const parseResult = parseCommand(JSON.stringify(entry.command)); - if (!parseResult.success) { - return errorResponse(command.id, `Stored command is no longer valid: ${parseResult.error}`); - } - const originalCommand = parseResult.command; - // Re-check deny list in case policy was updated since the confirmation was issued - actionPolicy = reloadPolicyIfChanged(); - const decision = checkPolicy(originalCommand.action, actionPolicy, new Set()); - if (decision === 'deny') { - const category = getActionCategory(originalCommand.action); - return errorResponse(command.id, `Action denied by policy: '${category}' is not allowed`); - } - return await dispatchAction(originalCommand, browser); -} -function handleDeny(command) { - const entry = getAndRemovePending(command.confirmationId); - if (!entry) { - return errorResponse(command.id, `No pending confirmation with id '${command.confirmationId}'`); - } - return successResponse(command.id, { denied: true }); -} -//# sourceMappingURL=actions.js.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/actions.js.map b/vendor/agent-browser/dist/actions.js.map deleted file mode 100644 index 96e06d0..0000000 --- a/vendor/agent-browser/dist/actions.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/auth-cli.d.ts b/vendor/agent-browser/dist/auth-cli.d.ts deleted file mode 100644 index c0e4383..0000000 --- a/vendor/agent-browser/dist/auth-cli.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {}; -//# sourceMappingURL=auth-cli.d.ts.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/auth-cli.d.ts.map b/vendor/agent-browser/dist/auth-cli.d.ts.map deleted file mode 100644 index 3cb7f60..0000000 --- a/vendor/agent-browser/dist/auth-cli.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"auth-cli.d.ts","sourceRoot":"","sources":["../src/auth-cli.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/vendor/agent-browser/dist/auth-cli.js b/vendor/agent-browser/dist/auth-cli.js deleted file mode 100644 index 2204264..0000000 --- a/vendor/agent-browser/dist/auth-cli.js +++ /dev/null @@ -1,97 +0,0 @@ -/** - * Standalone CLI entry point for auth vault operations that don't need a browser. - * Invoked directly by the Rust CLI to avoid sending passwords through the daemon channel. - * - * Usage: node auth-cli.js - * Prints a JSON response to stdout and exits. - */ -import { saveAuthProfile, getAuthProfileMeta, listAuthProfiles, deleteAuthProfile, } from './auth-vault.js'; -function success(id, data) { - return JSON.stringify({ success: true, id, data }); -} -function error(id, message) { - return JSON.stringify({ success: false, id, error: message }); -} -function run() { - const input = process.argv[2]; - if (!input) { - process.stderr.write('Usage: node auth-cli.js \n'); - process.exit(1); - } - let cmd; - try { - cmd = JSON.parse(input); - } - catch { - console.log(error('', 'Invalid JSON input')); - process.exit(1); - return; - } - const id = cmd.id || ''; - try { - switch (cmd.action) { - case 'auth_save': { - if (!cmd.name || !cmd.url || !cmd.username || !cmd.password) { - console.log(error(id, 'Missing required fields: name, url, username, password')); - return; - } - const meta = saveAuthProfile({ - name: cmd.name, - url: cmd.url, - username: cmd.username, - password: cmd.password, - usernameSelector: cmd.usernameSelector, - passwordSelector: cmd.passwordSelector, - submitSelector: cmd.submitSelector, - }); - console.log(success(id, { - saved: !meta.updated, - updated: meta.updated, - name: meta.name, - url: meta.url, - username: meta.username, - })); - return; - } - case 'auth_list': { - const profiles = listAuthProfiles(); - console.log(success(id, { profiles })); - return; - } - case 'auth_show': { - if (!cmd.name) { - console.log(error(id, 'Missing required field: name')); - return; - } - const meta = getAuthProfileMeta(cmd.name); - if (!meta) { - console.log(error(id, `Auth profile '${cmd.name}' not found`)); - return; - } - console.log(success(id, { profile: meta })); - return; - } - case 'auth_delete': { - if (!cmd.name) { - console.log(error(id, 'Missing required field: name')); - return; - } - const deleted = deleteAuthProfile(cmd.name); - if (!deleted) { - console.log(error(id, `Auth profile '${cmd.name}' not found`)); - return; - } - console.log(success(id, { deleted: true, name: cmd.name })); - return; - } - default: - console.log(error(id, `Unknown auth action: ${cmd.action}`)); - } - } - catch (err) { - const msg = err instanceof Error ? err.message : 'Operation failed'; - console.log(error(id, msg)); - } -} -run(); -//# sourceMappingURL=auth-cli.js.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/auth-cli.js.map b/vendor/agent-browser/dist/auth-cli.js.map deleted file mode 100644 index 69acf39..0000000 --- a/vendor/agent-browser/dist/auth-cli.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"auth-cli.js","sourceRoot":"","sources":["../src/auth-cli.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/auth-vault.d.ts b/vendor/agent-browser/dist/auth-vault.d.ts deleted file mode 100644 index 54df51e..0000000 --- a/vendor/agent-browser/dist/auth-vault.d.ts +++ /dev/null @@ -1,36 +0,0 @@ -interface AuthProfile { - name: string; - url: string; - username: string; - password: string; - usernameSelector?: string; - passwordSelector?: string; - submitSelector?: string; - createdAt: string; - lastLoginAt?: string; -} -export interface AuthProfileMeta { - name: string; - url: string; - username: string; - createdAt: string; - lastLoginAt?: string; -} -export declare function saveAuthProfile(opts: { - name: string; - url: string; - username: string; - password: string; - usernameSelector?: string; - passwordSelector?: string; - submitSelector?: string; -}): AuthProfileMeta & { - updated: boolean; -}; -export declare function getAuthProfile(name: string): AuthProfile | null; -export declare function getAuthProfileMeta(name: string): AuthProfileMeta | null; -export declare function listAuthProfiles(): AuthProfileMeta[]; -export declare function deleteAuthProfile(name: string): boolean; -export declare function updateLastLogin(name: string): void; -export {}; -//# sourceMappingURL=auth-vault.d.ts.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/auth-vault.d.ts.map b/vendor/agent-browser/dist/auth-vault.d.ts.map deleted file mode 100644 index 62779ca..0000000 --- a/vendor/agent-browser/dist/auth-vault.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"auth-vault.d.ts","sourceRoot":"","sources":["../src/auth-vault.ts"],"names":[],"mappings":"AAwBA,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA2DD,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,eAAe,GAAG;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAyBzC;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAE/D;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAUvE;AAED,wBAAgB,gBAAgB,IAAI,eAAe,EAAE,CAqBpD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKvD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAMlD"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/auth-vault.js b/vendor/agent-browser/dist/auth-vault.js deleted file mode 100644 index da9a6e4..0000000 --- a/vendor/agent-browser/dist/auth-vault.js +++ /dev/null @@ -1,125 +0,0 @@ -import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, unlinkSync, } from 'node:fs'; -import path from 'node:path'; -import os from 'node:os'; -import { getEncryptionKey, ensureEncryptionKey, encryptData, decryptData, isEncryptedPayload, getKeyFilePath, restrictFilePermissions, restrictDirPermissions, } from './encryption.js'; -const AUTH_DIR = 'auth'; -function getAuthDir() { - const dir = path.join(os.homedir(), '.agent-browser', AUTH_DIR); - if (!existsSync(dir)) { - mkdirSync(dir, { recursive: true, mode: 0o700 }); - restrictDirPermissions(dir); - } - return dir; -} -const SAFE_NAME_RE = /^[a-zA-Z0-9_-]+$/; -function validateProfileName(name) { - if (!SAFE_NAME_RE.test(name)) { - throw new Error(`Invalid auth profile name '${name}': only alphanumeric characters, hyphens, and underscores are allowed`); - } -} -function profilePath(name) { - validateProfileName(name); - return path.join(getAuthDir(), `${name}.json`); -} -function readProfile(name) { - const p = profilePath(name); - if (!existsSync(p)) - return null; - const raw = readFileSync(p, 'utf-8'); - const parsed = JSON.parse(raw); - if (isEncryptedPayload(parsed)) { - const key = getEncryptionKey(); - if (!key) { - throw new Error(`Encryption key required to read encrypted auth profiles. ` + - `Set AGENT_BROWSER_ENCRYPTION_KEY or ensure ${getKeyFilePath()} exists.`); - } - const decrypted = decryptData(parsed, key); - return JSON.parse(decrypted); - } - return parsed; -} -function writeProfile(profile) { - const key = ensureEncryptionKey(); - const serialized = JSON.stringify(profile, null, 2); - const encrypted = encryptData(serialized, key); - const filePath = profilePath(profile.name); - writeFileSync(filePath, JSON.stringify(encrypted, null, 2), { - mode: 0o600, - }); - restrictFilePermissions(filePath); -} -export function saveAuthProfile(opts) { - const existing = readProfile(opts.name); - const profile = { - name: opts.name, - url: opts.url, - username: opts.username, - password: opts.password, - usernameSelector: opts.usernameSelector, - passwordSelector: opts.passwordSelector, - submitSelector: opts.submitSelector, - createdAt: existing?.createdAt ?? new Date().toISOString(), - lastLoginAt: existing?.lastLoginAt, - }; - writeProfile(profile); - return { - name: profile.name, - url: profile.url, - username: profile.username, - createdAt: profile.createdAt, - lastLoginAt: profile.lastLoginAt, - updated: existing !== null, - }; -} -export function getAuthProfile(name) { - return readProfile(name); -} -export function getAuthProfileMeta(name) { - const profile = readProfile(name); - if (!profile) - return null; - return { - name: profile.name, - url: profile.url, - username: profile.username, - createdAt: profile.createdAt, - lastLoginAt: profile.lastLoginAt, - }; -} -export function listAuthProfiles() { - const dir = getAuthDir(); - const files = readdirSync(dir).filter((f) => f.endsWith('.json')); - const profiles = []; - for (const file of files) { - const name = file.replace(/\.json$/, ''); - try { - const meta = getAuthProfileMeta(name); - if (meta) - profiles.push(meta); - } - catch { - profiles.push({ - name, - url: '(encrypted)', - username: '(encrypted)', - createdAt: '(unknown)', - }); - } - } - return profiles; -} -export function deleteAuthProfile(name) { - const p = profilePath(name); - if (!existsSync(p)) - return false; - unlinkSync(p); - return true; -} -export function updateLastLogin(name) { - const profile = readProfile(name); - if (profile) { - profile.lastLoginAt = new Date().toISOString(); - writeProfile(profile); - } -} -//# sourceMappingURL=auth-vault.js.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/auth-vault.js.map b/vendor/agent-browser/dist/auth-vault.js.map deleted file mode 100644 index 480c4ab..0000000 --- a/vendor/agent-browser/dist/auth-vault.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"auth-vault.js","sourceRoot":"","sources":["../src/auth-vault.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/browser.d.ts b/vendor/agent-browser/dist/browser.d.ts deleted file mode 100644 index 0a12c4f..0000000 --- a/vendor/agent-browser/dist/browser.d.ts +++ /dev/null @@ -1,583 +0,0 @@ -import { devices, type Browser, type BrowserContext, type Page, type Frame, type Locator, type CDPSession } from 'playwright-core'; -import type { LaunchCommand } from './types.js'; -import { type RefMap, type EnhancedSnapshot } from './snapshot.js'; -/** - * Returns the default Playwright timeout in milliseconds for standard operations. - * Can be overridden via the AGENT_BROWSER_DEFAULT_TIMEOUT environment variable. - * Default is 25s, which is below the CLI's 30s IPC read timeout to ensure - * Playwright errors are returned before the CLI gives up with EAGAIN. - * CDP and recording contexts use a shorter fixed timeout (10s) and are not affected. - */ -export declare function getDefaultTimeout(): number; -export interface ScreencastFrame { - data: string; - metadata: { - offsetTop: number; - pageScaleFactor: number; - deviceWidth: number; - deviceHeight: number; - scrollOffsetX: number; - scrollOffsetY: number; - timestamp?: number; - }; - sessionId: number; -} -export interface ScreencastOptions { - format?: 'jpeg' | 'png'; - quality?: number; - maxWidth?: number; - maxHeight?: number; - everyNthFrame?: number; -} -interface TrackedRequest { - url: string; - method: string; - headers: Record; - timestamp: number; - resourceType: string; -} -interface ConsoleMessage { - type: string; - text: string; - timestamp: number; -} -interface PageError { - message: string; - timestamp: number; -} -/** - * Manages the Playwright browser lifecycle with multiple tabs/windows - */ -export declare class BrowserManager { - private browser; - private cdpEndpoint; - private isPersistentContext; - private browserbaseSessionId; - private browserbaseApiKey; - private browserUseSessionId; - private browserUseApiKey; - private kernelSessionId; - private kernelApiKey; - private contexts; - private pages; - private activePageIndex; - private activeFrame; - private dialogHandler; - private trackedRequests; - private routes; - private consoleMessages; - private pageErrors; - private isRecordingHar; - private refMap; - private lastSnapshot; - private scopedHeaderRoutes; - private colorScheme; - private downloadPath; - private allowedDomains; - /** - * Set the persistent color scheme preference. - * Applied automatically to all new pages and contexts. - */ - setColorScheme(scheme: 'light' | 'dark' | 'no-preference' | null): void; - private cdpSession; - private screencastActive; - private screencastSessionId; - private frameCallback; - private screencastFrameHandler; - private recordingContext; - private recordingPage; - private recordingOutputPath; - private recordingTempDir; - private launchWarnings; - /** - * Get and clear launch warnings (e.g., decryption failures) - */ - getAndClearWarnings(): string[]; - private static readonly MAX_PROFILE_EVENTS; - private profilingActive; - private profileChunks; - private profileEventsDropped; - private profileCompleteResolver; - private profileDataHandler; - private profileCompleteHandler; - /** - * Check if browser is launched - */ - isLaunched(): boolean; - /** - * Get enhanced snapshot with refs and cache the ref map - */ - getSnapshot(options?: { - interactive?: boolean; - cursor?: boolean; - maxDepth?: number; - compact?: boolean; - selector?: string; - }): Promise; - /** - * Get the last snapshot tree text (empty string if no snapshot has been taken) - */ - getLastSnapshot(): string; - /** - * Update the stored snapshot (used by diff to keep the baseline current) - */ - setLastSnapshot(snapshot: string): void; - /** - * Get the cached ref map from last snapshot - */ - getRefMap(): RefMap; - /** - * Get a locator from a ref (e.g., "e1", "@e1", "ref=e1") - * Returns null if ref doesn't exist or is invalid - */ - getLocatorFromRef(refArg: string): Locator | null; - /** - * Check if a selector looks like a ref - */ - isRef(selector: string): boolean; - /** - * Install the domain filter on a context if an allowlist is configured. - * Should be called before any pages navigate on the context. - */ - private ensureDomainFilter; - /** - * After installing the domain filter, verify existing pages are on allowed - * domains. Pages that pre-date the filter (e.g. CDP/cloud connect) may have - * already navigated to disallowed domains. Navigate them to about:blank. - */ - private sanitizeExistingPages; - /** - * Check if a URL is allowed by the domain allowlist. - * Throws if the URL's domain is blocked. No-op if no allowlist is set. - * Blocks non-http(s) schemes and unparseable URLs by default. - */ - checkDomainAllowed(url: string): void; - /** - * Get locator - supports both refs and regular selectors - */ - getLocator(selectorOrRef: string): Locator; - /** - * Check if the browser has any usable pages - */ - hasPages(): boolean; - /** - * Ensure at least one page exists. If the browser is launched but all pages - * were closed (stale session), creates a new page on the existing context. - * No-op if pages already exist. - */ - ensurePage(): Promise; - /** - * Get the current active page, throws if not launched - */ - getPage(): Page; - /** - * Get the current frame (or page's main frame if no frame is selected) - */ - getFrame(): Frame; - /** - * Switch to a frame by selector, name, or URL - */ - switchToFrame(options: { - selector?: string; - name?: string; - url?: string; - }): Promise; - /** - * Switch back to main frame - */ - switchToMainFrame(): void; - /** - * Set up dialog handler - */ - setDialogHandler(response: 'accept' | 'dismiss', promptText?: string): void; - /** - * Clear dialog handler - */ - clearDialogHandler(): void; - /** - * Start tracking requests - */ - startRequestTracking(): void; - /** - * Get tracked requests - */ - getRequests(filter?: string): TrackedRequest[]; - /** - * Clear tracked requests - */ - clearRequests(): void; - /** - * Add a route to intercept requests - */ - addRoute(url: string, options: { - response?: { - status?: number; - body?: string; - contentType?: string; - headers?: Record; - }; - abort?: boolean; - }): Promise; - /** - * Remove a route - */ - removeRoute(url?: string): Promise; - /** - * Set geolocation - */ - setGeolocation(latitude: number, longitude: number, accuracy?: number): Promise; - /** - * Set permissions - */ - setPermissions(permissions: string[], grant: boolean): Promise; - /** - * Set viewport - */ - setViewport(width: number, height: number): Promise; - /** - * Set device scale factor (devicePixelRatio) via CDP - * This sets window.devicePixelRatio which affects how the page renders and responds to media queries - * - * Note: When using CDP to set deviceScaleFactor, screenshots will be at logical pixel dimensions - * (viewport size), not physical pixel dimensions (viewport × scale). This is a Playwright limitation - * when using CDP emulation on existing contexts. For true HiDPI screenshots with physical pixels, - * deviceScaleFactor must be set at context creation time. - * - * Must be called after setViewport to work correctly - */ - setDeviceScaleFactor(deviceScaleFactor: number, width: number, height: number, mobile?: boolean): Promise; - /** - * Clear device metrics override to restore default devicePixelRatio - */ - clearDeviceMetricsOverride(): Promise; - /** - * Get device descriptor - */ - getDevice(deviceName: string): (typeof devices)[keyof typeof devices] | undefined; - /** - * List available devices - */ - listDevices(): string[]; - /** - * Start console message tracking - */ - startConsoleTracking(): void; - /** - * Get console messages - */ - getConsoleMessages(): ConsoleMessage[]; - /** - * Clear console messages - */ - clearConsoleMessages(): void; - /** - * Start error tracking - */ - startErrorTracking(): void; - /** - * Get page errors - */ - getPageErrors(): PageError[]; - /** - * Clear page errors - */ - clearPageErrors(): void; - /** - * Start HAR recording - */ - startHarRecording(): Promise; - /** - * Check if HAR recording - */ - isHarRecording(): boolean; - /** - * Set offline mode - */ - setOffline(offline: boolean): Promise; - /** - * Set extra HTTP headers (global - all requests) - */ - setExtraHeaders(headers: Record): Promise; - /** - * Set scoped HTTP headers (only for requests matching the origin) - * Uses route interception to add headers only to matching requests - */ - setScopedHeaders(origin: string, headers: Record): Promise; - /** - * Clear scoped headers for an origin (or all if no origin specified) - */ - clearScopedHeaders(origin?: string): Promise; - /** - * Start tracing - */ - startTracing(options: { - screenshots?: boolean; - snapshots?: boolean; - }): Promise; - /** - * Stop tracing and save - */ - stopTracing(path?: string): Promise; - /** - * Get the current browser context (first context) - */ - getContext(): BrowserContext | null; - /** - * Save storage state (cookies, localStorage, etc.) - */ - saveStorageState(path: string): Promise; - /** - * Get all pages - */ - getPages(): Page[]; - /** - * Get current page index - */ - getActiveIndex(): number; - /** - * Get the current browser instance - */ - getBrowser(): Browser | null; - /** - * Check if an existing CDP connection is still alive - * by verifying we can access browser contexts and that at least one has pages - */ - private isCdpConnectionAlive; - /** - * Check if CDP connection needs to be re-established - */ - private needsCdpReconnect; - /** - * Close a Browserbase session via API - */ - private closeBrowserbaseSession; - /** - * Close a Browser Use session via API - */ - private closeBrowserUseSession; - /** - * Close a Kernel session via API - */ - private closeKernelSession; - /** - * Connect to Browserbase remote browser via CDP. - * Requires BROWSERBASE_API_KEY and BROWSERBASE_PROJECT_ID environment variables. - */ - private connectToBrowserbase; - /** - * Find or create a Kernel profile by name. - * Returns the profile object if successful. - */ - private findOrCreateKernelProfile; - /** - * Connect to Kernel remote browser via CDP. - * Requires KERNEL_API_KEY environment variable. - */ - private connectToKernel; - /** - * Connect to Browser Use remote browser via CDP. - * Requires BROWSER_USE_API_KEY environment variable. - */ - private connectToBrowserUse; - /** - * Launch the browser with the specified options - * If already launched, this is a no-op (browser stays open) - */ - launch(options: LaunchCommand): Promise; - /** - * Connect to a running browser via CDP (Chrome DevTools Protocol) - * @param cdpEndpoint Either a port number (as string) or a full WebSocket URL (ws:// or wss://) - */ - private connectViaCDP; - /** - * Get Chrome's default user data directory paths for the current platform. - * Returns an array of candidate paths to check (stable, then beta/canary). - */ - private getChromeUserDataDirs; - /** - * Try to read the DevToolsActivePort file from a Chrome user data directory. - * Returns { port, wsPath } if found, or null if not available. - */ - private readDevToolsActivePort; - /** - * Try to discover a Chrome CDP endpoint by querying an HTTP debug port. - * Returns the WebSocket debugger URL if available. - */ - private probeDebugPort; - /** - * Auto-discover and connect to a running Chrome/Chromium instance. - * - * Discovery strategy: - * 1. Read DevToolsActivePort from Chrome's default user data directories - * 2. If found, connect using the port and WebSocket path from that file - * 3. If not found, probe common debugging ports (9222, 9229) - * 4. If a port responds, connect via CDP - */ - private autoConnectViaCDP; - /** - * Set up console, error, and close tracking for a page - */ - private setupPageTracking; - /** - * Set up tracking for new pages in a context (for CDP connections and popups/new tabs) - * This handles pages created externally (e.g., via target="_blank" links, window.open) - */ - private setupContextTracking; - /** - * Create a new tab in the current context - */ - newTab(): Promise<{ - index: number; - total: number; - }>; - /** - * Create a new window (new context) - */ - newWindow(viewport?: { - width: number; - height: number; - } | null): Promise<{ - index: number; - total: number; - }>; - /** - * Invalidate the current CDP session (must be called before switching pages) - * This ensures screencast and input injection work correctly after tab switch - */ - private invalidateCDPSession; - /** - * Switch to a specific tab/page by index - */ - switchTo(index: number): Promise<{ - index: number; - url: string; - title: string; - }>; - /** - * Close a specific tab/page - */ - closeTab(index?: number): Promise<{ - closed: number; - remaining: number; - }>; - /** - * List all tabs with their info - */ - listTabs(): Promise>; - /** - * Get or create a CDP session for the current page - * Only works with Chromium-based browsers - */ - getCDPSession(): Promise; - /** - * Check if screencast is currently active - */ - isScreencasting(): boolean; - /** - * Start screencast - streams viewport frames via CDP - * @param callback Function called for each frame - * @param options Screencast options - */ - startScreencast(callback: (frame: ScreencastFrame) => void, options?: ScreencastOptions): Promise; - /** - * Stop screencast - */ - stopScreencast(): Promise; - /** - * Check if profiling is currently active - */ - isProfilingActive(): boolean; - /** - * Start CDP profiling (Tracing) - */ - startProfiling(options?: { - categories?: string[]; - }): Promise; - /** - * Stop CDP profiling and save to file - */ - stopProfiling(outputPath: string): Promise<{ - path: string; - eventCount: number; - }>; - /** - * Inject a mouse event via CDP - */ - injectMouseEvent(params: { - type: 'mousePressed' | 'mouseReleased' | 'mouseMoved' | 'mouseWheel'; - x: number; - y: number; - button?: 'left' | 'right' | 'middle' | 'none'; - clickCount?: number; - deltaX?: number; - deltaY?: number; - modifiers?: number; - }): Promise; - /** - * Inject a keyboard event via CDP - */ - injectKeyboardEvent(params: { - type: 'keyDown' | 'keyUp' | 'char'; - key?: string; - code?: string; - text?: string; - modifiers?: number; - }): Promise; - /** - * Inject touch event via CDP (for mobile emulation) - */ - injectTouchEvent(params: { - type: 'touchStart' | 'touchEnd' | 'touchMove' | 'touchCancel'; - touchPoints: Array<{ - x: number; - y: number; - id?: number; - }>; - modifiers?: number; - }): Promise; - /** - * Check if video recording is currently active - */ - isRecording(): boolean; - /** - * Start recording to a video file using Playwright's native video recording. - * Creates a fresh browser context with video recording enabled. - * Automatically captures current URL and transfers cookies/storage if no URL provided. - * - * @param outputPath - Path to the output video file (will be .webm) - * @param url - Optional URL to navigate to (defaults to current page URL) - */ - startRecording(outputPath: string, url?: string): Promise; - /** - * Stop recording and save the video file - * @returns Recording result with path - */ - stopRecording(): Promise<{ - path: string; - frames: number; - error?: string; - }>; - /** - * Restart recording - stops current recording (if any) and starts a new one. - * Convenience method that combines stopRecording and startRecording. - * - * @param outputPath - Path to the output video file (must be .webm) - * @param url - Optional URL to navigate to (defaults to current page URL) - * @returns Result from stopping the previous recording (if any) - */ - restartRecording(outputPath: string, url?: string): Promise<{ - previousPath?: string; - stopped: boolean; - }>; - /** - * Close the browser and clean up - */ - close(): Promise; -} -export {}; -//# sourceMappingURL=browser.d.ts.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/browser.d.ts.map b/vendor/agent-browser/dist/browser.d.ts.map deleted file mode 100644 index 6d50913..0000000 --- a/vendor/agent-browser/dist/browser.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/browser.js b/vendor/agent-browser/dist/browser.js deleted file mode 100644 index 0c41376..0000000 --- a/vendor/agent-browser/dist/browser.js +++ /dev/null @@ -1,2135 +0,0 @@ -import { chromium, firefox, webkit, devices, } from 'playwright-core'; -import path from 'node:path'; -import os from 'node:os'; -import { existsSync, mkdirSync, rmSync, readFileSync, statSync } from 'node:fs'; -import { writeFile, mkdir } from 'node:fs/promises'; -import { getEnhancedSnapshot, parseRef } from './snapshot.js'; -import { safeHeaderMerge } from './state-utils.js'; -import { isDomainAllowed, installDomainFilter, parseDomainList } from './domain-filter.js'; -import { getEncryptionKey, isEncryptedPayload, decryptData, ENCRYPTION_KEY_ENV, } from './state-utils.js'; -/** - * Returns the default Playwright timeout in milliseconds for standard operations. - * Can be overridden via the AGENT_BROWSER_DEFAULT_TIMEOUT environment variable. - * Default is 25s, which is below the CLI's 30s IPC read timeout to ensure - * Playwright errors are returned before the CLI gives up with EAGAIN. - * CDP and recording contexts use a shorter fixed timeout (10s) and are not affected. - */ -export function getDefaultTimeout() { - const envValue = process.env.AGENT_BROWSER_DEFAULT_TIMEOUT; - if (envValue) { - const parsed = parseInt(envValue, 10); - if (!isNaN(parsed) && parsed >= 1000) { - return parsed; - } - } - return 25000; -} -/** - * Manages the Playwright browser lifecycle with multiple tabs/windows - */ -export class BrowserManager { - browser = null; - cdpEndpoint = null; // stores port number or full URL - isPersistentContext = false; - browserbaseSessionId = null; - browserbaseApiKey = null; - browserUseSessionId = null; - browserUseApiKey = null; - kernelSessionId = null; - kernelApiKey = null; - contexts = []; - pages = []; - activePageIndex = 0; - activeFrame = null; - dialogHandler = null; - trackedRequests = []; - routes = new Map(); - consoleMessages = []; - pageErrors = []; - isRecordingHar = false; - refMap = {}; - lastSnapshot = ''; - scopedHeaderRoutes = new Map(); - colorScheme = null; - downloadPath = null; - allowedDomains = []; - /** - * Set the persistent color scheme preference. - * Applied automatically to all new pages and contexts. - */ - setColorScheme(scheme) { - this.colorScheme = scheme; - } - // CDP session for screencast and input injection - cdpSession = null; - screencastActive = false; - screencastSessionId = 0; - frameCallback = null; - screencastFrameHandler = null; - // Video recording (Playwright native) - recordingContext = null; - recordingPage = null; - recordingOutputPath = ''; - recordingTempDir = ''; - launchWarnings = []; - /** - * Get and clear launch warnings (e.g., decryption failures) - */ - getAndClearWarnings() { - const warnings = this.launchWarnings; - this.launchWarnings = []; - return warnings; - } - // CDP profiling state - static MAX_PROFILE_EVENTS = 5_000_000; - profilingActive = false; - profileChunks = []; - profileEventsDropped = false; - profileCompleteResolver = null; - profileDataHandler = null; - profileCompleteHandler = null; - /** - * Check if browser is launched - */ - isLaunched() { - return this.browser !== null || this.isPersistentContext; - } - /** - * Get enhanced snapshot with refs and cache the ref map - */ - async getSnapshot(options) { - const page = this.getPage(); - const snapshot = await getEnhancedSnapshot(page, options); - this.refMap = snapshot.refs; - this.lastSnapshot = snapshot.tree; - return snapshot; - } - /** - * Get the last snapshot tree text (empty string if no snapshot has been taken) - */ - getLastSnapshot() { - return this.lastSnapshot; - } - /** - * Update the stored snapshot (used by diff to keep the baseline current) - */ - setLastSnapshot(snapshot) { - this.lastSnapshot = snapshot; - } - /** - * Get the cached ref map from last snapshot - */ - getRefMap() { - return this.refMap; - } - /** - * Get a locator from a ref (e.g., "e1", "@e1", "ref=e1") - * Returns null if ref doesn't exist or is invalid - */ - getLocatorFromRef(refArg) { - const ref = parseRef(refArg); - if (!ref) - return null; - const refData = this.refMap[ref]; - if (!refData) - return null; - const page = this.getPage(); - // Check if this is a cursor-interactive element (uses CSS selector, not ARIA role) - // These have pseudo-roles 'clickable' or 'focusable' and a CSS selector - if (refData.role === 'clickable' || refData.role === 'focusable') { - // The selector is a CSS selector, use it directly - return page.locator(refData.selector); - } - // Build locator with exact: true to avoid substring matches - let locator = page.getByRole(refData.role, { - name: refData.name, - exact: true, - }); - // If an nth index is stored (for disambiguation), use it - if (refData.nth !== undefined) { - locator = locator.nth(refData.nth); - } - return locator; - } - /** - * Check if a selector looks like a ref - */ - isRef(selector) { - return parseRef(selector) !== null; - } - /** - * Install the domain filter on a context if an allowlist is configured. - * Should be called before any pages navigate on the context. - */ - async ensureDomainFilter(context) { - if (this.allowedDomains.length > 0) { - await installDomainFilter(context, this.allowedDomains); - } - } - /** - * After installing the domain filter, verify existing pages are on allowed - * domains. Pages that pre-date the filter (e.g. CDP/cloud connect) may have - * already navigated to disallowed domains. Navigate them to about:blank. - */ - async sanitizeExistingPages(pages) { - if (this.allowedDomains.length === 0) - return; - for (const page of pages) { - const url = page.url(); - if (!url || url === 'about:blank') - continue; - try { - const hostname = new URL(url).hostname.toLowerCase(); - if (!isDomainAllowed(hostname, this.allowedDomains)) { - await page.goto('about:blank'); - } - } - catch { - await page.goto('about:blank').catch(() => { }); - } - } - } - /** - * Check if a URL is allowed by the domain allowlist. - * Throws if the URL's domain is blocked. No-op if no allowlist is set. - * Blocks non-http(s) schemes and unparseable URLs by default. - */ - checkDomainAllowed(url) { - if (this.allowedDomains.length === 0) - return; - if (!url.startsWith('http://') && !url.startsWith('https://')) { - throw new Error(`Navigation blocked: non-http(s) scheme in URL "${url}"`); - } - let hostname; - try { - hostname = new URL(url).hostname.toLowerCase(); - } - catch { - throw new Error(`Navigation blocked: unable to parse URL "${url}"`); - } - if (!isDomainAllowed(hostname, this.allowedDomains)) { - throw new Error(`Navigation blocked: ${hostname} is not in the allowed domains list`); - } - } - /** - * Get locator - supports both refs and regular selectors - */ - getLocator(selectorOrRef) { - // Check if it's a ref first - const locator = this.getLocatorFromRef(selectorOrRef); - if (locator) - return locator; - // Otherwise treat as regular selector - const page = this.getPage(); - return page.locator(selectorOrRef); - } - /** - * Check if the browser has any usable pages - */ - hasPages() { - return this.pages.length > 0; - } - /** - * Ensure at least one page exists. If the browser is launched but all pages - * were closed (stale session), creates a new page on the existing context. - * No-op if pages already exist. - */ - async ensurePage() { - if (this.pages.length > 0) - return; - if (!this.browser && !this.isPersistentContext) - return; - // Use the last existing context, or create a new one - let context; - if (this.contexts.length > 0) { - context = this.contexts[this.contexts.length - 1]; - } - else if (this.browser) { - context = await this.browser.newContext({ - ...(this.colorScheme && { colorScheme: this.colorScheme }), - }); - context.setDefaultTimeout(getDefaultTimeout()); - this.contexts.push(context); - this.setupContextTracking(context); - await this.ensureDomainFilter(context); - } - else { - return; - } - const page = await context.newPage(); - if (!this.pages.includes(page)) { - this.pages.push(page); - this.setupPageTracking(page); - } - this.activePageIndex = this.pages.length - 1; - } - /** - * Get the current active page, throws if not launched - */ - getPage() { - if (this.pages.length === 0) { - throw new Error('Browser not launched. Call launch first.'); - } - return this.pages[this.activePageIndex]; - } - /** - * Get the current frame (or page's main frame if no frame is selected) - */ - getFrame() { - if (this.activeFrame) { - return this.activeFrame; - } - return this.getPage().mainFrame(); - } - /** - * Switch to a frame by selector, name, or URL - */ - async switchToFrame(options) { - const page = this.getPage(); - if (options.selector) { - const frameElement = await page.$(options.selector); - if (!frameElement) { - throw new Error(`Frame not found: ${options.selector}`); - } - const frame = await frameElement.contentFrame(); - if (!frame) { - throw new Error(`Element is not a frame: ${options.selector}`); - } - this.activeFrame = frame; - } - else if (options.name) { - const frame = page.frame({ name: options.name }); - if (!frame) { - throw new Error(`Frame not found with name: ${options.name}`); - } - this.activeFrame = frame; - } - else if (options.url) { - const frame = page.frame({ url: options.url }); - if (!frame) { - throw new Error(`Frame not found with URL: ${options.url}`); - } - this.activeFrame = frame; - } - } - /** - * Switch back to main frame - */ - switchToMainFrame() { - this.activeFrame = null; - } - /** - * Set up dialog handler - */ - setDialogHandler(response, promptText) { - const page = this.getPage(); - // Remove existing handler if any - if (this.dialogHandler) { - page.removeListener('dialog', this.dialogHandler); - } - this.dialogHandler = async (dialog) => { - if (response === 'accept') { - await dialog.accept(promptText); - } - else { - await dialog.dismiss(); - } - }; - page.on('dialog', this.dialogHandler); - } - /** - * Clear dialog handler - */ - clearDialogHandler() { - if (this.dialogHandler) { - const page = this.getPage(); - page.removeListener('dialog', this.dialogHandler); - this.dialogHandler = null; - } - } - /** - * Start tracking requests - */ - startRequestTracking() { - const page = this.getPage(); - page.on('request', (request) => { - this.trackedRequests.push({ - url: request.url(), - method: request.method(), - headers: request.headers(), - timestamp: Date.now(), - resourceType: request.resourceType(), - }); - }); - } - /** - * Get tracked requests - */ - getRequests(filter) { - if (filter) { - return this.trackedRequests.filter((r) => r.url.includes(filter)); - } - return this.trackedRequests; - } - /** - * Clear tracked requests - */ - clearRequests() { - this.trackedRequests = []; - } - /** - * Add a route to intercept requests - */ - async addRoute(url, options) { - const page = this.getPage(); - const handler = async (route) => { - if (options.abort) { - await route.abort(); - } - else if (options.response) { - await route.fulfill({ - status: options.response.status ?? 200, - body: options.response.body ?? '', - contentType: options.response.contentType ?? 'text/plain', - headers: options.response.headers, - }); - } - else { - await route.continue(); - } - }; - this.routes.set(url, handler); - await page.route(url, handler); - } - /** - * Remove a route - */ - async removeRoute(url) { - const page = this.getPage(); - if (url) { - const handler = this.routes.get(url); - if (handler) { - await page.unroute(url, handler); - this.routes.delete(url); - } - } - else { - // Remove all routes - for (const [routeUrl, handler] of this.routes) { - await page.unroute(routeUrl, handler); - } - this.routes.clear(); - } - } - /** - * Set geolocation - */ - async setGeolocation(latitude, longitude, accuracy) { - const context = this.contexts[0]; - if (context) { - await context.setGeolocation({ latitude, longitude, accuracy }); - } - } - /** - * Set permissions - */ - async setPermissions(permissions, grant) { - const context = this.contexts[0]; - if (context) { - if (grant) { - await context.grantPermissions(permissions); - } - else { - await context.clearPermissions(); - } - } - } - /** - * Set viewport - */ - async setViewport(width, height) { - const page = this.getPage(); - await page.setViewportSize({ width, height }); - } - /** - * Set device scale factor (devicePixelRatio) via CDP - * This sets window.devicePixelRatio which affects how the page renders and responds to media queries - * - * Note: When using CDP to set deviceScaleFactor, screenshots will be at logical pixel dimensions - * (viewport size), not physical pixel dimensions (viewport × scale). This is a Playwright limitation - * when using CDP emulation on existing contexts. For true HiDPI screenshots with physical pixels, - * deviceScaleFactor must be set at context creation time. - * - * Must be called after setViewport to work correctly - */ - async setDeviceScaleFactor(deviceScaleFactor, width, height, mobile = false) { - const cdp = await this.getCDPSession(); - await cdp.send('Emulation.setDeviceMetricsOverride', { - width, - height, - deviceScaleFactor, - mobile, - }); - } - /** - * Clear device metrics override to restore default devicePixelRatio - */ - async clearDeviceMetricsOverride() { - const cdp = await this.getCDPSession(); - await cdp.send('Emulation.clearDeviceMetricsOverride'); - } - /** - * Get device descriptor - */ - getDevice(deviceName) { - return devices[deviceName]; - } - /** - * List available devices - */ - listDevices() { - return Object.keys(devices); - } - /** - * Start console message tracking - */ - startConsoleTracking() { - const page = this.getPage(); - page.on('console', (msg) => { - this.consoleMessages.push({ - type: msg.type(), - text: msg.text(), - timestamp: Date.now(), - }); - }); - } - /** - * Get console messages - */ - getConsoleMessages() { - return this.consoleMessages; - } - /** - * Clear console messages - */ - clearConsoleMessages() { - this.consoleMessages = []; - } - /** - * Start error tracking - */ - startErrorTracking() { - const page = this.getPage(); - page.on('pageerror', (error) => { - this.pageErrors.push({ - message: error.message, - timestamp: Date.now(), - }); - }); - } - /** - * Get page errors - */ - getPageErrors() { - return this.pageErrors; - } - /** - * Clear page errors - */ - clearPageErrors() { - this.pageErrors = []; - } - /** - * Start HAR recording - */ - async startHarRecording() { - // HAR is started at context level, flag for tracking - this.isRecordingHar = true; - } - /** - * Check if HAR recording - */ - isHarRecording() { - return this.isRecordingHar; - } - /** - * Set offline mode - */ - async setOffline(offline) { - const context = this.contexts[0]; - if (context) { - await context.setOffline(offline); - } - } - /** - * Set extra HTTP headers (global - all requests) - */ - async setExtraHeaders(headers) { - const context = this.contexts[0]; - if (context) { - await context.setExtraHTTPHeaders(headers); - } - } - /** - * Set scoped HTTP headers (only for requests matching the origin) - * Uses route interception to add headers only to matching requests - */ - async setScopedHeaders(origin, headers) { - const page = this.getPage(); - // Build URL pattern from origin (e.g., "api.example.com" -> "**://api.example.com/**") - // Handle both full URLs and just hostnames - let urlPattern; - try { - const url = new URL(origin.startsWith('http') ? origin : `https://${origin}`); - // Match any protocol, the host, and any path - urlPattern = `**://${url.host}/**`; - } - catch { - // If parsing fails, treat as hostname pattern - urlPattern = `**://${origin}/**`; - } - // Remove existing route for this origin if any - const existingHandler = this.scopedHeaderRoutes.get(urlPattern); - if (existingHandler) { - await page.unroute(urlPattern, existingHandler); - } - // Create handler that adds headers to matching requests - const handler = async (route) => { - const requestHeaders = route.request().headers(); - await route.continue({ - headers: safeHeaderMerge(requestHeaders, headers), - }); - }; - // Store and register the route - this.scopedHeaderRoutes.set(urlPattern, handler); - await page.route(urlPattern, handler); - } - /** - * Clear scoped headers for an origin (or all if no origin specified) - */ - async clearScopedHeaders(origin) { - const page = this.getPage(); - if (origin) { - let urlPattern; - try { - const url = new URL(origin.startsWith('http') ? origin : `https://${origin}`); - urlPattern = `**://${url.host}/**`; - } - catch { - urlPattern = `**://${origin}/**`; - } - const handler = this.scopedHeaderRoutes.get(urlPattern); - if (handler) { - await page.unroute(urlPattern, handler); - this.scopedHeaderRoutes.delete(urlPattern); - } - } - else { - // Clear all scoped header routes - for (const [pattern, handler] of this.scopedHeaderRoutes) { - await page.unroute(pattern, handler); - } - this.scopedHeaderRoutes.clear(); - } - } - /** - * Start tracing - */ - async startTracing(options) { - const context = this.contexts[0]; - if (context) { - await context.tracing.start({ - screenshots: options.screenshots ?? true, - snapshots: options.snapshots ?? true, - }); - } - } - /** - * Stop tracing and save - */ - async stopTracing(path) { - const context = this.contexts[0]; - if (context) { - await context.tracing.stop(path ? { path } : undefined); - } - } - /** - * Get the current browser context (first context) - */ - getContext() { - return this.contexts[0] ?? null; - } - /** - * Save storage state (cookies, localStorage, etc.) - */ - async saveStorageState(path) { - const context = this.contexts[0]; - if (context) { - await context.storageState({ path }); - } - } - /** - * Get all pages - */ - getPages() { - return this.pages; - } - /** - * Get current page index - */ - getActiveIndex() { - return this.activePageIndex; - } - /** - * Get the current browser instance - */ - getBrowser() { - return this.browser; - } - /** - * Check if an existing CDP connection is still alive - * by verifying we can access browser contexts and that at least one has pages - */ - isCdpConnectionAlive() { - if (!this.browser) - return false; - try { - const contexts = this.browser.contexts(); - if (contexts.length === 0) - return false; - return contexts.some((context) => context.pages().length > 0); - } - catch { - return false; - } - } - /** - * Check if CDP connection needs to be re-established - */ - needsCdpReconnect(cdpEndpoint) { - if (!this.browser?.isConnected()) - return true; - if (this.cdpEndpoint !== cdpEndpoint) - return true; - if (!this.isCdpConnectionAlive()) - return true; - return false; - } - /** - * Close a Browserbase session via API - */ - async closeBrowserbaseSession(sessionId, apiKey) { - await fetch(`https://api.browserbase.com/v1/sessions/${sessionId}`, { - method: 'DELETE', - headers: { - 'X-BB-API-Key': apiKey, - }, - }); - } - /** - * Close a Browser Use session via API - */ - async closeBrowserUseSession(sessionId, apiKey) { - const response = await fetch(`https://api.browser-use.com/api/v2/browsers/${sessionId}`, { - method: 'PATCH', - headers: { - 'Content-Type': 'application/json', - 'X-Browser-Use-API-Key': apiKey, - }, - body: JSON.stringify({ action: 'stop' }), - }); - if (!response.ok) { - throw new Error(`Failed to close Browser Use session: ${response.statusText}`); - } - } - /** - * Close a Kernel session via API - */ - async closeKernelSession(sessionId, apiKey) { - const response = await fetch(`https://api.onkernel.com/browsers/${sessionId}`, { - method: 'DELETE', - headers: { - Authorization: `Bearer ${apiKey}`, - }, - }); - if (!response.ok) { - throw new Error(`Failed to close Kernel session: ${response.statusText}`); - } - } - /** - * Connect to Browserbase remote browser via CDP. - * Requires BROWSERBASE_API_KEY and BROWSERBASE_PROJECT_ID environment variables. - */ - async connectToBrowserbase() { - const browserbaseApiKey = process.env.BROWSERBASE_API_KEY; - const browserbaseProjectId = process.env.BROWSERBASE_PROJECT_ID; - if (!browserbaseApiKey || !browserbaseProjectId) { - throw new Error('BROWSERBASE_API_KEY and BROWSERBASE_PROJECT_ID are required when using browserbase as a provider'); - } - const response = await fetch('https://api.browserbase.com/v1/sessions', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'X-BB-API-Key': browserbaseApiKey, - }, - body: JSON.stringify({ - projectId: browserbaseProjectId, - }), - }); - if (!response.ok) { - throw new Error(`Failed to create Browserbase session: ${response.statusText}`); - } - const session = (await response.json()); - const browser = await chromium.connectOverCDP(session.connectUrl).catch(() => { - throw new Error('Failed to connect to Browserbase session via CDP'); - }); - try { - const contexts = browser.contexts(); - if (contexts.length === 0) { - throw new Error('No browser context found in Browserbase session'); - } - const context = contexts[0]; - const pages = context.pages(); - const page = pages[0] ?? (await context.newPage()); - this.browserbaseSessionId = session.id; - this.browserbaseApiKey = browserbaseApiKey; - this.browser = browser; - context.setDefaultTimeout(10000); - this.contexts.push(context); - this.setupContextTracking(context); - await this.ensureDomainFilter(context); - await this.sanitizeExistingPages([page]); - this.pages.push(page); - this.activePageIndex = 0; - this.setupPageTracking(page); - } - catch (error) { - await this.closeBrowserbaseSession(session.id, browserbaseApiKey).catch((sessionError) => { - console.error('Failed to close Browserbase session during cleanup:', sessionError); - }); - throw error; - } - } - /** - * Find or create a Kernel profile by name. - * Returns the profile object if successful. - */ - async findOrCreateKernelProfile(profileName, apiKey) { - // First, try to get the existing profile - const getResponse = await fetch(`https://api.onkernel.com/profiles/${encodeURIComponent(profileName)}`, { - method: 'GET', - headers: { - Authorization: `Bearer ${apiKey}`, - }, - }); - if (getResponse.ok) { - // Profile exists, return it - return { name: profileName }; - } - if (getResponse.status !== 404) { - throw new Error(`Failed to check Kernel profile: ${getResponse.statusText}`); - } - // Profile doesn't exist, create it - const createResponse = await fetch('https://api.onkernel.com/profiles', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - Authorization: `Bearer ${apiKey}`, - }, - body: JSON.stringify({ name: profileName }), - }); - if (!createResponse.ok) { - throw new Error(`Failed to create Kernel profile: ${createResponse.statusText}`); - } - return { name: profileName }; - } - /** - * Connect to Kernel remote browser via CDP. - * Requires KERNEL_API_KEY environment variable. - */ - async connectToKernel() { - const kernelApiKey = process.env.KERNEL_API_KEY; - if (!kernelApiKey) { - throw new Error('KERNEL_API_KEY is required when using kernel as a provider'); - } - // Find or create profile if KERNEL_PROFILE_NAME is set - const profileName = process.env.KERNEL_PROFILE_NAME; - let profileConfig; - if (profileName) { - await this.findOrCreateKernelProfile(profileName, kernelApiKey); - profileConfig = { - profile: { - name: profileName, - save_changes: true, // Save cookies/state back to the profile when session ends - }, - }; - } - const response = await fetch('https://api.onkernel.com/browsers', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - Authorization: `Bearer ${kernelApiKey}`, - }, - body: JSON.stringify({ - // Kernel browsers are headful by default with stealth mode available - // The user can configure these via environment variables if needed - headless: process.env.KERNEL_HEADLESS?.toLowerCase() === 'true', - stealth: process.env.KERNEL_STEALTH?.toLowerCase() !== 'false', // Default to stealth mode - timeout_seconds: parseInt(process.env.KERNEL_TIMEOUT_SECONDS || '300', 10), - // Load and save to a profile if specified - ...profileConfig, - }), - }); - if (!response.ok) { - throw new Error(`Failed to create Kernel session: ${response.statusText}`); - } - let session; - try { - session = (await response.json()); - } - catch (error) { - throw new Error(`Failed to parse Kernel session response: ${error instanceof Error ? error.message : String(error)}`); - } - if (!session.session_id || !session.cdp_ws_url) { - throw new Error(`Invalid Kernel session response: missing ${!session.session_id ? 'session_id' : 'cdp_ws_url'}`); - } - const browser = await chromium.connectOverCDP(session.cdp_ws_url).catch(() => { - throw new Error('Failed to connect to Kernel session via CDP'); - }); - try { - const contexts = browser.contexts(); - let context; - let page; - // Kernel browsers launch with a default context and page - if (contexts.length === 0) { - context = await browser.newContext(); - page = await context.newPage(); - } - else { - context = contexts[0]; - const pages = context.pages(); - page = pages[0] ?? (await context.newPage()); - } - this.kernelSessionId = session.session_id; - this.kernelApiKey = kernelApiKey; - this.browser = browser; - context.setDefaultTimeout(getDefaultTimeout()); - this.contexts.push(context); - this.setupContextTracking(context); - await this.ensureDomainFilter(context); - await this.sanitizeExistingPages([page]); - this.pages.push(page); - this.activePageIndex = 0; - this.setupPageTracking(page); - } - catch (error) { - await this.closeKernelSession(session.session_id, kernelApiKey).catch((sessionError) => { - console.error('Failed to close Kernel session during cleanup:', sessionError); - }); - throw error; - } - } - /** - * Connect to Browser Use remote browser via CDP. - * Requires BROWSER_USE_API_KEY environment variable. - */ - async connectToBrowserUse() { - const browserUseApiKey = process.env.BROWSER_USE_API_KEY; - if (!browserUseApiKey) { - throw new Error('BROWSER_USE_API_KEY is required when using browseruse as a provider'); - } - const response = await fetch('https://api.browser-use.com/api/v2/browsers', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'X-Browser-Use-API-Key': browserUseApiKey, - }, - body: JSON.stringify({}), - }); - if (!response.ok) { - throw new Error(`Failed to create Browser Use session: ${response.statusText}`); - } - let session; - try { - session = (await response.json()); - } - catch (error) { - throw new Error(`Failed to parse Browser Use session response: ${error instanceof Error ? error.message : String(error)}`); - } - if (!session.id || !session.cdpUrl) { - throw new Error(`Invalid Browser Use session response: missing ${!session.id ? 'id' : 'cdpUrl'}`); - } - const browser = await chromium.connectOverCDP(session.cdpUrl).catch(() => { - throw new Error('Failed to connect to Browser Use session via CDP'); - }); - try { - const contexts = browser.contexts(); - let context; - let page; - if (contexts.length === 0) { - context = await browser.newContext(); - page = await context.newPage(); - } - else { - context = contexts[0]; - const pages = context.pages(); - page = pages[0] ?? (await context.newPage()); - } - this.browserUseSessionId = session.id; - this.browserUseApiKey = browserUseApiKey; - this.browser = browser; - context.setDefaultTimeout(getDefaultTimeout()); - this.contexts.push(context); - this.setupContextTracking(context); - await this.ensureDomainFilter(context); - await this.sanitizeExistingPages([page]); - this.pages.push(page); - this.activePageIndex = 0; - this.setupPageTracking(page); - } - catch (error) { - await this.closeBrowserUseSession(session.id, browserUseApiKey).catch((sessionError) => { - console.error('Failed to close Browser Use session during cleanup:', sessionError); - }); - throw error; - } - } - /** - * Launch the browser with the specified options - * If already launched, this is a no-op (browser stays open) - */ - async launch(options) { - // Determine CDP endpoint: prefer cdpUrl over cdpPort for flexibility - const cdpEndpoint = options.cdpUrl ?? (options.cdpPort ? String(options.cdpPort) : undefined); - const hasExtensions = !!options.extensions?.length; - const hasProfile = !!options.profile; - const hasStorageState = !!options.storageState; - if (hasExtensions && cdpEndpoint) { - throw new Error('Extensions cannot be used with CDP connection'); - } - if (hasProfile && cdpEndpoint) { - throw new Error('Profile cannot be used with CDP connection'); - } - if (hasStorageState && hasProfile) { - throw new Error('Storage state cannot be used with profile (profile is already persistent storage)'); - } - if (hasStorageState && hasExtensions) { - throw new Error('Storage state cannot be used with extensions (extensions require persistent context)'); - } - if (this.isLaunched()) { - const needsRelaunch = (!cdpEndpoint && !options.autoConnect && this.cdpEndpoint !== null) || - (!!cdpEndpoint && this.needsCdpReconnect(cdpEndpoint)) || - (!!options.autoConnect && !this.isCdpConnectionAlive()); - if (needsRelaunch) { - await this.close(); - } - else if (options.autoConnect && this.isCdpConnectionAlive()) { - // Already connected via auto-connect, no need to reconnect - return; - } - else { - return; - } - } - if (options.colorScheme) { - this.colorScheme = options.colorScheme; - } - if (options.downloadPath) { - this.downloadPath = options.downloadPath; - } - if (options.allowedDomains && options.allowedDomains.length > 0) { - this.allowedDomains = options.allowedDomains.map((d) => d.toLowerCase()); - } - else { - const envDomains = process.env.AGENT_BROWSER_ALLOWED_DOMAINS; - if (envDomains) { - this.allowedDomains = parseDomainList(envDomains); - } - } - if (this.downloadPath && (cdpEndpoint || options.autoConnect)) { - const warning = "--download-path is ignored when connecting via CDP or auto-connect (downloads use the remote browser's configuration)"; - this.launchWarnings.push(warning); - console.error(`[WARN] ${warning}`); - } - if (cdpEndpoint) { - await this.connectViaCDP(cdpEndpoint); - return; - } - if (options.autoConnect) { - await this.autoConnectViaCDP(); - return; - } - // Cloud browser providers require explicit opt-in via -p flag or AGENT_BROWSER_PROVIDER env var - // -p flag takes precedence over env var - const provider = options.provider ?? process.env.AGENT_BROWSER_PROVIDER; - if (this.downloadPath && provider) { - const warning = "--download-path is ignored when using a cloud provider (downloads use the remote browser's configuration)"; - this.launchWarnings.push(warning); - console.error(`[WARN] ${warning}`); - } - if (provider === 'browserbase') { - await this.connectToBrowserbase(); - return; - } - if (provider === 'browseruse') { - await this.connectToBrowserUse(); - return; - } - // Kernel: requires explicit opt-in via -p kernel flag or AGENT_BROWSER_PROVIDER=kernel - if (provider === 'kernel') { - await this.connectToKernel(); - return; - } - if (this.downloadPath) { - const resolved = path.resolve(this.downloadPath); - const stat = statSync(resolved, { throwIfNoEntry: false }); - if (stat && !stat.isDirectory()) { - throw new Error(`Download path is not a directory: ${resolved}`); - } - if (!stat) { - try { - mkdirSync(resolved, { recursive: true }); - } - catch (e) { - const msg = e instanceof Error ? e.message : String(e); - throw new Error(`Cannot create download directory '${resolved}': ${msg}`); - } - } - this.downloadPath = resolved; - } - const browserType = options.browser ?? 'chromium'; - if (hasExtensions && browserType !== 'chromium') { - throw new Error('Extensions are only supported in Chromium'); - } - // allowFileAccess is only supported in Chromium - if (options.allowFileAccess && browserType !== 'chromium') { - throw new Error('allowFileAccess is only supported in Chromium'); - } - const launcher = browserType === 'firefox' ? firefox : browserType === 'webkit' ? webkit : chromium; - // Build base args array with file access flags if enabled - // --allow-file-access-from-files: allows file:// URLs to read other file:// URLs via XHR/fetch - // --allow-file-access: allows the browser to access local files in general - const fileAccessArgs = options.allowFileAccess - ? ['--allow-file-access-from-files', '--allow-file-access'] - : []; - const baseArgs = options.args - ? [...fileAccessArgs, ...options.args] - : fileAccessArgs.length > 0 - ? fileAccessArgs - : undefined; - // Auto-detect args that control window size and disable viewport emulation - // so Playwright doesn't override the browser's own sizing behavior - const hasWindowSizeArgs = baseArgs?.some((arg) => arg === '--start-maximized' || arg.startsWith('--window-size=')); - const viewport = options.viewport !== undefined - ? options.viewport - : hasWindowSizeArgs - ? null - : { width: 1280, height: 720 }; - let context; - if (hasExtensions) { - // Extensions require persistent context in a temp directory - const extPaths = options.extensions.join(','); - const session = process.env.AGENT_BROWSER_SESSION || 'default'; - // Combine extension args with custom args and file access args - const extArgs = [`--disable-extensions-except=${extPaths}`, `--load-extension=${extPaths}`]; - const allArgs = baseArgs ? [...extArgs, ...baseArgs] : extArgs; - context = await launcher.launchPersistentContext(path.join(os.tmpdir(), `agent-browser-ext-${session}`), { - headless: false, - executablePath: options.executablePath, - args: allArgs, - viewport, - extraHTTPHeaders: options.headers, - userAgent: options.userAgent, - ...(options.proxy && { proxy: options.proxy }), - ignoreHTTPSErrors: options.ignoreHTTPSErrors ?? false, - ...(this.colorScheme && { colorScheme: this.colorScheme }), - ...(this.downloadPath && { downloadsPath: this.downloadPath }), - }); - this.isPersistentContext = true; - } - else if (hasProfile) { - // Profile uses persistent context for durable cookies/storage - // Expand ~ to home directory since it won't be shell-expanded - const profilePath = options.profile.replace(/^~\//, os.homedir() + '/'); - context = await launcher.launchPersistentContext(profilePath, { - headless: options.headless ?? true, - executablePath: options.executablePath, - args: baseArgs, - viewport, - extraHTTPHeaders: options.headers, - userAgent: options.userAgent, - ...(options.proxy && { proxy: options.proxy }), - ignoreHTTPSErrors: options.ignoreHTTPSErrors ?? false, - ...(this.colorScheme && { colorScheme: this.colorScheme }), - ...(this.downloadPath && { downloadsPath: this.downloadPath }), - }); - this.isPersistentContext = true; - } - else { - // Regular ephemeral browser - this.browser = await launcher.launch({ - headless: options.headless ?? true, - executablePath: options.executablePath, - args: baseArgs, - ...(this.downloadPath && { downloadsPath: this.downloadPath }), - }); - this.cdpEndpoint = null; - // Check for auto-load state file (supports encrypted files) - let storageState = options.storageState ? options.storageState : undefined; - if (!storageState && options.autoStateFilePath) { - try { - const fs = await import('fs'); - if (fs.existsSync(options.autoStateFilePath)) { - const content = fs.readFileSync(options.autoStateFilePath, 'utf8'); - const parsed = JSON.parse(content); - if (isEncryptedPayload(parsed)) { - const key = getEncryptionKey(); - if (key) { - try { - const decrypted = decryptData(parsed, key); - storageState = JSON.parse(decrypted); - if (process.env.AGENT_BROWSER_DEBUG === '1') { - console.error(`[DEBUG] Auto-loading session state (decrypted): ${options.autoStateFilePath}`); - } - } - catch (decryptErr) { - const warning = 'Failed to decrypt state file - wrong encryption key? Starting fresh.'; - this.launchWarnings.push(warning); - console.error(`[WARN] ${warning}`); - if (process.env.AGENT_BROWSER_DEBUG === '1') { - console.error(`[DEBUG] Decryption error:`, decryptErr); - } - } - } - else { - const warning = `State file is encrypted but ${ENCRYPTION_KEY_ENV} not set - starting fresh`; - this.launchWarnings.push(warning); - console.error(`[WARN] ${warning}`); - } - } - else { - storageState = options.autoStateFilePath; - if (process.env.AGENT_BROWSER_DEBUG === '1') { - console.error(`[DEBUG] Auto-loading session state: ${options.autoStateFilePath}`); - } - } - } - } - catch (err) { - if (process.env.AGENT_BROWSER_DEBUG === '1') { - console.error(`[DEBUG] Failed to load state file, starting fresh:`, err); - } - } - } - context = await this.browser.newContext({ - viewport, - extraHTTPHeaders: options.headers, - userAgent: options.userAgent, - storageState, - ...(options.proxy && { proxy: options.proxy }), - ignoreHTTPSErrors: options.ignoreHTTPSErrors ?? false, - ...(this.colorScheme && { colorScheme: this.colorScheme }), - }); - } - context.setDefaultTimeout(getDefaultTimeout()); - this.contexts.push(context); - this.setupContextTracking(context); - await this.ensureDomainFilter(context); - const page = context.pages()[0] ?? (await context.newPage()); - await this.sanitizeExistingPages([page]); - // Only add if not already tracked (setupContextTracking may have already added it via 'page' event) - if (!this.pages.includes(page)) { - this.pages.push(page); - this.setupPageTracking(page); - } - this.activePageIndex = this.pages.length > 0 ? this.pages.length - 1 : 0; - } - /** - * Connect to a running browser via CDP (Chrome DevTools Protocol) - * @param cdpEndpoint Either a port number (as string) or a full WebSocket URL (ws:// or wss://) - */ - async connectViaCDP(cdpEndpoint, options) { - if (!cdpEndpoint) { - throw new Error('CDP endpoint is required for CDP connection'); - } - // Determine the connection URL: - // - If it starts with ws://, wss://, http://, or https://, use it directly - // - If it's a numeric string (e.g., "9222"), treat as port for localhost - // - Otherwise, treat it as a port number for localhost - let cdpUrl; - if (cdpEndpoint.startsWith('ws://') || - cdpEndpoint.startsWith('wss://') || - cdpEndpoint.startsWith('http://') || - cdpEndpoint.startsWith('https://')) { - cdpUrl = cdpEndpoint; - } - else if (/^\d+$/.test(cdpEndpoint)) { - // Numeric string - treat as port number (handles JSON serialization quirks) - cdpUrl = `http://localhost:${cdpEndpoint}`; - } - else { - // Unknown format - still try as port for backward compatibility - cdpUrl = `http://localhost:${cdpEndpoint}`; - } - const browser = await chromium - .connectOverCDP(cdpUrl, { timeout: options?.timeout }) - .catch(() => { - throw new Error(`Failed to connect via CDP to ${cdpUrl}. ` + - (cdpUrl.includes('localhost') - ? `Make sure the app is running with --remote-debugging-port=${cdpEndpoint}` - : 'Make sure the remote browser is accessible and the URL is correct.')); - }); - // Validate and set up state, cleaning up browser connection if anything fails - try { - const contexts = browser.contexts(); - if (contexts.length === 0) { - throw new Error('No browser context found. Make sure the app has an open window.'); - } - // Filter out pages with empty URLs, which can cause Playwright to hang - const allPages = contexts.flatMap((context) => context.pages()).filter((page) => page.url()); - if (allPages.length === 0) { - throw new Error('No page found. Make sure the app has loaded content.'); - } - // All validation passed - commit state - this.browser = browser; - this.cdpEndpoint = cdpEndpoint; - for (const context of contexts) { - context.setDefaultTimeout(10000); - this.contexts.push(context); - this.setupContextTracking(context); - await this.ensureDomainFilter(context); - } - await this.sanitizeExistingPages(allPages); - for (const page of allPages) { - this.pages.push(page); - this.setupPageTracking(page); - } - this.activePageIndex = 0; - } - catch (error) { - // Clean up browser connection if validation or setup failed - await browser.close().catch(() => { }); - throw error; - } - } - /** - * Get Chrome's default user data directory paths for the current platform. - * Returns an array of candidate paths to check (stable, then beta/canary). - */ - getChromeUserDataDirs() { - const home = os.homedir(); - const platform = os.platform(); - if (platform === 'darwin') { - return [ - path.join(home, 'Library', 'Application Support', 'Google', 'Chrome'), - path.join(home, 'Library', 'Application Support', 'Google', 'Chrome Canary'), - path.join(home, 'Library', 'Application Support', 'Chromium'), - ]; - } - else if (platform === 'win32') { - const localAppData = process.env.LOCALAPPDATA ?? path.join(home, 'AppData', 'Local'); - return [ - path.join(localAppData, 'Google', 'Chrome', 'User Data'), - path.join(localAppData, 'Google', 'Chrome SxS', 'User Data'), - path.join(localAppData, 'Chromium', 'User Data'), - ]; - } - else { - // Linux - return [ - path.join(home, '.config', 'google-chrome'), - path.join(home, '.config', 'google-chrome-unstable'), - path.join(home, '.config', 'chromium'), - ]; - } - } - /** - * Try to read the DevToolsActivePort file from a Chrome user data directory. - * Returns { port, wsPath } if found, or null if not available. - */ - readDevToolsActivePort(userDataDir) { - const filePath = path.join(userDataDir, 'DevToolsActivePort'); - try { - if (!existsSync(filePath)) - return null; - const content = readFileSync(filePath, 'utf-8').trim(); - const lines = content.split('\n'); - if (lines.length < 2) - return null; - const port = parseInt(lines[0].trim(), 10); - const wsPath = lines[1].trim(); - if (isNaN(port) || port <= 0 || port > 65535) - return null; - if (!wsPath) - return null; - return { port, wsPath }; - } - catch { - return null; - } - } - /** - * Try to discover a Chrome CDP endpoint by querying an HTTP debug port. - * Returns the WebSocket debugger URL if available. - */ - async probeDebugPort(port) { - try { - const response = await fetch(`http://127.0.0.1:${port}/json/version`, { - signal: AbortSignal.timeout(2000), - }); - if (!response.ok) - return null; - const data = (await response.json()); - return data.webSocketDebuggerUrl ?? null; - } - catch { - return null; - } - } - /** - * Auto-discover and connect to a running Chrome/Chromium instance. - * - * Discovery strategy: - * 1. Read DevToolsActivePort from Chrome's default user data directories - * 2. If found, connect using the port and WebSocket path from that file - * 3. If not found, probe common debugging ports (9222, 9229) - * 4. If a port responds, connect via CDP - */ - async autoConnectViaCDP() { - // Strategy 1: Check DevToolsActivePort files - const userDataDirs = this.getChromeUserDataDirs(); - for (const dir of userDataDirs) { - const activePort = this.readDevToolsActivePort(dir); - if (activePort) { - // Try HTTP discovery first (works with --remote-debugging-port mode) - const wsUrl = await this.probeDebugPort(activePort.port); - if (wsUrl) { - await this.connectViaCDP(wsUrl); - return; - } - // HTTP probe failed -- Chrome M144+ chrome://inspect remote debugging uses a - // WebSocket-only server with no HTTP endpoints. Connect using the WebSocket - // path read directly from DevToolsActivePort. - const directWsUrl = `ws://127.0.0.1:${activePort.port}${activePort.wsPath}`; - try { - if (process.env.AGENT_BROWSER_DEBUG === '1') { - console.error(`[DEBUG] HTTP probe failed on port ${activePort.port}, ` + - `attempting direct WebSocket connection to ${directWsUrl}`); - } - await this.connectViaCDP(directWsUrl, { timeout: 60_000 }); - return; - } - catch { - // Direct WebSocket also failed, try next directory - } - } - } - // Strategy 2: Probe common debugging ports - const commonPorts = [9222, 9229]; - for (const port of commonPorts) { - const wsUrl = await this.probeDebugPort(port); - if (wsUrl) { - await this.connectViaCDP(wsUrl); - return; - } - } - // Nothing found - const platform = os.platform(); - let hint; - if (platform === 'darwin') { - hint = - 'Start Chrome with: /Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome --remote-debugging-port=9222\n' + - 'Or enable remote debugging in Chrome 144+ at chrome://inspect/#remote-debugging'; - } - else if (platform === 'win32') { - hint = - 'Start Chrome with: chrome.exe --remote-debugging-port=9222\n' + - 'Or enable remote debugging in Chrome 144+ at chrome://inspect/#remote-debugging'; - } - else { - hint = - 'Start Chrome with: google-chrome --remote-debugging-port=9222\n' + - 'Or enable remote debugging in Chrome 144+ at chrome://inspect/#remote-debugging'; - } - throw new Error(`No running Chrome instance with remote debugging found.\n${hint}`); - } - /** - * Set up console, error, and close tracking for a page - */ - setupPageTracking(page) { - if (this.colorScheme) { - page.emulateMedia({ colorScheme: this.colorScheme }).catch(() => { }); - } - page.on('console', (msg) => { - this.consoleMessages.push({ - type: msg.type(), - text: msg.text(), - timestamp: Date.now(), - }); - }); - page.on('pageerror', (error) => { - this.pageErrors.push({ - message: error.message, - timestamp: Date.now(), - }); - }); - page.on('close', () => { - const index = this.pages.indexOf(page); - if (index !== -1) { - this.pages.splice(index, 1); - if (this.activePageIndex >= this.pages.length) { - this.activePageIndex = Math.max(0, this.pages.length - 1); - } - } - }); - } - /** - * Set up tracking for new pages in a context (for CDP connections and popups/new tabs) - * This handles pages created externally (e.g., via target="_blank" links, window.open) - */ - setupContextTracking(context) { - context.on('page', (page) => { - // Only add if not already tracked (avoids duplicates when newTab() creates pages) - if (!this.pages.includes(page)) { - this.pages.push(page); - this.setupPageTracking(page); - } - // Auto-switch to the newly opened tab so subsequent commands target it. - // For tabs created via newTab()/newWindow(), this is redundant (they set activePageIndex after), - // but for externally opened tabs (window.open, target="_blank"), this ensures the active tab - // stays in sync with the browser. - const newIndex = this.pages.indexOf(page); - if (newIndex !== -1 && newIndex !== this.activePageIndex) { - this.activePageIndex = newIndex; - // Invalidate CDP session since the active page changed - this.invalidateCDPSession().catch(() => { }); - } - }); - } - /** - * Create a new tab in the current context - */ - async newTab() { - if (!this.browser || this.contexts.length === 0) { - throw new Error('Browser not launched'); - } - // Invalidate CDP session since we're switching to a new page - await this.invalidateCDPSession(); - const context = this.contexts[0]; // Use first context for tabs - const page = await context.newPage(); - // Only add if not already tracked (setupContextTracking may have already added it via 'page' event) - if (!this.pages.includes(page)) { - this.pages.push(page); - this.setupPageTracking(page); - } - this.activePageIndex = this.pages.length - 1; - return { index: this.activePageIndex, total: this.pages.length }; - } - /** - * Create a new window (new context) - */ - async newWindow(viewport) { - if (!this.browser) { - throw new Error('Browser not launched'); - } - const context = await this.browser.newContext({ - viewport: viewport === undefined ? { width: 1280, height: 720 } : viewport, - ...(this.colorScheme && { colorScheme: this.colorScheme }), - }); - context.setDefaultTimeout(getDefaultTimeout()); - this.contexts.push(context); - this.setupContextTracking(context); - await this.ensureDomainFilter(context); - const page = await context.newPage(); - // Only add if not already tracked (setupContextTracking may have already added it via 'page' event) - if (!this.pages.includes(page)) { - this.pages.push(page); - this.setupPageTracking(page); - } - this.activePageIndex = this.pages.length - 1; - return { index: this.activePageIndex, total: this.pages.length }; - } - /** - * Invalidate the current CDP session (must be called before switching pages) - * This ensures screencast and input injection work correctly after tab switch - */ - async invalidateCDPSession() { - // Stop screencast if active (it's tied to the current page's CDP session) - if (this.screencastActive) { - await this.stopScreencast(); - } - // Detach and clear the CDP session - if (this.cdpSession) { - await this.cdpSession.detach().catch(() => { }); - this.cdpSession = null; - } - } - /** - * Switch to a specific tab/page by index - */ - async switchTo(index) { - if (index < 0 || index >= this.pages.length) { - throw new Error(`Invalid tab index: ${index}. Available: 0-${this.pages.length - 1}`); - } - // Invalidate CDP session before switching (it's page-specific) - if (index !== this.activePageIndex) { - await this.invalidateCDPSession(); - } - this.activePageIndex = index; - const page = this.pages[index]; - return { - index: this.activePageIndex, - url: page.url(), - title: '', // Title requires async, will be fetched separately - }; - } - /** - * Close a specific tab/page - */ - async closeTab(index) { - const targetIndex = index ?? this.activePageIndex; - if (targetIndex < 0 || targetIndex >= this.pages.length) { - throw new Error(`Invalid tab index: ${targetIndex}`); - } - if (this.pages.length === 1) { - throw new Error('Cannot close the last tab. Use "close" to close the browser.'); - } - // If closing the active tab, invalidate CDP session first - if (targetIndex === this.activePageIndex) { - await this.invalidateCDPSession(); - } - const page = this.pages[targetIndex]; - await page.close(); - this.pages.splice(targetIndex, 1); - // Adjust active index if needed - if (this.activePageIndex >= this.pages.length) { - this.activePageIndex = this.pages.length - 1; - } - else if (this.activePageIndex > targetIndex) { - this.activePageIndex--; - } - return { closed: targetIndex, remaining: this.pages.length }; - } - /** - * List all tabs with their info - */ - async listTabs() { - const tabs = await Promise.all(this.pages.map(async (page, index) => ({ - index, - url: page.url(), - title: await page.title().catch(() => ''), - active: index === this.activePageIndex, - }))); - return tabs; - } - /** - * Get or create a CDP session for the current page - * Only works with Chromium-based browsers - */ - async getCDPSession() { - if (this.cdpSession) { - return this.cdpSession; - } - const page = this.getPage(); - const context = page.context(); - // Create a new CDP session attached to the page - this.cdpSession = await context.newCDPSession(page); - return this.cdpSession; - } - /** - * Check if screencast is currently active - */ - isScreencasting() { - return this.screencastActive; - } - /** - * Start screencast - streams viewport frames via CDP - * @param callback Function called for each frame - * @param options Screencast options - */ - async startScreencast(callback, options) { - if (this.screencastActive) { - throw new Error('Screencast already active'); - } - const cdp = await this.getCDPSession(); - this.frameCallback = callback; - this.screencastActive = true; - // Create and store the frame handler so we can remove it later - this.screencastFrameHandler = async (params) => { - const frame = { - data: params.data, - metadata: params.metadata, - sessionId: params.sessionId, - }; - // Acknowledge the frame to receive the next one - await cdp.send('Page.screencastFrameAck', { sessionId: params.sessionId }); - // Call the callback with the frame - if (this.frameCallback) { - this.frameCallback(frame); - } - }; - // Listen for screencast frames - cdp.on('Page.screencastFrame', this.screencastFrameHandler); - // Start the screencast - await cdp.send('Page.startScreencast', { - format: options?.format ?? 'jpeg', - quality: options?.quality ?? 80, - maxWidth: options?.maxWidth ?? 1280, - maxHeight: options?.maxHeight ?? 720, - everyNthFrame: options?.everyNthFrame ?? 1, - }); - } - /** - * Stop screencast - */ - async stopScreencast() { - if (!this.screencastActive) { - return; - } - try { - const cdp = await this.getCDPSession(); - await cdp.send('Page.stopScreencast'); - // Remove the event listener to prevent accumulation - if (this.screencastFrameHandler) { - cdp.off('Page.screencastFrame', this.screencastFrameHandler); - } - } - catch { - // Ignore errors when stopping - } - this.screencastActive = false; - this.frameCallback = null; - this.screencastFrameHandler = null; - } - /** - * Check if profiling is currently active - */ - isProfilingActive() { - return this.profilingActive; - } - /** - * Start CDP profiling (Tracing) - */ - async startProfiling(options) { - if (this.profilingActive) { - throw new Error('Profiling already active'); - } - const cdp = await this.getCDPSession(); - const dataHandler = (params) => { - if (params.value) { - for (const evt of params.value) { - if (this.profileChunks.length >= BrowserManager.MAX_PROFILE_EVENTS) { - if (!this.profileEventsDropped) { - this.profileEventsDropped = true; - console.warn(`Profiling: exceeded ${BrowserManager.MAX_PROFILE_EVENTS} events, dropping further data`); - } - return; - } - this.profileChunks.push(evt); - } - } - }; - const completeHandler = () => { - if (this.profileCompleteResolver) { - this.profileCompleteResolver(); - } - }; - cdp.on('Tracing.dataCollected', dataHandler); - cdp.on('Tracing.tracingComplete', completeHandler); - const categories = options?.categories ?? [ - 'devtools.timeline', - 'disabled-by-default-devtools.timeline', - 'disabled-by-default-devtools.timeline.frame', - 'disabled-by-default-devtools.timeline.stack', - 'v8.execute', - 'disabled-by-default-v8.cpu_profiler', - 'disabled-by-default-v8.cpu_profiler.hires', - 'v8', - 'disabled-by-default-v8.runtime_stats', - 'blink', - 'blink.user_timing', - 'latencyInfo', - 'renderer.scheduler', - 'sequence_manager', - 'toplevel', - ]; - try { - await cdp.send('Tracing.start', { - traceConfig: { - includedCategories: categories, - enableSampling: true, - }, - transferMode: 'ReportEvents', - }); - } - catch (error) { - cdp.off('Tracing.dataCollected', dataHandler); - cdp.off('Tracing.tracingComplete', completeHandler); - throw error; - } - // Only commit state after the CDP call succeeds - this.profilingActive = true; - this.profileChunks = []; - this.profileEventsDropped = false; - this.profileDataHandler = dataHandler; - this.profileCompleteHandler = completeHandler; - } - /** - * Stop CDP profiling and save to file - */ - async stopProfiling(outputPath) { - if (!this.profilingActive) { - throw new Error('No profiling session active'); - } - const cdp = await this.getCDPSession(); - const TRACE_TIMEOUT_MS = 30_000; - const completePromise = new Promise((resolve, reject) => { - const timer = setTimeout(() => reject(new Error('Profiling data collection timed out')), TRACE_TIMEOUT_MS); - this.profileCompleteResolver = () => { - clearTimeout(timer); - resolve(); - }; - }); - await cdp.send('Tracing.end'); - let chunks; - try { - await completePromise; - chunks = this.profileChunks; - } - finally { - if (this.profileDataHandler) { - cdp.off('Tracing.dataCollected', this.profileDataHandler); - } - if (this.profileCompleteHandler) { - cdp.off('Tracing.tracingComplete', this.profileCompleteHandler); - } - this.profilingActive = false; - this.profileChunks = []; - this.profileEventsDropped = false; - this.profileCompleteResolver = null; - this.profileDataHandler = null; - this.profileCompleteHandler = null; - } - const clockDomain = process.platform === 'linux' - ? 'LINUX_CLOCK_MONOTONIC' - : process.platform === 'darwin' - ? 'MAC_MACH_ABSOLUTE_TIME' - : undefined; - const traceData = { - traceEvents: chunks, - }; - if (clockDomain) { - traceData.metadata = { 'clock-domain': clockDomain }; - } - const dir = path.dirname(outputPath); - await mkdir(dir, { recursive: true }); - await writeFile(outputPath, JSON.stringify(traceData)); - const eventCount = chunks.length; - return { path: outputPath, eventCount }; - } - /** - * Inject a mouse event via CDP - */ - async injectMouseEvent(params) { - const cdp = await this.getCDPSession(); - const cdpButton = params.button === 'left' - ? 'left' - : params.button === 'right' - ? 'right' - : params.button === 'middle' - ? 'middle' - : 'none'; - await cdp.send('Input.dispatchMouseEvent', { - type: params.type, - x: params.x, - y: params.y, - button: cdpButton, - clickCount: params.clickCount ?? 1, - deltaX: params.deltaX ?? 0, - deltaY: params.deltaY ?? 0, - modifiers: params.modifiers ?? 0, - }); - } - /** - * Inject a keyboard event via CDP - */ - async injectKeyboardEvent(params) { - const cdp = await this.getCDPSession(); - await cdp.send('Input.dispatchKeyEvent', { - type: params.type, - key: params.key, - code: params.code, - text: params.text, - modifiers: params.modifiers ?? 0, - }); - } - /** - * Inject touch event via CDP (for mobile emulation) - */ - async injectTouchEvent(params) { - const cdp = await this.getCDPSession(); - await cdp.send('Input.dispatchTouchEvent', { - type: params.type, - touchPoints: params.touchPoints.map((tp, i) => ({ - x: tp.x, - y: tp.y, - id: tp.id ?? i, - })), - modifiers: params.modifiers ?? 0, - }); - } - /** - * Check if video recording is currently active - */ - isRecording() { - return this.recordingContext !== null; - } - /** - * Start recording to a video file using Playwright's native video recording. - * Creates a fresh browser context with video recording enabled. - * Automatically captures current URL and transfers cookies/storage if no URL provided. - * - * @param outputPath - Path to the output video file (will be .webm) - * @param url - Optional URL to navigate to (defaults to current page URL) - */ - async startRecording(outputPath, url) { - if (this.recordingContext) { - throw new Error("Recording already in progress. Run 'record stop' first, or use 'record restart' to stop and start a new recording."); - } - if (!this.browser) { - throw new Error('Browser not launched. Call launch first.'); - } - // Check if output file already exists - if (existsSync(outputPath)) { - throw new Error(`Output file already exists: ${outputPath}`); - } - // Validate output path is .webm (Playwright native format) - if (!outputPath.endsWith('.webm')) { - throw new Error('Playwright native recording only supports WebM format. Please use a .webm extension.'); - } - // Auto-capture current URL if none provided - const currentPage = this.pages.length > 0 ? this.pages[this.activePageIndex] : null; - const currentContext = this.contexts.length > 0 ? this.contexts[0] : null; - if (!url && currentPage) { - const currentUrl = currentPage.url(); - if (currentUrl && currentUrl !== 'about:blank') { - url = currentUrl; - } - } - // Capture state from current context (cookies + storage) - let storageState; - if (currentContext) { - try { - storageState = await currentContext.storageState(); - } - catch { - // Ignore errors - context might be closed or invalid - } - } - // Create a temp directory for video recording - const session = process.env.AGENT_BROWSER_SESSION || 'default'; - this.recordingTempDir = path.join(os.tmpdir(), `agent-browser-recording-${session}-${Date.now()}`); - mkdirSync(this.recordingTempDir, { recursive: true }); - this.recordingOutputPath = outputPath; - // Create a new context with video recording enabled and restored state - const viewport = { width: 1280, height: 720 }; - this.recordingContext = await this.browser.newContext({ - viewport, - recordVideo: { - dir: this.recordingTempDir, - size: viewport, - }, - storageState, - }); - this.recordingContext.setDefaultTimeout(10000); - // Create a page in the recording context - this.recordingPage = await this.recordingContext.newPage(); - // Add the recording context and page to our managed lists - this.contexts.push(this.recordingContext); - this.pages.push(this.recordingPage); - this.activePageIndex = this.pages.length - 1; - // Set up page tracking - this.setupPageTracking(this.recordingPage); - // Invalidate CDP session since we switched pages - await this.invalidateCDPSession(); - // Navigate to URL if provided or captured - if (url) { - await this.recordingPage.goto(url, { waitUntil: 'load' }); - } - } - /** - * Stop recording and save the video file - * @returns Recording result with path - */ - async stopRecording() { - if (!this.recordingContext || !this.recordingPage) { - return { path: '', frames: 0, error: 'No recording in progress' }; - } - const outputPath = this.recordingOutputPath; - try { - // Get the video object before closing the page - const video = this.recordingPage.video(); - // Remove recording page/context from our managed lists before closing - const pageIndex = this.pages.indexOf(this.recordingPage); - if (pageIndex !== -1) { - this.pages.splice(pageIndex, 1); - } - const contextIndex = this.contexts.indexOf(this.recordingContext); - if (contextIndex !== -1) { - this.contexts.splice(contextIndex, 1); - } - // Close the page to finalize the video - await this.recordingPage.close(); - // Save the video to the desired output path - if (video) { - await video.saveAs(outputPath); - } - // Clean up temp directory - if (this.recordingTempDir) { - rmSync(this.recordingTempDir, { recursive: true, force: true }); - } - // Close the recording context - await this.recordingContext.close(); - // Reset recording state - this.recordingContext = null; - this.recordingPage = null; - this.recordingOutputPath = ''; - this.recordingTempDir = ''; - // Adjust active page index - if (this.pages.length > 0) { - this.activePageIndex = Math.min(this.activePageIndex, this.pages.length - 1); - } - else { - this.activePageIndex = 0; - } - // Invalidate CDP session since we may have switched pages - await this.invalidateCDPSession(); - return { path: outputPath, frames: 0 }; // Playwright doesn't expose frame count - } - catch (error) { - // Clean up temp directory on error - if (this.recordingTempDir) { - rmSync(this.recordingTempDir, { recursive: true, force: true }); - } - // Reset state on error - this.recordingContext = null; - this.recordingPage = null; - this.recordingOutputPath = ''; - this.recordingTempDir = ''; - const message = error instanceof Error ? error.message : String(error); - return { path: outputPath, frames: 0, error: message }; - } - } - /** - * Restart recording - stops current recording (if any) and starts a new one. - * Convenience method that combines stopRecording and startRecording. - * - * @param outputPath - Path to the output video file (must be .webm) - * @param url - Optional URL to navigate to (defaults to current page URL) - * @returns Result from stopping the previous recording (if any) - */ - async restartRecording(outputPath, url) { - let previousPath; - let stopped = false; - // Stop current recording if active - if (this.recordingContext) { - const result = await this.stopRecording(); - previousPath = result.path; - stopped = true; - } - // Start new recording - await this.startRecording(outputPath, url); - return { previousPath, stopped }; - } - /** - * Close the browser and clean up - */ - async close() { - // Stop recording if active (saves video) - if (this.recordingContext) { - await this.stopRecording(); - } - // Stop screencast if active - if (this.screencastActive) { - await this.stopScreencast(); - } - // Clean up profiling state if active (without saving) - if (this.profilingActive) { - const cdp = this.cdpSession; - if (cdp) { - if (this.profileDataHandler) { - cdp.off('Tracing.dataCollected', this.profileDataHandler); - } - if (this.profileCompleteHandler) { - cdp.off('Tracing.tracingComplete', this.profileCompleteHandler); - } - await cdp.send('Tracing.end').catch(() => { }); - } - this.profilingActive = false; - this.profileChunks = []; - this.profileEventsDropped = false; - this.profileCompleteResolver = null; - this.profileDataHandler = null; - this.profileCompleteHandler = null; - } - // Clean up CDP session - if (this.cdpSession) { - await this.cdpSession.detach().catch(() => { }); - this.cdpSession = null; - } - if (this.browserbaseSessionId && this.browserbaseApiKey) { - await this.closeBrowserbaseSession(this.browserbaseSessionId, this.browserbaseApiKey).catch((error) => { - console.error('Failed to close Browserbase session:', error); - }); - this.browser = null; - } - else if (this.browserUseSessionId && this.browserUseApiKey) { - await this.closeBrowserUseSession(this.browserUseSessionId, this.browserUseApiKey).catch((error) => { - console.error('Failed to close Browser Use session:', error); - }); - this.browser = null; - } - else if (this.kernelSessionId && this.kernelApiKey) { - await this.closeKernelSession(this.kernelSessionId, this.kernelApiKey).catch((error) => { - console.error('Failed to close Kernel session:', error); - }); - this.browser = null; - } - else if (this.cdpEndpoint !== null) { - // CDP: only disconnect, don't close external app's pages - if (this.browser) { - await this.browser.close().catch(() => { }); - this.browser = null; - } - } - else { - // Regular browser: close everything - for (const page of this.pages) { - await page.close().catch(() => { }); - } - for (const context of this.contexts) { - await context.close().catch(() => { }); - } - if (this.browser) { - await this.browser.close().catch(() => { }); - this.browser = null; - } - } - this.pages = []; - this.contexts = []; - this.cdpEndpoint = null; - this.browserbaseSessionId = null; - this.browserbaseApiKey = null; - this.browserUseSessionId = null; - this.browserUseApiKey = null; - this.kernelSessionId = null; - this.kernelApiKey = null; - this.isPersistentContext = false; - this.activePageIndex = 0; - this.colorScheme = null; - this.refMap = {}; - this.lastSnapshot = ''; - this.frameCallback = null; - } -} -//# sourceMappingURL=browser.js.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/browser.js.map b/vendor/agent-browser/dist/browser.js.map deleted file mode 100644 index 8c1097e..0000000 --- a/vendor/agent-browser/dist/browser.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/confirmation.d.ts b/vendor/agent-browser/dist/confirmation.d.ts deleted file mode 100644 index 99ef0c7..0000000 --- a/vendor/agent-browser/dist/confirmation.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -export declare function requestConfirmation(action: string, category: string, description: string, command: Record): { - confirmationId: string; -}; -export declare function getAndRemovePending(id: string): { - command: Record; - action: string; -} | null; -//# sourceMappingURL=confirmation.d.ts.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/confirmation.d.ts.map b/vendor/agent-browser/dist/confirmation.d.ts.map deleted file mode 100644 index 9d97506..0000000 --- a/vendor/agent-browser/dist/confirmation.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"confirmation.d.ts","sourceRoot":"","sources":["../src/confirmation.ts"],"names":[],"mappings":"AAmBA,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B;IAAE,cAAc,EAAE,MAAM,CAAA;CAAE,CAiB5B;AAED,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,MAAM,GACT;IAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAO7D"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/confirmation.js b/vendor/agent-browser/dist/confirmation.js deleted file mode 100644 index e262efe..0000000 --- a/vendor/agent-browser/dist/confirmation.js +++ /dev/null @@ -1,30 +0,0 @@ -import { randomBytes } from 'node:crypto'; -const AUTO_DENY_TIMEOUT_MS = 60_000; -const pending = new Map(); -function generateId() { - return `c_${randomBytes(8).toString('hex')}`; -} -export function requestConfirmation(action, category, description, command) { - const id = generateId(); - const timer = setTimeout(() => { - pending.delete(id); - }, AUTO_DENY_TIMEOUT_MS); - pending.set(id, { - id, - action, - category, - description, - command, - timer, - }); - return { confirmationId: id }; -} -export function getAndRemovePending(id) { - const entry = pending.get(id); - if (!entry) - return null; - clearTimeout(entry.timer); - pending.delete(id); - return { command: entry.command, action: entry.action }; -} -//# sourceMappingURL=confirmation.js.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/confirmation.js.map b/vendor/agent-browser/dist/confirmation.js.map deleted file mode 100644 index 15645d2..0000000 --- a/vendor/agent-browser/dist/confirmation.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"confirmation.js","sourceRoot":"","sources":["../src/confirmation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAW1C,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAEpC,MAAM,OAAO,GAAG,IAAI,GAAG,EAA+B,CAAC;AAEvD,SAAS,UAAU;IACjB,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,MAAc,EACd,QAAgB,EAChB,WAAmB,EACnB,OAAgC;IAEhC,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;IAExB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;QAC5B,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACrB,CAAC,EAAE,oBAAoB,CAAC,CAAC;IAEzB,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE;QACd,EAAE;QACF,MAAM;QACN,QAAQ;QACR,WAAW;QACX,OAAO;QACP,KAAK;KACN,CAAC,CAAC;IAEH,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,EAAU;IAEV,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1B,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACnB,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;AAC1D,CAAC"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/daemon.d.ts b/vendor/agent-browser/dist/daemon.d.ts deleted file mode 100644 index d65faca..0000000 --- a/vendor/agent-browser/dist/daemon.d.ts +++ /dev/null @@ -1,66 +0,0 @@ -import * as net from 'net'; -/** - * Backpressure-aware socket write. - * If the kernel buffer is full (socket.write returns false), - * waits for the 'drain' event before resolving. - */ -export declare function safeWrite(socket: net.Socket, payload: string): Promise; -/** - * Set the current session - */ -export declare function setSession(session: string): void; -/** - * Get the current session - */ -export declare function getSession(): string; -/** - * Get the base directory for socket/pid files. - * Priority: AGENT_BROWSER_SOCKET_DIR > XDG_RUNTIME_DIR > ~/.agent-browser > tmpdir - */ -export declare function getAppDir(): string; -export declare function getSocketDir(): string; -/** - * Get the socket path for the current session (Unix) or port (Windows) - */ -export declare function getSocketPath(session?: string): string; -/** - * Get the port file path for Windows (stores the port number) - */ -export declare function getPortFile(session?: string): string; -/** - * Get the PID file path for the current session - */ -export declare function getPidFile(session?: string): string; -/** - * Check if daemon is running for the current session - */ -export declare function isDaemonRunning(session?: string): boolean; -/** - * Get connection info for the current session - * Returns { type: 'unix', path: string } or { type: 'tcp', port: number } - */ -export declare function getConnectionInfo(session?: string): { - type: 'unix'; - path: string; -} | { - type: 'tcp'; - port: number; -}; -/** - * Clean up socket and PID file for the current session - */ -export declare function cleanupSocket(session?: string): void; -/** - * Get the stream port file path - */ -export declare function getStreamPortFile(session?: string): string; -/** - * Start the daemon server - * @param options.streamPort Port for WebSocket stream server (0 to disable) - * @param options.provider Provider type ('ios' for iOS Simulator, undefined for desktop) - */ -export declare function startDaemon(options?: { - streamPort?: number; - provider?: string; -}): Promise; -//# sourceMappingURL=daemon.d.ts.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/daemon.d.ts.map b/vendor/agent-browser/dist/daemon.d.ts.map deleted file mode 100644 index b811513..0000000 --- a/vendor/agent-browser/dist/daemon.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAuB3B;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkC5E;AA2GD;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAgBD;;;GAGG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAclC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAMrC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAMtD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAmBzD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,CAAC,EAAE,MAAM,GACf;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAMhE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAgBpD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,OAAO,CAAC,EAAE;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiXhB"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/daemon.js b/vendor/agent-browser/dist/daemon.js deleted file mode 100644 index 778b4c8..0000000 --- a/vendor/agent-browser/dist/daemon.js +++ /dev/null @@ -1,609 +0,0 @@ -import * as net from 'net'; -import * as fs from 'fs'; -import * as path from 'path'; -import * as os from 'os'; -import { BrowserManager } from './browser.js'; -import { IOSManager } from './ios-manager.js'; -import { parseCommand, serializeResponse, errorResponse } from './protocol.js'; -import { executeCommand, initActionPolicy } from './actions.js'; -import { executeIOSCommand } from './ios-actions.js'; -import { StreamServer } from './stream-server.js'; -import { getEncryptionKey, encryptData, isValidSessionName, cleanupExpiredStates, getAutoStateFilePath, } from './state-utils.js'; -/** - * Backpressure-aware socket write. - * If the kernel buffer is full (socket.write returns false), - * waits for the 'drain' event before resolving. - */ -export function safeWrite(socket, payload) { - return new Promise((resolve, reject) => { - if (socket.destroyed) { - resolve(); - return; - } - const canContinue = socket.write(payload); - if (canContinue) { - resolve(); - } - else if (socket.destroyed) { - resolve(); - } - else { - const cleanup = () => { - socket.removeListener('drain', onDrain); - socket.removeListener('error', onError); - socket.removeListener('close', onClose); - }; - const onDrain = () => { - cleanup(); - resolve(); - }; - const onError = (err) => { - cleanup(); - reject(err); - }; - const onClose = () => { - cleanup(); - resolve(); - }; - socket.once('drain', onDrain); - socket.once('error', onError); - socket.once('close', onClose); - } - }); -} -// Platform detection -const isWindows = process.platform === 'win32'; -// Session support - each session gets its own socket/pid -let currentSession = process.env.AGENT_BROWSER_SESSION || 'default'; -// Stream server for browser preview -let streamServer = null; -// Default stream port (can be overridden with AGENT_BROWSER_STREAM_PORT) -const DEFAULT_STREAM_PORT = 9223; -/** - * Save state to file with optional encryption. - */ -async function saveStateToFile(browser, filepath) { - const context = browser.getContext(); - if (!context) { - throw new Error('No browser context available'); - } - const state = await context.storageState(); - const jsonData = JSON.stringify(state, null, 2); - const key = getEncryptionKey(); - if (key) { - const encrypted = encryptData(jsonData, key); - fs.writeFileSync(filepath, JSON.stringify(encrypted, null, 2)); - return { encrypted: true }; - } - fs.writeFileSync(filepath, jsonData); - return { encrypted: false }; -} -const AUTO_EXPIRE_ENV = 'AGENT_BROWSER_STATE_EXPIRE_DAYS'; -const DEFAULT_EXPIRE_DAYS = 30; -function runCleanupExpiredStates() { - const expireDaysStr = process.env[AUTO_EXPIRE_ENV]; - const expireDays = expireDaysStr ? parseInt(expireDaysStr, 10) : DEFAULT_EXPIRE_DAYS; - if (isNaN(expireDays) || expireDays <= 0) { - return; - } - try { - const deleted = cleanupExpiredStates(expireDays); - if (deleted.length > 0 && process.env.AGENT_BROWSER_DEBUG === '1') { - console.error(`[DEBUG] Auto-expired ${deleted.length} state file(s) older than ${expireDays} days`); - } - } - catch (err) { - if (process.env.AGENT_BROWSER_DEBUG === '1') { - console.error(`[DEBUG] Failed to clean up expired states:`, err); - } - } -} -/** - * Get the validated session name and auto-state file path. - * Centralizes session name validation to prevent path traversal. - */ -function getSessionAutoStatePath() { - const sessionNameRaw = process.env.AGENT_BROWSER_SESSION_NAME; - if (!sessionNameRaw) - return undefined; - if (!isValidSessionName(sessionNameRaw)) { - if (process.env.AGENT_BROWSER_DEBUG === '1') { - console.error(`[SECURITY] Invalid session name rejected: ${sessionNameRaw}`); - } - return undefined; - } - const sessionId = process.env.AGENT_BROWSER_SESSION || 'default'; - try { - const autoStatePath = getAutoStateFilePath(sessionNameRaw, sessionId); - return autoStatePath && fs.existsSync(autoStatePath) ? autoStatePath : undefined; - } - catch { - return undefined; - } -} -/** - * Get the auto-state file path for saving (creates sessions dir if needed). - * Returns undefined if no valid session name is configured. - */ -function getSessionSaveStatePath() { - const sessionNameRaw = process.env.AGENT_BROWSER_SESSION_NAME; - if (!sessionNameRaw) - return undefined; - if (!isValidSessionName(sessionNameRaw)) - return undefined; - const sessionId = process.env.AGENT_BROWSER_SESSION || 'default'; - try { - return getAutoStateFilePath(sessionNameRaw, sessionId) ?? undefined; - } - catch { - return undefined; - } -} -/** - * Set the current session - */ -export function setSession(session) { - currentSession = session; -} -/** - * Get the current session - */ -export function getSession() { - return currentSession; -} -/** - * Get port number for TCP mode (Windows) - * Uses a hash of the session name to get a consistent port - */ -function getPortForSession(session) { - let hash = 0; - for (let i = 0; i < session.length; i++) { - hash = (hash << 5) - hash + session.charCodeAt(i); - hash |= 0; - } - // Port range 49152-65535 (dynamic/private ports) - return 49152 + (Math.abs(hash) % 16383); -} -/** - * Get the base directory for socket/pid files. - * Priority: AGENT_BROWSER_SOCKET_DIR > XDG_RUNTIME_DIR > ~/.agent-browser > tmpdir - */ -export function getAppDir() { - // 1. XDG_RUNTIME_DIR (Linux standard) - if (process.env.XDG_RUNTIME_DIR) { - return path.join(process.env.XDG_RUNTIME_DIR, 'agent-browser'); - } - // 2. Home directory fallback (like Docker Desktop's ~/.docker/run/) - const homeDir = os.homedir(); - if (homeDir) { - return path.join(homeDir, '.agent-browser'); - } - // 3. Last resort: temp dir - return path.join(os.tmpdir(), 'agent-browser'); -} -export function getSocketDir() { - // Allow explicit override for socket directory - if (process.env.AGENT_BROWSER_SOCKET_DIR) { - return process.env.AGENT_BROWSER_SOCKET_DIR; - } - return getAppDir(); -} -/** - * Get the socket path for the current session (Unix) or port (Windows) - */ -export function getSocketPath(session) { - const sess = session ?? currentSession; - if (isWindows) { - return String(getPortForSession(sess)); - } - return path.join(getSocketDir(), `${sess}.sock`); -} -/** - * Get the port file path for Windows (stores the port number) - */ -export function getPortFile(session) { - const sess = session ?? currentSession; - return path.join(getSocketDir(), `${sess}.port`); -} -/** - * Get the PID file path for the current session - */ -export function getPidFile(session) { - const sess = session ?? currentSession; - return path.join(getSocketDir(), `${sess}.pid`); -} -/** - * Check if daemon is running for the current session - */ -export function isDaemonRunning(session) { - const pidFile = getPidFile(session); - if (!fs.existsSync(pidFile)) - return false; - try { - const pid = parseInt(fs.readFileSync(pidFile, 'utf8').trim(), 10); - // Check if process exists (works on both Unix and Windows) - process.kill(pid, 0); - return true; - } - catch (err) { - // EPERM means the process exists but we lack permission to signal it - // (e.g. caller is inside a macOS sandbox). Only ESRCH means it's gone. - if (err instanceof Error && err.code === 'EPERM') { - return true; - } - // Process doesn't exist, clean up stale files - cleanupSocket(session); - return false; - } -} -/** - * Get connection info for the current session - * Returns { type: 'unix', path: string } or { type: 'tcp', port: number } - */ -export function getConnectionInfo(session) { - const sess = session ?? currentSession; - if (isWindows) { - return { type: 'tcp', port: getPortForSession(sess) }; - } - return { type: 'unix', path: path.join(getSocketDir(), `${sess}.sock`) }; -} -/** - * Clean up socket and PID file for the current session - */ -export function cleanupSocket(session) { - const pidFile = getPidFile(session); - const streamPortFile = getStreamPortFile(session); - try { - if (fs.existsSync(pidFile)) - fs.unlinkSync(pidFile); - if (fs.existsSync(streamPortFile)) - fs.unlinkSync(streamPortFile); - if (isWindows) { - const portFile = getPortFile(session); - if (fs.existsSync(portFile)) - fs.unlinkSync(portFile); - } - else { - const socketPath = getSocketPath(session); - if (fs.existsSync(socketPath)) - fs.unlinkSync(socketPath); - } - } - catch { - // Ignore cleanup errors - } -} -/** - * Get the stream port file path - */ -export function getStreamPortFile(session) { - const sess = session ?? currentSession; - return path.join(getSocketDir(), `${sess}.stream`); -} -/** - * Start the daemon server - * @param options.streamPort Port for WebSocket stream server (0 to disable) - * @param options.provider Provider type ('ios' for iOS Simulator, undefined for desktop) - */ -export async function startDaemon(options) { - // Ensure socket directory exists with restricted permissions (owner-only access) - const socketDir = getSocketDir(); - if (!fs.existsSync(socketDir)) { - fs.mkdirSync(socketDir, { recursive: true, mode: 0o700 }); - } - // Clean up any stale socket - cleanupSocket(); - // Clean up expired state files on startup - runCleanupExpiredStates(); - // Initialize action policy enforcement - initActionPolicy(); - // Determine provider from options or environment - const provider = options?.provider ?? process.env.AGENT_BROWSER_PROVIDER; - const isIOS = provider === 'ios'; - // Create appropriate manager - const manager = isIOS ? new IOSManager() : new BrowserManager(); - let shuttingDown = false; - // Start stream server if port is specified (or use default if env var is set) - // Note: Stream server only works with BrowserManager (desktop), not iOS - const streamPort = options?.streamPort ?? - (process.env.AGENT_BROWSER_STREAM_PORT - ? parseInt(process.env.AGENT_BROWSER_STREAM_PORT, 10) - : 0); - if (streamPort > 0 && !isIOS && manager instanceof BrowserManager) { - streamServer = new StreamServer(manager, streamPort); - await streamServer.start(); - // Write stream port to file for clients to discover - const streamPortFile = getStreamPortFile(); - fs.writeFileSync(streamPortFile, streamPort.toString()); - } - const server = net.createServer((socket) => { - let buffer = ''; - let httpChecked = false; - // Command serialization: queue incoming lines and process them one at a time. - // This prevents concurrent command execution which can cause socket.write - // buffer contention and EAGAIN errors on the Rust CLI side. - const commandQueue = []; - let processing = false; - async function processQueue() { - if (processing) - return; - processing = true; - while (commandQueue.length > 0) { - const line = commandQueue.shift(); - try { - const parseResult = parseCommand(line); - if (!parseResult.success) { - const resp = errorResponse(parseResult.id ?? 'unknown', parseResult.error); - await safeWrite(socket, serializeResponse(resp) + '\n'); - continue; - } - // Handle device_list specially - it works without a session and always uses IOSManager - if (parseResult.command.action === 'device_list') { - const iosManager = new IOSManager(); - try { - const devices = await iosManager.listAllDevices(); - const response = { - id: parseResult.command.id, - success: true, - data: { devices }, - }; - await safeWrite(socket, serializeResponse(response) + '\n'); - } - catch (err) { - const message = err instanceof Error ? err.message : String(err); - await safeWrite(socket, serializeResponse(errorResponse(parseResult.command.id, message)) + '\n'); - } - continue; - } - // Auto-launch if not already launched and this isn't a launch/close/state_load command - if (!manager.isLaunched() && - parseResult.command.action !== 'launch' && - parseResult.command.action !== 'close' && - parseResult.command.action !== 'state_load') { - if (isIOS && manager instanceof IOSManager) { - // Auto-launch iOS Safari - // Check for device in command first (for reused daemons), then fall back to env vars - const cmd = parseResult.command; - const iosDevice = cmd.iosDevice || process.env.AGENT_BROWSER_IOS_DEVICE; - await manager.launch({ - device: iosDevice, - udid: process.env.AGENT_BROWSER_IOS_UDID, - }); - } - else if (manager instanceof BrowserManager) { - // Auto-launch desktop browser - const extensions = process.env.AGENT_BROWSER_EXTENSIONS - ? process.env.AGENT_BROWSER_EXTENSIONS.split(',') - .map((p) => p.trim()) - .filter(Boolean) - : undefined; - // Parse args from env (comma or newline separated) - const argsEnv = process.env.AGENT_BROWSER_ARGS; - const args = argsEnv - ? argsEnv - .split(/[,\n]/) - .map((a) => a.trim()) - .filter((a) => a.length > 0) - : undefined; - // Parse proxy from env - const proxyServer = process.env.AGENT_BROWSER_PROXY; - const proxyBypass = process.env.AGENT_BROWSER_PROXY_BYPASS; - const proxy = proxyServer - ? { - server: proxyServer, - ...(proxyBypass && { bypass: proxyBypass }), - } - : undefined; - const ignoreHTTPSErrors = process.env.AGENT_BROWSER_IGNORE_HTTPS_ERRORS === '1'; - const allowFileAccess = process.env.AGENT_BROWSER_ALLOW_FILE_ACCESS === '1'; - const colorSchemeEnv = process.env.AGENT_BROWSER_COLOR_SCHEME; - const colorScheme = colorSchemeEnv === 'dark' || - colorSchemeEnv === 'light' || - colorSchemeEnv === 'no-preference' - ? colorSchemeEnv - : undefined; - await manager.launch({ - id: 'auto', - action: 'launch', - headless: process.env.AGENT_BROWSER_HEADED !== '1', - executablePath: process.env.AGENT_BROWSER_EXECUTABLE_PATH, - extensions: extensions, - profile: process.env.AGENT_BROWSER_PROFILE, - storageState: process.env.AGENT_BROWSER_STATE, - args, - userAgent: process.env.AGENT_BROWSER_USER_AGENT, - proxy, - ignoreHTTPSErrors: ignoreHTTPSErrors, - allowFileAccess: allowFileAccess, - colorScheme, - autoStateFilePath: getSessionAutoStatePath(), - }); - } - } - // Recover from stale state: browser is launched but all pages were closed - if (manager instanceof BrowserManager && - manager.isLaunched() && - !manager.hasPages() && - parseResult.command.action !== 'launch' && - parseResult.command.action !== 'close') { - await manager.ensurePage(); - } - // Handle explicit launch with auto-load state - if (parseResult.command.action === 'launch' && - manager instanceof BrowserManager && - !parseResult.command.autoStateFilePath) { - const autoStatePath = getSessionAutoStatePath(); - if (autoStatePath) { - parseResult.command.autoStateFilePath = autoStatePath; - } - } - // Handle close command specially - shuts down daemon - if (parseResult.command.action === 'close') { - // Auto-save state before closing - if (manager instanceof BrowserManager && manager.isLaunched()) { - const savePath = getSessionSaveStatePath(); - if (savePath) { - try { - const { encrypted } = await saveStateToFile(manager, savePath); - fs.chmodSync(savePath, 0o600); - if (process.env.AGENT_BROWSER_DEBUG === '1') { - console.error(`Auto-saved session state: ${savePath}${encrypted ? ' (encrypted)' : ''}`); - } - } - catch (err) { - if (process.env.AGENT_BROWSER_DEBUG === '1') { - console.error(`Failed to auto-save session state:`, err); - } - } - } - } - const response = isIOS && manager instanceof IOSManager - ? await executeIOSCommand(parseResult.command, manager) - : await executeCommand(parseResult.command, manager); - await safeWrite(socket, serializeResponse(response) + '\n'); - if (!shuttingDown) { - shuttingDown = true; - setTimeout(() => { - server.close(); - cleanupSocket(); - process.exit(0); - }, 100); - } - commandQueue.length = 0; - processing = false; - return; - } - // Execute command with appropriate handler - const response = isIOS && manager instanceof IOSManager - ? await executeIOSCommand(parseResult.command, manager) - : await executeCommand(parseResult.command, manager); - // Add any launch warnings to the response - if (manager instanceof BrowserManager) { - const warnings = manager.getAndClearWarnings(); - if (warnings.length > 0 && response.success && response.data) { - response.data.warnings = warnings; - } - } - await safeWrite(socket, serializeResponse(response) + '\n'); - } - catch (err) { - const message = err instanceof Error ? err.message : String(err); - await safeWrite(socket, serializeResponse(errorResponse('error', message)) + '\n').catch(() => { }); // Socket may already be destroyed - } - } - processing = false; - } - socket.on('data', (data) => { - buffer += data.toString(); - // Security: Detect and reject HTTP requests to prevent cross-origin attacks. - // Browsers using fetch() must send HTTP headers (e.g., "POST / HTTP/1.1"), - // while legitimate clients send raw JSON starting with "{". - if (!httpChecked) { - httpChecked = true; - const trimmed = buffer.trimStart(); - if (/^(GET|POST|PUT|DELETE|HEAD|OPTIONS|PATCH|CONNECT|TRACE)\s/i.test(trimmed)) { - socket.destroy(); - return; - } - } - // Extract complete lines and enqueue them for serial processing - while (buffer.includes('\n')) { - const newlineIdx = buffer.indexOf('\n'); - const line = buffer.substring(0, newlineIdx); - buffer = buffer.substring(newlineIdx + 1); - if (!line.trim()) - continue; - commandQueue.push(line); - } - processQueue().catch((err) => { - // Socket write failures during queue processing are non-fatal; - // the client has likely disconnected. - // Only log err.message to avoid leaking sensitive fields (e.g. passwords) from command objects. - console.warn('[warn] processQueue error:', err?.message ?? String(err)); - if (process.env.AGENT_BROWSER_DEBUG === '1') { - console.error('[DEBUG] processQueue error stack:', err?.stack ?? err?.message ?? String(err)); - } - }); - }); - socket.on('error', () => { - // Client disconnected, ignore - }); - }); - const pidFile = getPidFile(); - // Write PID file before listening - fs.writeFileSync(pidFile, process.pid.toString()); - if (isWindows) { - // Windows: use TCP socket on localhost - const port = getPortForSession(currentSession); - const portFile = getPortFile(); - fs.writeFileSync(portFile, port.toString()); - server.listen(port, '127.0.0.1', () => { - // Daemon is ready on TCP port - }); - } - else { - // Unix: use Unix domain socket - const socketPath = getSocketPath(); - server.listen(socketPath, () => { - // Daemon is ready - }); - } - server.on('error', (err) => { - console.error('Server error:', err); - cleanupSocket(); - process.exit(1); - }); - // Handle shutdown signals - const shutdown = async () => { - if (shuttingDown) - return; - shuttingDown = true; - // Stop stream server if running - if (streamServer) { - await streamServer.stop(); - streamServer = null; - // Clean up stream port file - const streamPortFile = getStreamPortFile(); - try { - if (fs.existsSync(streamPortFile)) - fs.unlinkSync(streamPortFile); - } - catch { - // Ignore cleanup errors - } - } - await manager.close(); - server.close(); - cleanupSocket(); - process.exit(0); - }; - process.on('SIGINT', shutdown); - process.on('SIGTERM', shutdown); - process.on('SIGHUP', shutdown); - // Handle unexpected errors - always cleanup - process.on('uncaughtException', (err) => { - console.error('Uncaught exception:', err); - cleanupSocket(); - process.exit(1); - }); - process.on('unhandledRejection', (reason) => { - console.error('Unhandled rejection:', reason); - cleanupSocket(); - process.exit(1); - }); - // Cleanup on normal exit - process.on('exit', () => { - cleanupSocket(); - }); - // Keep process alive - process.stdin.resume(); -} -// Run daemon if this is the entry point -if (process.argv[1]?.endsWith('daemon.js') || process.env.AGENT_BROWSER_DAEMON === '1') { - startDaemon().catch((err) => { - console.error('Daemon error:', err); - cleanupSocket(); - process.exit(1); - }); -} -//# sourceMappingURL=daemon.js.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/daemon.js.map b/vendor/agent-browser/dist/daemon.js.map deleted file mode 100644 index 6501316..0000000 --- a/vendor/agent-browser/dist/daemon.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAC3B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAGL,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAK1B;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,MAAkB,EAAE,OAAe;IAC3D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,OAAO,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,EAAE,CAAC;QACZ,CAAC;aAAM,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YAC5B,OAAO,EAAE,CAAC;QACZ,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACxC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACxC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC1C,CAAC,CAAC;YACF,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC;YACF,MAAM,OAAO,GAAG,CAAC,GAAU,EAAE,EAAE;gBAC7B,OAAO,EAAE,CAAC;gBACV,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC,CAAC;YACF,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,qBAAqB;AACrB,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;AAE/C,yDAAyD;AACzD,IAAI,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,SAAS,CAAC;AAEpE,oCAAoC;AACpC,IAAI,YAAY,GAAwB,IAAI,CAAC;AAE7C,yEAAyE;AACzE,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAEjC;;GAEG;AACH,KAAK,UAAU,eAAe,CAC5B,OAAuB,EACvB,QAAgB;IAEhB,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IACrC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAEhD,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;IAC/B,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC7C,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/D,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACrC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,eAAe,GAAG,iCAAiC,CAAC;AAC1D,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAE/B,SAAS,uBAAuB;IAC9B,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC;IAErF,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;QACzC,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;QACjD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,GAAG,EAAE,CAAC;YAClE,OAAO,CAAC,KAAK,CACX,wBAAwB,OAAO,CAAC,MAAM,6BAA6B,UAAU,OAAO,CACrF,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,GAAG,EAAE,CAAC;YAC5C,OAAO,CAAC,KAAK,CAAC,4CAA4C,EAAE,GAAG,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,uBAAuB;IAC9B,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;IAC9D,IAAI,CAAC,cAAc;QAAE,OAAO,SAAS,CAAC;IAEtC,IAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC,EAAE,CAAC;QACxC,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,GAAG,EAAE,CAAC;YAC5C,OAAO,CAAC,KAAK,CAAC,6CAA6C,cAAc,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,SAAS,CAAC;IACjE,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,oBAAoB,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;QACtE,OAAO,aAAa,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;IACnF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,uBAAuB;IAC9B,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;IAC9D,IAAI,CAAC,cAAc;QAAE,OAAO,SAAS,CAAC;IAEtC,IAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC;QAAE,OAAO,SAAS,CAAC;IAE1D,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,SAAS,CAAC;IACjE,IAAI,CAAC;QACH,OAAO,oBAAoB,CAAC,cAAc,EAAE,SAAS,CAAC,IAAI,SAAS,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,cAAc,GAAG,OAAO,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,OAAe;IACxC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAClD,IAAI,IAAI,CAAC,CAAC;IACZ,CAAC;IACD,iDAAiD;IACjD,OAAO,KAAK,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;AAC1C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS;IACvB,sCAAsC;IACtC,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;IACjE,CAAC;IAED,oEAAoE;IACpE,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC7B,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IAC9C,CAAC;IAED,2BAA2B;IAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,+CAA+C;IAC/C,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC;QACzC,OAAO,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;IAC9C,CAAC;IACD,OAAO,SAAS,EAAE,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,MAAM,IAAI,GAAG,OAAO,IAAI,cAAc,CAAC;IACvC,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,MAAM,IAAI,GAAG,OAAO,IAAI,cAAc,CAAC;IACvC,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,OAAgB;IACzC,MAAM,IAAI,GAAG,OAAO,IAAI,cAAc,CAAC;IACvC,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAE1C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAClE,2DAA2D;QAC3D,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,qEAAqE;QACrE,uEAAuE;QACvE,IAAI,GAAG,YAAY,KAAK,IAAK,GAA6B,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5E,OAAO,IAAI,CAAC;QACd,CAAC;QACD,8CAA8C;QAC9C,aAAa,CAAC,OAAO,CAAC,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAgB;IAEhB,MAAM,IAAI,GAAG,OAAO,IAAI,cAAc,CAAC;IACvC,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;IACxD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,IAAI,OAAO,CAAC,EAAE,CAAC;AAC3E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACpC,MAAM,cAAc,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC;YAAE,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;QACjE,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;YACtC,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;gBAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;gBAAE,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,wBAAwB;IAC1B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,MAAM,IAAI,GAAG,OAAO,IAAI,cAAc,CAAC;IACvC,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,IAAI,SAAS,CAAC,CAAC;AACrD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAGjC;IACC,iFAAiF;IACjF,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,4BAA4B;IAC5B,aAAa,EAAE,CAAC;IAEhB,0CAA0C;IAC1C,uBAAuB,EAAE,CAAC;IAE1B,uCAAuC;IACvC,gBAAgB,EAAE,CAAC;IAEnB,iDAAiD;IACjD,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IACzE,MAAM,KAAK,GAAG,QAAQ,KAAK,KAAK,CAAC;IAEjC,6BAA6B;IAC7B,MAAM,OAAO,GAAY,KAAK,CAAC,CAAC,CAAC,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,cAAc,EAAE,CAAC;IACzE,IAAI,YAAY,GAAG,KAAK,CAAC;IAEzB,8EAA8E;IAC9E,wEAAwE;IACxE,MAAM,UAAU,GACd,OAAO,EAAE,UAAU;QACnB,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB;YACpC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,EAAE,CAAC;YACrD,CAAC,CAAC,CAAC,CAAC,CAAC;IAET,IAAI,UAAU,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,YAAY,cAAc,EAAE,CAAC;QAClE,YAAY,GAAG,IAAI,YAAY,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACrD,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;QAE3B,oDAAoD;QACpD,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;QAC3C,EAAE,CAAC,aAAa,CAAC,cAAc,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,EAAE;QACzC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,WAAW,GAAG,KAAK,CAAC;QAExB,8EAA8E;QAC9E,0EAA0E;QAC1E,4DAA4D;QAC5D,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,IAAI,UAAU,GAAG,KAAK,CAAC;QAEvB,KAAK,UAAU,YAAY;YACzB,IAAI,UAAU;gBAAE,OAAO;YACvB,UAAU,GAAG,IAAI,CAAC;YAElB,OAAO,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,EAAG,CAAC;gBAEnC,IAAI,CAAC;oBACH,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;oBAEvC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;wBACzB,MAAM,IAAI,GAAG,aAAa,CAAC,WAAW,CAAC,EAAE,IAAI,SAAS,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;wBAC3E,MAAM,SAAS,CAAC,MAAM,EAAE,iBAAiB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;wBACxD,SAAS;oBACX,CAAC;oBAED,uFAAuF;oBACvF,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;wBACjD,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;wBACpC,IAAI,CAAC;4BACH,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,cAAc,EAAE,CAAC;4BAClD,MAAM,QAAQ,GAAG;gCACf,EAAE,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE;gCAC1B,OAAO,EAAE,IAAa;gCACtB,IAAI,EAAE,EAAE,OAAO,EAAE;6BAClB,CAAC;4BACF,MAAM,SAAS,CAAC,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;wBAC9D,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;4BACjE,MAAM,SAAS,CACb,MAAM,EACN,iBAAiB,CAAC,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,CACzE,CAAC;wBACJ,CAAC;wBACD,SAAS;oBACX,CAAC;oBAED,uFAAuF;oBACvF,IACE,CAAC,OAAO,CAAC,UAAU,EAAE;wBACrB,WAAW,CAAC,OAAO,CAAC,MAAM,KAAK,QAAQ;wBACvC,WAAW,CAAC,OAAO,CAAC,MAAM,KAAK,OAAO;wBACtC,WAAW,CAAC,OAAO,CAAC,MAAM,KAAK,YAAY,EAC3C,CAAC;wBACD,IAAI,KAAK,IAAI,OAAO,YAAY,UAAU,EAAE,CAAC;4BAC3C,yBAAyB;4BACzB,qFAAqF;4BACrF,MAAM,GAAG,GAAG,WAAW,CAAC,OAAiC,CAAC;4BAC1D,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;4BACxE,MAAM,OAAO,CAAC,MAAM,CAAC;gCACnB,MAAM,EAAE,SAAS;gCACjB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB;6BACzC,CAAC,CAAC;wBACL,CAAC;6BAAM,IAAI,OAAO,YAAY,cAAc,EAAE,CAAC;4BAC7C,8BAA8B;4BAC9B,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB;gCACrD,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,KAAK,CAAC,GAAG,CAAC;qCAC5C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;qCACpB,MAAM,CAAC,OAAO,CAAC;gCACpB,CAAC,CAAC,SAAS,CAAC;4BAEd,mDAAmD;4BACnD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;4BAC/C,MAAM,IAAI,GAAG,OAAO;gCAClB,CAAC,CAAC,OAAO;qCACJ,KAAK,CAAC,OAAO,CAAC;qCACd,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;qCACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;gCAChC,CAAC,CAAC,SAAS,CAAC;4BAEd,uBAAuB;4BACvB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;4BACpD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;4BAC3D,MAAM,KAAK,GAAG,WAAW;gCACvB,CAAC,CAAC;oCACE,MAAM,EAAE,WAAW;oCACnB,GAAG,CAAC,WAAW,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;iCAC5C;gCACH,CAAC,CAAC,SAAS,CAAC;4BAEd,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,iCAAiC,KAAK,GAAG,CAAC;4BAChF,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,+BAA+B,KAAK,GAAG,CAAC;4BAC5E,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;4BAC9D,MAAM,WAAW,GACf,cAAc,KAAK,MAAM;gCACzB,cAAc,KAAK,OAAO;gCAC1B,cAAc,KAAK,eAAe;gCAChC,CAAC,CAAC,cAAc;gCAChB,CAAC,CAAC,SAAS,CAAC;4BAChB,MAAM,OAAO,CAAC,MAAM,CAAC;gCACnB,EAAE,EAAE,MAAM;gCACV,MAAM,EAAE,QAAiB;gCACzB,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,GAAG;gCAClD,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,6BAA6B;gCACzD,UAAU,EAAE,UAAU;gCACtB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB;gCAC1C,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB;gCAC7C,IAAI;gCACJ,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB;gCAC/C,KAAK;gCACL,iBAAiB,EAAE,iBAAiB;gCACpC,eAAe,EAAE,eAAe;gCAChC,WAAW;gCACX,iBAAiB,EAAE,uBAAuB,EAAE;6BAC7C,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;oBAED,0EAA0E;oBAC1E,IACE,OAAO,YAAY,cAAc;wBACjC,OAAO,CAAC,UAAU,EAAE;wBACpB,CAAC,OAAO,CAAC,QAAQ,EAAE;wBACnB,WAAW,CAAC,OAAO,CAAC,MAAM,KAAK,QAAQ;wBACvC,WAAW,CAAC,OAAO,CAAC,MAAM,KAAK,OAAO,EACtC,CAAC;wBACD,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;oBAC7B,CAAC;oBAED,8CAA8C;oBAC9C,IACE,WAAW,CAAC,OAAO,CAAC,MAAM,KAAK,QAAQ;wBACvC,OAAO,YAAY,cAAc;wBACjC,CAAC,WAAW,CAAC,OAAO,CAAC,iBAAiB,EACtC,CAAC;wBACD,MAAM,aAAa,GAAG,uBAAuB,EAAE,CAAC;wBAChD,IAAI,aAAa,EAAE,CAAC;4BAClB,WAAW,CAAC,OAAO,CAAC,iBAAiB,GAAG,aAAa,CAAC;wBACxD,CAAC;oBACH,CAAC;oBAED,qDAAqD;oBACrD,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;wBAC3C,iCAAiC;wBACjC,IAAI,OAAO,YAAY,cAAc,IAAI,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;4BAC9D,MAAM,QAAQ,GAAG,uBAAuB,EAAE,CAAC;4BAC3C,IAAI,QAAQ,EAAE,CAAC;gCACb,IAAI,CAAC;oCACH,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;oCAC/D,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;oCAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,GAAG,EAAE,CAAC;wCAC5C,OAAO,CAAC,KAAK,CACX,6BAA6B,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAC1E,CAAC;oCACJ,CAAC;gCACH,CAAC;gCAAC,OAAO,GAAG,EAAE,CAAC;oCACb,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,GAAG,EAAE,CAAC;wCAC5C,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAC,CAAC;oCAC3D,CAAC;gCACH,CAAC;4BACH,CAAC;wBACH,CAAC;wBAED,MAAM,QAAQ,GACZ,KAAK,IAAI,OAAO,YAAY,UAAU;4BACpC,CAAC,CAAC,MAAM,iBAAiB,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC;4BACvD,CAAC,CAAC,MAAM,cAAc,CAAC,WAAW,CAAC,OAAO,EAAE,OAAyB,CAAC,CAAC;wBAC3E,MAAM,SAAS,CAAC,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;wBAE5D,IAAI,CAAC,YAAY,EAAE,CAAC;4BAClB,YAAY,GAAG,IAAI,CAAC;4BACpB,UAAU,CAAC,GAAG,EAAE;gCACd,MAAM,CAAC,KAAK,EAAE,CAAC;gCACf,aAAa,EAAE,CAAC;gCAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;4BAClB,CAAC,EAAE,GAAG,CAAC,CAAC;wBACV,CAAC;wBAED,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;wBACxB,UAAU,GAAG,KAAK,CAAC;wBACnB,OAAO;oBACT,CAAC;oBAED,2CAA2C;oBAC3C,MAAM,QAAQ,GACZ,KAAK,IAAI,OAAO,YAAY,UAAU;wBACpC,CAAC,CAAC,MAAM,iBAAiB,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC;wBACvD,CAAC,CAAC,MAAM,cAAc,CAAC,WAAW,CAAC,OAAO,EAAE,OAAyB,CAAC,CAAC;oBAE3E,0CAA0C;oBAC1C,IAAI,OAAO,YAAY,cAAc,EAAE,CAAC;wBACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;wBAC/C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;4BAC5D,QAAQ,CAAC,IAAgC,CAAC,QAAQ,GAAG,QAAQ,CAAC;wBACjE,CAAC;oBACH,CAAC;oBAED,MAAM,SAAS,CAAC,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;gBAC9D,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBACjE,MAAM,SAAS,CAAC,MAAM,EAAE,iBAAiB,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,CACtF,GAAG,EAAE,GAAE,CAAC,CACT,CAAC,CAAC,kCAAkC;gBACvC,CAAC;YACH,CAAC;YAED,UAAU,GAAG,KAAK,CAAC;QACrB,CAAC;QAED,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAE1B,6EAA6E;YAC7E,2EAA2E;YAC3E,4DAA4D;YAC5D,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,WAAW,GAAG,IAAI,CAAC;gBACnB,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;gBACnC,IAAI,4DAA4D,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC/E,MAAM,CAAC,OAAO,EAAE,CAAC;oBACjB,OAAO;gBACT,CAAC;YACH,CAAC;YAED,gEAAgE;YAChE,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACxC,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;gBAC7C,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;gBAE1C,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;oBAAE,SAAS;gBAC3B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;YAED,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC3B,+DAA+D;gBAC/D,sCAAsC;gBACtC,gGAAgG;gBAChG,OAAO,CAAC,IAAI,CAAC,4BAA4B,EAAE,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBACxE,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,GAAG,EAAE,CAAC;oBAC5C,OAAO,CAAC,KAAK,CACX,mCAAmC,EACnC,GAAG,EAAE,KAAK,IAAI,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAC1C,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACtB,8BAA8B;QAChC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,kCAAkC;IAClC,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IAElD,IAAI,SAAS,EAAE,CAAC;QACd,uCAAuC;QACvC,MAAM,IAAI,GAAG,iBAAiB,CAAC,cAAc,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;QAC/B,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE;YACpC,8BAA8B;QAChC,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,+BAA+B;QAC/B,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE;YAC7B,kBAAkB;QACpB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACzB,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;QACpC,aAAa,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,IAAI,YAAY;YAAE,OAAO;QACzB,YAAY,GAAG,IAAI,CAAC;QAEpB,gCAAgC;QAChC,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;YAC1B,YAAY,GAAG,IAAI,CAAC;YACpB,4BAA4B;YAC5B,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;YAC3C,IAAI,CAAC;gBACH,IAAI,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC;oBAAE,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;YACnE,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;QACH,CAAC;QAED,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,aAAa,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAE/B,4CAA4C;IAC5C,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE;QACtC,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;QAC1C,aAAa,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;QAC1C,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;QAC9C,aAAa,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,yBAAyB;IACzB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;QACtB,aAAa,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,qBAAqB;IACrB,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;AACzB,CAAC;AAED,wCAAwC;AACxC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,GAAG,EAAE,CAAC;IACvF,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QAC1B,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;QACpC,aAAa,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/diff.d.ts b/vendor/agent-browser/dist/diff.d.ts deleted file mode 100644 index 5601016..0000000 --- a/vendor/agent-browser/dist/diff.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { BrowserContext } from 'playwright-core'; -import type { DiffSnapshotData, DiffScreenshotData } from './types.js'; -/** - * Produce a unified diff string and stats from two snapshot texts. - */ -export declare function diffSnapshots(before: string, after: string): DiffSnapshotData; -/** - * Compare two image buffers using the browser's Canvas API for pixel comparison. - * Uses an isolated blank page to avoid CSP interference or DOM side effects on the - * user's page. Images are served via intercepted routes to avoid large base64 payloads - * through page.evaluate (which can be slow or hit CDP message size limits). - */ -export declare function diffScreenshots(context: BrowserContext, baselineBuffer: Buffer, currentBuffer: Buffer, opts: { - threshold?: number; - outputPath?: string; - baselineMime?: string; -}): Promise; -//# sourceMappingURL=diff.d.ts.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/diff.d.ts.map b/vendor/agent-browser/dist/diff.d.ts.map deleted file mode 100644 index c251478..0000000 --- a/vendor/agent-browser/dist/diff.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAsHvE;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAmC7E;AAcD;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,cAAc,EACvB,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GACvE,OAAO,CAAC,kBAAkB,CAAC,CA4J7B"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/diff.js b/vendor/agent-browser/dist/diff.js deleted file mode 100644 index fbdda13..0000000 --- a/vendor/agent-browser/dist/diff.js +++ /dev/null @@ -1,271 +0,0 @@ -import { writeFile, mkdir } from 'node:fs/promises'; -import path from 'node:path'; -/** - * Myers diff algorithm operating on arrays of lines. - * Returns a minimal edit script. - */ -function myersDiff(a, b) { - const n = a.length; - const m = b.length; - const max = n + m; - if (max === 0) - return []; - // Optimize: if both are identical, skip diff - if (n === m) { - let identical = true; - for (let i = 0; i < n; i++) { - if (a[i] !== b[i]) { - identical = false; - break; - } - } - if (identical) - return a.map((line) => ({ type: 'equal', line })); - } - const vSize = 2 * max + 1; - const v = new Int32Array(vSize); - v.fill(-1); - const trace = []; - v[max + 1] = 0; - for (let d = 0; d <= max; d++) { - const snapshot = new Int32Array(v); - trace.push(snapshot); - for (let k = -d; k <= d; k += 2) { - const idx = k + max; - let x; - if (k === -d || (k !== d && v[idx - 1] < v[idx + 1])) { - x = v[idx + 1]; - } - else { - x = v[idx - 1] + 1; - } - let y = x - k; - while (x < n && y < m && a[x] === b[y]) { - x++; - y++; - } - v[idx] = x; - if (x >= n && y >= m) { - return buildEditScript(trace, a, b, max); - } - } - } - return buildEditScript(trace, a, b, max); -} -function buildEditScript(trace, a, b, max) { - const edits = []; - let x = a.length; - let y = b.length; - for (let d = trace.length - 1; d > 0; d--) { - const v = trace[d]; - const k = x - y; - const idx = k + max; - let prevK; - if (k === -d || (k !== d && v[idx - 1] < v[idx + 1])) { - prevK = k + 1; - } - else { - prevK = k - 1; - } - const prevIdx = prevK + max; - let prevX = v[prevIdx]; - let prevY = prevX - prevK; - // Diagonal (equal lines) - while (x > prevX && y > prevY) { - x--; - y--; - edits.push({ type: 'equal', line: a[x] }); - } - if (x === prevX) { - y--; - edits.push({ type: 'insert', line: b[y] }); - } - else { - x--; - edits.push({ type: 'delete', line: a[x] }); - } - } - // Remaining diagonal at d=0 - while (x > 0 && y > 0) { - x--; - y--; - edits.push({ type: 'equal', line: a[x] }); - } - edits.reverse(); - return edits; -} -/** - * Produce a unified diff string and stats from two snapshot texts. - */ -export function diffSnapshots(before, after) { - const linesA = before.split('\n'); - const linesB = after.split('\n'); - const edits = myersDiff(linesA, linesB); - let additions = 0; - let removals = 0; - let unchanged = 0; - const diffLines = []; - for (const edit of edits) { - switch (edit.type) { - case 'equal': - unchanged++; - diffLines.push(` ${edit.line}`); - break; - case 'insert': - additions++; - diffLines.push(`+ ${edit.line}`); - break; - case 'delete': - removals++; - diffLines.push(`- ${edit.line}`); - break; - } - } - return { - diff: diffLines.join('\n'), - additions, - removals, - unchanged, - changed: additions > 0 || removals > 0, - }; -} -const DIFF_ROUTE_PREFIX = 'https://agent-browser-diff.localhost'; -/** - * Compare two image buffers using the browser's Canvas API for pixel comparison. - * Uses an isolated blank page to avoid CSP interference or DOM side effects on the - * user's page. Images are served via intercepted routes to avoid large base64 payloads - * through page.evaluate (which can be slow or hit CDP message size limits). - */ -export async function diffScreenshots(context, baselineBuffer, currentBuffer, opts) { - const baselineMime = opts.baselineMime ?? 'image/png'; - const threshold = opts.threshold ?? 0.1; - const nonce = Math.random().toString(36).slice(2, 10); - const blankUrl = `${DIFF_ROUTE_PREFIX}/${nonce}/index.html`; - const baselineUrl = `${DIFF_ROUTE_PREFIX}/${nonce}/baseline.png`; - const currentUrl = `${DIFF_ROUTE_PREFIX}/${nonce}/current.png`; - const diffPage = await context.newPage(); - let blankRouted = false; - let baselineRouted = false; - let currentRouted = false; - try { - await diffPage.route(blankUrl, (route) => route.fulfill({ body: '', contentType: 'text/html' })); - blankRouted = true; - await diffPage.route(baselineUrl, (route) => route.fulfill({ body: baselineBuffer, contentType: baselineMime })); - baselineRouted = true; - await diffPage.route(currentUrl, (route) => route.fulfill({ body: currentBuffer, contentType: 'image/png' })); - currentRouted = true; - await diffPage.goto(blankUrl); - const pixelDiffFn = async (args) => { - const g = globalThis; - const doc = g.document; - const Img = g.Image; - function loadImage(url) { - return new Promise((resolve, reject) => { - const img = new Img(); - img.onload = () => resolve(img); - img.onerror = () => reject(new Error('Failed to load image')); - img.src = url; - }); - } - const [imgA, imgB] = (await Promise.all([ - loadImage(args.baselineUrl), - loadImage(args.currentUrl), - ])); - if (imgA.width !== imgB.width || imgA.height !== imgB.height) { - const c = doc.createElement('canvas'); - c.width = 1; - c.height = 1; - return { - totalPixels: Math.max(imgA.width * imgA.height, imgB.width * imgB.height), - differentPixels: Math.max(imgA.width * imgA.height, imgB.width * imgB.height), - mismatchPercentage: 100, - diffBase64: c.toDataURL('image/png').split(',')[1], - dimensionMismatch: true, - }; - } - const w = imgA.width; - const h = imgA.height; - const canvasA = doc.createElement('canvas'); - canvasA.width = w; - canvasA.height = h; - const ctxA = canvasA.getContext('2d'); - ctxA.drawImage(imgA, 0, 0); - const dataA = ctxA.getImageData(0, 0, w, h).data; - const canvasB = doc.createElement('canvas'); - canvasB.width = w; - canvasB.height = h; - const ctxB = canvasB.getContext('2d'); - ctxB.drawImage(imgB, 0, 0); - const dataB = ctxB.getImageData(0, 0, w, h).data; - const diffCanvas = doc.createElement('canvas'); - diffCanvas.width = w; - diffCanvas.height = h; - const ctxDiff = diffCanvas.getContext('2d'); - const diffImageData = ctxDiff.createImageData(w, h); - const diffData = diffImageData.data; - const maxColorDistance = args.threshold * 255 * Math.sqrt(3); - let differentPixels = 0; - const totalPixels = w * h; - for (let i = 0; i < totalPixels; i++) { - const offset = i * 4; - const rA = dataA[offset], gA = dataA[offset + 1], bA = dataA[offset + 2]; - const rB = dataB[offset], gB = dataB[offset + 1], bB = dataB[offset + 2]; - const dr = rA - rB, dg = gA - gB, db = bA - bB; - const dist = Math.sqrt(dr * dr + dg * dg + db * db); - if (dist > maxColorDistance) { - differentPixels++; - diffData[offset] = 255; - diffData[offset + 1] = 0; - diffData[offset + 2] = 0; - diffData[offset + 3] = 255; - } - else { - diffData[offset] = Math.round(rA * 0.3); - diffData[offset + 1] = Math.round(gA * 0.3); - diffData[offset + 2] = Math.round(bA * 0.3); - diffData[offset + 3] = 255; - } - } - ctxDiff.putImageData(diffImageData, 0, 0); - const diffBase64 = diffCanvas.toDataURL('image/png').split(',')[1]; - return { - totalPixels, - differentPixels, - mismatchPercentage: Math.round((differentPixels / totalPixels) * 10000) / 100, - diffBase64, - dimensionMismatch: false, - }; - }; - const result = (await diffPage.evaluate(pixelDiffFn, { - baselineUrl, - currentUrl, - threshold, - })); - let outputPath = opts.outputPath; - if (!outputPath) { - const tmpDir = path.join(process.env.HOME || process.env.USERPROFILE || '/tmp', '.agent-browser', 'tmp', 'diffs'); - await mkdir(tmpDir, { recursive: true }); - outputPath = path.join(tmpDir, `diff-${Date.now()}.png`); - } - const diffBuffer = Buffer.from(result.diffBase64, 'base64'); - await writeFile(outputPath, diffBuffer); - return { - diffPath: outputPath, - totalPixels: result.totalPixels, - differentPixels: result.differentPixels, - mismatchPercentage: result.mismatchPercentage, - match: result.differentPixels === 0, - ...(result.dimensionMismatch ? { dimensionMismatch: true } : {}), - }; - } - finally { - if (blankRouted) - await diffPage.unroute(blankUrl).catch(() => { }); - if (baselineRouted) - await diffPage.unroute(baselineUrl).catch(() => { }); - if (currentRouted) - await diffPage.unroute(currentUrl).catch(() => { }); - await diffPage.close().catch(() => { }); - } -} -//# sourceMappingURL=diff.js.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/diff.js.map b/vendor/agent-browser/dist/diff.js.map deleted file mode 100644 index 2b8d9ff..0000000 --- a/vendor/agent-browser/dist/diff.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/domain-filter.d.ts b/vendor/agent-browser/dist/domain-filter.d.ts deleted file mode 100644 index 6eb5313..0000000 --- a/vendor/agent-browser/dist/domain-filter.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -import type { BrowserContext } from 'playwright-core'; -/** - * Checks whether a hostname matches one of the allowed domain patterns. - * Patterns support exact match ("example.com") and wildcard prefix ("*.example.com"). - */ -export declare function isDomainAllowed(hostname: string, allowedDomains: string[]): boolean; -export declare function parseDomainList(raw: string): string[]; -/** - * Build the init script source that monkey-patches WebSocket, EventSource, - * and navigator.sendBeacon to block connections to non-allowed domains. - * Exported for testing. - */ -export declare function buildWebSocketFilterScript(allowedDomains: string[]): string; -/** - * Installs a context-level route that enforces the domain allowlist. - * Both document navigations and sub-resource requests (scripts, images, fetch, etc.) - * to non-allowed domains are blocked, preventing data exfiltration. - * Non-http(s) schemes (data:, blob:, etc.) are allowed for sub-resources - * but blocked for document navigations. - * - * Also installs an init script that patches WebSocket, EventSource, and - * navigator.sendBeacon to block connections to non-allowed domains. This is - * a best-effort defense: if eval is permitted by action policy, page scripts - * could theoretically restore the originals. Denying the eval action - * category closes that loophole. - */ -export declare function installDomainFilter(context: BrowserContext, allowedDomains: string[]): Promise; -//# sourceMappingURL=domain-filter.d.ts.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/domain-filter.d.ts.map b/vendor/agent-browser/dist/domain-filter.d.ts.map deleted file mode 100644 index ba4ac18..0000000 --- a/vendor/agent-browser/dist/domain-filter.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"domain-filter.d.ts","sourceRoot":"","sources":["../src/domain-filter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAS,MAAM,iBAAiB,CAAC;AAE7D;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,OAAO,CAYnF;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAKrD;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,MAAM,CAyE3E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,cAAc,EACvB,cAAc,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,IAAI,CAAC,CAgCf"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/domain-filter.js b/vendor/agent-browser/dist/domain-filter.js deleted file mode 100644 index b09b334..0000000 --- a/vendor/agent-browser/dist/domain-filter.js +++ /dev/null @@ -1,149 +0,0 @@ -/** - * Checks whether a hostname matches one of the allowed domain patterns. - * Patterns support exact match ("example.com") and wildcard prefix ("*.example.com"). - */ -export function isDomainAllowed(hostname, allowedDomains) { - for (const pattern of allowedDomains) { - if (pattern.startsWith('*.')) { - const suffix = pattern.slice(1); // ".example.com" - if (hostname === pattern.slice(2) || hostname.endsWith(suffix)) { - return true; - } - } - else if (hostname === pattern) { - return true; - } - } - return false; -} -export function parseDomainList(raw) { - return raw - .split(',') - .map((d) => d.trim().toLowerCase()) - .filter((d) => d.length > 0); -} -/** - * Build the init script source that monkey-patches WebSocket, EventSource, - * and navigator.sendBeacon to block connections to non-allowed domains. - * Exported for testing. - */ -export function buildWebSocketFilterScript(allowedDomains) { - const serialized = JSON.stringify(allowedDomains); - return `(function() { - var _allowedDomains = ${serialized}; - function _isDomainAllowed(hostname) { - hostname = hostname.toLowerCase(); - for (var i = 0; i < _allowedDomains.length; i++) { - var pattern = _allowedDomains[i]; - if (pattern.indexOf('*.') === 0) { - var suffix = pattern.slice(1); - if (hostname === pattern.slice(2) || hostname.slice(-suffix.length) === suffix) { - return true; - } - } else if (hostname === pattern) { - return true; - } - } - return false; - } - function _checkUrl(url) { - try { - var parsed = new URL(url); - return _isDomainAllowed(parsed.hostname); - } catch(e) { - return false; - } - } - if (typeof WebSocket !== 'undefined') { - var _OrigWS = WebSocket; - WebSocket = function(url, protocols) { - if (!_checkUrl(url)) { - throw new DOMException( - 'WebSocket connection to ' + url + ' blocked by domain allowlist', - 'SecurityError' - ); - } - if (protocols !== undefined) { - return new _OrigWS(url, protocols); - } - return new _OrigWS(url); - }; - WebSocket.prototype = _OrigWS.prototype; - WebSocket.CONNECTING = _OrigWS.CONNECTING; - WebSocket.OPEN = _OrigWS.OPEN; - WebSocket.CLOSING = _OrigWS.CLOSING; - WebSocket.CLOSED = _OrigWS.CLOSED; - } - if (typeof EventSource !== 'undefined') { - var _OrigES = EventSource; - EventSource = function(url, opts) { - if (!_checkUrl(url)) { - throw new DOMException( - 'EventSource connection to ' + url + ' blocked by domain allowlist', - 'SecurityError' - ); - } - return new _OrigES(url, opts); - }; - EventSource.prototype = _OrigES.prototype; - EventSource.CONNECTING = _OrigES.CONNECTING; - EventSource.OPEN = _OrigES.OPEN; - EventSource.CLOSED = _OrigES.CLOSED; - } - if (typeof navigator !== 'undefined' && typeof navigator.sendBeacon === 'function') { - var _origSendBeacon = navigator.sendBeacon.bind(navigator); - navigator.sendBeacon = function(url, data) { - if (!_checkUrl(url)) { - return false; - } - return _origSendBeacon(url, data); - }; - } -})();`; -} -/** - * Installs a context-level route that enforces the domain allowlist. - * Both document navigations and sub-resource requests (scripts, images, fetch, etc.) - * to non-allowed domains are blocked, preventing data exfiltration. - * Non-http(s) schemes (data:, blob:, etc.) are allowed for sub-resources - * but blocked for document navigations. - * - * Also installs an init script that patches WebSocket, EventSource, and - * navigator.sendBeacon to block connections to non-allowed domains. This is - * a best-effort defense: if eval is permitted by action policy, page scripts - * could theoretically restore the originals. Denying the eval action - * category closes that loophole. - */ -export async function installDomainFilter(context, allowedDomains) { - if (allowedDomains.length === 0) - return; - await context.addInitScript(buildWebSocketFilterScript(allowedDomains)); - await context.route('**/*', async (route) => { - const request = route.request(); - const urlStr = request.url(); - if (!urlStr.startsWith('http://') && !urlStr.startsWith('https://')) { - if (request.resourceType() === 'document') { - await route.abort('blockedbyclient'); - } - else { - await route.continue(); - } - return; - } - let hostname; - try { - hostname = new URL(urlStr).hostname.toLowerCase(); - } - catch { - await route.abort('blockedbyclient'); - return; - } - if (isDomainAllowed(hostname, allowedDomains)) { - await route.continue(); - } - else { - await route.abort('blockedbyclient'); - } - }); -} -//# sourceMappingURL=domain-filter.js.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/domain-filter.js.map b/vendor/agent-browser/dist/domain-filter.js.map deleted file mode 100644 index 3fa1ce8..0000000 --- a/vendor/agent-browser/dist/domain-filter.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"domain-filter.js","sourceRoot":"","sources":["../src/domain-filter.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,cAAwB;IACxE,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;QACrC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB;YAClD,IAAI,QAAQ,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC/D,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;aAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,OAAO,GAAG;SACP,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;SAClC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,cAAwB;IACjE,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAClD,OAAO;0BACiB,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAqE9B,CAAC;AACP,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAuB,EACvB,cAAwB;IAExB,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAExC,MAAM,OAAO,CAAC,aAAa,CAAC,0BAA0B,CAAC,cAAc,CAAC,CAAC,CAAC;IAExE,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAY,EAAE,EAAE;QACjD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAE7B,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACpE,IAAI,OAAO,CAAC,YAAY,EAAE,KAAK,UAAU,EAAE,CAAC;gBAC1C,MAAM,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;YACzB,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QAED,IAAI,eAAe,CAAC,QAAQ,EAAE,cAAc,CAAC,EAAE,CAAC;YAC9C,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/encryption.d.ts b/vendor/agent-browser/dist/encryption.d.ts deleted file mode 100644 index 2437973..0000000 --- a/vendor/agent-browser/dist/encryption.d.ts +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Encryption utilities for state file protection using AES-256-GCM. - */ -export declare const ENCRYPTION_ALGORITHM = "aes-256-gcm"; -export declare const ENCRYPTION_KEY_ENV = "AGENT_BROWSER_ENCRYPTION_KEY"; -export declare const IV_LENGTH = 12; -/** - * Encrypted payload structure. - */ -export interface EncryptedPayload { - version: 1; - encrypted: true; - iv: string; - authTag: string; - data: string; -} -export declare function getKeyFilePath(): string; -/** - * Restrict file permissions to the current user only. - * On Unix, the caller should use `mode: 0o600` when writing. This function - * handles Windows where Node's mode parameter is ignored. - */ -export declare function restrictFilePermissions(filePath: string): void; -/** - * Restrict directory permissions to the current user only. - * On Unix, the caller should use `mode: 0o700` when creating. This function - * handles Windows where Node's mode parameter is ignored. - */ -export declare function restrictDirPermissions(dirPath: string): void; -/** - * Get encryption key from environment variable or key file. - * The key should be a 32-byte (256-bit) hex-encoded string (64 characters). - * Generate with: openssl rand -hex 32 - * - * Checks (in order): - * 1. AGENT_BROWSER_ENCRYPTION_KEY env var - * 2. ~/.agent-browser/.encryption-key file - * - * @returns Buffer containing the key, or null if not available - */ -export declare function getEncryptionKey(): Buffer | null; -/** - * Ensure an encryption key is available, auto-generating one if needed. - * On first call without an existing key, generates a random 256-bit key - * and writes it to ~/.agent-browser/.encryption-key (mode 0600). - */ -export declare function ensureEncryptionKey(): Buffer; -/** - * Encrypt data using AES-256-GCM. - * Returns a JSON-serializable payload with IV, auth tag, and encrypted data. - * - * @param plaintext - The string to encrypt - * @param key - The 256-bit encryption key - * @returns Encrypted payload object - */ -export declare function encryptData(plaintext: string, key: Buffer): EncryptedPayload; -/** - * Decrypt data using AES-256-GCM. - * - * @param payload - The encrypted payload object - * @param key - The 256-bit encryption key - * @returns Decrypted plaintext string - * @throws Error if decryption fails (wrong key, tampered data, etc.) - */ -export declare function decryptData(payload: EncryptedPayload, key: Buffer): string; -/** - * Check if a parsed JSON object is an encrypted payload. - * - * @param data - The object to check - * @returns True if the object is a valid encrypted payload - */ -export declare function isEncryptedPayload(data: unknown): data is EncryptedPayload; -//# sourceMappingURL=encryption.d.ts.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/encryption.d.ts.map b/vendor/agent-browser/dist/encryption.d.ts.map deleted file mode 100644 index 42e9dab..0000000 --- a/vendor/agent-browser/dist/encryption.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../src/encryption.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH,eAAO,MAAM,oBAAoB,gBAAgB,CAAC;AAClD,eAAO,MAAM,kBAAkB,iCAAiC,CAAC;AACjE,eAAO,MAAM,SAAS,KAAK,CAAC;AAG5B;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,IAAI,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAU9D;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAU5D;AAOD;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAyBhD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAsB5C;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAc5E;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAY1E;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,gBAAgB,CAW1E"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/encryption.js b/vendor/agent-browser/dist/encryption.js deleted file mode 100644 index 30fdffa..0000000 --- a/vendor/agent-browser/dist/encryption.js +++ /dev/null @@ -1,171 +0,0 @@ -/** - * Encryption utilities for state file protection using AES-256-GCM. - */ -import * as crypto from 'crypto'; -import { execSync } from 'node:child_process'; -import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'; -import { join } from 'node:path'; -import os from 'node:os'; -// ============================================ -// Constants -// ============================================ -export const ENCRYPTION_ALGORITHM = 'aes-256-gcm'; -export const ENCRYPTION_KEY_ENV = 'AGENT_BROWSER_ENCRYPTION_KEY'; -export const IV_LENGTH = 12; // 96 bits for GCM -const KEY_FILE_NAME = '.encryption-key'; -export function getKeyFilePath() { - return join(os.homedir(), '.agent-browser', KEY_FILE_NAME); -} -/** - * Restrict file permissions to the current user only. - * On Unix, the caller should use `mode: 0o600` when writing. This function - * handles Windows where Node's mode parameter is ignored. - */ -export function restrictFilePermissions(filePath) { - if (os.platform() !== 'win32') - return; - try { - execSync(`icacls "${filePath}" /inheritance:r /grant:r "%USERNAME%:F"`, { - stdio: 'ignore', - windowsHide: true, - }); - } - catch { - // Best-effort; may fail in some environments (containers, restricted shells) - } -} -/** - * Restrict directory permissions to the current user only. - * On Unix, the caller should use `mode: 0o700` when creating. This function - * handles Windows where Node's mode parameter is ignored. - */ -export function restrictDirPermissions(dirPath) { - if (os.platform() !== 'win32') - return; - try { - execSync(`icacls "${dirPath}" /inheritance:r /grant:r "%USERNAME%:(OI)(CI)F"`, { - stdio: 'ignore', - windowsHide: true, - }); - } - catch { - // Best-effort - } -} -function parseKeyHex(keyHex) { - if (!/^[a-fA-F0-9]{64}$/.test(keyHex.trim())) - return null; - return Buffer.from(keyHex.trim(), 'hex'); -} -/** - * Get encryption key from environment variable or key file. - * The key should be a 32-byte (256-bit) hex-encoded string (64 characters). - * Generate with: openssl rand -hex 32 - * - * Checks (in order): - * 1. AGENT_BROWSER_ENCRYPTION_KEY env var - * 2. ~/.agent-browser/.encryption-key file - * - * @returns Buffer containing the key, or null if not available - */ -export function getEncryptionKey() { - const keyHex = process.env[ENCRYPTION_KEY_ENV]; - if (keyHex) { - const key = parseKeyHex(keyHex); - if (!key) { - console.warn(`Warning: ${ENCRYPTION_KEY_ENV} should be a 64-character hex string (256 bits). ` + - `Generate one with: openssl rand -hex 32`); - return null; - } - return key; - } - const keyFilePath = getKeyFilePath(); - if (existsSync(keyFilePath)) { - try { - const fileHex = readFileSync(keyFilePath, 'utf-8'); - return parseKeyHex(fileHex); - } - catch { - return null; - } - } - return null; -} -/** - * Ensure an encryption key is available, auto-generating one if needed. - * On first call without an existing key, generates a random 256-bit key - * and writes it to ~/.agent-browser/.encryption-key (mode 0600). - */ -export function ensureEncryptionKey() { - const existing = getEncryptionKey(); - if (existing) - return existing; - const key = crypto.randomBytes(32); - const keyHex = key.toString('hex'); - const dir = join(os.homedir(), '.agent-browser'); - if (!existsSync(dir)) { - mkdirSync(dir, { recursive: true, mode: 0o700 }); - restrictDirPermissions(dir); - } - const keyFilePath = getKeyFilePath(); - writeFileSync(keyFilePath, keyHex + '\n', { mode: 0o600 }); - restrictFilePermissions(keyFilePath); - console.error(`[agent-browser] Auto-generated encryption key at ${keyFilePath} -- back up this file or set ${ENCRYPTION_KEY_ENV}`); - return key; -} -/** - * Encrypt data using AES-256-GCM. - * Returns a JSON-serializable payload with IV, auth tag, and encrypted data. - * - * @param plaintext - The string to encrypt - * @param key - The 256-bit encryption key - * @returns Encrypted payload object - */ -export function encryptData(plaintext, key) { - const iv = crypto.randomBytes(IV_LENGTH); - const cipher = crypto.createCipheriv(ENCRYPTION_ALGORITHM, key, iv); - let encrypted = cipher.update(plaintext, 'utf8'); - encrypted = Buffer.concat([encrypted, cipher.final()]); - return { - version: 1, - encrypted: true, - iv: iv.toString('base64'), - authTag: cipher.getAuthTag().toString('base64'), - data: encrypted.toString('base64'), - }; -} -/** - * Decrypt data using AES-256-GCM. - * - * @param payload - The encrypted payload object - * @param key - The 256-bit encryption key - * @returns Decrypted plaintext string - * @throws Error if decryption fails (wrong key, tampered data, etc.) - */ -export function decryptData(payload, key) { - const iv = Buffer.from(payload.iv, 'base64'); - const authTag = Buffer.from(payload.authTag, 'base64'); - const encryptedData = Buffer.from(payload.data, 'base64'); - const decipher = crypto.createDecipheriv(ENCRYPTION_ALGORITHM, key, iv); - decipher.setAuthTag(authTag); - let decrypted = decipher.update(encryptedData); - decrypted = Buffer.concat([decrypted, decipher.final()]); - return decrypted.toString('utf8'); -} -/** - * Check if a parsed JSON object is an encrypted payload. - * - * @param data - The object to check - * @returns True if the object is a valid encrypted payload - */ -export function isEncryptedPayload(data) { - return (typeof data === 'object' && - data !== null && - 'encrypted' in data && - data.encrypted === true && - 'version' in data && - 'iv' in data && - 'authTag' in data && - 'data' in data); -} -//# sourceMappingURL=encryption.js.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/encryption.js.map b/vendor/agent-browser/dist/encryption.js.map deleted file mode 100644 index 39bf93c..0000000 --- a/vendor/agent-browser/dist/encryption.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"encryption.js","sourceRoot":"","sources":["../src/encryption.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/ios-actions.d.ts b/vendor/agent-browser/dist/ios-actions.d.ts deleted file mode 100644 index 4969a5c..0000000 --- a/vendor/agent-browser/dist/ios-actions.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * iOS command execution - mirrors actions.ts but for iOS Safari via Appium. - * Provides 1:1 command parity where possible. - */ -import type { IOSManager } from './ios-manager.js'; -import type { Command, Response } from './types.js'; -/** - * Execute a command on the iOS manager - */ -export declare function executeIOSCommand(command: Command, manager: IOSManager): Promise; -//# sourceMappingURL=ios-actions.d.ts.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/ios-actions.d.ts.map b/vendor/agent-browser/dist/ios-actions.d.ts.map deleted file mode 100644 index c79d9f9..0000000 --- a/vendor/agent-browser/dist/ios-actions.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ios-actions.d.ts","sourceRoot":"","sources":["../src/ios-actions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAUpD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,CA6PhG"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/ios-actions.js b/vendor/agent-browser/dist/ios-actions.js deleted file mode 100644 index 325f44f..0000000 --- a/vendor/agent-browser/dist/ios-actions.js +++ /dev/null @@ -1,228 +0,0 @@ -/** - * iOS command execution - mirrors actions.ts but for iOS Safari via Appium. - * Provides 1:1 command parity where possible. - */ -function successResponse(id, data) { - return { id, success: true, data }; -} -function errorResponse(id, error) { - return { id, success: false, error }; -} -/** - * Execute a command on the iOS manager - */ -export async function executeIOSCommand(command, manager) { - const { id, action } = command; - try { - switch (action) { - case 'launch': { - const cmd = command; - await manager.launch({ - device: cmd.device, - udid: cmd.udid, - }); - const info = manager.getDeviceInfo(); - return successResponse(id, { - launched: true, - device: info?.name ?? 'iOS Simulator', - udid: info?.udid, - }); - } - case 'navigate': { - const cmd = command; - const result = await manager.navigate(cmd.url); - return successResponse(id, result); - } - case 'click': { - const cmd = command; - await manager.click(cmd.selector); - return successResponse(id, { clicked: true }); - } - case 'tap': { - const cmd = command; - await manager.tap(cmd.selector); - return successResponse(id, { tapped: true }); - } - case 'type': { - const cmd = command; - await manager.type(cmd.selector, cmd.text, { - delay: cmd.delay, - clear: cmd.clear, - }); - return successResponse(id, { typed: true }); - } - case 'fill': { - const cmd = command; - await manager.fill(cmd.selector, cmd.value); - return successResponse(id, { filled: true }); - } - case 'screenshot': { - const cmd = command; - const result = await manager.screenshot({ - path: cmd.path, - fullPage: cmd.fullPage, - }); - return successResponse(id, result); - } - case 'snapshot': { - const cmd = command; - const result = await manager.getSnapshot({ - interactive: cmd.interactive, - }); - return successResponse(id, { snapshot: result.tree, refs: result.refs }); - } - case 'scroll': { - const cmd = command; - await manager.scroll({ - selector: cmd.selector, - x: cmd.x, - y: cmd.y, - direction: cmd.direction, - amount: cmd.amount, - }); - return successResponse(id, { scrolled: true }); - } - case 'swipe': { - const cmd = command; - await manager.swipe(cmd.direction, { distance: cmd.distance }); - return successResponse(id, { swiped: true }); - } - case 'evaluate': { - const cmd = command; - const result = await manager.evaluate(cmd.script, ...(cmd.args ?? [])); - return successResponse(id, { result }); - } - case 'wait': { - const cmd = command; - await manager.wait({ - selector: cmd.selector, - timeout: cmd.timeout, - state: cmd.state, - }); - return successResponse(id, { waited: true }); - } - case 'press': { - const cmd = command; - await manager.press(cmd.key); - return successResponse(id, { pressed: true }); - } - case 'hover': { - const cmd = command; - await manager.hover(cmd.selector); - return successResponse(id, { hovered: true }); - } - case 'content': { - const cmd = command; - const html = await manager.getContent(cmd.selector); - return successResponse(id, { html }); - } - case 'gettext': { - const cmd = command; - const text = await manager.getText(cmd.selector); - return successResponse(id, { text }); - } - case 'getattribute': { - const cmd = command; - const value = await manager.getAttribute(cmd.selector, cmd.attribute); - return successResponse(id, { value }); - } - case 'isvisible': { - const cmd = command; - const visible = await manager.isVisible(cmd.selector); - return successResponse(id, { visible }); - } - case 'isenabled': { - const cmd = command; - const enabled = await manager.isEnabled(cmd.selector); - return successResponse(id, { enabled }); - } - case 'url': { - const url = await manager.getUrl(); - return successResponse(id, { url }); - } - case 'title': { - const title = await manager.getTitle(); - return successResponse(id, { title }); - } - case 'back': { - await manager.goBack(); - return successResponse(id, { navigated: 'back' }); - } - case 'forward': { - await manager.goForward(); - return successResponse(id, { navigated: 'forward' }); - } - case 'reload': { - await manager.reload(); - return successResponse(id, { reloaded: true }); - } - case 'select': { - const cmd = command; - await manager.select(cmd.selector, cmd.values); - return successResponse(id, { selected: true }); - } - case 'check': { - const cmd = command; - await manager.check(cmd.selector); - return successResponse(id, { checked: true }); - } - case 'uncheck': { - const cmd = command; - await manager.uncheck(cmd.selector); - return successResponse(id, { unchecked: true }); - } - case 'focus': { - const cmd = command; - await manager.focus(cmd.selector); - return successResponse(id, { focused: true }); - } - case 'clear': { - const cmd = command; - await manager.clear(cmd.selector); - return successResponse(id, { cleared: true }); - } - case 'count': { - const cmd = command; - const count = await manager.count(cmd.selector); - return successResponse(id, { count }); - } - case 'boundingbox': { - const cmd = command; - const box = await manager.getBoundingBox(cmd.selector); - return successResponse(id, { box }); - } - case 'close': { - await manager.close(); - return successResponse(id, { closed: true }); - } - // iOS-specific: device list - case 'device_list': { - const devices = await manager.listDevices(); - return successResponse(id, { devices }); - } - // Commands that don't apply to iOS Safari - case 'tab_new': - case 'tab_list': - case 'tab_switch': - case 'tab_close': - case 'window_new': - return errorResponse(id, `Command '${action}' is not supported on iOS Safari. Mobile Safari does not support programmatic tab management.`); - case 'pdf': - return errorResponse(id, 'PDF generation is not supported on iOS Safari.'); - case 'screencast_start': - case 'screencast_stop': - return errorResponse(id, 'Screencast is not supported on iOS (requires CDP).'); - case 'recording_start': - case 'recording_stop': - case 'recording_restart': - return errorResponse(id, 'Video recording is not yet supported on iOS.'); - default: - return errorResponse(id, `Unknown or unsupported iOS command: ${action}`); - } - } - catch (error) { - const message = error instanceof Error ? error.message : String(error); - return errorResponse(id, message); - } -} -//# sourceMappingURL=ios-actions.js.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/ios-actions.js.map b/vendor/agent-browser/dist/ios-actions.js.map deleted file mode 100644 index 4aadf32..0000000 --- a/vendor/agent-browser/dist/ios-actions.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ios-actions.js","sourceRoot":"","sources":["../src/ios-actions.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/ios-manager.d.ts b/vendor/agent-browser/dist/ios-manager.d.ts deleted file mode 100644 index 4253121..0000000 --- a/vendor/agent-browser/dist/ios-manager.d.ts +++ /dev/null @@ -1,266 +0,0 @@ -/** - * iOS Simulator Manager - Manages iOS Simulator and Safari automation via Appium. - * - * This provides 1:1 command parity with BrowserManager for iOS Safari. - */ -export interface IOSRefMap { - [ref: string]: { - selector: string; - role?: string; - name?: string; - xpath?: string; - }; -} -export interface IOSEnhancedSnapshot { - tree: string; - refs: IOSRefMap; -} -interface IOSDeviceInfo { - name: string; - udid: string; - state: string; - runtime: string; - isAvailable: boolean; - isRealDevice?: boolean; -} -/** - * Manages iOS Simulator and Safari automation via Appium - */ -export declare class IOSManager { - private simctl; - private browser; - private appiumProcess; - private deviceUdid; - private deviceName; - private consoleMessages; - private refMap; - private lastSnapshot; - private refCounter; - private static readonly APPIUM_PORT; - private static readonly APPIUM_HOST; - constructor(); - /** - * Check if browser is launched - */ - isLaunched(): boolean; - /** - * List connected real iOS devices - */ - private listRealDevices; - /** - * List available iOS simulators - */ - listDevices(): Promise; - /** - * List all devices (simulators + real devices) - */ - listAllDevices(): Promise; - /** - * Find the best default device (most recent iPhone) - */ - private findDefaultDevice; - /** - * Find device by name or UDID (searches both simulators and real devices) - */ - private findDevice; - /** - * Check if Appium is installed - */ - private checkAppiumInstalled; - /** - * Check if Appium server is already running - */ - private isAppiumRunning; - /** - * Start Appium server if not already running - */ - private startAppiumServer; - /** - * Boot the iOS simulator - */ - private bootSimulator; - /** - * Launch iOS Safari via Appium - */ - launch(options?: { - device?: string; - udid?: string; - headless?: boolean; - }): Promise; - /** - * Navigate to URL - */ - navigate(url: string): Promise<{ - url: string; - title: string; - }>; - /** - * Get current URL - */ - getUrl(): Promise; - /** - * Get page title - */ - getTitle(): Promise; - /** - * Click/tap an element - */ - click(selector: string): Promise; - /** - * Alias for click (semantic clarity for touch) - */ - tap(selector: string): Promise; - /** - * Type text into an element - */ - type(selector: string, text: string, options?: { - delay?: number; - clear?: boolean; - }): Promise; - /** - * Fill an element (clear first, then type) - */ - fill(selector: string, value: string): Promise; - /** - * Get element by selector or ref - */ - private getElement; - /** - * Get ref data from ref string - */ - private getRefData; - /** - * Take a screenshot - */ - screenshot(options?: { - path?: string; - fullPage?: boolean; - }): Promise<{ - path?: string; - base64?: string; - }>; - /** - * Get page snapshot with refs - */ - getSnapshot(options?: { - interactive?: boolean; - }): Promise; - /** - * Get cached ref map - */ - getRefMap(): IOSRefMap; - /** - * Scroll the page - */ - scroll(options?: { - selector?: string; - x?: number; - y?: number; - direction?: 'up' | 'down' | 'left' | 'right'; - amount?: number; - }): Promise; - /** - * Swipe gesture (iOS-specific) - */ - swipe(direction: 'up' | 'down' | 'left' | 'right', options?: { - distance?: number; - }): Promise; - /** - * Execute JavaScript - */ - evaluate(script: string, ...args: unknown[]): Promise; - /** - * Wait for element - */ - wait(options: { - selector?: string; - timeout?: number; - state?: 'attached' | 'detached' | 'visible' | 'hidden'; - }): Promise; - /** - * Press a key - */ - press(key: string): Promise; - /** - * Hover over element (limited on touch - just scrolls into view) - */ - hover(selector: string): Promise; - /** - * Get page content (HTML) - */ - getContent(selector?: string): Promise; - /** - * Get text content of element - */ - getText(selector: string): Promise; - /** - * Get attribute value - */ - getAttribute(selector: string, attribute: string): Promise; - /** - * Check if element is visible - */ - isVisible(selector: string): Promise; - /** - * Check if element is enabled - */ - isEnabled(selector: string): Promise; - /** - * Navigate back - */ - goBack(): Promise; - /** - * Navigate forward - */ - goForward(): Promise; - /** - * Reload page - */ - reload(): Promise; - /** - * Select option(s) from dropdown - */ - select(selector: string, values: string | string[]): Promise; - /** - * Check a checkbox - */ - check(selector: string): Promise; - /** - * Uncheck a checkbox - */ - uncheck(selector: string): Promise; - /** - * Focus an element - */ - focus(selector: string): Promise; - /** - * Clear input field - */ - clear(selector: string): Promise; - /** - * Get element count - */ - count(selector: string): Promise; - /** - * Get bounding box - */ - getBoundingBox(selector: string): Promise<{ - x: number; - y: number; - width: number; - height: number; - } | null>; - /** - * Get device info - */ - getDeviceInfo(): { - name: string; - udid: string; - } | null; - /** - * Close browser and cleanup - */ - close(): Promise; -} -export {}; -//# sourceMappingURL=ios-manager.d.ts.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/ios-manager.d.ts.map b/vendor/agent-browser/dist/ios-manager.d.ts.map deleted file mode 100644 index f269088..0000000 --- a/vendor/agent-browser/dist/ios-manager.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ios-manager.d.ts","sourceRoot":"","sources":["../src/ios-manager.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/ios-manager.js b/vendor/agent-browser/dist/ios-manager.js deleted file mode 100644 index 679e6f9..0000000 --- a/vendor/agent-browser/dist/ios-manager.js +++ /dev/null @@ -1,1073 +0,0 @@ -/** - * iOS Simulator Manager - Manages iOS Simulator and Safari automation via Appium. - * - * This provides 1:1 command parity with BrowserManager for iOS Safari. - */ -import { Simctl } from 'node-simctl'; -import { remote } from 'webdriverio'; -import { spawn } from 'node:child_process'; -import { existsSync } from 'node:fs'; -import path from 'node:path'; -/** - * Manages iOS Simulator and Safari automation via Appium - */ -export class IOSManager { - simctl; - browser = null; - appiumProcess = null; - deviceUdid = null; - deviceName = null; - consoleMessages = []; - refMap = {}; - lastSnapshot = ''; - refCounter = 0; - // Default Appium port - static APPIUM_PORT = 4723; - static APPIUM_HOST = '127.0.0.1'; - constructor() { - this.simctl = new Simctl(); - } - /** - * Check if browser is launched - */ - isLaunched() { - return this.browser !== null; - } - /** - * List connected real iOS devices - */ - async listRealDevices() { - const devices = []; - try { - // Use xcrun xctrace to list connected devices - const { execSync } = await import('node:child_process'); - const output = execSync('xcrun xctrace list devices 2>/dev/null || true', { - encoding: 'utf-8', - timeout: 10000, - }); - // Parse output - format is: - // == Devices == - // Device Name (OS Version) (UDID) - // Real devices show version as just "26.2", simulators as "iOS 18.0" - const lines = output.split('\n'); - let inDevicesSection = false; - for (const line of lines) { - if (line.includes('== Devices ==')) { - inDevicesSection = true; - continue; - } - // Stop at Simulators or Devices Offline section - if (line.includes('== Simulators ==') || line.includes('== Devices Offline ==')) { - break; - } - if (inDevicesSection && line.trim()) { - // Match pattern: "Device Name (version) (UDID)" - const match = line.match(/^(.+?)\s+\(([^)]+)\)\s+\(([A-F0-9-]+)\)$/i); - if (match) { - const [, name, version, udid] = match; - const nameLower = name.toLowerCase(); - // Include iOS devices: either name contains iPhone/iPad, or version looks like iOS - // (a simple version number like "26.2" or "18.6") and isn't a Mac - const isIOS = nameLower.includes('iphone') || - nameLower.includes('ipad') || - version.includes('iOS') || - version.includes('iPadOS'); - const isMac = nameLower.includes('mac') || - nameLower.includes('macbook') || - nameLower.includes('imac'); - if (isIOS || (!isMac && /^\d+\.\d+(\.\d+)?$/.test(version))) { - devices.push({ - name: name.trim(), - udid: udid, - state: 'Connected', - runtime: `iOS ${version}`, - isAvailable: true, - isRealDevice: true, - }); - } - } - } - } - } - catch { - // Ignore errors - real device listing is optional - } - return devices; - } - /** - * List available iOS simulators - */ - async listDevices() { - const devices = []; - try { - const rawDevices = await this.simctl.getDevices(); - for (const [runtime, deviceList] of Object.entries(rawDevices)) { - if (!Array.isArray(deviceList)) - continue; - for (const device of deviceList) { - // Only include iPhone and iPad simulators - if (device.name && (device.name.includes('iPhone') || device.name.includes('iPad'))) { - devices.push({ - name: device.name, - udid: device.udid, - state: device.state, - runtime: runtime, - isAvailable: device.isAvailable ?? true, - isRealDevice: false, - }); - } - } - } - } - catch (error) { - throw new Error(`Failed to list iOS simulators. Is Xcode installed? Error: ${error instanceof Error ? error.message : String(error)}`); - } - return devices; - } - /** - * List all devices (simulators + real devices) - */ - async listAllDevices() { - const [simulators, realDevices] = await Promise.all([ - this.listDevices(), - this.listRealDevices(), - ]); - // Real devices first, then simulators - return [...realDevices, ...simulators]; - } - /** - * Find the best default device (most recent iPhone) - */ - async findDefaultDevice() { - const devices = await this.listDevices(); - // Filter to available iPhones, prefer Pro models, then by name (which typically indicates recency) - const iphones = devices - .filter((d) => d.isAvailable && d.name.includes('iPhone')) - .sort((a, b) => { - // Prefer Pro models - const aIsPro = a.name.includes('Pro') ? 1 : 0; - const bIsPro = b.name.includes('Pro') ? 1 : 0; - if (aIsPro !== bIsPro) - return bIsPro - aIsPro; - // Then sort by name descending (iPhone 15 > iPhone 14) - return b.name.localeCompare(a.name); - }); - return iphones[0] ?? null; - } - /** - * Find device by name or UDID (searches both simulators and real devices) - */ - async findDevice(nameOrUdid) { - const devices = await this.listAllDevices(); - // Try exact UDID match first - const byUdid = devices.find((d) => d.udid === nameOrUdid); - if (byUdid) - return byUdid; - // Try exact name match - const byExactName = devices.find((d) => d.name === nameOrUdid); - if (byExactName) - return byExactName; - // Try partial name match - const byPartialName = devices.find((d) => d.name.toLowerCase().includes(nameOrUdid.toLowerCase())); - return byPartialName ?? null; - } - /** - * Check if Appium is installed - */ - async checkAppiumInstalled() { - return new Promise((resolve) => { - const proc = spawn('appium', ['--version'], { shell: true }); - proc.on('close', (code) => resolve(code === 0)); - proc.on('error', () => resolve(false)); - }); - } - /** - * Check if Appium server is already running - */ - async isAppiumRunning() { - try { - const response = await fetch(`http://${IOSManager.APPIUM_HOST}:${IOSManager.APPIUM_PORT}/status`); - return response.ok; - } - catch { - return false; - } - } - /** - * Start Appium server if not already running - */ - async startAppiumServer() { - if (await this.isAppiumRunning()) { - return; // Already running - } - if (!(await this.checkAppiumInstalled())) { - throw new Error('Appium not installed. Run: npm install -g appium && appium driver install xcuitest'); - } - return new Promise((resolve, reject) => { - this.appiumProcess = spawn('appium', ['--port', String(IOSManager.APPIUM_PORT), '--relaxed-security'], { - shell: true, - stdio: ['ignore', 'pipe', 'pipe'], - }); - let started = false; - const timeout = setTimeout(() => { - if (!started) { - reject(new Error('Appium server failed to start within 30 seconds')); - } - }, 30000); - this.appiumProcess.stdout?.on('data', (data) => { - const output = data.toString(); - if (output.includes('Appium REST http interface listener started')) { - started = true; - clearTimeout(timeout); - resolve(); - } - }); - this.appiumProcess.stderr?.on('data', (data) => { - const output = data.toString(); - // Appium logs to stderr for info messages too - if (output.includes('Appium REST http interface listener started')) { - started = true; - clearTimeout(timeout); - resolve(); - } - }); - this.appiumProcess.on('error', (err) => { - clearTimeout(timeout); - reject(new Error(`Failed to start Appium: ${err.message}`)); - }); - this.appiumProcess.on('close', (code) => { - if (!started) { - clearTimeout(timeout); - reject(new Error(`Appium exited with code ${code}`)); - } - }); - }); - } - /** - * Boot the iOS simulator - */ - async bootSimulator(udid) { - try { - const devices = await this.simctl.getDevices(); - let currentState; - // Find current device state - for (const deviceList of Object.values(devices)) { - if (!Array.isArray(deviceList)) - continue; - const device = deviceList.find((d) => d.udid === udid); - if (device) { - currentState = device.state; - break; - } - } - if (currentState === 'Booted') { - return; // Already booted - } - // node-simctl expects udid to be set on the instance - this.simctl.udid = udid; - await this.simctl.bootDevice(); - // Wait for device to be fully booted - let attempts = 0; - while (attempts < 60) { - const updatedDevices = await this.simctl.getDevices(); - for (const deviceList of Object.values(updatedDevices)) { - if (!Array.isArray(deviceList)) - continue; - const device = deviceList.find((d) => d.udid === udid); - if (device?.state === 'Booted') { - return; - } - } - await new Promise((r) => setTimeout(r, 1000)); - attempts++; - } - throw new Error('Simulator failed to boot within 60 seconds'); - } - catch (error) { - throw new Error(`Failed to boot simulator: ${error instanceof Error ? error.message : String(error)}`); - } - } - /** - * Launch iOS Safari via Appium - */ - async launch(options = {}) { - if (this.isLaunched()) { - return; // Already launched - } - // Find device - let device = null; - if (options.udid) { - device = await this.findDevice(options.udid); - if (!device) { - throw new Error(`Device with UDID ${options.udid} not found`); - } - } - else if (options.device) { - device = await this.findDevice(options.device); - if (!device) { - throw new Error(`Device "${options.device}" not found. Run: agent-browser device list`); - } - } - else { - // Check environment variable - const envDevice = process.env.AGENT_BROWSER_IOS_DEVICE; - const envUdid = process.env.AGENT_BROWSER_IOS_UDID; - if (envUdid) { - device = await this.findDevice(envUdid); - if (!device) { - throw new Error(`Device with UDID ${envUdid} not found. Run: agent-browser device list`); - } - } - else if (envDevice) { - device = await this.findDevice(envDevice); - if (!device) { - throw new Error(`Device "${envDevice}" not found. Run: agent-browser device list`); - } - } - else { - device = await this.findDefaultDevice(); - if (!device) { - throw new Error('No iOS simulators available. Open Xcode and download simulator runtimes.'); - } - } - } - this.deviceUdid = device.udid; - this.deviceName = device.name; - // Start Appium server - await this.startAppiumServer(); - // Boot simulator (skip for real devices - they're already running) - if (!device.isRealDevice) { - await this.bootSimulator(device.udid); - } - // Connect to Safari via Appium - try { - this.browser = await remote({ - hostname: IOSManager.APPIUM_HOST, - port: IOSManager.APPIUM_PORT, - path: '/', - capabilities: { - platformName: 'iOS', - 'appium:automationName': 'XCUITest', - 'appium:deviceName': device.name, - 'appium:udid': device.udid, - browserName: 'Safari', - 'appium:noReset': true, - 'appium:newCommandTimeout': 300, - }, - connectionRetryTimeout: 120000, - connectionRetryCount: 3, - }); - } - catch (error) { - throw new Error(`Failed to connect to Safari: ${error instanceof Error ? error.message : String(error)}. ` + - 'Make sure XCUITest driver is installed: appium driver install xcuitest'); - } - } - /** - * Navigate to URL - */ - async navigate(url) { - if (!this.browser) { - throw new Error('iOS browser not launched. Call launch first.'); - } - await this.browser.url(url); - // Wait for page to load - await this.browser.waitUntil(async () => { - const state = (await this.browser.execute('return document.readyState')); - return state === 'complete'; - }, { timeout: 30000, interval: 500 }); - const title = await this.browser.getTitle(); - const currentUrl = await this.browser.getUrl(); - return { url: currentUrl, title }; - } - /** - * Get current URL - */ - async getUrl() { - if (!this.browser) { - throw new Error('iOS browser not launched'); - } - return this.browser.getUrl(); - } - /** - * Get page title - */ - async getTitle() { - if (!this.browser) { - throw new Error('iOS browser not launched'); - } - return this.browser.getTitle(); - } - /** - * Click/tap an element - */ - async click(selector) { - if (!this.browser) { - throw new Error('iOS browser not launched'); - } - const element = await this.getElement(selector); - await element.click(); - } - /** - * Alias for click (semantic clarity for touch) - */ - async tap(selector) { - return this.click(selector); - } - /** - * Type text into an element - */ - async type(selector, text, options) { - if (!this.browser) { - throw new Error('iOS browser not launched'); - } - const element = await this.getElement(selector); - if (options?.clear) { - await element.clearValue(); - } - // WebdriverIO doesn't have a delay option, so we simulate it - if (options?.delay && options.delay > 0) { - for (const char of text) { - await element.addValue(char); - await new Promise((r) => setTimeout(r, options.delay)); - } - } - else { - await element.addValue(text); - } - } - /** - * Fill an element (clear first, then type) - */ - async fill(selector, value) { - if (!this.browser) { - throw new Error('iOS browser not launched'); - } - const element = await this.getElement(selector); - await element.clearValue(); - await element.setValue(value); - } - /** - * Get element by selector or ref - */ - async getElement(selectorOrRef) { - if (!this.browser) { - throw new Error('iOS browser not launched'); - } - // Check if it's a ref - const refData = this.getRefData(selectorOrRef); - if (refData) { - if (refData.xpath) { - return this.browser.$(refData.xpath); - } - return this.browser.$(refData.selector); - } - // Regular CSS selector - return this.browser.$(selectorOrRef); - } - /** - * Get ref data from ref string - */ - getRefData(refArg) { - let ref = null; - if (refArg.startsWith('@')) { - ref = refArg.slice(1); - } - else if (refArg.startsWith('ref=')) { - ref = refArg.slice(4); - } - else if (/^e\d+$/.test(refArg)) { - ref = refArg; - } - if (ref && this.refMap[ref]) { - return this.refMap[ref]; - } - return null; - } - /** - * Take a screenshot - */ - async screenshot(options) { - if (!this.browser) { - throw new Error('iOS browser not launched'); - } - const base64 = await this.browser.takeScreenshot(); - if (options?.path) { - const { writeFileSync, mkdirSync } = await import('node:fs'); - const dir = path.dirname(options.path); - if (!existsSync(dir)) { - mkdirSync(dir, { recursive: true }); - } - writeFileSync(options.path, base64, 'base64'); - return { path: options.path }; - } - return { base64 }; - } - /** - * Get page snapshot with refs - */ - async getSnapshot(options) { - if (!this.browser) { - throw new Error('iOS browser not launched'); - } - this.refCounter = 0; - this.refMap = {}; - // Get page structure via JavaScript execution - // Note: The function runs in browser context, so we use 'any' for DOM types - const snapshot = await this.browser.execute(function (interactiveOnly) { - const INTERACTIVE_ROLES = new Set([ - 'button', - 'link', - 'textbox', - 'checkbox', - 'radio', - 'combobox', - 'listbox', - 'menuitem', - 'option', - 'searchbox', - 'slider', - 'spinbutton', - 'switch', - 'tab', - 'treeitem', - ]); - const INTERACTIVE_TAGS = new Set([ - 'A', - 'BUTTON', - 'INPUT', - 'SELECT', - 'TEXTAREA', - 'DETAILS', - 'SUMMARY', - ]); - function getXPath(element) { - if (element.id) { - return `//*[@id="${element.id}"]`; - } - const parts = []; - let current = element; - while (current && current.nodeType === 1) { - // Node.ELEMENT_NODE = 1 - let index = 1; - let sibling = current.previousElementSibling; - while (sibling) { - if (sibling.nodeName === current.nodeName) { - index++; - } - sibling = sibling.previousElementSibling; - } - const tagName = current.nodeName.toLowerCase(); - parts.unshift(`${tagName}[${index}]`); - current = current.parentElement; - } - return '/' + parts.join('/'); - } - function getAccessibleName(element) { - // aria-label takes precedence - const ariaLabel = element.getAttribute('aria-label'); - if (ariaLabel) - return ariaLabel; - // For inputs, check placeholder and label - const tagName = element.tagName; - if (tagName === 'INPUT' || tagName === 'TEXTAREA') { - const id = element.id; - if (id) { - const label = document.querySelector(`label[for="${id}"]`); - if (label) - return label.textContent?.trim() || ''; - } - if (element.placeholder) - return element.placeholder; - } - // For buttons and links, use text content - if (tagName === 'BUTTON' || tagName === 'A') { - return element.textContent?.trim() || ''; - } - // aria-labelledby - const labelledBy = element.getAttribute('aria-labelledby'); - if (labelledBy) { - const labelElement = document.getElementById(labelledBy); - if (labelElement) - return labelElement.textContent?.trim() || ''; - } - return element.textContent?.trim().slice(0, 50) || ''; - } - function getRole(element) { - // Explicit role - const role = element.getAttribute('role'); - if (role) - return role; - // Implicit roles - const tag = element.tagName; - if (tag === 'A' && element.hasAttribute('href')) - return 'link'; - if (tag === 'BUTTON') - return 'button'; - if (tag === 'INPUT') { - const type = element.type; - if (type === 'checkbox') - return 'checkbox'; - if (type === 'radio') - return 'radio'; - if (type === 'text' || type === 'email' || type === 'password' || type === 'search') - return 'textbox'; - if (type === 'submit' || type === 'button') - return 'button'; - } - if (tag === 'TEXTAREA') - return 'textbox'; - if (tag === 'SELECT') - return 'combobox'; - if (tag === 'H1' || - tag === 'H2' || - tag === 'H3' || - tag === 'H4' || - tag === 'H5' || - tag === 'H6') - return 'heading'; - if (tag === 'IMG') - return 'img'; - if (tag === 'NAV') - return 'navigation'; - if (tag === 'MAIN') - return 'main'; - if (tag === 'HEADER') - return 'banner'; - if (tag === 'FOOTER') - return 'contentinfo'; - return null; - } - function traverse(element, depth) { - if (depth > 10) - return null; // Limit depth - const tag = element.tagName; - const role = getRole(element); - const name = getAccessibleName(element); - const isInteractive = INTERACTIVE_TAGS.has(tag) || (role !== null && INTERACTIVE_ROLES.has(role)); - // Skip hidden elements - const style = window.getComputedStyle(element); - if (style.display === 'none' || style.visibility === 'hidden') { - return null; - } - const children = []; - for (const child of element.children) { - const childInfo = traverse(child, depth + 1); - if (childInfo) { - children.push(childInfo); - } - } - // In interactive mode, skip non-interactive elements without interactive children - if (interactiveOnly && !isInteractive && children.length === 0) { - return null; - } - return { - tag, - role, - name, - text: element.textContent?.trim().slice(0, 100) || '', - isInteractive, - xpath: getXPath(element), - children, - }; - } - const root = traverse(document.body, 0); - return root; - }, options?.interactive ?? false); - // Build tree string and refs - const lines = []; - const buildTree = (node, indent) => { - if (!node) - return; - const prefix = ' '.repeat(indent) + '- '; - const role = node.role || node.tag.toLowerCase(); - const name = node.name; - let line = `${prefix}${role}`; - if (name) { - line += ` "${name}"`; - } - // Add ref for interactive elements - if (node.isInteractive) { - const ref = `e${++this.refCounter}`; - line += ` [ref=${ref}]`; - this.refMap[ref] = { - selector: node.xpath.startsWith('/') ? node.xpath : `#${node.xpath}`, - role: node.role, - name: node.name, - xpath: node.xpath, - }; - } - lines.push(line); - for (const child of node.children || []) { - buildTree(child, indent + 1); - } - }; - if (snapshot) { - buildTree(snapshot, 0); - } - const tree = lines.join('\n') || '(empty)'; - this.lastSnapshot = tree; - return { tree, refs: this.refMap }; - } - /** - * Get cached ref map - */ - getRefMap() { - return this.refMap; - } - /** - * Scroll the page - */ - async scroll(options) { - if (!this.browser) { - throw new Error('iOS browser not launched'); - } - const amount = options?.amount ?? 300; - if (options?.selector) { - const element = await this.getElement(options.selector); - await element.scrollIntoView(); - return; - } - // Use JavaScript scrolling - let deltaX = options?.x ?? 0; - let deltaY = options?.y ?? 0; - if (options?.direction) { - switch (options.direction) { - case 'up': - deltaY = -amount; - break; - case 'down': - deltaY = amount; - break; - case 'left': - deltaX = -amount; - break; - case 'right': - deltaX = amount; - break; - } - } - await this.browser.execute(function (x, y) { - window.scrollBy(x, y); - }, deltaX, deltaY); - } - /** - * Swipe gesture (iOS-specific) - */ - async swipe(direction, options) { - if (!this.browser) { - throw new Error('iOS browser not launched'); - } - const distance = options?.distance ?? 300; - // Map direction to scroll (opposite direction) - const scrollDirection = { - up: 'down', - down: 'up', - left: 'right', - right: 'left', - }[direction]; - await this.scroll({ direction: scrollDirection, amount: distance }); - } - /** - * Execute JavaScript - */ - async evaluate(script, ...args) { - if (!this.browser) { - throw new Error('iOS browser not launched'); - } - // Execute the script directly - WebdriverIO handles the context - const result = await this.browser.execute(function (code, evalArgs) { - // Create a function from the code and execute it - const fn = new Function(...evalArgs.map((_, i) => `arg${i}`), code); - return fn(...evalArgs); - }, script.includes('return') ? script : `return (${script})`, args); - return result; - } - /** - * Wait for element - */ - async wait(options) { - if (!this.browser) { - throw new Error('iOS browser not launched'); - } - const timeout = options.timeout ?? 30000; - if (options.selector) { - const element = await this.getElement(options.selector); - switch (options.state) { - case 'detached': - await element.waitForExist({ timeout, reverse: true }); - break; - case 'hidden': - await element.waitForDisplayed({ timeout, reverse: true }); - break; - case 'visible': - await element.waitForDisplayed({ timeout }); - break; - case 'attached': - default: - await element.waitForExist({ timeout }); - break; - } - } - else { - // Just wait for timeout - await new Promise((r) => setTimeout(r, timeout)); - } - } - /** - * Press a key - */ - async press(key) { - if (!this.browser) { - throw new Error('iOS browser not launched'); - } - // Map common key names - const keyMap = { - Enter: '\uE007', - Tab: '\uE004', - Escape: '\uE00C', - Backspace: '\uE003', - Delete: '\uE017', - ArrowUp: '\uE013', - ArrowDown: '\uE015', - ArrowLeft: '\uE012', - ArrowRight: '\uE014', - }; - const mappedKey = keyMap[key] ?? key; - await this.browser.keys(mappedKey); - } - /** - * Hover over element (limited on touch - just scrolls into view) - */ - async hover(selector) { - if (!this.browser) { - throw new Error('iOS browser not launched'); - } - const element = await this.getElement(selector); - await element.scrollIntoView(); - } - /** - * Get page content (HTML) - */ - async getContent(selector) { - if (!this.browser) { - throw new Error('iOS browser not launched'); - } - if (selector) { - const element = await this.getElement(selector); - return element.getHTML(); - } - return this.browser.getPageSource(); - } - /** - * Get text content of element - */ - async getText(selector) { - if (!this.browser) { - throw new Error('iOS browser not launched'); - } - const element = await this.getElement(selector); - return element.getText(); - } - /** - * Get attribute value - */ - async getAttribute(selector, attribute) { - if (!this.browser) { - throw new Error('iOS browser not launched'); - } - const element = await this.getElement(selector); - return element.getAttribute(attribute); - } - /** - * Check if element is visible - */ - async isVisible(selector) { - if (!this.browser) { - throw new Error('iOS browser not launched'); - } - try { - const element = await this.getElement(selector); - return element.isDisplayed(); - } - catch { - return false; - } - } - /** - * Check if element is enabled - */ - async isEnabled(selector) { - if (!this.browser) { - throw new Error('iOS browser not launched'); - } - const element = await this.getElement(selector); - return element.isEnabled(); - } - /** - * Navigate back - */ - async goBack() { - if (!this.browser) { - throw new Error('iOS browser not launched'); - } - await this.browser.back(); - } - /** - * Navigate forward - */ - async goForward() { - if (!this.browser) { - throw new Error('iOS browser not launched'); - } - await this.browser.forward(); - } - /** - * Reload page - */ - async reload() { - if (!this.browser) { - throw new Error('iOS browser not launched'); - } - await this.browser.refresh(); - } - /** - * Select option(s) from dropdown - */ - async select(selector, values) { - if (!this.browser) { - throw new Error('iOS browser not launched'); - } - const element = await this.getElement(selector); - const valueArray = Array.isArray(values) ? values : [values]; - for (const value of valueArray) { - await element.selectByAttribute('value', value); - } - } - /** - * Check a checkbox - */ - async check(selector) { - if (!this.browser) { - throw new Error('iOS browser not launched'); - } - const element = await this.getElement(selector); - const isChecked = await element.isSelected(); - if (!isChecked) { - await element.click(); - } - } - /** - * Uncheck a checkbox - */ - async uncheck(selector) { - if (!this.browser) { - throw new Error('iOS browser not launched'); - } - const element = await this.getElement(selector); - const isChecked = await element.isSelected(); - if (isChecked) { - await element.click(); - } - } - /** - * Focus an element - */ - async focus(selector) { - if (!this.browser) { - throw new Error('iOS browser not launched'); - } - const element = await this.getElement(selector); - await this.browser.execute(function (el) { - el.focus(); - }, element); - } - /** - * Clear input field - */ - async clear(selector) { - if (!this.browser) { - throw new Error('iOS browser not launched'); - } - const element = await this.getElement(selector); - await element.clearValue(); - } - /** - * Get element count - */ - async count(selector) { - if (!this.browser) { - throw new Error('iOS browser not launched'); - } - const elements = await this.browser.$$(selector); - return elements.length; - } - /** - * Get bounding box - */ - async getBoundingBox(selector) { - if (!this.browser) { - throw new Error('iOS browser not launched'); - } - try { - const element = await this.getElement(selector); - const location = await element.getLocation(); - const size = await element.getSize(); - return { - x: location.x, - y: location.y, - width: size.width, - height: size.height, - }; - } - catch { - return null; - } - } - /** - * Get device info - */ - getDeviceInfo() { - if (!this.deviceName || !this.deviceUdid) { - return null; - } - return { - name: this.deviceName, - udid: this.deviceUdid, - }; - } - /** - * Close browser and cleanup - */ - async close() { - if (this.browser) { - try { - await this.browser.deleteSession(); - } - catch { - // Ignore cleanup errors - } - this.browser = null; - } - if (this.appiumProcess) { - this.appiumProcess.kill(); - this.appiumProcess = null; - } - // Optionally shutdown simulator - if (this.deviceUdid) { - try { - this.simctl.udid = this.deviceUdid; - await this.simctl.shutdownDevice(); - } - catch { - // Ignore - simulator might already be shutdown - } - } - this.deviceUdid = null; - this.deviceName = null; - this.refMap = {}; - this.lastSnapshot = ''; - this.refCounter = 0; - } -} -//# sourceMappingURL=ios-manager.js.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/ios-manager.js.map b/vendor/agent-browser/dist/ios-manager.js.map deleted file mode 100644 index 638d1bd..0000000 --- a/vendor/agent-browser/dist/ios-manager.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ios-manager.js","sourceRoot":"","sources":["../src/ios-manager.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/protocol.d.ts b/vendor/agent-browser/dist/protocol.d.ts deleted file mode 100644 index 58a127e..0000000 --- a/vendor/agent-browser/dist/protocol.d.ts +++ /dev/null @@ -1,26 +0,0 @@ -import type { Command, Response } from './types.js'; -export type ParseResult = { - success: true; - command: Command; -} | { - success: false; - error: string; - id?: string; -}; -/** - * Parse a JSON string into a validated command - */ -export declare function parseCommand(input: string): ParseResult; -/** - * Create a success response - */ -export declare function successResponse(id: string, data: T): Response; -/** - * Create an error response - */ -export declare function errorResponse(id: string, error: string): Response; -/** - * Serialize a response to JSON string - */ -export declare function serializeResponse(response: Response): string; -//# sourceMappingURL=protocol.d.ts.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/protocol.d.ts.map b/vendor/agent-browser/dist/protocol.d.ts.map deleted file mode 100644 index b63c895..0000000 --- a/vendor/agent-browser/dist/protocol.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AA+iCpD,MAAM,MAAM,WAAW,GACnB;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GACnC;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnD;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAqDvD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAEnE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,CAEjE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAE5D"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/protocol.js b/vendor/agent-browser/dist/protocol.js deleted file mode 100644 index 4406d9e..0000000 --- a/vendor/agent-browser/dist/protocol.js +++ /dev/null @@ -1,982 +0,0 @@ -import { z } from 'zod'; -// Base schema for all commands -const baseCommandSchema = z.object({ - id: z.string(), - action: z.string(), -}); -// Individual action schemas -const launchSchema = baseCommandSchema.extend({ - action: z.literal('launch'), - headless: z.boolean().optional(), - viewport: z - .object({ - width: z.number().positive(), - height: z.number().positive(), - }) - .nullable() - .optional(), - browser: z.enum(['chromium', 'firefox', 'webkit']).optional(), - cdpPort: z.number().positive().optional(), - cdpUrl: z - .string() - .url() - .refine((url) => url.startsWith('ws://') || - url.startsWith('wss://') || - url.startsWith('http://') || - url.startsWith('https://'), { message: 'CDP URL must start with ws://, wss://, http://, or https://' }) - .optional(), - autoConnect: z.boolean().optional(), - executablePath: z.string().optional(), - extensions: z.array(z.string()).optional(), - headers: z.record(z.string()).optional(), - proxy: z - .object({ - server: z.string().min(1), - bypass: z.string().optional(), - username: z.string().optional(), - password: z.string().optional(), - }) - .optional(), - args: z.array(z.string()).optional(), - userAgent: z.string().optional(), - provider: z.string().optional(), - ignoreHTTPSErrors: z.boolean().optional(), - allowFileAccess: z.boolean().optional(), - colorScheme: z.enum(['light', 'dark', 'no-preference']).optional(), - downloadPath: z.string().optional(), - profile: z.string().optional(), - storageState: z.string().optional(), - allowedDomains: z.array(z.string()).optional(), - actionPolicy: z.string().optional(), - confirmActions: z.array(z.string()).optional(), -}); -const navigateSchema = baseCommandSchema.extend({ - action: z.literal('navigate'), - url: z.string().min(1), - waitUntil: z.enum(['load', 'domcontentloaded', 'networkidle']).optional(), - headers: z.record(z.string()).optional(), -}); -const clickSchema = baseCommandSchema.extend({ - action: z.literal('click'), - selector: z.string().min(1), - button: z.enum(['left', 'right', 'middle']).optional(), - clickCount: z.number().positive().optional(), - delay: z.number().nonnegative().optional(), - newTab: z.boolean().optional(), -}); -const typeSchema = baseCommandSchema.extend({ - action: z.literal('type'), - selector: z.string().min(1), - text: z.string(), - delay: z.number().nonnegative().optional(), - clear: z.boolean().optional(), -}); -const fillSchema = baseCommandSchema.extend({ - action: z.literal('fill'), - selector: z.string().min(1), - value: z.string(), -}); -const checkSchema = baseCommandSchema.extend({ - action: z.literal('check'), - selector: z.string().min(1), -}); -const uncheckSchema = baseCommandSchema.extend({ - action: z.literal('uncheck'), - selector: z.string().min(1), -}); -const uploadSchema = baseCommandSchema.extend({ - action: z.literal('upload'), - selector: z.string().min(1), - files: z.union([z.string(), z.array(z.string())]), -}); -const dblclickSchema = baseCommandSchema.extend({ - action: z.literal('dblclick'), - selector: z.string().min(1), -}); -const focusSchema = baseCommandSchema.extend({ - action: z.literal('focus'), - selector: z.string().min(1), -}); -const dragSchema = baseCommandSchema.extend({ - action: z.literal('drag'), - source: z.string().min(1), - target: z.string().min(1), -}); -const frameSchema = baseCommandSchema.extend({ - action: z.literal('frame'), - selector: z.string().min(1).optional(), - name: z.string().optional(), - url: z.string().optional(), -}); -const mainframeSchema = baseCommandSchema.extend({ - action: z.literal('mainframe'), -}); -const getByRoleSchema = baseCommandSchema.extend({ - action: z.literal('getbyrole'), - role: z.string().min(1), - name: z.string().optional(), - exact: z.boolean().optional(), - subaction: z.enum(['click', 'fill', 'check', 'hover']), - value: z.string().optional(), -}); -const getByTextSchema = baseCommandSchema.extend({ - action: z.literal('getbytext'), - text: z.string().min(1), - exact: z.boolean().optional(), - subaction: z.enum(['click', 'hover']), -}); -const getByLabelSchema = baseCommandSchema.extend({ - action: z.literal('getbylabel'), - label: z.string().min(1), - exact: z.boolean().optional(), - subaction: z.enum(['click', 'fill', 'check']), - value: z.string().optional(), -}); -const getByPlaceholderSchema = baseCommandSchema.extend({ - action: z.literal('getbyplaceholder'), - placeholder: z.string().min(1), - exact: z.boolean().optional(), - subaction: z.enum(['click', 'fill']), - value: z.string().optional(), -}); -const cookiesGetSchema = baseCommandSchema.extend({ - action: z.literal('cookies_get'), - urls: z.array(z.string()).optional(), -}); -const cookiesSetSchema = baseCommandSchema.extend({ - action: z.literal('cookies_set'), - cookies: z.array(z.object({ - name: z.string(), - value: z.string(), - url: z.string().optional(), - domain: z.string().optional(), - path: z.string().optional(), - expires: z.number().optional(), - httpOnly: z.boolean().optional(), - secure: z.boolean().optional(), - sameSite: z.enum(['Strict', 'Lax', 'None']).optional(), - })), -}); -const cookiesClearSchema = baseCommandSchema.extend({ - action: z.literal('cookies_clear'), -}); -const storageGetSchema = baseCommandSchema.extend({ - action: z.literal('storage_get'), - key: z.string().optional(), - type: z.enum(['local', 'session']), -}); -const storageSetSchema = baseCommandSchema.extend({ - action: z.literal('storage_set'), - key: z.string().min(1), - value: z.string(), - type: z.enum(['local', 'session']), -}); -const storageClearSchema = baseCommandSchema.extend({ - action: z.literal('storage_clear'), - type: z.enum(['local', 'session']), -}); -const dialogSchema = baseCommandSchema.extend({ - action: z.literal('dialog'), - response: z.enum(['accept', 'dismiss']), - promptText: z.string().optional(), -}); -const pdfSchema = baseCommandSchema.extend({ - action: z.literal('pdf'), - path: z.string().min(1), - format: z - .enum(['Letter', 'Legal', 'Tabloid', 'Ledger', 'A0', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6']) - .optional(), -}); -const routeSchema = baseCommandSchema.extend({ - action: z.literal('route'), - url: z.string().min(1), - response: z - .object({ - status: z.number().optional(), - body: z.string().optional(), - contentType: z.string().optional(), - headers: z.record(z.string()).optional(), - }) - .optional(), - abort: z.boolean().optional(), -}); -const unrouteSchema = baseCommandSchema.extend({ - action: z.literal('unroute'), - url: z.string().optional(), -}); -const requestsSchema = baseCommandSchema.extend({ - action: z.literal('requests'), - filter: z.string().optional(), - clear: z.boolean().optional(), -}); -const downloadSchema = baseCommandSchema.extend({ - action: z.literal('download'), - selector: z.string().min(1), - path: z.string().min(1), -}); -const geolocationSchema = baseCommandSchema.extend({ - action: z.literal('geolocation'), - latitude: z.number(), - longitude: z.number(), - accuracy: z.number().optional(), -}); -const permissionsSchema = baseCommandSchema.extend({ - action: z.literal('permissions'), - permissions: z.array(z.string()), - grant: z.boolean(), -}); -const viewportSchema = baseCommandSchema.extend({ - action: z.literal('viewport'), - width: z.number().positive(), - height: z.number().positive(), -}); -const userAgentSchema = baseCommandSchema.extend({ - action: z.literal('useragent'), - userAgent: z.string().min(1), -}); -const deviceSchema = baseCommandSchema.extend({ - action: z.literal('device'), - device: z.string().min(1), -}); -const backSchema = baseCommandSchema.extend({ - action: z.literal('back'), -}); -const forwardSchema = baseCommandSchema.extend({ - action: z.literal('forward'), -}); -const reloadSchema = baseCommandSchema.extend({ - action: z.literal('reload'), -}); -const urlSchema = baseCommandSchema.extend({ - action: z.literal('url'), -}); -const titleSchema = baseCommandSchema.extend({ - action: z.literal('title'), -}); -const getAttributeSchema = baseCommandSchema.extend({ - action: z.literal('getattribute'), - selector: z.string().min(1), - attribute: z.string().min(1), -}); -const getTextSchema = baseCommandSchema.extend({ - action: z.literal('gettext'), - selector: z.string().min(1), -}); -const isVisibleSchema = baseCommandSchema.extend({ - action: z.literal('isvisible'), - selector: z.string().min(1), -}); -const isEnabledSchema = baseCommandSchema.extend({ - action: z.literal('isenabled'), - selector: z.string().min(1), -}); -const isCheckedSchema = baseCommandSchema.extend({ - action: z.literal('ischecked'), - selector: z.string().min(1), -}); -const countSchema = baseCommandSchema.extend({ - action: z.literal('count'), - selector: z.string().min(1), -}); -const boundingBoxSchema = baseCommandSchema.extend({ - action: z.literal('boundingbox'), - selector: z.string().min(1), -}); -const stylesSchema = baseCommandSchema.extend({ - action: z.literal('styles'), - selector: z.string().min(1), -}); -const videoStartSchema = baseCommandSchema.extend({ - action: z.literal('video_start'), - path: z.string().min(1), -}); -const videoStopSchema = baseCommandSchema.extend({ - action: z.literal('video_stop'), -}); -// Recording schemas (Playwright native video recording) -const recordingStartSchema = baseCommandSchema.extend({ - action: z.literal('recording_start'), - path: z.string().min(1), - url: z.string().min(1).optional(), -}); -const recordingStopSchema = baseCommandSchema.extend({ - action: z.literal('recording_stop'), -}); -const recordingRestartSchema = baseCommandSchema.extend({ - action: z.literal('recording_restart'), - path: z.string().min(1), - url: z.string().min(1).optional(), -}); -const traceStartSchema = baseCommandSchema.extend({ - action: z.literal('trace_start'), - screenshots: z.boolean().optional(), - snapshots: z.boolean().optional(), -}); -const traceStopSchema = baseCommandSchema.extend({ - action: z.literal('trace_stop'), - path: z.string().min(1).optional(), -}); -const profilerStartSchema = baseCommandSchema.extend({ - action: z.literal('profiler_start'), - categories: z.array(z.string()).optional(), -}); -const profilerStopSchema = baseCommandSchema.extend({ - action: z.literal('profiler_stop'), - path: z.string().min(1).optional(), -}); -const harStartSchema = baseCommandSchema.extend({ - action: z.literal('har_start'), -}); -const harStopSchema = baseCommandSchema.extend({ - action: z.literal('har_stop'), - path: z.string().min(1), -}); -const stateSaveSchema = baseCommandSchema.extend({ - action: z.literal('state_save'), - path: z.string().min(1), -}); -const stateLoadSchema = baseCommandSchema.extend({ - action: z.literal('state_load'), - path: z.string().min(1), -}); -const stateListSchema = baseCommandSchema.extend({ - action: z.literal('state_list'), -}); -const stateClearSchema = baseCommandSchema.extend({ - action: z.literal('state_clear'), - sessionName: z.string().optional(), - all: z.boolean().optional(), -}); -const stateShowSchema = baseCommandSchema.extend({ - action: z.literal('state_show'), - filename: z.string().min(1), -}); -const stateCleanSchema = baseCommandSchema.extend({ - action: z.literal('state_clean'), - days: z.number().int().positive(), -}); -const stateRenameSchema = baseCommandSchema.extend({ - action: z.literal('state_rename'), - oldName: z.string().min(1), - newName: z.string().min(1), -}); -const consoleSchema = baseCommandSchema.extend({ - action: z.literal('console'), - clear: z.boolean().optional(), -}); -const errorsSchema = baseCommandSchema.extend({ - action: z.literal('errors'), - clear: z.boolean().optional(), -}); -const keyboardSchema = baseCommandSchema.extend({ - action: z.literal('keyboard'), - subaction: z.enum(['type', 'press', 'insertText']).optional(), - keys: z.string().min(1).optional(), - text: z.string().min(1).optional(), - delay: z.number().optional(), -}); -const wheelSchema = baseCommandSchema.extend({ - action: z.literal('wheel'), - deltaX: z.number().optional(), - deltaY: z.number().optional(), - selector: z.string().optional(), -}); -const tapSchema = baseCommandSchema.extend({ - action: z.literal('tap'), - selector: z.string().min(1), -}); -const clipboardSchema = baseCommandSchema.extend({ - action: z.literal('clipboard'), - operation: z.enum(['copy', 'paste', 'read']), - text: z.string().optional(), -}); -const highlightSchema = baseCommandSchema.extend({ - action: z.literal('highlight'), - selector: z.string().min(1), -}); -const clearSchema = baseCommandSchema.extend({ - action: z.literal('clear'), - selector: z.string().min(1), -}); -const selectAllSchema = baseCommandSchema.extend({ - action: z.literal('selectall'), - selector: z.string().min(1), -}); -const innerTextSchema = baseCommandSchema.extend({ - action: z.literal('innertext'), - selector: z.string().min(1), -}); -const innerHtmlSchema = baseCommandSchema.extend({ - action: z.literal('innerhtml'), - selector: z.string().min(1), -}); -const inputValueSchema = baseCommandSchema.extend({ - action: z.literal('inputvalue'), - selector: z.string().min(1), -}); -const setValueSchema = baseCommandSchema.extend({ - action: z.literal('setvalue'), - selector: z.string().min(1), - value: z.string(), -}); -const dispatchSchema = baseCommandSchema.extend({ - action: z.literal('dispatch'), - selector: z.string().min(1), - event: z.string().min(1), - eventInit: z.record(z.unknown()).optional(), -}); -const evalHandleSchema = baseCommandSchema.extend({ - action: z.literal('evalhandle'), - script: z.string().min(1), -}); -const exposeSchema = baseCommandSchema.extend({ - action: z.literal('expose'), - name: z.string().min(1), -}); -const addScriptSchema = baseCommandSchema.extend({ - action: z.literal('addscript'), - content: z.string().optional(), - url: z.string().optional(), -}); -const addStyleSchema = baseCommandSchema.extend({ - action: z.literal('addstyle'), - content: z.string().optional(), - url: z.string().optional(), -}); -const emulateMediaSchema = baseCommandSchema.extend({ - action: z.literal('emulatemedia'), - media: z.enum(['screen', 'print']).nullable().optional(), - colorScheme: z.enum(['light', 'dark', 'no-preference']).nullable().optional(), - reducedMotion: z.enum(['reduce', 'no-preference']).nullable().optional(), - forcedColors: z.enum(['active', 'none']).nullable().optional(), -}); -const offlineSchema = baseCommandSchema.extend({ - action: z.literal('offline'), - offline: z.boolean(), -}); -const headersSchema = baseCommandSchema.extend({ - action: z.literal('headers'), - headers: z.record(z.string()), -}); -const pauseSchema = baseCommandSchema.extend({ - action: z.literal('pause'), -}); -const getByAltTextSchema = baseCommandSchema.extend({ - action: z.literal('getbyalttext'), - text: z.string().min(1), - exact: z.boolean().optional(), - subaction: z.enum(['click', 'hover']), -}); -const getByTitleSchema = baseCommandSchema.extend({ - action: z.literal('getbytitle'), - text: z.string().min(1), - exact: z.boolean().optional(), - subaction: z.enum(['click', 'hover']), -}); -const getByTestIdSchema = baseCommandSchema.extend({ - action: z.literal('getbytestid'), - testId: z.string().min(1), - subaction: z.enum(['click', 'fill', 'check', 'hover']), - value: z.string().optional(), -}); -const nthSchema = baseCommandSchema.extend({ - action: z.literal('nth'), - selector: z.string().min(1), - index: z.number(), - subaction: z.enum(['click', 'fill', 'check', 'hover', 'text']), - value: z.string().optional(), -}); -const waitForUrlSchema = baseCommandSchema.extend({ - action: z.literal('waitforurl'), - url: z.string().min(1), - timeout: z.number().positive().optional(), -}); -const waitForLoadStateSchema = baseCommandSchema.extend({ - action: z.literal('waitforloadstate'), - state: z.enum(['load', 'domcontentloaded', 'networkidle']), - timeout: z.number().positive().optional(), -}); -const setContentSchema = baseCommandSchema.extend({ - action: z.literal('setcontent'), - html: z.string(), -}); -const timezoneSchema = baseCommandSchema.extend({ - action: z.literal('timezone'), - timezone: z.string().min(1), -}); -const localeSchema = baseCommandSchema.extend({ - action: z.literal('locale'), - locale: z.string().min(1), -}); -const credentialsSchema = baseCommandSchema.extend({ - action: z.literal('credentials'), - username: z.string(), - password: z.string(), -}); -const mouseMoveSchema = baseCommandSchema.extend({ - action: z.literal('mousemove'), - x: z.number(), - y: z.number(), -}); -const mouseDownSchema = baseCommandSchema.extend({ - action: z.literal('mousedown'), - button: z.enum(['left', 'right', 'middle']).optional(), -}); -const mouseUpSchema = baseCommandSchema.extend({ - action: z.literal('mouseup'), - button: z.enum(['left', 'right', 'middle']).optional(), -}); -const bringToFrontSchema = baseCommandSchema.extend({ - action: z.literal('bringtofront'), -}); -const waitForFunctionSchema = baseCommandSchema.extend({ - action: z.literal('waitforfunction'), - expression: z.string().min(1), - timeout: z.number().positive().optional(), -}); -const scrollIntoViewSchema = baseCommandSchema.extend({ - action: z.literal('scrollintoview'), - selector: z.string().min(1), -}); -const addInitScriptSchema = baseCommandSchema.extend({ - action: z.literal('addinitscript'), - script: z.string().min(1), -}); -const keyDownSchema = baseCommandSchema.extend({ - action: z.literal('keydown'), - key: z.string().min(1), -}); -const keyUpSchema = baseCommandSchema.extend({ - action: z.literal('keyup'), - key: z.string().min(1), -}); -const insertTextSchema = baseCommandSchema.extend({ - action: z.literal('inserttext'), - text: z.string(), -}); -const multiSelectSchema = baseCommandSchema.extend({ - action: z.literal('multiselect'), - selector: z.string().min(1), - values: z.array(z.string()), -}); -const waitForDownloadSchema = baseCommandSchema.extend({ - action: z.literal('waitfordownload'), - path: z.string().optional(), - timeout: z.number().positive().optional(), -}); -const responseBodySchema = baseCommandSchema.extend({ - action: z.literal('responsebody'), - url: z.string().min(1), - timeout: z.number().positive().optional(), -}); -// Screencast schemas for streaming browser viewport -const screencastStartSchema = baseCommandSchema.extend({ - action: z.literal('screencast_start'), - format: z.enum(['jpeg', 'png']).optional(), - quality: z.number().min(0).max(100).optional(), - maxWidth: z.number().positive().optional(), - maxHeight: z.number().positive().optional(), - everyNthFrame: z.number().positive().optional(), -}); -const screencastStopSchema = baseCommandSchema.extend({ - action: z.literal('screencast_stop'), -}); -// Input injection schemas for pair browsing -const inputMouseSchema = baseCommandSchema.extend({ - action: z.literal('input_mouse'), - type: z.enum(['mousePressed', 'mouseReleased', 'mouseMoved', 'mouseWheel']), - x: z.number(), - y: z.number(), - button: z.enum(['left', 'right', 'middle', 'none']).optional(), - clickCount: z.number().positive().optional(), - deltaX: z.number().optional(), - deltaY: z.number().optional(), - modifiers: z.number().optional(), -}); -const inputKeyboardSchema = baseCommandSchema.extend({ - action: z.literal('input_keyboard'), - type: z.enum(['keyDown', 'keyUp', 'char']), - key: z.string().optional(), - code: z.string().optional(), - text: z.string().optional(), - modifiers: z.number().optional(), -}); -const inputTouchSchema = baseCommandSchema.extend({ - action: z.literal('input_touch'), - type: z.enum(['touchStart', 'touchEnd', 'touchMove', 'touchCancel']), - touchPoints: z.array(z.object({ - x: z.number(), - y: z.number(), - id: z.number().optional(), - })), - modifiers: z.number().optional(), -}); -// iOS-specific schemas -const swipeSchema = baseCommandSchema.extend({ - action: z.literal('swipe'), - direction: z.enum(['up', 'down', 'left', 'right']), - distance: z.number().positive().optional(), -}); -const deviceListSchema = baseCommandSchema.extend({ - action: z.literal('device_list'), -}); -// Diff schemas -const diffSnapshotSchema = baseCommandSchema.extend({ - action: z.literal('diff_snapshot'), - baseline: z.string().optional(), - selector: z.string().optional(), - compact: z.boolean().optional(), - maxDepth: z.number().nonnegative().optional(), -}); -const diffScreenshotSchema = baseCommandSchema.extend({ - action: z.literal('diff_screenshot'), - baseline: z.string().min(1), - output: z.string().optional(), - threshold: z.number().min(0).max(1).optional(), - selector: z.string().min(1).optional(), - fullPage: z.boolean().optional(), -}); -const diffUrlSchema = baseCommandSchema.extend({ - action: z.literal('diff_url'), - url1: z.string().min(1), - url2: z.string().min(1), - screenshot: z.boolean().optional(), - fullPage: z.boolean().optional(), - waitUntil: z.enum(['load', 'domcontentloaded', 'networkidle']).optional(), - selector: z.string().optional(), - compact: z.boolean().optional(), - maxDepth: z.number().nonnegative().optional(), -}); -const pressSchema = baseCommandSchema.extend({ - action: z.literal('press'), - key: z.string().min(1), - selector: z.string().min(1).optional(), -}); -const screenshotSchema = baseCommandSchema.extend({ - action: z.literal('screenshot'), - path: z.string().nullable().optional(), - fullPage: z.boolean().optional(), - selector: z.string().min(1).nullish(), - format: z.enum(['png', 'jpeg']).optional(), - quality: z.number().min(0).max(100).optional(), - annotate: z.boolean().optional(), -}); -const snapshotSchema = baseCommandSchema.extend({ - action: z.literal('snapshot'), - interactive: z.boolean().optional(), - cursor: z.boolean().optional(), - maxDepth: z.number().nonnegative().optional(), - compact: z.boolean().optional(), - selector: z.string().optional(), -}); -const evaluateSchema = baseCommandSchema.extend({ - action: z.literal('evaluate'), - script: z.string().min(1), - args: z.array(z.unknown()).optional(), -}); -const waitSchema = baseCommandSchema.extend({ - action: z.literal('wait'), - selector: z.string().min(1).optional(), - timeout: z.number().positive().optional(), - state: z.enum(['attached', 'detached', 'visible', 'hidden']).optional(), -}); -const scrollSchema = baseCommandSchema.extend({ - action: z.literal('scroll'), - selector: z.string().min(1).optional(), - x: z.number().optional(), - y: z.number().optional(), - direction: z.enum(['up', 'down', 'left', 'right']).optional(), - amount: z.number().positive().optional(), -}); -const selectSchema = baseCommandSchema.extend({ - action: z.literal('select'), - selector: z.string().min(1), - values: z.union([z.string(), z.array(z.string())]), -}); -const hoverSchema = baseCommandSchema.extend({ - action: z.literal('hover'), - selector: z.string().min(1), -}); -const contentSchema = baseCommandSchema.extend({ - action: z.literal('content'), - selector: z.string().min(1).optional(), -}); -const closeSchema = baseCommandSchema.extend({ - action: z.literal('close'), -}); -// Tab/Window schemas -const tabNewSchema = baseCommandSchema.extend({ - action: z.literal('tab_new'), - url: z.string().min(1).optional(), -}); -const tabListSchema = baseCommandSchema.extend({ - action: z.literal('tab_list'), -}); -const tabSwitchSchema = baseCommandSchema.extend({ - action: z.literal('tab_switch'), - index: z.number().nonnegative(), -}); -const tabCloseSchema = baseCommandSchema.extend({ - action: z.literal('tab_close'), - index: z.number().nonnegative().optional(), -}); -const windowNewSchema = baseCommandSchema.extend({ - action: z.literal('window_new'), - viewport: z - .object({ - width: z.number().positive(), - height: z.number().positive(), - }) - .nullable() - .optional(), -}); -const authProfileName = z - .string() - .min(1) - .regex(/^[a-zA-Z0-9_-]+$/, { - message: 'Profile name must contain only alphanumeric characters, hyphens, and underscores', -}); -const authSaveSchema = baseCommandSchema.extend({ - action: z.literal('auth_save'), - name: authProfileName, - url: z.string().min(1), - username: z.string().min(1), - password: z.string().min(1), - usernameSelector: z.string().optional(), - passwordSelector: z.string().optional(), - submitSelector: z.string().optional(), -}); -const authLoginSchema = baseCommandSchema.extend({ - action: z.literal('auth_login'), - name: authProfileName, -}); -const authListSchema = baseCommandSchema.extend({ - action: z.literal('auth_list'), -}); -const authDeleteSchema = baseCommandSchema.extend({ - action: z.literal('auth_delete'), - name: authProfileName, -}); -const authShowSchema = baseCommandSchema.extend({ - action: z.literal('auth_show'), - name: authProfileName, -}); -const confirmSchema = baseCommandSchema.extend({ - action: z.literal('confirm'), - confirmationId: z.string().min(1), -}); -const denySchema = baseCommandSchema.extend({ - action: z.literal('deny'), - confirmationId: z.string().min(1), -}); -// Union schema for all commands -const commandSchema = z.discriminatedUnion('action', [ - launchSchema, - navigateSchema, - clickSchema, - typeSchema, - fillSchema, - checkSchema, - uncheckSchema, - uploadSchema, - dblclickSchema, - focusSchema, - dragSchema, - frameSchema, - mainframeSchema, - getByRoleSchema, - getByTextSchema, - getByLabelSchema, - getByPlaceholderSchema, - pressSchema, - screenshotSchema, - snapshotSchema, - evaluateSchema, - waitSchema, - scrollSchema, - selectSchema, - hoverSchema, - contentSchema, - closeSchema, - tabNewSchema, - tabListSchema, - tabSwitchSchema, - tabCloseSchema, - windowNewSchema, - cookiesGetSchema, - cookiesSetSchema, - cookiesClearSchema, - storageGetSchema, - storageSetSchema, - storageClearSchema, - dialogSchema, - pdfSchema, - routeSchema, - unrouteSchema, - requestsSchema, - downloadSchema, - geolocationSchema, - permissionsSchema, - viewportSchema, - userAgentSchema, - deviceSchema, - backSchema, - forwardSchema, - reloadSchema, - urlSchema, - titleSchema, - getAttributeSchema, - getTextSchema, - isVisibleSchema, - isEnabledSchema, - isCheckedSchema, - countSchema, - boundingBoxSchema, - stylesSchema, - videoStartSchema, - videoStopSchema, - recordingStartSchema, - recordingStopSchema, - recordingRestartSchema, - traceStartSchema, - traceStopSchema, - profilerStartSchema, - profilerStopSchema, - harStartSchema, - harStopSchema, - stateSaveSchema, - stateLoadSchema, - stateListSchema, - stateClearSchema, - stateShowSchema, - stateCleanSchema, - stateRenameSchema, - consoleSchema, - errorsSchema, - keyboardSchema, - wheelSchema, - tapSchema, - clipboardSchema, - highlightSchema, - clearSchema, - selectAllSchema, - innerTextSchema, - innerHtmlSchema, - inputValueSchema, - setValueSchema, - dispatchSchema, - evalHandleSchema, - exposeSchema, - addScriptSchema, - addStyleSchema, - emulateMediaSchema, - offlineSchema, - headersSchema, - pauseSchema, - getByAltTextSchema, - getByTitleSchema, - getByTestIdSchema, - nthSchema, - waitForUrlSchema, - waitForLoadStateSchema, - setContentSchema, - timezoneSchema, - localeSchema, - credentialsSchema, - mouseMoveSchema, - mouseDownSchema, - mouseUpSchema, - bringToFrontSchema, - waitForFunctionSchema, - scrollIntoViewSchema, - addInitScriptSchema, - keyDownSchema, - keyUpSchema, - insertTextSchema, - multiSelectSchema, - waitForDownloadSchema, - responseBodySchema, - screencastStartSchema, - screencastStopSchema, - inputMouseSchema, - inputKeyboardSchema, - inputTouchSchema, - swipeSchema, - deviceListSchema, - diffSnapshotSchema, - diffScreenshotSchema, - diffUrlSchema, - confirmSchema, - denySchema, - authSaveSchema, - authLoginSchema, - authListSchema, - authDeleteSchema, - authShowSchema, -]); -/** - * Parse a JSON string into a validated command - */ -export function parseCommand(input) { - // First, try to parse JSON - let json; - try { - json = JSON.parse(input); - } - catch { - return { success: false, error: 'Invalid JSON' }; - } - // Extract id for error responses if possible - const id = typeof json === 'object' && json !== null && 'id' in json - ? String(json.id) - : undefined; - // Validate against schema - const result = commandSchema.safeParse(json); - if (!result.success) { - const errors = result.error.errors.map((e) => `${e.path.join('.')}: ${e.message}`).join(', '); - return { success: false, error: `Validation error: ${errors}`, id }; - } - const command = result.data; - // Post-parse validation for commands that need cross-field checks - if ((command.action === 'addscript' || command.action === 'addstyle') && - !command.content && - !command.url) { - return { success: false, error: 'Either content or url must be provided', id }; - } - if (command.action === 'frame' && !command.selector && !command.name && !command.url) { - return { - success: false, - error: 'frame command requires at least one of: selector, name, or url', - id, - }; - } - if (command.action === 'keyboard') { - const sub = command.subaction ?? 'press'; - if ((sub === 'type' || sub === 'insertText') && !command.text) { - return { success: false, error: `keyboard ${sub} requires text`, id }; - } - if (sub === 'press' && !command.keys) { - return { success: false, error: 'keyboard press requires keys', id }; - } - } - return { success: true, command }; -} -/** - * Create a success response - */ -export function successResponse(id, data) { - return { id, success: true, data }; -} -/** - * Create an error response - */ -export function errorResponse(id, error) { - return { id, success: false, error }; -} -/** - * Serialize a response to JSON string - */ -export function serializeResponse(response) { - return JSON.stringify(response); -} -//# sourceMappingURL=protocol.js.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/protocol.js.map b/vendor/agent-browser/dist/protocol.js.map deleted file mode 100644 index 7a7691d..0000000 --- a/vendor/agent-browser/dist/protocol.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/snapshot.d.ts b/vendor/agent-browser/dist/snapshot.d.ts deleted file mode 100644 index 188a99d..0000000 --- a/vendor/agent-browser/dist/snapshot.d.ts +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Enhanced snapshot with element refs for deterministic element selection. - * - * This module generates accessibility snapshots with embedded refs that can be - * used to click/fill/interact with elements without re-querying the DOM. - * - * Example output: - * - heading "Example Domain" [ref=e1] [level=1] - * - paragraph: Some text content - * - button "Submit" [ref=e2] - * - textbox "Email" [ref=e3] - * - * Usage: - * agent-browser snapshot # Full snapshot - * agent-browser snapshot -i # Interactive elements only - * agent-browser snapshot --depth 3 # Limit depth - * agent-browser click @e2 # Click element by ref - */ -import type { Page } from 'playwright-core'; -export interface RefMap { - [ref: string]: { - selector: string; - role: string; - name: string; - /** Index for disambiguation when multiple elements have same role+name */ - nth?: number; - }; -} -export interface EnhancedSnapshot { - tree: string; - refs: RefMap; -} -export interface SnapshotOptions { - /** Only include interactive elements (buttons, links, inputs, etc.) */ - interactive?: boolean; - /** Include cursor-interactive elements (cursor:pointer, onclick, tabindex) */ - cursor?: boolean; - /** Maximum depth of tree to include (0 = root only) */ - maxDepth?: number; - /** Remove structural elements without meaningful content */ - compact?: boolean; - /** CSS selector to scope the snapshot */ - selector?: string; -} -/** - * Reset ref counter (call at start of each snapshot) - */ -export declare function resetRefs(): void; -/** - * Get enhanced snapshot with refs and optional filtering - */ -export declare function getEnhancedSnapshot(page: Page, options?: SnapshotOptions): Promise; -/** - * Parse a ref from command argument (e.g., "@e1" -> "e1") - */ -export declare function parseRef(arg: string): string | null; -/** - * Get snapshot statistics - */ -export declare function getSnapshotStats(tree: string, refs: RefMap): { - lines: number; - chars: number; - tokens: number; - refs: number; - interactive: number; -}; -//# sourceMappingURL=snapshot.d.ts.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/snapshot.d.ts.map b/vendor/agent-browser/dist/snapshot.d.ts.map deleted file mode 100644 index 352233c..0000000 --- a/vendor/agent-browser/dist/snapshot.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAW,MAAM,iBAAiB,CAAC;AAErD,MAAM,WAAW,MAAM;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,0EAA0E;QAC1E,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,uEAAuE;IACvE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAKD;;GAEG;AACH,wBAAgB,SAAS,IAAI,IAAI,CAEhC;AA6MD;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,IAAI,EACV,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CAmE3B;AA0QD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWnD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX;IACD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB,CAUA"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/snapshot.js b/vendor/agent-browser/dist/snapshot.js deleted file mode 100644 index f902336..0000000 --- a/vendor/agent-browser/dist/snapshot.js +++ /dev/null @@ -1,514 +0,0 @@ -/** - * Enhanced snapshot with element refs for deterministic element selection. - * - * This module generates accessibility snapshots with embedded refs that can be - * used to click/fill/interact with elements without re-querying the DOM. - * - * Example output: - * - heading "Example Domain" [ref=e1] [level=1] - * - paragraph: Some text content - * - button "Submit" [ref=e2] - * - textbox "Email" [ref=e3] - * - * Usage: - * agent-browser snapshot # Full snapshot - * agent-browser snapshot -i # Interactive elements only - * agent-browser snapshot --depth 3 # Limit depth - * agent-browser click @e2 # Click element by ref - */ -// Counter for generating refs -let refCounter = 0; -/** - * Reset ref counter (call at start of each snapshot) - */ -export function resetRefs() { - refCounter = 0; -} -/** - * Generate next ref ID - */ -function nextRef() { - return `e${++refCounter}`; -} -/** - * Roles that are interactive and should get refs - */ -const INTERACTIVE_ROLES = new Set([ - 'button', - 'link', - 'textbox', - 'checkbox', - 'radio', - 'combobox', - 'listbox', - 'menuitem', - 'menuitemcheckbox', - 'menuitemradio', - 'option', - 'searchbox', - 'slider', - 'spinbutton', - 'switch', - 'tab', - 'treeitem', -]); -/** - * Roles that provide structure/context (get refs for text extraction) - */ -const CONTENT_ROLES = new Set([ - 'heading', - 'cell', - 'gridcell', - 'columnheader', - 'rowheader', - 'listitem', - 'article', - 'region', - 'main', - 'navigation', -]); -/** - * Roles that are purely structural (can be filtered in compact mode) - */ -const STRUCTURAL_ROLES = new Set([ - 'generic', - 'group', - 'list', - 'table', - 'row', - 'rowgroup', - 'grid', - 'treegrid', - 'menu', - 'menubar', - 'toolbar', - 'tablist', - 'tree', - 'directory', - 'document', - 'application', - 'presentation', - 'none', -]); -/** - * Build a selector string for storing in ref map - */ -function buildSelector(role, name) { - const escapedName = JSON.stringify(name); - return `getByRole('${role}', { name: ${escapedName}, exact: true })`; -} -/** - * Query the page for clickable elements that might not have proper ARIA roles. - * This finds elements with cursor: pointer or onclick handlers. - */ -async function findCursorInteractiveElements(page, selector) { - const rootSelector = selector || 'body'; - // Use a string function body to avoid TypeScript transpilation issues - const scriptBody = `(rootSel) => { - const results = []; - - // Elements that already have interactive ARIA roles - skip these - const interactiveRoles = new Set([ - 'button', 'link', 'textbox', 'checkbox', 'radio', 'combobox', 'listbox', - 'menuitem', 'menuitemcheckbox', 'menuitemradio', 'option', 'searchbox', - 'slider', 'spinbutton', 'switch', 'tab', 'treeitem' - ]); - - // Tags that are already interactive by default - const interactiveTags = new Set([ - 'a', 'button', 'input', 'select', 'textarea', 'details', 'summary' - ]); - - const root = document.querySelector(rootSel) || document.body; - const allElements = root.querySelectorAll('*'); - - // Build a unique selector for an element - const buildSelector = (el) => { - const testId = el.getAttribute('data-testid'); - if (testId) return '[data-testid="' + testId + '"]'; - if (el.id) return '#' + CSS.escape(el.id); - - const path = []; - let current = el; - while (current && current !== document.body) { - let sel = current.tagName.toLowerCase(); - const classes = Array.from(current.classList).filter(c => c.trim()); - if (classes.length > 0) sel += '.' + CSS.escape(classes[0]); - - const parent = current.parentElement; - if (parent) { - const siblings = Array.from(parent.children); - const matching = siblings.filter(s => { - if (s.tagName !== current.tagName) return false; - if (classes.length > 0 && !s.classList.contains(classes[0])) return false; - return true; - }); - if (matching.length > 1) { - const idx = matching.indexOf(current) + 1; - sel += ':nth-of-type(' + idx + ')'; - } - } - path.unshift(sel); - current = current.parentElement; - // Stop once the selector uniquely identifies the element (max 10 levels) - if (path.length >= 1) { - try { - const candidate = path.join(' > '); - if (document.querySelectorAll(candidate).length === 1) break; - } catch (e) { - // If selector is invalid, keep building - } - } - if (path.length >= 10) break; - } - return path.join(' > '); - }; - - for (const el of allElements) { - const tagName = el.tagName.toLowerCase(); - if (interactiveTags.has(tagName)) continue; - - const role = el.getAttribute('role'); - if (role && interactiveRoles.has(role.toLowerCase())) continue; - - const computedStyle = getComputedStyle(el); - const hasCursorPointer = computedStyle.cursor === 'pointer'; - const hasOnClick = el.hasAttribute('onclick') || el.onclick !== null; - const tabIndex = el.getAttribute('tabindex'); - const hasTabIndex = tabIndex !== null && tabIndex !== '-1'; - - if (!hasCursorPointer && !hasOnClick && !hasTabIndex) continue; - - // Skip elements that only inherit cursor:pointer from an ancestor - // (the ancestor itself will be captured instead) - if (hasCursorPointer && !hasOnClick && !hasTabIndex) { - const parent = el.parentElement; - if (parent && getComputedStyle(parent).cursor === 'pointer') continue; - } - - const text = (el.textContent || '').trim().slice(0, 100); - if (!text) continue; - - const rect = el.getBoundingClientRect(); - if (rect.width === 0 || rect.height === 0) continue; - - results.push({ - selector: buildSelector(el), - text, - tagName, - hasOnClick, - hasCursorPointer, - hasTabIndex - }); - } - return results; - }`; - // eslint-disable-next-line @typescript-eslint/no-implied-eval - const fn = new Function('return ' + scriptBody)(); - return page.evaluate(fn, rootSelector); -} -/** - * Get enhanced snapshot with refs and optional filtering - */ -export async function getEnhancedSnapshot(page, options = {}) { - resetRefs(); - const refs = {}; - // Get ARIA snapshot from Playwright - const locator = options.selector ? page.locator(options.selector) : page.locator(':root'); - const ariaTree = await locator.ariaSnapshot(); - if (!ariaTree) { - return { - tree: '(empty)', - refs: {}, - }; - } - // Parse and enhance the ARIA tree - const enhancedTree = processAriaTree(ariaTree, refs, options); - // When cursor flag is set, also find cursor-interactive elements - // that may not have proper ARIA roles - if (options.cursor) { - const cursorElements = await findCursorInteractiveElements(page, options.selector); - // Filter out elements whose text is already captured in the snapshot - const existingTexts = new Set(Object.values(refs).map((r) => r.name.toLowerCase())); - // Also extract quoted strings from the ARIA tree for broader dedup - for (const m of enhancedTree.matchAll(/"([^"]+)"/g)) { - existingTexts.add(m[1].toLowerCase()); - } - const additionalLines = []; - for (const el of cursorElements) { - const elTextLower = el.text.toLowerCase(); - // Skip if text already captured in the ARIA tree - if (existingTexts.has(elTextLower)) - continue; - existingTexts.add(elTextLower); - const ref = nextRef(); - const role = el.hasCursorPointer || el.hasOnClick ? 'clickable' : 'focusable'; - refs[ref] = { - selector: el.selector, - role: role, - name: el.text, - }; - // Build description of why it's interactive - const hints = []; - if (el.hasCursorPointer) - hints.push('cursor:pointer'); - if (el.hasOnClick) - hints.push('onclick'); - if (el.hasTabIndex) - hints.push('tabindex'); - additionalLines.push(`- ${role} "${el.text}" [ref=${ref}] [${hints.join(', ')}]`); - } - if (additionalLines.length > 0) { - const separator = enhancedTree === '(no interactive elements)' ? '' : '\n# Cursor-interactive elements:\n'; - const base = enhancedTree === '(no interactive elements)' ? '' : enhancedTree; - return { - tree: base + separator + additionalLines.join('\n'), - refs, - }; - } - } - return { tree: enhancedTree, refs }; -} -function createRoleNameTracker() { - const counts = new Map(); - const refsByKey = new Map(); - return { - counts, - refsByKey, - getKey(role, name) { - return `${role}:${name ?? ''}`; - }, - getNextIndex(role, name) { - const key = this.getKey(role, name); - const current = counts.get(key) ?? 0; - counts.set(key, current + 1); - return current; - }, - trackRef(role, name, ref) { - const key = this.getKey(role, name); - const refs = refsByKey.get(key) ?? []; - refs.push(ref); - refsByKey.set(key, refs); - }, - getDuplicateKeys() { - const duplicates = new Set(); - for (const [key, refs] of refsByKey) { - if (refs.length > 1) { - duplicates.add(key); - } - } - return duplicates; - }, - }; -} -/** - * Process ARIA snapshot: add refs and apply filters - */ -function processAriaTree(ariaTree, refs, options) { - const lines = ariaTree.split('\n'); - const result = []; - const tracker = createRoleNameTracker(); - // For interactive-only mode, we collect just interactive elements - if (options.interactive) { - for (const line of lines) { - const match = line.match(/^(\s*-\s*)(\w+)(?:\s+"([^"]*)")?(.*)$/); - if (!match) - continue; - const [, , role, name, suffix] = match; - const roleLower = role.toLowerCase(); - if (INTERACTIVE_ROLES.has(roleLower)) { - const ref = nextRef(); - const resolvedName = name ?? ''; - const nth = tracker.getNextIndex(roleLower, resolvedName); - tracker.trackRef(roleLower, resolvedName, ref); - refs[ref] = { - selector: buildSelector(roleLower, resolvedName), - role: roleLower, - name: resolvedName, - nth, // Always store nth, we'll use it for duplicates - }; - let enhanced = `- ${role}`; - if (name) - enhanced += ` "${name}"`; - enhanced += ` [ref=${ref}]`; - // Only show nth in output if it's > 0 (for readability) - if (nth > 0) - enhanced += ` [nth=${nth}]`; - if (suffix && suffix.includes('[')) - enhanced += suffix; - result.push(enhanced); - } - } - // Post-process: remove nth from refs that don't have duplicates - removeNthFromNonDuplicates(refs, tracker); - return result.join('\n') || '(no interactive elements)'; - } - // Normal processing with depth/compact filters - for (const line of lines) { - const processed = processLine(line, refs, options, tracker); - if (processed !== null) { - result.push(processed); - } - } - // Post-process: remove nth from refs that don't have duplicates - removeNthFromNonDuplicates(refs, tracker); - // If compact mode, remove empty structural elements - if (options.compact) { - return compactTree(result.join('\n')); - } - return result.join('\n'); -} -/** - * Remove nth from refs that ended up not having duplicates - * This keeps single-element locators simple (no unnecessary .nth(0)) - */ -function removeNthFromNonDuplicates(refs, tracker) { - const duplicateKeys = tracker.getDuplicateKeys(); - for (const [ref, data] of Object.entries(refs)) { - const key = tracker.getKey(data.role, data.name); - if (!duplicateKeys.has(key)) { - // Not a duplicate, remove nth to keep locator simple - delete refs[ref].nth; - } - } -} -/** - * Get indentation level (number of spaces / 2) - */ -function getIndentLevel(line) { - const match = line.match(/^(\s*)/); - return match ? Math.floor(match[1].length / 2) : 0; -} -/** - * Process a single line: add ref if needed, filter if requested - */ -function processLine(line, refs, options, tracker) { - const depth = getIndentLevel(line); - // Check max depth - if (options.maxDepth !== undefined && depth > options.maxDepth) { - return null; - } - // Match lines like: - // - button "Submit" - // - heading "Title" [level=1] - // - link "Click me": - const match = line.match(/^(\s*-\s*)(\w+)(?:\s+"([^"]*)")?(.*)$/); - if (!match) { - // Metadata lines (like /url:) or text content - if (options.interactive) { - // In interactive mode, only keep metadata under interactive elements - return null; - } - return line; - } - const [, prefix, role, name, suffix] = match; - const roleLower = role.toLowerCase(); - // Skip metadata lines (like /url:) - if (role.startsWith('/')) { - return line; - } - const isInteractive = INTERACTIVE_ROLES.has(roleLower); - const isContent = CONTENT_ROLES.has(roleLower); - const isStructural = STRUCTURAL_ROLES.has(roleLower); - // In interactive-only mode, filter non-interactive elements - if (options.interactive && !isInteractive) { - return null; - } - // In compact mode, skip unnamed structural elements - if (options.compact && isStructural && !name) { - return null; - } - // Add ref for interactive or named content elements - const shouldHaveRef = isInteractive || (isContent && name); - if (shouldHaveRef) { - const ref = nextRef(); - // Normalize to "" so unnamed elements get exact-match selectors - const resolvedName = isInteractive ? (name ?? '') : name; - const nth = tracker.getNextIndex(roleLower, resolvedName); - tracker.trackRef(roleLower, resolvedName, ref); - refs[ref] = { - selector: buildSelector(roleLower, resolvedName), - role: roleLower, - name: resolvedName, - nth, // Always store nth, we'll clean up non-duplicates later - }; - // Build enhanced line with ref - let enhanced = `${prefix}${role}`; - if (name) - enhanced += ` "${name}"`; - enhanced += ` [ref=${ref}]`; - // Only show nth in output if it's > 0 (for readability) - if (nth > 0) - enhanced += ` [nth=${nth}]`; - if (suffix) - enhanced += suffix; - return enhanced; - } - return line; -} -/** - * Remove empty structural branches in compact mode - */ -function compactTree(tree) { - const lines = tree.split('\n'); - const result = []; - // Simple pass: keep lines that have content or refs - for (let i = 0; i < lines.length; i++) { - const line = lines[i]; - // Always keep lines with refs - if (line.includes('[ref=')) { - result.push(line); - continue; - } - // Keep lines with text content (after :) - if (line.includes(':') && !line.endsWith(':')) { - result.push(line); - continue; - } - // Check if this structural element has children with refs - const currentIndent = getIndentLevel(line); - let hasRelevantChildren = false; - for (let j = i + 1; j < lines.length; j++) { - const childIndent = getIndentLevel(lines[j]); - if (childIndent <= currentIndent) - break; - if (lines[j].includes('[ref=')) { - hasRelevantChildren = true; - break; - } - } - if (hasRelevantChildren) { - result.push(line); - } - } - return result.join('\n'); -} -/** - * Parse a ref from command argument (e.g., "@e1" -> "e1") - */ -export function parseRef(arg) { - if (arg.startsWith('@')) { - return arg.slice(1); - } - if (arg.startsWith('ref=')) { - return arg.slice(4); - } - if (/^e\d+$/.test(arg)) { - return arg; - } - return null; -} -/** - * Get snapshot statistics - */ -export function getSnapshotStats(tree, refs) { - const interactive = Object.values(refs).filter((r) => INTERACTIVE_ROLES.has(r.role)).length; - return { - lines: tree.split('\n').length, - chars: tree.length, - tokens: Math.ceil(tree.length / 4), - refs: Object.keys(refs).length, - interactive, - }; -} -//# sourceMappingURL=snapshot.js.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/snapshot.js.map b/vendor/agent-browser/dist/snapshot.js.map deleted file mode 100644 index 19d8d52..0000000 --- a/vendor/agent-browser/dist/snapshot.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/state-utils.d.ts b/vendor/agent-browser/dist/state-utils.d.ts deleted file mode 100644 index 52b12f7..0000000 --- a/vendor/agent-browser/dist/state-utils.d.ts +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Shared utilities for session state management. - */ -import { getEncryptionKey, encryptData, decryptData, isEncryptedPayload, type EncryptedPayload, ENCRYPTION_KEY_ENV } from './encryption.js'; -/** - * Get the session persistence directory. - * Located at ~/.agent-browser/sessions/ - */ -export declare function getSessionsDir(): string; -/** - * Ensure the sessions directory exists with proper permissions. - * Creates directory with mode 0o700 (owner only). - */ -export declare function ensureSessionsDir(): string; -/** - * Validate a session name for safety (no path traversal). - * Only allows alphanumeric characters, dashes, and underscores. - * This validation is critical for security - the daemon reads session names - * from environment variables which can be set by attackers bypassing CLI validation. - */ -export declare function isValidSessionName(name: string): boolean; -/** - * Get the auto-save state file path for a session. - * Pattern: {SESSION_NAME}-{SESSION_ID}.json - * - * @param sessionName - The session name (e.g., "twitter") - * @param sessionId - The session ID (e.g., "default" or "agent1") - * @returns Full path to the state file, or null if sessionName is empty - * @throws Error if sessionName or sessionId contains invalid characters (path traversal prevention) - */ -export declare function getAutoStateFilePath(sessionName: string, sessionId: string): string | null; -/** - * Check if an auto-state file exists for a session. - */ -export declare function autoStateFileExists(sessionName: string, sessionId: string): boolean; -/** - * Write state data to file, encrypting if encryption key is available. - * - * @param filepath - Path to write the state file - * @param data - State data object to write - * @returns Object indicating whether the file was encrypted - */ -export declare function writeStateFile(filepath: string, data: object): { - encrypted: boolean; -}; -/** - * Read state data from file, decrypting if necessary. - * - * @param filepath - Path to the state file - * @returns Object containing the data and whether it was encrypted - * @throws Error if file is encrypted but no key is available - */ -export declare function readStateFile(filepath: string): { - data: object; - wasEncrypted: boolean; -}; -/** - * List all state files in the sessions directory. - * @returns Array of filenames ending in .json - */ -export declare function listStateFiles(): string[]; -/** - * Clean up state files older than specified days. - * @param days - Maximum age in days (files older than this are deleted) - * @returns Array of deleted filenames - */ -export declare function cleanupExpiredStates(days: number): string[]; -/** - * Safely merge headers without prototype pollution risk. - * Filters out dangerous keys like __proto__, constructor, prototype. - * @param base - Base headers object - * @param override - Headers to merge (takes precedence) - * @returns Merged headers object (null-prototype) - */ -export declare function safeHeaderMerge(base: Record, override: Record): Record; -export { getEncryptionKey, encryptData, decryptData, isEncryptedPayload, type EncryptedPayload, ENCRYPTION_KEY_ENV, }; -//# sourceMappingURL=state-utils.d.ts.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/state-utils.d.ts.map b/vendor/agent-browser/dist/state-utils.d.ts.map deleted file mode 100644 index ebd6fa8..0000000 --- a/vendor/agent-browser/dist/state-utils.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"state-utils.d.ts","sourceRoot":"","sources":["../src/state-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,KAAK,gBAAgB,EACrB,kBAAkB,EACnB,MAAM,iBAAiB,CAAC;AAEzB;;;GAGG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAM1C;AAUD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmB1F;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAGnF;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,CAYrF;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,CAiBvF;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,MAAM,EAAE,CAMzC;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CA2B3D;AAID;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgBxB;AAGD,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,KAAK,gBAAgB,EACrB,kBAAkB,GACnB,CAAC"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/state-utils.js b/vendor/agent-browser/dist/state-utils.js deleted file mode 100644 index 2d318c7..0000000 --- a/vendor/agent-browser/dist/state-utils.js +++ /dev/null @@ -1,178 +0,0 @@ -/** - * Shared utilities for session state management. - */ -import * as fs from 'fs'; -import * as path from 'path'; -import * as os from 'os'; -import { getEncryptionKey, encryptData, decryptData, isEncryptedPayload, ENCRYPTION_KEY_ENV, } from './encryption.js'; -/** - * Get the session persistence directory. - * Located at ~/.agent-browser/sessions/ - */ -export function getSessionsDir() { - return path.join(os.homedir(), '.agent-browser', 'sessions'); -} -/** - * Ensure the sessions directory exists with proper permissions. - * Creates directory with mode 0o700 (owner only). - */ -export function ensureSessionsDir() { - const sessionsDir = getSessionsDir(); - if (!fs.existsSync(sessionsDir)) { - fs.mkdirSync(sessionsDir, { recursive: true, mode: 0o700 }); - } - return sessionsDir; -} -/** - * Validate a session ID to prevent path traversal attacks. - * Only allows alphanumeric characters, hyphens, and underscores. - */ -function isValidSessionId(id) { - return /^[a-zA-Z0-9_-]+$/.test(id); -} -/** - * Validate a session name for safety (no path traversal). - * Only allows alphanumeric characters, dashes, and underscores. - * This validation is critical for security - the daemon reads session names - * from environment variables which can be set by attackers bypassing CLI validation. - */ -export function isValidSessionName(name) { - return /^[a-zA-Z0-9_-]+$/.test(name); -} -/** - * Get the auto-save state file path for a session. - * Pattern: {SESSION_NAME}-{SESSION_ID}.json - * - * @param sessionName - The session name (e.g., "twitter") - * @param sessionId - The session ID (e.g., "default" or "agent1") - * @returns Full path to the state file, or null if sessionName is empty - * @throws Error if sessionName or sessionId contains invalid characters (path traversal prevention) - */ -export function getAutoStateFilePath(sessionName, sessionId) { - if (!sessionName) - return null; - // SECURITY: Validate sessionName to prevent path traversal attacks. - // The daemon reads AGENT_BROWSER_SESSION_NAME from environment which - // can be set directly by attackers, bypassing CLI validation. - if (!isValidSessionName(sessionName)) { - throw new Error(`Invalid session name '${sessionName}'. Only alphanumeric characters, hyphens, and underscores are allowed.`); - } - if (!isValidSessionId(sessionId)) { - throw new Error(`Invalid session ID '${sessionId}'. Only alphanumeric characters, hyphens, and underscores are allowed.`); - } - const sessionsDir = ensureSessionsDir(); - return path.join(sessionsDir, `${sessionName}-${sessionId}.json`); -} -/** - * Check if an auto-state file exists for a session. - */ -export function autoStateFileExists(sessionName, sessionId) { - const filePath = getAutoStateFilePath(sessionName, sessionId); - return filePath ? fs.existsSync(filePath) : false; -} -/** - * Write state data to file, encrypting if encryption key is available. - * - * @param filepath - Path to write the state file - * @param data - State data object to write - * @returns Object indicating whether the file was encrypted - */ -export function writeStateFile(filepath, data) { - const key = getEncryptionKey(); - const jsonData = JSON.stringify(data, null, 2); - if (key) { - const encrypted = encryptData(jsonData, key); - fs.writeFileSync(filepath, JSON.stringify(encrypted, null, 2)); - return { encrypted: true }; - } - fs.writeFileSync(filepath, jsonData); - return { encrypted: false }; -} -/** - * Read state data from file, decrypting if necessary. - * - * @param filepath - Path to the state file - * @returns Object containing the data and whether it was encrypted - * @throws Error if file is encrypted but no key is available - */ -export function readStateFile(filepath) { - const content = fs.readFileSync(filepath, 'utf-8'); - const parsed = JSON.parse(content); - if (isEncryptedPayload(parsed)) { - const key = getEncryptionKey(); - if (!key) { - throw new Error(`State file is encrypted but ${ENCRYPTION_KEY_ENV} is not set. ` + - `Set the environment variable to decrypt.`); - } - const decrypted = decryptData(parsed, key); - return { data: JSON.parse(decrypted), wasEncrypted: true }; - } - return { data: parsed, wasEncrypted: false }; -} -/** - * List all state files in the sessions directory. - * @returns Array of filenames ending in .json - */ -export function listStateFiles() { - const sessionsDir = getSessionsDir(); - if (!fs.existsSync(sessionsDir)) { - return []; - } - return fs.readdirSync(sessionsDir).filter((f) => f.endsWith('.json')); -} -/** - * Clean up state files older than specified days. - * @param days - Maximum age in days (files older than this are deleted) - * @returns Array of deleted filenames - */ -export function cleanupExpiredStates(days) { - if (days <= 0) - return []; - const sessionsDir = getSessionsDir(); - if (!fs.existsSync(sessionsDir)) { - return []; - } - const now = Date.now(); - const maxAge = days * 24 * 60 * 60 * 1000; - const deleted = []; - const files = listStateFiles(); - for (const file of files) { - const filepath = path.join(sessionsDir, file); - try { - const stats = fs.statSync(filepath); - if (now - stats.mtime.getTime() > maxAge) { - fs.unlinkSync(filepath); - deleted.push(file); - } - } - catch { - // Ignore individual file errors - } - } - return deleted; -} -const DANGEROUS_KEYS = ['__proto__', 'constructor', 'prototype']; -/** - * Safely merge headers without prototype pollution risk. - * Filters out dangerous keys like __proto__, constructor, prototype. - * @param base - Base headers object - * @param override - Headers to merge (takes precedence) - * @returns Merged headers object (null-prototype) - */ -export function safeHeaderMerge(base, override) { - const result = Object.create(null); - for (const [key, value] of Object.entries(base)) { - if (!DANGEROUS_KEYS.includes(key)) { - result[key] = value; - } - } - for (const [key, value] of Object.entries(override)) { - if (!DANGEROUS_KEYS.includes(key)) { - result[key] = value; - } - } - return result; -} -// Re-export encryption utilities -export { getEncryptionKey, encryptData, decryptData, isEncryptedPayload, ENCRYPTION_KEY_ENV, }; -//# sourceMappingURL=state-utils.js.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/state-utils.js.map b/vendor/agent-browser/dist/state-utils.js.map deleted file mode 100644 index 6e859c9..0000000 --- a/vendor/agent-browser/dist/state-utils.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"state-utils.js","sourceRoot":"","sources":["../src/state-utils.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/stream-server.d.ts b/vendor/agent-browser/dist/stream-server.d.ts deleted file mode 100644 index 49b3889..0000000 --- a/vendor/agent-browser/dist/stream-server.d.ts +++ /dev/null @@ -1,117 +0,0 @@ -import type { BrowserManager } from './browser.js'; -/** - * Check whether a WebSocket connection origin should be allowed. - * Allows: no origin (CLI tools), file:// origins, and localhost/loopback origins. - * Rejects: all other origins (prevents malicious web pages from connecting). - */ -export declare function isAllowedOrigin(origin: string | undefined): boolean; -export interface FrameMessage { - type: 'frame'; - data: string; - metadata: { - offsetTop: number; - pageScaleFactor: number; - deviceWidth: number; - deviceHeight: number; - scrollOffsetX: number; - scrollOffsetY: number; - timestamp?: number; - }; -} -export interface InputMouseMessage { - type: 'input_mouse'; - eventType: 'mousePressed' | 'mouseReleased' | 'mouseMoved' | 'mouseWheel'; - x: number; - y: number; - button?: 'left' | 'right' | 'middle' | 'none'; - clickCount?: number; - deltaX?: number; - deltaY?: number; - modifiers?: number; -} -export interface InputKeyboardMessage { - type: 'input_keyboard'; - eventType: 'keyDown' | 'keyUp' | 'char'; - key?: string; - code?: string; - text?: string; - modifiers?: number; -} -export interface InputTouchMessage { - type: 'input_touch'; - eventType: 'touchStart' | 'touchEnd' | 'touchMove' | 'touchCancel'; - touchPoints: Array<{ - x: number; - y: number; - id?: number; - }>; - modifiers?: number; -} -export interface StatusMessage { - type: 'status'; - connected: boolean; - screencasting: boolean; - viewportWidth?: number; - viewportHeight?: number; -} -export interface ErrorMessage { - type: 'error'; - message: string; -} -export type StreamMessage = FrameMessage | InputMouseMessage | InputKeyboardMessage | InputTouchMessage | StatusMessage | ErrorMessage; -/** - * WebSocket server for streaming browser viewport and receiving input - */ -export declare class StreamServer { - private wss; - private clients; - private browser; - private port; - private isScreencasting; - constructor(browser: BrowserManager, port?: number); - /** - * Start the WebSocket server - */ - start(): Promise; - /** - * Stop the WebSocket server - */ - stop(): Promise; - /** - * Handle a new WebSocket connection - */ - private handleConnection; - /** - * Handle incoming messages from clients - */ - private handleMessage; - /** - * Broadcast a frame to all connected clients - */ - private broadcastFrame; - /** - * Send status to a client - */ - private sendStatus; - /** - * Send an error to a client - */ - private sendError; - /** - * Start screencasting - */ - private startScreencast; - /** - * Stop screencasting - */ - private stopScreencast; - /** - * Get the port the server is running on - */ - getPort(): number; - /** - * Get the number of connected clients - */ - getClientCount(): number; -} -//# sourceMappingURL=stream-server.d.ts.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/stream-server.d.ts.map b/vendor/agent-browser/dist/stream-server.d.ts.map deleted file mode 100644 index 5d8c810..0000000 --- a/vendor/agent-browser/dist/stream-server.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"stream-server.d.ts","sourceRoot":"","sources":["../src/stream-server.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/stream-server.js b/vendor/agent-browser/dist/stream-server.js deleted file mode 100644 index f602bc6..0000000 --- a/vendor/agent-browser/dist/stream-server.js +++ /dev/null @@ -1,309 +0,0 @@ -import { WebSocketServer, WebSocket } from 'ws'; -import { setScreencastFrameCallback } from './actions.js'; -/** - * Check whether a WebSocket connection origin should be allowed. - * Allows: no origin (CLI tools), file:// origins, and localhost/loopback origins. - * Rejects: all other origins (prevents malicious web pages from connecting). - */ -export function isAllowedOrigin(origin) { - // Allow connections with no origin (non-browser clients like CLI tools) - if (!origin) { - return true; - } - // Allow file:// origins (local HTML files) - if (origin.startsWith('file://')) { - return true; - } - // Allow localhost/loopback origins (browser-based stream viewers) - try { - const url = new URL(origin); - const host = url.hostname; - if (host === 'localhost' || host === '127.0.0.1' || host === '::1' || host === '[::1]') { - return true; - } - } - catch { - // Invalid origin URL - reject - } - return false; -} -/** - * WebSocket server for streaming browser viewport and receiving input - */ -export class StreamServer { - wss = null; - clients = new Set(); - browser; - port; - isScreencasting = false; - constructor(browser, port = 9223) { - this.browser = browser; - this.port = port; - } - /** - * Start the WebSocket server - */ - start() { - return new Promise((resolve, reject) => { - try { - // SECURITY: Bind to localhost only to prevent network exposure. - // The stream server allows direct input injection (mouse, keyboard, touch) - // which would be a critical security risk if exposed to the network. - this.wss = new WebSocketServer({ - port: this.port, - host: '127.0.0.1', - // Security: Reject cross-origin WebSocket connections from untrusted origins. - // This prevents malicious web pages from connecting and injecting input events. - // Localhost origins are allowed so browser-based stream viewers can connect. - verifyClient: (info) => { - if (isAllowedOrigin(info.origin)) { - return true; - } - console.log(`[StreamServer] Rejected connection from origin: ${info.origin}`); - return false; - }, - }); - this.wss.on('connection', (ws) => { - this.handleConnection(ws); - }); - this.wss.on('error', (error) => { - console.error('[StreamServer] WebSocket error:', error); - reject(error); - }); - this.wss.on('listening', () => { - console.log(`[StreamServer] Listening on port ${this.port}`); - // Set up the screencast frame callback - setScreencastFrameCallback((frame) => { - this.broadcastFrame(frame); - }); - resolve(); - }); - } - catch (error) { - reject(error); - } - }); - } - /** - * Stop the WebSocket server - */ - async stop() { - // Stop screencasting - if (this.isScreencasting) { - await this.stopScreencast(); - } - // Clear the callback - setScreencastFrameCallback(null); - // Close all clients - for (const client of this.clients) { - client.close(); - } - this.clients.clear(); - // Close the server - if (this.wss) { - return new Promise((resolve) => { - this.wss.close(() => { - this.wss = null; - resolve(); - }); - }); - } - } - /** - * Handle a new WebSocket connection - */ - handleConnection(ws) { - console.log('[StreamServer] Client connected'); - this.clients.add(ws); - // Send initial status - this.sendStatus(ws); - // Start screencasting if this is the first client - if (this.clients.size === 1 && !this.isScreencasting) { - this.startScreencast().catch((error) => { - console.error('[StreamServer] Failed to start screencast:', error); - this.sendError(ws, error.message); - }); - } - // Handle messages from client - ws.on('message', (data) => { - try { - const message = JSON.parse(data.toString()); - this.handleMessage(message, ws); - } - catch (error) { - console.error('[StreamServer] Failed to parse message:', error); - } - }); - // Handle client disconnect - ws.on('close', () => { - console.log('[StreamServer] Client disconnected'); - this.clients.delete(ws); - // Stop screencasting if no more clients - if (this.clients.size === 0 && this.isScreencasting) { - this.stopScreencast().catch((error) => { - console.error('[StreamServer] Failed to stop screencast:', error); - }); - } - }); - ws.on('error', (error) => { - console.error('[StreamServer] Client error:', error); - this.clients.delete(ws); - }); - } - /** - * Handle incoming messages from clients - */ - async handleMessage(message, ws) { - try { - switch (message.type) { - case 'input_mouse': - await this.browser.injectMouseEvent({ - type: message.eventType, - x: message.x, - y: message.y, - button: message.button, - clickCount: message.clickCount, - deltaX: message.deltaX, - deltaY: message.deltaY, - modifiers: message.modifiers, - }); - break; - case 'input_keyboard': - await this.browser.injectKeyboardEvent({ - type: message.eventType, - key: message.key, - code: message.code, - text: message.text, - modifiers: message.modifiers, - }); - break; - case 'input_touch': - await this.browser.injectTouchEvent({ - type: message.eventType, - touchPoints: message.touchPoints, - modifiers: message.modifiers, - }); - break; - case 'status': - // Client is requesting status - this.sendStatus(ws); - break; - } - } - catch (error) { - const errorMessage = error instanceof Error ? error.message : String(error); - this.sendError(ws, errorMessage); - } - } - /** - * Broadcast a frame to all connected clients - */ - broadcastFrame(frame) { - const message = { - type: 'frame', - data: frame.data, - metadata: frame.metadata, - }; - const payload = JSON.stringify(message); - for (const client of this.clients) { - if (client.readyState === WebSocket.OPEN) { - client.send(payload); - } - } - } - /** - * Send status to a client - */ - sendStatus(ws) { - let viewportWidth; - let viewportHeight; - try { - const page = this.browser.getPage(); - const viewport = page.viewportSize(); - viewportWidth = viewport?.width; - viewportHeight = viewport?.height; - } - catch { - // Browser not launched yet - } - const message = { - type: 'status', - connected: true, - screencasting: this.isScreencasting, - viewportWidth, - viewportHeight, - }; - if (ws.readyState === WebSocket.OPEN) { - ws.send(JSON.stringify(message)); - } - } - /** - * Send an error to a client - */ - sendError(ws, errorMessage) { - const message = { - type: 'error', - message: errorMessage, - }; - if (ws.readyState === WebSocket.OPEN) { - ws.send(JSON.stringify(message)); - } - } - /** - * Start screencasting - */ - async startScreencast() { - // Set flag immediately to prevent race conditions with concurrent calls - if (this.isScreencasting) - return; - this.isScreencasting = true; - try { - // Check if browser is launched - if (!this.browser.isLaunched()) { - throw new Error('Browser not launched'); - } - await this.browser.startScreencast((frame) => this.broadcastFrame(frame), { - format: 'jpeg', - quality: 80, - maxWidth: 1280, - maxHeight: 720, - everyNthFrame: 1, - }); - // Notify all clients - for (const client of this.clients) { - this.sendStatus(client); - } - } - catch (error) { - // Reset flag on failure so caller can retry - this.isScreencasting = false; - throw error; - } - } - /** - * Stop screencasting - */ - async stopScreencast() { - if (!this.isScreencasting) - return; - await this.browser.stopScreencast(); - this.isScreencasting = false; - // Notify all clients - for (const client of this.clients) { - this.sendStatus(client); - } - } - /** - * Get the port the server is running on - */ - getPort() { - return this.port; - } - /** - * Get the number of connected clients - */ - getClientCount() { - return this.clients.size; - } -} -//# sourceMappingURL=stream-server.js.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/stream-server.js.map b/vendor/agent-browser/dist/stream-server.js.map deleted file mode 100644 index a4563e8..0000000 --- a/vendor/agent-browser/dist/stream-server.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"stream-server.js","sourceRoot":"","sources":["../src/stream-server.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/types.d.ts b/vendor/agent-browser/dist/types.d.ts deleted file mode 100644 index 349582e..0000000 --- a/vendor/agent-browser/dist/types.d.ts +++ /dev/null @@ -1,917 +0,0 @@ -import type { Page, Browser, BrowserContext } from 'playwright-core'; -export interface BaseCommand { - id: string; - action: string; -} -export interface LaunchCommand extends BaseCommand { - action: 'launch'; - headless?: boolean; - viewport?: { - width: number; - height: number; - } | null; - browser?: 'chromium' | 'firefox' | 'webkit'; - headers?: Record; - executablePath?: string; - cdpPort?: number; - cdpUrl?: string; - autoConnect?: boolean; - extensions?: string[]; - profile?: string; - storageState?: string; - proxy?: { - server: string; - bypass?: string; - username?: string; - password?: string; - }; - args?: string[]; - userAgent?: string; - provider?: string; - ignoreHTTPSErrors?: boolean; - allowFileAccess?: boolean; - colorScheme?: 'light' | 'dark' | 'no-preference'; - downloadPath?: string; - allowedDomains?: string[]; - actionPolicy?: string; - confirmActions?: string[]; - autoStateFilePath?: string; -} -export interface NavigateCommand extends BaseCommand { - action: 'navigate'; - url: string; - waitUntil?: 'load' | 'domcontentloaded' | 'networkidle'; - headers?: Record; -} -export interface ClickCommand extends BaseCommand { - action: 'click'; - selector: string; - button?: 'left' | 'right' | 'middle'; - clickCount?: number; - delay?: number; - newTab?: boolean; -} -export interface TypeCommand extends BaseCommand { - action: 'type'; - selector: string; - text: string; - delay?: number; - clear?: boolean; -} -export interface FillCommand extends BaseCommand { - action: 'fill'; - selector: string; - value: string; -} -export interface CheckCommand extends BaseCommand { - action: 'check'; - selector: string; -} -export interface UncheckCommand extends BaseCommand { - action: 'uncheck'; - selector: string; -} -export interface UploadCommand extends BaseCommand { - action: 'upload'; - selector: string; - files: string | string[]; -} -export interface DoubleClickCommand extends BaseCommand { - action: 'dblclick'; - selector: string; -} -export interface FocusCommand extends BaseCommand { - action: 'focus'; - selector: string; -} -export interface DragCommand extends BaseCommand { - action: 'drag'; - source: string; - target: string; -} -export interface FrameCommand extends BaseCommand { - action: 'frame'; - selector?: string; - name?: string; - url?: string; -} -export interface MainFrameCommand extends BaseCommand { - action: 'mainframe'; -} -export interface GetByRoleCommand extends BaseCommand { - action: 'getbyrole'; - role: string; - name?: string; - exact?: boolean; - subaction: 'click' | 'fill' | 'check' | 'hover'; - value?: string; -} -export interface GetByTextCommand extends BaseCommand { - action: 'getbytext'; - text: string; - exact?: boolean; - subaction: 'click' | 'hover'; -} -export interface GetByLabelCommand extends BaseCommand { - action: 'getbylabel'; - label: string; - exact?: boolean; - subaction: 'click' | 'fill' | 'check'; - value?: string; -} -export interface GetByPlaceholderCommand extends BaseCommand { - action: 'getbyplaceholder'; - placeholder: string; - exact?: boolean; - subaction: 'click' | 'fill'; - value?: string; -} -export interface CookiesGetCommand extends BaseCommand { - action: 'cookies_get'; - urls?: string[]; -} -export interface CookiesSetCommand extends BaseCommand { - action: 'cookies_set'; - cookies: Array<{ - name: string; - value: string; - url?: string; - domain?: string; - path?: string; - expires?: number; - httpOnly?: boolean; - secure?: boolean; - sameSite?: 'Strict' | 'Lax' | 'None'; - }>; -} -export interface CookiesClearCommand extends BaseCommand { - action: 'cookies_clear'; -} -export interface StorageGetCommand extends BaseCommand { - action: 'storage_get'; - key?: string; - type: 'local' | 'session'; -} -export interface StorageSetCommand extends BaseCommand { - action: 'storage_set'; - key: string; - value: string; - type: 'local' | 'session'; -} -export interface StorageClearCommand extends BaseCommand { - action: 'storage_clear'; - type: 'local' | 'session'; -} -export interface DialogCommand extends BaseCommand { - action: 'dialog'; - response: 'accept' | 'dismiss'; - promptText?: string; -} -export interface PdfCommand extends BaseCommand { - action: 'pdf'; - path: string; - format?: 'Letter' | 'Legal' | 'Tabloid' | 'Ledger' | 'A0' | 'A1' | 'A2' | 'A3' | 'A4' | 'A5' | 'A6'; -} -export interface RouteCommand extends BaseCommand { - action: 'route'; - url: string; - response?: { - status?: number; - body?: string; - contentType?: string; - headers?: Record; - }; - abort?: boolean; -} -export interface UnrouteCommand extends BaseCommand { - action: 'unroute'; - url?: string; -} -export interface RequestsCommand extends BaseCommand { - action: 'requests'; - filter?: string; - clear?: boolean; -} -export interface DownloadCommand extends BaseCommand { - action: 'download'; - selector: string; - path: string; -} -export interface GeolocationCommand extends BaseCommand { - action: 'geolocation'; - latitude: number; - longitude: number; - accuracy?: number; -} -export interface PermissionsCommand extends BaseCommand { - action: 'permissions'; - permissions: string[]; - grant: boolean; -} -export interface ViewportCommand extends BaseCommand { - action: 'viewport'; - width: number; - height: number; -} -export interface UserAgentCommand extends BaseCommand { - action: 'useragent'; - userAgent: string; -} -export interface DeviceCommand extends BaseCommand { - action: 'device'; - device: string; -} -export interface BackCommand extends BaseCommand { - action: 'back'; -} -export interface ForwardCommand extends BaseCommand { - action: 'forward'; -} -export interface ReloadCommand extends BaseCommand { - action: 'reload'; -} -export interface UrlCommand extends BaseCommand { - action: 'url'; -} -export interface TitleCommand extends BaseCommand { - action: 'title'; -} -export interface GetAttributeCommand extends BaseCommand { - action: 'getattribute'; - selector: string; - attribute: string; -} -export interface GetTextCommand extends BaseCommand { - action: 'gettext'; - selector: string; -} -export interface IsVisibleCommand extends BaseCommand { - action: 'isvisible'; - selector: string; -} -export interface IsEnabledCommand extends BaseCommand { - action: 'isenabled'; - selector: string; -} -export interface IsCheckedCommand extends BaseCommand { - action: 'ischecked'; - selector: string; -} -export interface CountCommand extends BaseCommand { - action: 'count'; - selector: string; -} -export interface BoundingBoxCommand extends BaseCommand { - action: 'boundingbox'; - selector: string; -} -export interface StylesCommand extends BaseCommand { - action: 'styles'; - selector: string; -} -export interface GetByAltTextCommand extends BaseCommand { - action: 'getbyalttext'; - text: string; - exact?: boolean; - subaction: 'click' | 'hover'; -} -export interface GetByTitleCommand extends BaseCommand { - action: 'getbytitle'; - text: string; - exact?: boolean; - subaction: 'click' | 'hover'; -} -export interface GetByTestIdCommand extends BaseCommand { - action: 'getbytestid'; - testId: string; - subaction: 'click' | 'fill' | 'check' | 'hover'; - value?: string; -} -export interface NthCommand extends BaseCommand { - action: 'nth'; - selector: string; - index: number; - subaction: 'click' | 'fill' | 'check' | 'hover' | 'text'; - value?: string; -} -export interface WaitForUrlCommand extends BaseCommand { - action: 'waitforurl'; - url: string; - timeout?: number; -} -export interface WaitForLoadStateCommand extends BaseCommand { - action: 'waitforloadstate'; - state: 'load' | 'domcontentloaded' | 'networkidle'; - timeout?: number; -} -export interface SetContentCommand extends BaseCommand { - action: 'setcontent'; - html: string; -} -export interface TimezoneCommand extends BaseCommand { - action: 'timezone'; - timezone: string; -} -export interface LocaleCommand extends BaseCommand { - action: 'locale'; - locale: string; -} -export interface HttpCredentialsCommand extends BaseCommand { - action: 'credentials'; - username: string; - password: string; -} -export interface MouseMoveCommand extends BaseCommand { - action: 'mousemove'; - x: number; - y: number; -} -export interface MouseDownCommand extends BaseCommand { - action: 'mousedown'; - button?: 'left' | 'right' | 'middle'; -} -export interface MouseUpCommand extends BaseCommand { - action: 'mouseup'; - button?: 'left' | 'right' | 'middle'; -} -export interface BringToFrontCommand extends BaseCommand { - action: 'bringtofront'; -} -export interface WaitForFunctionCommand extends BaseCommand { - action: 'waitforfunction'; - expression: string; - timeout?: number; -} -export interface ScrollIntoViewCommand extends BaseCommand { - action: 'scrollintoview'; - selector: string; -} -export interface AddInitScriptCommand extends BaseCommand { - action: 'addinitscript'; - script: string; -} -export interface KeyDownCommand extends BaseCommand { - action: 'keydown'; - key: string; -} -export interface KeyUpCommand extends BaseCommand { - action: 'keyup'; - key: string; -} -export interface InsertTextCommand extends BaseCommand { - action: 'inserttext'; - text: string; -} -export interface MultiSelectCommand extends BaseCommand { - action: 'multiselect'; - selector: string; - values: string[]; -} -export interface WaitForDownloadCommand extends BaseCommand { - action: 'waitfordownload'; - path?: string; - timeout?: number; -} -export interface ResponseBodyCommand extends BaseCommand { - action: 'responsebody'; - url: string; - timeout?: number; -} -export interface ScreencastStartCommand extends BaseCommand { - action: 'screencast_start'; - format?: 'jpeg' | 'png'; - quality?: number; - maxWidth?: number; - maxHeight?: number; - everyNthFrame?: number; -} -export interface ScreencastStopCommand extends BaseCommand { - action: 'screencast_stop'; -} -export interface InputMouseCommand extends BaseCommand { - action: 'input_mouse'; - type: 'mousePressed' | 'mouseReleased' | 'mouseMoved' | 'mouseWheel'; - x: number; - y: number; - button?: 'left' | 'right' | 'middle' | 'none'; - clickCount?: number; - deltaX?: number; - deltaY?: number; - modifiers?: number; -} -export interface InputKeyboardCommand extends BaseCommand { - action: 'input_keyboard'; - type: 'keyDown' | 'keyUp' | 'char'; - key?: string; - code?: string; - text?: string; - modifiers?: number; -} -export interface InputTouchCommand extends BaseCommand { - action: 'input_touch'; - type: 'touchStart' | 'touchEnd' | 'touchMove' | 'touchCancel'; - touchPoints: Array<{ - x: number; - y: number; - id?: number; - }>; - modifiers?: number; -} -export interface SwipeCommand extends BaseCommand { - action: 'swipe'; - direction: 'up' | 'down' | 'left' | 'right'; - distance?: number; -} -export interface DeviceListCommand extends BaseCommand { - action: 'device_list'; -} -export interface VideoStartCommand extends BaseCommand { - action: 'video_start'; - path: string; -} -export interface VideoStopCommand extends BaseCommand { - action: 'video_stop'; -} -export interface RecordingStartCommand extends BaseCommand { - action: 'recording_start'; - path: string; - url?: string; -} -export interface RecordingStopCommand extends BaseCommand { - action: 'recording_stop'; -} -export interface RecordingRestartCommand extends BaseCommand { - action: 'recording_restart'; - path: string; - url?: string; -} -export interface TraceStartCommand extends BaseCommand { - action: 'trace_start'; - screenshots?: boolean; - snapshots?: boolean; -} -export interface TraceStopCommand extends BaseCommand { - action: 'trace_stop'; - path?: string; -} -/** - * Chrome Trace Event format. All fields are optional because CDP trace event - * shapes vary across categories and event phases -- this type is intentionally - * loose to accept any valid trace event without data loss. - */ -export interface TraceEvent { - cat?: string; - name?: string; - ph?: string; - pid?: number; - tid?: number; - ts?: number; - dur?: number; - args?: Record; - [key: string]: unknown; -} -export interface ProfilerStartCommand extends BaseCommand { - action: 'profiler_start'; - categories?: string[]; -} -export interface ProfilerStopCommand extends BaseCommand { - action: 'profiler_stop'; - path?: string; -} -export interface HarStartCommand extends BaseCommand { - action: 'har_start'; -} -export interface HarStopCommand extends BaseCommand { - action: 'har_stop'; - path: string; -} -export interface StorageStateSaveCommand extends BaseCommand { - action: 'state_save'; - path: string; -} -export interface StorageStateLoadCommand extends BaseCommand { - action: 'state_load'; - path: string; -} -export interface StateListCommand extends BaseCommand { - action: 'state_list'; -} -export interface StateClearCommand extends BaseCommand { - action: 'state_clear'; - sessionName?: string; - all?: boolean; -} -export interface StateShowCommand extends BaseCommand { - action: 'state_show'; - filename: string; -} -export interface StateCleanCommand extends BaseCommand { - action: 'state_clean'; - days: number; -} -export interface StateRenameCommand extends BaseCommand { - action: 'state_rename'; - oldName: string; - newName: string; -} -export interface ConsoleCommand extends BaseCommand { - action: 'console'; - clear?: boolean; -} -export interface ErrorsCommand extends BaseCommand { - action: 'errors'; - clear?: boolean; -} -export interface KeyboardCommand extends BaseCommand { - action: 'keyboard'; - subaction?: 'type' | 'press' | 'insertText'; - keys?: string; - text?: string; - delay?: number; -} -export interface WheelCommand extends BaseCommand { - action: 'wheel'; - deltaX?: number; - deltaY?: number; - selector?: string; -} -export interface TapCommand extends BaseCommand { - action: 'tap'; - selector: string; -} -export interface ClipboardCommand extends BaseCommand { - action: 'clipboard'; - operation: 'copy' | 'paste' | 'read'; - text?: string; -} -export interface HighlightCommand extends BaseCommand { - action: 'highlight'; - selector: string; -} -export interface ClearCommand extends BaseCommand { - action: 'clear'; - selector: string; -} -export interface SelectAllCommand extends BaseCommand { - action: 'selectall'; - selector: string; -} -export interface InnerTextCommand extends BaseCommand { - action: 'innertext'; - selector: string; -} -export interface InnerHtmlCommand extends BaseCommand { - action: 'innerhtml'; - selector: string; -} -export interface InputValueCommand extends BaseCommand { - action: 'inputvalue'; - selector: string; -} -export interface SetValueCommand extends BaseCommand { - action: 'setvalue'; - selector: string; - value: string; -} -export interface DispatchEventCommand extends BaseCommand { - action: 'dispatch'; - selector: string; - event: string; - eventInit?: Record; -} -export interface EvaluateHandleCommand extends BaseCommand { - action: 'evalhandle'; - script: string; -} -export interface ExposeFunctionCommand extends BaseCommand { - action: 'expose'; - name: string; -} -export interface AddScriptCommand extends BaseCommand { - action: 'addscript'; - content?: string; - url?: string; -} -export interface AddStyleCommand extends BaseCommand { - action: 'addstyle'; - content?: string; - url?: string; -} -export interface EmulateMediaCommand extends BaseCommand { - action: 'emulatemedia'; - media?: 'screen' | 'print' | null; - colorScheme?: 'light' | 'dark' | 'no-preference' | null; - reducedMotion?: 'reduce' | 'no-preference' | null; - forcedColors?: 'active' | 'none' | null; -} -export interface OfflineCommand extends BaseCommand { - action: 'offline'; - offline: boolean; -} -export interface HeadersCommand extends BaseCommand { - action: 'headers'; - headers: Record; -} -export interface PauseCommand extends BaseCommand { - action: 'pause'; -} -export interface PressCommand extends BaseCommand { - action: 'press'; - key: string; - selector?: string; -} -export interface ScreenshotCommand extends BaseCommand { - action: 'screenshot'; - path?: string; - fullPage?: boolean; - selector?: string; - format?: 'png' | 'jpeg'; - quality?: number; - annotate?: boolean; -} -export interface SnapshotCommand extends BaseCommand { - action: 'snapshot'; -} -export interface EvaluateCommand extends BaseCommand { - action: 'evaluate'; - script: string; - args?: unknown[]; -} -export interface WaitCommand extends BaseCommand { - action: 'wait'; - selector?: string; - timeout?: number; - state?: 'attached' | 'detached' | 'visible' | 'hidden'; -} -export interface ScrollCommand extends BaseCommand { - action: 'scroll'; - selector?: string; - x?: number; - y?: number; - direction?: 'up' | 'down' | 'left' | 'right'; - amount?: number; -} -export interface SelectCommand extends BaseCommand { - action: 'select'; - selector: string; - values: string | string[]; -} -export interface HoverCommand extends BaseCommand { - action: 'hover'; - selector: string; -} -export interface ContentCommand extends BaseCommand { - action: 'content'; - selector?: string; -} -export interface CloseCommand extends BaseCommand { - action: 'close'; -} -export interface TabNewCommand extends BaseCommand { - action: 'tab_new'; - url?: string; -} -export interface TabListCommand extends BaseCommand { - action: 'tab_list'; -} -export interface TabSwitchCommand extends BaseCommand { - action: 'tab_switch'; - index: number; -} -export interface TabCloseCommand extends BaseCommand { - action: 'tab_close'; - index?: number; -} -export interface WindowNewCommand extends BaseCommand { - action: 'window_new'; - viewport?: { - width: number; - height: number; - } | null; -} -export type Command = LaunchCommand | NavigateCommand | ClickCommand | TypeCommand | FillCommand | CheckCommand | UncheckCommand | UploadCommand | DoubleClickCommand | FocusCommand | DragCommand | FrameCommand | MainFrameCommand | GetByRoleCommand | GetByTextCommand | GetByLabelCommand | GetByPlaceholderCommand | PressCommand | ScreenshotCommand | SnapshotCommand | EvaluateCommand | WaitCommand | ScrollCommand | SelectCommand | HoverCommand | ContentCommand | CloseCommand | TabNewCommand | TabListCommand | TabSwitchCommand | TabCloseCommand | WindowNewCommand | CookiesGetCommand | CookiesSetCommand | CookiesClearCommand | StorageGetCommand | StorageSetCommand | StorageClearCommand | DialogCommand | PdfCommand | RouteCommand | UnrouteCommand | RequestsCommand | DownloadCommand | GeolocationCommand | PermissionsCommand | ViewportCommand | UserAgentCommand | DeviceCommand | BackCommand | ForwardCommand | ReloadCommand | UrlCommand | TitleCommand | GetAttributeCommand | GetTextCommand | IsVisibleCommand | IsEnabledCommand | IsCheckedCommand | CountCommand | BoundingBoxCommand | StylesCommand | VideoStartCommand | VideoStopCommand | RecordingStartCommand | RecordingStopCommand | RecordingRestartCommand | TraceStartCommand | TraceStopCommand | ProfilerStartCommand | ProfilerStopCommand | HarStartCommand | HarStopCommand | StorageStateSaveCommand | StorageStateLoadCommand | StateListCommand | StateClearCommand | StateShowCommand | StateCleanCommand | StateRenameCommand | ConsoleCommand | ErrorsCommand | KeyboardCommand | WheelCommand | TapCommand | ClipboardCommand | HighlightCommand | ClearCommand | SelectAllCommand | InnerTextCommand | InnerHtmlCommand | InputValueCommand | SetValueCommand | DispatchEventCommand | EvaluateHandleCommand | ExposeFunctionCommand | AddScriptCommand | AddStyleCommand | EmulateMediaCommand | OfflineCommand | HeadersCommand | PauseCommand | GetByAltTextCommand | GetByTitleCommand | GetByTestIdCommand | NthCommand | WaitForUrlCommand | WaitForLoadStateCommand | SetContentCommand | TimezoneCommand | LocaleCommand | HttpCredentialsCommand | MouseMoveCommand | MouseDownCommand | MouseUpCommand | BringToFrontCommand | WaitForFunctionCommand | ScrollIntoViewCommand | AddInitScriptCommand | KeyDownCommand | KeyUpCommand | InsertTextCommand | MultiSelectCommand | WaitForDownloadCommand | ResponseBodyCommand | ScreencastStartCommand | ScreencastStopCommand | InputMouseCommand | InputKeyboardCommand | InputTouchCommand | SwipeCommand | DeviceListCommand | DiffSnapshotCommand | DiffScreenshotCommand | DiffUrlCommand | AuthSaveCommand | AuthLoginCommand | AuthListCommand | AuthDeleteCommand | AuthShowCommand | ConfirmCommand | DenyCommand; -export interface AuthSaveCommand extends BaseCommand { - action: 'auth_save'; - name: string; - url: string; - username: string; - password: string; - usernameSelector?: string; - passwordSelector?: string; - submitSelector?: string; -} -export interface AuthLoginCommand extends BaseCommand { - action: 'auth_login'; - name: string; -} -export interface AuthListCommand extends BaseCommand { - action: 'auth_list'; -} -export interface AuthDeleteCommand extends BaseCommand { - action: 'auth_delete'; - name: string; -} -export interface AuthShowCommand extends BaseCommand { - action: 'auth_show'; - name: string; -} -export interface ConfirmCommand extends BaseCommand { - action: 'confirm'; - confirmationId: string; -} -export interface DenyCommand extends BaseCommand { - action: 'deny'; - confirmationId: string; -} -export interface DiffSnapshotCommand extends BaseCommand { - action: 'diff_snapshot'; - baseline?: string; - selector?: string; - compact?: boolean; - maxDepth?: number; -} -export interface DiffScreenshotCommand extends BaseCommand { - action: 'diff_screenshot'; - baseline: string; - output?: string; - threshold?: number; - selector?: string; - fullPage?: boolean; -} -export interface DiffUrlCommand extends BaseCommand { - action: 'diff_url'; - url1: string; - url2: string; - screenshot?: boolean; - fullPage?: boolean; - waitUntil?: 'load' | 'domcontentloaded' | 'networkidle'; - selector?: string; - compact?: boolean; - maxDepth?: number; -} -export interface SuccessResponse { - id: string; - success: true; - data: T; -} -export interface ErrorResponse { - id: string; - success: false; - error: string; -} -export type Response = SuccessResponse | ErrorResponse; -export interface NavigateData { - url: string; - title: string; -} -export interface Annotation { - ref: string; - number: number; - role: string; - name?: string; - box: { - x: number; - y: number; - width: number; - height: number; - }; -} -export interface ScreenshotData { - path?: string; - base64?: string; - annotations?: Annotation[]; -} -export interface SnapshotData { - snapshot: string; - refs?: Record; - origin?: string; -} -export interface EvaluateData { - result: unknown; - origin?: string; -} -export interface ContentData { - html: string; - origin?: string; -} -export interface TextData { - text: string | null; - origin?: string; -} -export interface AttributeData { - attribute: string; - value: string | null; - origin?: string; -} -export interface ValueData { - value: string; - origin?: string; -} -export interface ConsoleData { - messages: Array<{ - type: string; - text: string; - }>; - origin?: string; -} -export interface TabInfo { - index: number; - url: string; - title: string; - active: boolean; -} -export interface TabListData { - tabs: TabInfo[]; - active: number; -} -export interface TabNewData { - index: number; - total: number; -} -export interface TabSwitchData { - index: number; - url: string; - title: string; -} -export interface TabCloseData { - closed: number; - remaining: number; -} -export interface ScreencastStartData { - started: boolean; - format: string; - quality: number; -} -export interface ScreencastStopData { - stopped: boolean; -} -export interface RecordingStartData { - started: boolean; - path: string; -} -export interface RecordingStopData { - path: string; - frames: number; - error?: string; -} -export interface RecordingRestartData { - started: boolean; - path: string; - previousPath?: string; - stopped: boolean; -} -export interface InputEventData { - injected: boolean; -} -export interface ElementStyleInfo { - tag: string; - text: string | null; - box: { - x: number; - y: number; - width: number; - height: number; - }; - styles: { - fontSize: string; - fontWeight: string; - fontFamily: string; - color: string; - backgroundColor: string; - borderRadius: string; - border: string | null; - boxShadow: string | null; - padding: string; - }; -} -export interface StylesData { - elements: ElementStyleInfo[]; -} -export interface DiffSnapshotData { - diff: string; - additions: number; - removals: number; - unchanged: number; - changed: boolean; -} -export interface DiffScreenshotData { - diffPath: string; - totalPixels: number; - differentPixels: number; - mismatchPercentage: number; - match: boolean; - dimensionMismatch?: boolean; -} -export interface DiffUrlData { - snapshot: DiffSnapshotData; - screenshot?: DiffScreenshotData; -} -export interface BrowserState { - browser: Browser | null; - context: BrowserContext | null; - page: Page | null; -} -//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/types.d.ts.map b/vendor/agent-browser/dist/types.d.ts.map deleted file mode 100644 index 5175474..0000000 --- a/vendor/agent-browser/dist/types.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/vendor/agent-browser/dist/types.js b/vendor/agent-browser/dist/types.js deleted file mode 100644 index 718fd38..0000000 --- a/vendor/agent-browser/dist/types.js +++ /dev/null @@ -1,2 +0,0 @@ -export {}; -//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/vendor/agent-browser/dist/types.js.map b/vendor/agent-browser/dist/types.js.map deleted file mode 100644 index c768b79..0000000 --- a/vendor/agent-browser/dist/types.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/vendor/agent-browser/runtime-manifest.json b/vendor/agent-browser/runtime-manifest.json deleted file mode 100644 index 523b5f4..0000000 --- a/vendor/agent-browser/runtime-manifest.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "schemaVersion": 1, - "runtimeVersion": "v0.15.2", - "source": { - "repository": "https://github.com/vercel-labs/agent-browser", - "releaseTag": "v0.15.2", - "releasedAt": "2026-03-02T17:16:52Z" - }, - "shared": ["dist"], - "platforms": { - "darwin-arm64": { - "entrypoint": "runtimes/darwin-arm64/agent-browser", - "sha256": "a8a4da234c242fd37d11273bbd192c70e33c45a1f5c247d0c3e27dfcdd8e624e" - }, - "darwin-x64": { - "entrypoint": "runtimes/darwin-x64/agent-browser", - "sha256": "c46b12464477d17673b07558a7d781c9396e351a9be48a6260dec8a8c315df06" - }, - "linux-arm64": { - "entrypoint": "runtimes/linux-arm64/agent-browser", - "sha256": "a8faf247e56a42d0368a0ae04e3b20d5954bdc69bc23b2ee791af4bad0ef924e" - }, - "linux-x64": { - "entrypoint": "runtimes/linux-x64/agent-browser", - "sha256": "1f770144983165c548e449785b4949303968b8362fad4ad9b3d51f827d960413" - }, - "win32-x64": { - "entrypoint": "runtimes/win32-x64/agent-browser.exe", - "sha256": "4e3877d224307ff9ca982be2af2253f0951efa25c507d8232453200f769fbdfb" - } - } -} diff --git a/vendor/agent-browser/runtimes/darwin-arm64/agent-browser b/vendor/agent-browser/runtimes/darwin-arm64/agent-browser deleted file mode 100755 index 4514f6cc0f1dee6f436e680c6209f4cd0f85721c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 867776 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

ecX-WG42ULu01h{T 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%0ArP=lqx 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
#&1nI#`#+$1ft_ig9|~2!(YE2 z9ivgV867X8N+yLdhb|BuJTdQ6#ZMezml$N+RAwVnCxs8nrtrbxD)BMDsR4Yj1v;R|4veO1nSia;QuN#a=UC|ZFsV3jY_N1T69_WQ>Dlyd)T2^lb;p*yvFhN3ScTMd<^o6zeRzRuWk67Sjdm`pSCfnYt z4C1YHpmO+c>zr$int9Hx{2f4C2n%AO|J^Q&|A9G&Yx?%&H!+Lf?DM8OpI-{OSXD4qzkF%4H zan>A&{7aELbjE)l%<+uVvX{Ek$nr9v75s(4^-_W%SPjQTnksofhZiKRG7o4xH56K{ zELhnMvh{97WB+|(&4dk~i3hxVj3<`M4L}@V&SMPOhnhZPp#M7$PxnGR6G%GQn5Z9oZQ2o#zD_ZN z^j|rb+NHCiCMNx>3PKs8%B0`W=-KA#Iq52b5ub^kUOUY6bm$o~>E}8_0oI!^{d-x8 z+2{k^6=5B(9#D5*W&!ooAqMsB5;N&<%nu1vLHc8ERuH!Ryju9kjS@n;>w%jjncM~_ z^>GwCm)d13yl?39C|6k(*X53@5n=NAVUp3!3$kAQ#u$@JS6+CJgIKTjZDbjf%s+Wd z-d8-3IcLX^fb}MH`_oKx-MXp4=~+FXKHJa&>WV)As^>zjSB<%TRXun?iT^WxudhK; z#ix#n4UU^%q}!_Yq8j*;;@+3C?zixPp6=ZTdYs*1m2W>UPaDT^! zi9#}`B?2-9o3x7CQdbZEEyGEnWg+1XT=M>CHlgaDN>!=OBwQw))7cw?IwkHgQ%aTr%A!P?rR)}32 zU6x9io>kkX#pH!R%&G2j;SJ+3ykV5ozyl_@$dwF^uPl7nHb!05goV%Bmtwe;h0k!Z zag{R5y5BL^97r&~>~;drWik$b{Mo=^TG(%n(U_g>f5Oa|(#MAatT$n+>LPFC$H9k`kRYz! zSS_G_X19Rq`;9>zpc=gd6s9fB2?KQAiS-5AZ#Tew7bT2M3+fuN(Pkry%aOZ zB)Tmois?F79oYRRP=?dt_TtG1&FaBU3X1Qi)XE~^FMnA?!sfk5B+M*qz3Rz-@>tI=grEE*RI$|?(H4;te;{~LnyKU-7$9&H)lx(9iDhkDJVxaCb7gc-^WXx1|t4+P4@T??km0|8H zM3v+PWbVshLt?U+a6w|4TH65FudaIfCxVo)Da?Jho{^BwB8%^fGxvorUH|2doio(s z4wKFAu{qFNoq<9ua0u=~^P%gl-iR`Kgxip~Vs>%8T^V!&^Jlc%TWcWe=NS!R2Po! z&SV%o=o}k7cszJm(t9{+(Q36u>c#FQ3-l26F{1@1CQ(jyA14D>0Rg; z%k+G$R7--H8h7lW4DQ%`eCLkwX0UlE9U}>!XqT{y-v#X;FB_7+gcDw9B#>*-pdsnk z;YP(MfBPdw`P68TF3H=z%U27r`=oXs>GR=toi6 z0x2A57+200Y=(m?$t#F`LMY+V>LojP*KiMrMJg9{_im-HWTra|!tp=Y1l7kCrYfb8 zXtflvG;(~DK?VX2A6KHy$W($;%b9PQmdzDkJYdc$s#Bzz=KcDGE?T%5g`l#O4XZT=D`nN zr>NyyIN_>>srM5s;Y?Gnh5+@W2hH@n^}dim74)3fQb9PbdLZm+g>WQ%xB)G-r<>8z zHY5luZ|}knidi8w{(W&VBbdhjjDhv77ojb*NJ7GA&p4X}>yPaYgX2Ib@fKW*LB&m3 z_g|1uo~DQ~4{lAQoh)5zf}a^E`rr+|>CKekEL^QV)s;hVUC^ZJeB)m1ibpiQx zD~_g|RZXJuLWxSAMEmavWw0wR3cHPQkFFkte1Dh}nkaMZw><72Do)FbLZ^^`^(NFA zU>1K8;}nU`-vYe+_x0-qnAMp;U9}6Kdf3kw^zt2f?Pp(GFp!=~G36;Mxls7xGQ5E~ zb5cChiRn7ynrN5d^@4?A1;g1R@F~1rOa9Fvx{zNMciI9tz4fv6&ODN-gqPaAly02vS5)P&(`q>0OZgzwgb?-IfF{e~-_H-0tjt zXTI~^n>Tf5uvj}Uaz0jD>JtV|Oii2`O)-M{Q2eM(x|40mPe+m}8V6MJrj)U-%;y*q zPn(gq#l~L4dBd%LFeT3(ed;TkIpy4eq;?Y)dskiSYxq!*dioiC!Y?9WY&k%)1o~nS zk~nbHaD0I*&Am2lO>&PGmEr)V*|LIp<%^A32L% zayDuY@pUsl6<;@Fdy;SPKxw{{bYf5IPPLLpjPHv*N_TF7(#4iJ>)O&DrRzg^Sh&j+ zWiY-;fPBl)y;ltB{MhX&icocCQ$&|j`RpcZ04|@+UjF};&-xXm(RW*j#QwX{&%>%a zozd^ap4srr#bwRG<@3XC{*d)Jb|>rWn^|F!YIDX#CdSh^tT;Zr_k2yIC9{gtjUH=wc<+?Nq=ZCggHU_g7_{G`v$n@H z`a#Uy(3ik`IKqiwZ0b;k%UDbvIP=X9@I8IO;Rl^T`=WandOs%UZq`Xe*LPg~@BzuM z&`)oB+8z`Nx@>_{S`aZ^V$;($BSz8e3jr2$9gtOJS$I@aiBB9+j7=ZmXGMeRQoG?#%**G^r zA>xB*d_1f5nw+|+k}+7q=j}jUgtg-}<wFYcI-nf?z*WK zK>9v4^iCK&G_E()U|-P;s=k8FlaRTynBBmp7mz*=M;*%4q`&=VUWf-oa)yndnpdE= zjAEydhlxGZM-ThhA~~X15fs${G_&G06FD)s-@X$390@!x2!>c*hIQ0Eg1j@27%Vl2 z_5C*?)+L=GR@Yz7&F6xhdBrx-?x@*d`Vb*gL;uC6Wf5Pz1Ubv4H{!A?Of1HAQYniS zhPvY2=Hj2r`Mt`2_UAc)($U8$YmU^`q_;?)m zHfeFNLv8MN9G^PT!qJLp-xF z1`_M~+n*hB_&a?J+7*TG#WZ+wb@1QB>1Qbi&eL(7hEu;DC{AMA@i&YN`X+U6(YEr7 z@HUN9Watbb`Tzi^z}+8&w-9 zB2IADiU=1!-9{1QYn9>>er_x5Y_;6kjSgMY#){b`!=2Jtv2f2kke1EXbTQfS?YEow zqUO_!aU>D)K81Of zNI9B^;R3cWn8yo1a9((ij+EIC-=kv^mibv^{^d{Ev^*5DV3$YRwwE2JEBy`vcX0bM z1ZMy=YFVk7eJq@}E!u-i)aAJu|9J!Qw2ZwmT zdjm;FnD9ZCIL}h-2`ol7UCTv1z&n*IjOibGm3|Lf`k*VK4g3i(ssF?j>K)XTfQeXwQdEr8!c z`(Ud`U-&mRx*-GkL zV81>6YkC3bI*k69UtdH?YE0(?1sgU!#~Er`)gJ@pM1EARiQ$cGMG=7XYd~ zu&z%>b@XMr!ytK(Q z$a~OMmiG!YEGb{S#!q?PFR~uT`6YT(WKn4v=K@pCW@Evh&NMdDFp$TQ*hgPtCb#xS zuE-fp2-UVrhKmBj@PTSzSWYnP_<}Yh%AVjttK1kbHI^q8mNZiWL-Qq#CJqK{k|Ygf}L+AE%Bx5bb8_)C(BzLcR498Ro2a{xPd_be-zidh%~~(fic1ZSO}+6+;wyV zkk!V0^)6&X3xCLZ9C=sk6}PjXq&g!oRI3`PItA5_muZRSC2J|+A64OaRy-yd_6iKc zbS%{qrnM6m&!#mO{aBU!x6e$5qH(2PqM0w{iB)mEd>%?Uik@&;QV5F>2qxo)$-w z=9>I-9!Eiw7wLsO`{iRc^|dOve%R*`qaUD&H;frNKJBSD>R%%tnG%^VQkwr9R*7vA z&CY{zYZorCQ~ZwOqgRo(*6c(~=!hZ$Sl=mWecZih=68J48~K{CRVls?M0{O)XnEvj z@f9p-<)W9fG_^d=K^`T)@)Tcl#D`B5@+=L)(x%{~5FB`x*)DQLP>XTzRJ~to=#YNN zk>c`=q5YDdqj!>zt*Z6L(D)X0TUNc-!oH$&)vVNO{R(VJeqvRv;qko;!9xpdiL_7K zu_!2QS4t5+w(XpfhS}+sp;sbyrEOgc0=8&-)bSX5)LqOAJ!H^k1M%O;erE7*+L*z; zZ+SL}y7oBNFWPm?@8KKY8EW3)8yZe1ftcy!Xv1)Vs~0*WA8x~N0*^m&E^blfdG(Nf zC}Gs>hYuytdOmF^A=Y&sV@+6+Pt1Mm=-R9?uJ}tw{5+OZ0{P6w>e@}z6 zwApri{E(#n7|X$+P-ud8^&h=V1LQQK!`E`y!Pp_e2-I6x=w}%XnZBA>Q}wZt>yTf5 z)mZnK$E@*XY+Q1GR3S7TL2sa+uN%>!5E@0RN(U@g!3Ph@dx$_A(|KBx_$4Jc4oWDp z6{fl=vy^vShnHbpQ2GP0DDR{ww7dr6>xdML^$*s49bq0wTY4g!Z0ub{*`UHC7BPm( zY<%<$DEq&NG5t((1O^Amk||qtv=2O1AB0r+e1((>TBaT-wO>c38f>9VX^_mvF?dQM zI<9^9;Q>y|8hy>u16k95_+if4k>lB9?fOb%*20Mk4SKHqnzGh6WzeAZIC_M3VHa8= zDHyfHA#Oe})4pQt@8F0rw4g~*4>_44HajZ)K}E>-+XEVj=a@v?kRb^;$u1Wp5dEV` z?EEVmd7NH>_JB5f@Aj|=-P7yv*ir1q7!djbrC}ZoZ|rCuio*!xa7yz6ShH75G;o?f zf!}%XqhT2DhXbXW(1sXnJh~BzE5*GZ8Pu9lPO)2la)^>bq2spE*`~S!#iY;da(jU zo!#k{sOS=2(<&zR)h{*lrS(<#R?)H`NwrI0sFpBNttY77M9ZG3=7kcKtooq3`81CCIV~*mVds}2gETJw znN1QsH5Ur}?;WH!u+UE^=?9)F!+^-drDz)Rsm|UWL`h6s>6?aF>GWYZ(x*dO(w-1k zIN8OGD;z16lw3F8Y8={P9tCgP2FR-KWpEN3A+vhg#M za9ZOGHf&R)i1)*qm96t2Kjp+kVCycLv2Z;%%I{PMJd0-K0MRsUo2fUr27bq}uC9-H zA!6>vx!RCKqFs{&H!IcW{E~zkR2E`fHDE|md}12(Rikg zFNpWE{rp)!sTcdR<}+I_r>S4tfIgbDB9DZ6ja|L?td&F3kK(M>Fc_&TgC~rrCD;?o zFytv0bMTDoY$`-=cSD_>zQ&sij9k~LLh_r=;@0Bb@MBPYlF zTQ|L9-hjQ%AMH7;j(NocOhoZW!{v{N|9>9hu8bvtI>+2RW-K`W9B>>8O78BU2q&OG}j60ZLzNT>eP8a^vY?$9ff|lz8?JLptqm zQ&AV+D^x|AYEuf3O$$#*CloAnqP98RPMF|bc+~~v$pr6W+G!14xiRAuI_@eRwTY?w zJXpTcmzJ-5&Tp}6#ktq5THsBOV{N#W8x%F0G6QRA)z;$4-FccyIG>~Og!B1Gr(3BS zO76Yy*j){g?usk1hJMHK1J3rAj+=bGI{6mImvvchCKs@AxqqDIkj}J<01Fgt>I)*i zqHVSKsKKjz>UVq#b@AaOAe;L4P4Giu#F?)4^y*^KMpe`UTw1GB{!>!n z+Qy#4+x!`cVcAJk6<^j$5tTTil9N-|+*!*oc|zqoY*zkAWJbYx{m}f5>_q(_%Fg3o_pwNp>I2 zDn{^b+>#7i2ZrHREYs5o^UQb5uz`W$LhN>)i+Qj1UXH(i5D+Pr(>UUop=(sK(Ug1v zJk`#0XI=7NY=sc7w&cG9KGm>%(fu5)JkH7PcXiO){bF9*8#Nn^gNID`Su4ZuZc9}? zJ3Sy`D1+4@I#o6JmQ|J7PH*?Yev$P!>P2fP_GLwGN~$XZQ$z=2fu4@)d-Is;y=OGL z$Haq8dHGrYis3~To=tEUL%@_Z$y#1 z|GE@o6js{l?EUkv*oc%i`l30Yx?e`*7}rum(F}o-bXD5>vcOP1u-icO`j<>~LVGPy zZoh4)2CBInKzQYfBsx4WM5}8=?P-Jl*1UczkX2u!yPWK!NQ{;bwvSs?{Smp>fWzB~1C$=Ql+OqXA z)QL;&t0}{`0-OPM=oc@_Jaqhjfj+!LwP)D_iRwMt%QCI$ozn zJ$3ZCT5ay7`lmbh;?9QZ94!CSQQh(dQ%#E0sB#0sQ_0vue7I1RT7OG%CIp7#zdHm+ zd)g%$HKG>cli;bI;5$e6Cp8J7F0&~oDr(AqWbd>d;k2G$EkM!HcGB?uhR+dq6(uWc zTvI-HKK*?RW98_R-jZ5n)9WQu&t-G+6|Y_^PRYGqc_Kru7Z)bD3ybh{dc81<^;$1V zZ-UD!c+1H{+P)sg*G=`-u_+r)O>Zxi>G zftpuOMuxNxhVc1F&ieU7W|{S~rMy2`w$>SIGG(SmrUgVl)v>fsr=J&RvVNwu(Cg=M zzsPzVuCiJI;5KwQRZlb_p#}Zd1Gw=8s&n|2)gP*xfSg984+8 zv9OkB$T-AU*i+!3)}?@)nhK|-Bw6jdvAMZcBRs^?t!m%um8ETTK-B&}EZ)<}veTz5 z%UROha#P_MzsPzVMPASs%WCJP+TEi9LUke*?-5md+E1snV)@l45c@j1^G@-+j3FyN z!Z$btpFIax8draC+<+lCOPD5aa#BvK<{EQWPA%-Q{{K-<6-DOwDOW&pJRQsYbjn#V zgOy`zrZ1D@u!s4h$$A_!4`?VZ9`3V}>Nk@DLiGY>C3I8^3aaZG=q=(mY%uNzRnd+c zc}6m97#N05jiEiweL^#z_>W;eqxjD8$0@y3Yf7q*th7IV!dGcmqh2V*H?B!ia>7u1 z8XZ{9&4Z)ZlAN=ib9|^X@NUQxqkLbjlQpX0#4jhq^~jo#4L3!mlFQ0|u-6)PrUt|s zj$u`v&Kmxm&W78%v0lVGv5UDM*5G)#w7xPqa7vm*r@&B+(5TwelK;}oqAlpEed%tq zQU_bhV$i@ft3Nf|@qHovh!6DVEkp*y+F00~UWe|z8c*lP zSmi;XwB?c*E2rrP=smTh&yKLp)uuX#Ku-OO=~9%e_fgoxTodKPo5I?Fk>{ioV%PDx z*LOCJ_P^H}^j&xw>-(ifdVL?krsRH*bX1eAXYOB|Iw7f^92XF(kw&V$K4hvT9C}9; z4yyVQ=!Xkc*?U}aObQIgSy+81YP$C@Ajl46%?Gf_v3%#~R777Q#+KIP>NPakyY!kE z83|0RGH~k0GjbXvyN#NJ2FX67W!70+oQEagJwDTpaN3OY>QV*dDWb& zmW}FF^n-~=@4pX{b;Dvnoevs0l@-0UzTPHV`bE~`XjNE~xE+#I+WsZ=?FtOlAF$w0 zM|JNMrh1}~Ud^9i>vBx`TR)6{h?J>g8u6zj>kJH8n?}~2*5Y?^cSxfw2&)d<>GnV5 zfs9uc=$EC&&o(YgH8>Ki>HKCT#2{MNF>e0$-?t!j4f?$LkBe{2*A`Y>q9Jd~7L?Qh zrM4?(QFKczC}bnMmE{utCry@MEgLUo8-%rN*o-n>eqcKdpa%BQ)3Uq6ufQlrI_qBEwegR9$BMh zR_SMOwJHhAs<6~&MO$nrl}u}^_R{m5Jj}f3v_i`s=KbRTKMynUm@Elh-$i2o-NW3% zYB*i7E$!iA8&^;7VNMnEhb;CKkv^T*I{f{+q*^*KRNH7&?P>2F(h6;V3|OdRaTjp_ zg=bBI|KfEvR{7R!+Mkl4`ZUQ2lXvCi!4^c{iH_~J0z*b z1cvI+g$4_mI+3ZqTU|?(YEb3XLjK6rcyPa!6o+UOVG2+Cnzfrd8bCy$OV2w-$`z8K^iL7~pI znz>gVcNrUkw@ zaU!i4CrPWEKf)E#Q6W@1$Kg@&kMBpMUt(bJD1hC{52Al@B&n7lo9D(FVGki)#s5A z?4|QMO{5|8Qr`Uj+Ve~*2U;nAoJwVv-4Cf2mrKQQqjFY0e-vk}7N>hvHpZ2jQXe5R1yR@+m5mKmHLm<-yq z3}Rc6ugJt{{A(2KdotbSWLIaUs@Sgf1o@MHt3TWBRo48W0Z~>xtQ^$YRhM_zuD+suxCk>&_r18a39>?aW>$M#33}fgq2ei0#ar{6y@Z=MvkQsgG@g z<##KK5kDI~rA6($=%!u?@mVCKsM%VC)o`sXJTp%Xq!Ui7ol8PCygXM$C87SfmG%V; zu0%&ZCf5yJliX*(kh<;j7Wm1Y{yqyaJfk{t}3fS{QU{!tLMf<4!{yGlK!;OJ)OV zFZ~XCtNnLaQjZ|(aeVi>irI<$`(m- zagTt=b2?Vz=?dhEL=v606MBF)3*p0)e_BiCcU$T0f%&b+jgxmnf`yL7X589IBk5DH zU;B0YnDiO=mDRXsIfW{NekEqhxtKKgE2Sj%^q^`Tv$$NXyL*hyY^K{KSb1j&%Lkc*1)RN3)`Mb4I z+DoxF0%9-mGYs}JVJLXv(7n=nqwe4rS&!rDNezWolTGQqUQ#_UARtuNVCkLCw2vl` z2u&y4v}dpTkP|et20WHydDT}ORW^+S#1T#1B9`yT-O@OKZ1mSF>P&s7XlS0qB2ITc z+6y7vo;HzQA|trJR%SPINUpNm__tytHeFXBBGKCwxHW|BWUQZEfij$ZmI?O4;bjaS z-r`#60mnp{{P{WxfG(5k=w6peH!|t&Tr^aU!`$ozq4SUo!0*$`ZZ6!$A)ct&*oFGt z3%-2tSkZttz4@pm@`10|tS14f5ge^2l#73QQObjR)IO?CMY~)Xd+kA%+HEDmbE@4| zmC{U)OV{jc|G&~TW1ZAt1B`zMpn;ozy1`_t4d&97SW+X)RmSzJ{*d)J_RGxzxLN$~ zYDsllpMX$(b()}RPy1py1WhJAauAwFQ~A!Z13SN{AE0Fh?{Ke-#-GP?>q`EQ^qxtS z1FgsSKa?9a9dXNbuURzeMyZ~@f>iTjkwK2i-YwOpBmBF6VCiCu2*(GzsPzVEB@9{TtO9GC8-Vw4AlfI4J4}AJAbLB?8$FH>|fyy z$MRra2h0<=JfpeF!>%!xH8DR@&CLm?srfTf^XHU?TdSt0vy0ZXbz@wkadgeFqD~jq zE4lJfot<9sCKd?wV``2ug)~ucA9VXAe`!RjJ{pyXMrjdW_dQyCY`rP|#iw>gdmJ)x zoz=iBlluOFF~IREaBBNsAqVf&Tn%12BgT{5b)4?@k=TFl*B6~)CuFV@?yV$2z29nvb^S5 zq?OlWeNkR-ETlU}88UVF&NWZL&Xu{D{uYsY3UFFUrIkW3Kx#`XV<~Qh<2DVb_w9_h zy#wm+ouCf#`YYVJ7h~!n8!7R08|>IOgqY56xIK61MawewSvr4FnF{I zE1Ud^3tCR8}LmCuy+T9rXyWLN)i@MUrW$z%bqEHZWCt zGpTCaK$PD>b9EvQh7ldz?9R-~YahQ~A)6G3ws|7MXy}8jv_qKFjgwwd?*=D^j%!G# zF(%{Om&P%0JR4{fM%j#&0o1=+fJtcC8F04;%8B<->RrD%T|X%`6%?Aa^h!>qTS8g` zo9?~yl$%G%)oQxe7fUG@3Cy@guXhbnPDP6!rn^VFKsMdBev$P!o|5$=f5+Typ``jt zU`97qVsV_#bdSU_)#<@{)BW-sTS@Lrx5D0h5Eo@|3ieYV9vg>OA`rjwslgAK5(g0H?l(wisIeal_*6Y5n2m#x>#3)YJBW1j73#3|~Wj z$ev!#kaVTmob;tXwWPUqyyT3(NpA#B-MSE&&<)d<0E$I%}=$r86PN~pBDStSFt~uSso$mj|L_BbJ#D106lKaOEaTd6ivN6UJha)DxrWlfz#JElv zj+d;5<0U%>h0?Z;O8X$piDBphQ(X0eaO_}an$xv~drd!_exwkHJes0)oBP(fQ4?6r zn&;C+7j!P6i-b5F>$!?`A@p(&GZaEE_O$IaC?5Fx27aemx|J_Y8X8dDNE3dNn!C6q zmr18E@g+_(vgyn7!BbpxOy#*gR|0ZwQdS0BH4wES^JRICcm>htvPsLIDHylIXq;~F zJg=dNjxx~H(3hxgU>c@5_eU_@_MK$9{^fu${V>hIblIycKF*Rn*-GqS?yWRQ^r#JA zhe(YF%?8`Y??N#YC*H+)D$hiBF2<8GCC2juwG%UIV(CAhoSKrzXNzL-{~%iYAB1W% zIx8cl5%11uPfbH4F|IoXvyOpDr*6JSJ3ivj*}U8j!ojnXV}efd!LuCi&^W}qvRSYr z8Lj;SJ5%OIdxqmQQ0*|*_~sCp@6=Bkjvn@{l;+*s=$$u!N1fm1L4FXupe%gNJ93rW z9lr5h>ixO#0S*p{O`wm%dG;9df*h0-k0U(eDJVT3#3GLC+(7jvqKrHi%2B@Ri?TdL zISP#cic%bu8$V*`07T(Ep*4w5Xk7)xM0;8z$Gn58J#}?6fb?h2O6Q=>b!Wst_dHq$ z*ZEN-rJxPPZ+320wF6~wM4u~aHXjrRevOX`e(QR8vpnt<_9fX5*3CBXrq)usA;fzn z`mf`z4Wb3wnCMR%NwN`nONtvD-)R89(+sD((t23V-5=-;81&iJs86T66-?v~4w=U& z8m+U%;?=js6_%_%&biA6GwGC^I6yO#-dG4n28fkwHuXA$Wr%-zQ$%C5msa0Md&%lX zg#FxSODfm(hY;SFSG~e(`7)FX0UDEj!NLud z8waFdZ`PPNxi{+w-kWs6f;|CP*R``kFU4I1+kcLnn>AM>*>G4rwh42VakX5^7R zX#6|0<8)3n&PZ9~z_@Kn+%ZmrdOQzt-qx1+%U)x$bs^dKX-wRQ@GQ@!(%FfXaJuHM z+7-O;#Q~fYVZ;$+%Z~a(*5hb>SgTZd}=JS0^I;0CpSsWE<_>2)JasIy#UC>5biX(3It3wZ=R3)Mb_i^e7j~T+?yyjN2+*iV5p8p#i1)nUvy%1a-Q6>@#yDB0_MRc z9wD(Cmjd3$u>q8VJ*~FaDx=0iIpju081*!iZsj7?#=qSpf$8V}x_TY;t&XsbEA*wT z$MGJ&hjPy&H0us)R`AFU*WJAktv1S66BeZwnMw3#(O0;zv+PZ-pVT6oTsxUqE{EA# zd-d47V?a!91=Sr?mgo1MOa0{y4Ap{0s?Q3l z@v_Ij9`W`eKd2g~S|7HWe#Qu|>$0aE`Gl-StfpUxj-#4E0b)o2z4(_=$HJ(p{i2mS z?n?KQd~#(}ZON!sBlgIZLB0gmBY}vcQ4wd<56UAcZ^Dg{5)vN$tG>Wr`qf`+ZV#OL z20E@en(p^^G`+IvPLnY|)Ecan`DCv>JRcYrbZ?l!bf0d=rrY0w>^zX%t$kiT8_boVlqHsPsHXR%^H`pjWnKfzi93ue zzy3OVmVbI}U|O5pvFy(4S4H*1ESI$NvK)^7BqkvA8Y$Wi{s*ln(b%22&+0ycV2f}UaZ-; zL5%=d^crqojrm0r_apuM4qfA+82S1A6njoejkvDmn3ej3OeL4Dx7a6AQa|Oc#Bm=X z8-F(TO@mVBM6*&eujrLJXsLFjNl>HBi0fWUBKrHLBcH*}R9S z=F;`PI$bi24Ghzo8dH1Pkg1yaIl)$ao$kCd7o#eWt!rGJSmfauO3lvHP1Pb-laWLm z#X{@J6K%FN;o&KXsM^-y+KB=76rAofBrbYYc=*t`q@>{qeeDS$%9;E&{1%?Vze65( zUf}z(;y$7B4DmdCw)k~?i{Hp~NCh8xT!himv4(Vq%YDAfO}@*W+NJtTA*M|u^3JTC za_S{@bD4;vAR0Fa&6>=o`i^T79+%u~Y?JU9d(>_GKZg-b%m(aCuJ3fedB^E);KUh< zm7J+rd6Ey}Z%E3oE#3JdBlfkVU2Gy#uMUbTusLPZ(xA+YXdGqdx{h!-=&}YA?tB`u~J|9?tCC^x_K znT7<0=?{YhQ+wJKk5>AAYKhW!ita?|%VVFIC7l2B7%ODw539!ao4YhwKhpUZ1WtXI z%5zQ*znRn`JN#-g=3F}bun(nl;++98x%USe^th-6>+v7B3l;-UX}`VGKa*QzaQNv{ zB-Jae148x88&Z)~Cu@of0$ue9x^v^4G}$n0>>Nr>!NM&f9>XL|$g>qNr6!uL8>m;W zbib0%rp_0>U56?zP=y6*f*DnrP{|h5u>?-*a2-x-Q6*DamoEd=#De-ppymivFLPR} z2^DHV4Hc+?0yVR|DXmmO9T1ILUA`I$ltZANF{5G$HPeC$7O1S+oUajPRB1x>wV?J6 zVQK6VsJRtQ3{PGHs*VLUL!dqssLtlJ77*&67ukq(`RXN5Jp}5#FjHD7gxY37Ju6UE z1!}e#)s#^0Sx~nIbH1+DVrl$j)>i>Sb+e#03DjDFddHmB!HYmuu%O-*sC0o^QO=aF zS%msq_(q*HItx@gfeJID`VndcP_(rDI>vT$bW|TpAI^?y%r<|@zO`-~{+=xTgQ5ab z`p;pdoo+lUe^Yi;9nR?;)q$=4ko7p$Y|*@YL2?Jj+>+|;mI0yK$Vm0oCQLQ@q`q#f z>JQZz*A?uNt4&5m@rl>I(Rf4q0i*HT;~^j(#KOpG$VBpxVo2*)V>rnh6DYv((Pn+l z=WfyD^~m~d0B~yFht+SdOHHuZIAzSatlyeVmb$na84z78>|-#SeJ`*so z**~-C`lG%{^|eb219&^<{q4Gj#_S9;5ucvhNL z6A#B&jQT$AmIg&c~&gm&(db=$e$sT&&W>3J_Y^OVJaR3qzOkpbglWZkI$!}1e}tY? zCDye+dh(!r25}ls6kck5JiLU^FOne?4 zbe%F0aVFONWOT&6DErF9(CBfuXq%|m0)HjHgy7hStui>V4+lrCeT;M13y#?*zNENV z*H6*-`r zr?%wqGuI>S2@U(&FW-q=TNI@F+Uu9bmkv8|sfHQfxC@cJQnYWBeaP0nE$x@L;7?{o zD-!UNw6+jTEQuEjbnTXGl3jm9x!T(ihL`bLgxi0{+VqmYQ2L}yrg?KkQ5 zZ23};Sn{1jd>^Cr89r3QY*EyCmZ;f;!UlMhOWD6x@iji((|e$4Q?c-xa;?UKB!0cD z`Rh+uZXWx1^p&#IMtE*&|Hg~yjt4Sg6Mu0ZGrj173f+J#RaOcKov2gDibQ% zf;!emw0|peT31S$(z<*Gs3sQFHv%k30yR*e(#)t-LLF$v^@a}B zP@o(F^_&?MOQ@NQ5?xjI2n^c}Eu(D1kZ!bVd$j9U>2cj7!tkV;GM}I9z`orvuFLrP zPI+R17<`xt1H)<#8Vt{;1ue&T1hh)EHE9)>_2nft%{;C-cdj%`to5fJvbMDfrc3`` zp>aSe&9~^Y8qCmY8&rPg;7arCF@2@kca1+}@x{ezeUEzRcuDn#7Xm`{msbr`uhe6z zPtVg5<+;PPtNo%%pPFBaah+0jkCP;u1cqb{Bgr;`< zy}PW`cfJFMLK8%D>!MO$LwDXm^1G-L(2ksF7+rd0l_uavwj*B#PVKnZ?65w5ot?-B z==q_;Ua^G9iOfHNB6?ToLRYZk1nO0R8f8W$6KbmkRa2m<2-I*hstKVy7Szq2%xOBU2dfm$O_ZHk-nb>KKq!i_1pxO%57iLsn zLM^wT$_i8&fl|$=I)oZyL7jh%rEvZX`~_6B1+`e9z89!HX4E!9m9U`R z7N}tYm0?D`N2os=auLu;BTAr}2~?aJ)s0Z|2$hp-p7OiiHIG>Cj|;K7=AmPxE7|G@ zNGUyzRed_wY^%fm?#07;*Svd~KV&_QQ4&=E6_ax49Z9uqV5rtJQteWkspdPNQRN}x zFs7QzA>y@fOQwI+3y4tP?J8a0p5dD7n^z02ZzJx|^2*Uh21x;O_1$@?KVrAqNX#gi z9XEZn@!zKr)^;)2$gyx1e3e6b8=1GnAF>`t#$v6K;-QkoZ%L}90zBFL1&F3yjO&`RcBIVp zw{>!*pvLEpkjw=c7U0<0UNTW2qc%0BRBSQAK0p=Avs(i(`pz4({ElWNs$lM^*{5#` zJwk(cqtTPi(J~MGswtZ-bIl@ulx?-lC0=#Ushg{e=QO=szLUW+o7V&{k7KfQ2|U|S z*e|jk$83pW?^Sw))X}qnp*jrf33ZP4;~GrWxkvB4dM)%vuCzJ^JMp1grvwd`EZ1RM zhX54yeON1}V|leYvt06tR%m&Z%DNx@WGVI$89_vM4wFQq14Fc`k*HG;E&r1yPON~l zDJA?TdI=kzj3uJwyhMMC2#7>Sw>L=ii)tjiT<)D?^hmaSJ|}=#Mw{|>O|KJZ#?jNn zan9?qWx-FIPW?w=P2>t7f*B-&r&FY^3gk`%jpt*3Yw4a?11D>EnSE20t!Au0pAWz{ z@hAqqKk-qd5KyE65@lqvq&PE|9<*JCk0Sh{O=;qzm^XJ6d0@prkwQRmHc|X7Nm6_^ zmlW6SFj4%hx>t&?SILzWdBn?})?tCDf8aJK1Qe$b#kyXK>vC87Hm>wFIRsG;@uoO; zs(C4{uZ%ip<$Oxf(ef+Jaj;KKov%5LM|SIa6HZ$=9S1F`hlUVs{haKwj@)Hfh@KO= z40nP}U51PUXpn1-3SBdPv_Op%s0tw_)Ko&9sKo_ehjI#33xQe}YC?4<)O-u7xIh&a zs0aB>sLF&&wxEu6;CvlM&k6YoGw18_exRCIP~QmD9D#b#j9N{oPz!3PKn)bAGx<#n zQwen-+$@cT0_6~>D&~B}5^AOe6)aF$=s6)@&b+3yN)xKD1+}+5OJkQnC7Mwu_W@PM zf|?;v9|}|Yr!L`RXN5Jp}5TJSK)IgxW?ZZprb;&f1mm9MqA)#6R*f>u>yil`Q%#%eLq zic(ynDM4Q)@^Vt|f`^=%TT7x1b=kr4;N@|Y-KCM`=GN!m_(Rs?SjH|yE{ptjh@{#g zFjVs!sa6wIzuTfw<=W{wR`klDSiiU0cyF*|`b*V-2(^b(2-Ti8djL62jFY_;M$LA* zGq}9Xv0NC|72zUu(`GWzU-!VQD%N09I_KpUs0jkK(Tw_>P#3G4QC$S8y+FClsQ!dn zX+f0}s3!%gpc(Z)LXESa)ELg!nZlf}^;vYsGb&I*Y!2caIf zphgMQ2!ZNgMol5qabbcw8MYRv<^omMjCzGo-&s(_1gelgoqb@+S0zFvSx`sYurz)v z#L~zxqb}_Rs<8$2wLr}lsF7yWDnjMApb`Y?4T1X7tgrEe+AqvpCyfRIRZpM>n^7@@ z`pkmLD^L##a=v>0Ym!DOLd9E9dtPK|>=dZ#X4HwFfU0dleJoHP2-NlarnKf0>TVUY z&BqDUs{*y&j7lcdRtu`8KvfZ_+Gg8mLMV>~bu*gtb>%UZMlo|`6H2I;EU1kFwML+h z2AMp-fn7kACzRpr<9n^BafZf|$FY4nCA+>pwF2qv<9*5O0-f9{?6MDSF6=v>&X3)m zW)y1NG)jG&4uUawrJ90M6~W1F)=(4T%5gl=spcW45R@mJ)<&l(dbKkeD@f@{ z86O2I@B1C!bz-Q+M`K%Ru!wK0WL})&YwCA=ujt|{Oz~l8nE36HgBdJ|%d`B=?|i~( z{0ORId5t(LHpcZpnYk$+MgEzL9D4`aln)TOnxB$2nB(0jR`w0FoT2Ob3Ginl{4u_d@-&CL)3RDX-sw1K1SWpE7Dp;Tj zn^8{_Y9OIJjuO-Ln(O%4BV^`|-RI1}kuQV|sYO^QzE5u%Jo^R1txyeaDnm6+)$0P=7XOhDYGb z!0@hFR#&zF)zpHTCs1<*YO5KwhEN48s5b>_kU)jsH8D&h)WK)W(r6@5&k59RbH3UV zYL*2RB2YGg+H6LZAyhx0u!$or`M9ODS%;7=mUz}jvV2yd!2tP0n%jB%HUm}8f|@8$ z;{~dq8TBcl)UxKBb`Yo-fjVUN5Pb->)Pj0Sph^i;KXX-9i%_F1sI$#DUnkI{LB1l) zs5@}4YHJH>p+LKTFBXhuCpsB{bJViV4(l2w3m>N2BjglcC& ztrVyw0=4v-Nf$qD0O|<~YMem5BT%EvsA+^cP0OncwRIbTY9&yu&8XK1^@9cVxIh&Z zs9jf0466}pxCM2*F-zl*2P};b&8TbZfr_-Cz7wdg1geJ_wT@5)EvO`c8X{0t&8P{4 zI)u&VjM8Wb}ss8THRvprS3P#RB!cK=m-Awh^iXP?~%mD7Tj*B*+ra01;0g5l>^Y zk9vpV*^QHPjPj`~P_+cAoEg=MP}41_e;aa6@7&{@t~QsZqJ-*cL1hTk7J*7NqyE5# zOloxtYN|j@7N~eL>MKHBr%k>Mdhae!T?NWg-iHusy#-ZSpuz-d*A-K_s86Vg7S!bi zER75Q2)&z8c?i|Pf?6$5%LHoAMN?WolUIMrf=U&r(E@ebERBx{bru~Pqcma#$|+D& z&8XK2wa|hpEl|Y;%56r~Ak;_;>STSE#<9CBjhla)@^xbsP%SK|1p@VrKwUQbu?>VO zY(b?6)KGzPnbVp?sKe+H8>P`ypc)EPUUOO<2{p%pDj-n70u^%El&_}=HPC`O_&iHv z?;V!LFPBWHbL8tB7St?(njuhg%xNtmR2G(hczx#S#R$15LpBsa^HceS!f26*_pS95 zlA#Y-Kq1Q!Vw6x>k$xGGesrdZbsb87j0JW6InL`TG+EFJC}BqZvjV7S3u>`IeJ@aj z&824>p-Na#Zwu5gftq*0#PB^r{fV&#Z{9aALdb4}7;{=z#8XSev(aopttg)97Sz8E z&gq?7oKuV46(v+p3o1jPwg^-wb6S6pU$1UKO%w#kV@P2{H7Yh;goeZPii-$r!w#1!Pk8}UeP0oFi*>e@AxZ^CST>`aDpcMOwzI;&%Q~IS5rnD-F{ZLBa+ibx%A3eSNBc9UAV-c30!j4kdS%ev-5i8Pm zinOOHCTn?}(q3pml@_St0`;XCRfA9?EvS=qSvtpVuyiV$Q8$(X)xv^WAW+{3)bnQ4 z20|4kl&A6k@KD)9qPdUnsEiryBckakqPb!=vEdZW4hyQ5Kvfs0#PcTcL=tKWqvXM4 zG?W7>H~+_Zy>gxNx>|TQdM4(4LJ9a%cEEK4xKaSent{J80q~jZfT;pFS^!&{fgcg@ zEZm<_EU^OR6sQ4avAj;Gg%(t4fhsOgnPz`hgHR(asFM*w|JPV1|C&)Z$m6!KpcV+! zHv%=rjM_k`!WLADKn)eBsb_No7XAw%n=sUCjvE1pnfo;z9-bZLgu{n z7O2+*>V4H@%EJh?-GT}isA>XL-Hd8RsP`?X+qF4g*RF8BDwYPyR+wHK&yW>kMdtpsXgC{(&3jP#oH9m2k} z#8gnkluyL;yg8<4D5k*_lNkAWpmd;ky6Z!lQb@EV=Eb#Gir-&mDV{aUV;gz&5*F0k z0yRva`k7Jh5$aD=B1U;c2~;zI+JDw0#cqU}XF=Ho>M?;DXhu~a)SDL6@8O)UUoUaK zV$G<(e*mhH1@)yseJ)TvPnj65AQVQRP5BxuQ2hn!M4OLB~W9` zs9J;?WkH>-!O}R9$`25 zDk|r+gE<}>#naA$S}9OV1nMa>>ZfmkdcuMlCs6MQ)W7C(I*m}LgUvZ@BT%gbD#MI= zjZi;WP>%~#QGuFjMpYx!a0}{qRhGsd3QMErpC(;gn+H^+1@)akeI-ygkC{;G2vyL6 zN)o6c0=3bMnn0*SSnzMudt-sBFHn)@TBbdrzObP33sfF~DriPMNvHupiT)UzxlL&^ z2Vq?-F|Dt{5?XbhCG@-5ukZT?sB#w6M1dMFP+yu+pAt%?R zYC%0EP^APazZq4FP~r#*{c`5Bl{sH0&T+o>n|;z9cowy_C9Q=5HD91UGo!W;s+a{e zQlOFrD&CBmOsJ!1jTxoULZF%m)a5@+R@RkJSWsy~6&9#afm&@wg%K*jf;wD@rE%aa zOC!~cy6_cH4J@cR0yR^hV$G;!gvx6{4HT%p0#(|K8cnD@ut=jc90FBGpzi)|l7^E| zA6rma6**u3oZ);OHKU3HmD$Ib(9Z&rAt0N~kmGQxnGr_FCjv4}K)yCZz6Zo!5bJ)i z9JmeEUd7JFFSaO%#aiGlGcuE-T^YOz^~O!CAxJ@6BC{C>iQRwxqR^fcT0)=2DFk(h_q9dmlTl|8;i5PPzB3U#^)X2$8z$%MvUwdhnpkeN@aGwG*< zI-PzBsqfKGh&mBJSlqTxEdjS7-Yg;BEF|6x;Wzn}Z>jl9?|w2b(KVJUz)U z=vgE5px7kUH^dWcP9vTirzg`Wu#oBz&nC!cov0T|@VUsY+8kvLFEyf{5VanaKzc^q zaP@ntm*@`rr(qeoi08VD=N9+WA0e&GS~@Ys-as^uW5gq~TuwT5x>&lL>SZLrXsk0X zPS8I@irE^2`XzYDx6fS1+ifu7%x+nI8D17jiKd^Y)i(5l9Mew`wK0A;wOTY1Lz(R( zFRoFpe-?t-E(KGA#;54D571px?~Ax@(ocwbNyhatUQ!Q2-RgM(KOx}XhN+e*&D zV8e;_pBM&K2gwJ>dT9!!0d2@^tY4<7H|*c90Ub>Pl|;HFF4P}EQ(Z!TejwgYtF!2* z5Lbqf$oshCm&Z%gDtYmQW;$5sM7w$@?@;8mBDD7}a|hNxj_MPb+tZoG|0t$UFfQyX z)a5AX7YfoB-vSi6nnLxtynYp-Un2C8GRk~bm+Cr#4HB?ytx7XTbuRQLjcX!-p4ZaC zzSi(d>?&{x*Q9q9(XOu8^two9M_rQ9gszwybXgs`AfcZkG->lhG3}x-LexyMH#${| zpS7c)>!7W6rYmYPs4q$&4QZ)3u0d3uQ2lOPL-l*`!|1E>&8lRL{4_+xet6<(KQcxl zP?Uyn=%SUp2&E!QAsr;Q(YR1Q11(`+PqKZ%=%xyz8%IAy)Ktkko#u%sg0)n9Q^ZR{ z=qE(&CtrH(aqXq9bb(^wml~?;1i9rhVs8wz`h_f-H;`avWp$;zuZX7*%^2K+ARlQ( zye7%CH^_^P$h-G_xp!QPRUfijZ>qy0S#_mvAkwPAOU& zF4TKOD@45^+1967RN}WndYBec10zWT;UvN$Y85HM)$-|f0M!HZ6lOp_P_%rhBu`ZP zSE4g3sMCSd3F5U&h`9nqLA=gMqoGKVR)3LJoJ{M5+@z&1`?oJ5nRuDZ>+)hQ+_*~H zMjQ282WImZ$ zUd^DVd+F&8`Sep6ot@TJkX|xmNO@@yFUbqC5uLQ!{*9QsD%U?XNT5E2HdFpIhE|}^ z8cK#Sv=D`sR2CaUZ^3i13{!datPLkBx!1R+`lUvG`UpzYHH*e$P3@K%kZdC0O#KyP zRoz1QTTkK$QCHxHpG-ie)P9uxf%GQ9nNr2DS)hqkTbm&-{}bdeW(rA#(Z3R@}i zLh3q^#&Vg)2Y6e3Krx4?w`E)hWE4MOO_%zyKu!@zmqeDqx*xSUy18f~Hlm+GYCZZ1 zQNyY4OIjI5OM~d*EV;p8@zTE{o?9}W{S?nt3M`~v5YJA_XJNF8iX!MM?dB>jblMzy z0k~#LMb?9vk;HpOmY=RWn zDawON`75EG64^XTKOyR`_~9HhlUcbg>xSy&xLe}6+Elz-U%s1&chyN0SXv!NKSkBI z@Pm9~b22qm)?m9i%B?Z3EM-S9xVn1mQ^#VwN$pCQLTWqu2~nN+VG8+3n;^ zeAb0l?~$Z0$_k;P^u;rY=UXDjNixT7?S02kOhr?fyjL{ z!9nDvY>EFW6N`r|blO~^;Jq5kOCK9FG?PM0Dv`#}2?)(zZ)@`U^ww+)^wtrKlstf| zw~<}-n#g*l%=%}N%~i_ipY+NR@ydSr${xI;mIrmvSFU zxrS1}m~vae=lXO5pZYoS8KmQLZ4~$f6Q5;(t79qOY52o_I+5;%(On^Ez7O5?#~-HH zTZ;H8c|o$~N1ddZ^(5*44*TMnS~XcV6h=r$Efg|c_R`OB_G%b2l0cy)m6FELml2x1 zxIIBWahIU%Rj!Qe9h!#htrAACSQ`aWM&qy!m5TOl-iF}#&UpB9Pw+V(cYP@J-`EN5+0{mbFz*7NdWtEW1xmdzWyIU%#XWfuK}+&UwmYQeiW^-;gVRW$r1IBPLmn$4GT zdJD#@uB4H$n`Fj9dkSd?hauy;6nb)$o=ENeOwTsavvKr{rt?`dA4py8lot==MLlRw zCoj)Q;AlWwsSP3wep0IS0Qt~{h?s-Flfj3L+HQjwSc+OXeVbwo4?~Q9zHg9B1w240 z%P@u(qR<-3Vq@s76A103d}a(ifza#~R`R}2VV@3%Y`=$DD6bmfb8>_qy61y;C-`83 zmjzsnAnD?37~w%H(jAsd2@m=>-C=B82q;mCn7<<-%XLSMedvZc>d3qTD|@$1!BCxx zc+{;_8gbAPQlmdOnhzsu_>&o%**UX&W-s+@K7@E(xQe~!U>o#8#mpL+5t;Qfo2vLK z34)*pi|EfX`m>5&31@}U2TOc0P!{Mp^5U?(cnt5rTBxB&y=$G}bUrS0q4t9fD%U&) zRX>l1Q0g&bXn6`Psq8R@7L*Yc4MIfU;bEps@{lpflYfaMu^n1+D7BfM`G?iUz06=l zqpkpNrLQsm1!k0T*N57Rhw4~D)uDt72ul|RP6sis!@Fd0YFA@Btg99&v6z8(GV3Xq zCnH*DJySoXQVZ`P%LnmHC%ZBdoyzrs=-t(!-d&8~#t!d5GQJVTozoLF6R z8#4HOj_`px_|+u9>60d9sS$qX7)x!IG4vEdHBL0rs*_qN5h+V;CPn%qYD48Uz)2t| zh8S4AXPSJ2YpvX!5AzCS>>&LWf z^-HOR-^q(EqR1BbBI_d~!-xnr3!y*zB{CC^mOI$2&1+Dz`l)=jTT`if{U+3j>XQi9 z+0~|_kXu(J{#}DI=2PexrJXT!8im$S8W=-IQ)nlpqA|2TLbJDqnYVn_Pyy%asrAr{ zRL-~z1ghr<@1cXA#$j{nO-Nq(+6(8Bec=yg`o1yrR|+kuj5LOBKxpuLoff1(EiFagt8@T-k=P{@)L$tbh_V$SF_jAof|$KjUI}e zPXSVCW=ttPNBC+TyeYvu5IhKQbrH-@-K5zjl@Sl#RX^7Syh8zV>9sWaGmZWP!_SLy zDUA3YOB8Lo2sxJVjl5Vb3(-1 z1wHskd!QYJ^5GFSp!yRHDjbE-?8Uekk;#Vq^O*EjqrpkJJ3**M-6gwn^HE^AeORM>yRA9@Kp#w*-;>{t*MJnP`>KfrADAF2ASz~A~kyL(TXiSbtjnyTUkCG}wN$pHGFfB}x zc2brYLvR14@z)H#D&A7bkt#0Zi+k}Ryg-sMbd`i#Mo<5~>dSs2rjXS%inJc!YAw=0 zb^OtcXERG3o}Mk@)XyNsblB;3NZxsK^h z%zdhVz<88*0oObMc^KtKda?;mbd=T{G79ek?$w!ujxnK!5_&wI=%egTfrCwftthaY zF`bSSFBD@_ZloHr+5itSTPS}SLo3qj-_q;bjSn89*E=Z-jiEPw&B=tTUGeGg$AOf8 zlsILm5x(397p|BF(7B1FUS>E~1PKHmNAL(Ee3%bTep^=&%olK$ejS20C-}AT1_?Y5 zILz{xF|>S+k#^BVdK3#6)Qhk(WtI_s>L3I-o&=a?e6Wiiuw(}sA1uNH(CA_e{S=|u zJBPiOe3I=r0e zp^P_%W>9EJWsos+F+#J?=-G?Dj1HuvMp07XMtGu#w6rnw)f^+8qKmW?MOuv_J%Z+< zu5gy6NNXrtjG_5OQr{axukO!@e`Q@#3;H9e^_byQ1{>i^0LN^`OUBTd6k0=xG=@%~ z(2`0`W9ZNv34HapPk=Ruz<%ny{XGVu)Z*60yNc42@VfBkODfHbq3OP)O#WhZCTErXMN>+u10@v% zxIU|u>B;kWqRUi-Na?rHhO9p2OUdL~+KH6dwH(62CiOfjoN(U&kq%zzXx(=aQ?o5ijqWTm$j8d6|RFwKg z_$ZN71!HJGkyIgLXa`?XCQYV`q*#*$DXFrQ)Sh=Jt6Sw@PjQjdN@M8#J)EmK#?W&J zr5QQwt!zr_NnKL2v8h#TdKQj7E<{4Ot^BK?VKWCeN(aQJGtG}gDvgYxV-cFYWh_HP zvQ#%jDryWxdjIWwHsv<{=wg0>Vs56KG=^58&>G5aV`x#qV!1K&pPzGLQA@{S85Z`b zJFvV;8D@m91srDax-smO^VN?;1mYq0mlBvN3cuLbF%n#dE&ACgFHFH5~(+ zio*zhD@XW`I(R*Tw<7qhk!05BztzVbUqsS!GrK6ik1*ur8Q`GCt;Wz$3N5MpU<|#sE2kV*5fq8I^8M?`A$`cL z3^Br&0**+#8AE5~80r2qKHGSSA{{`HK4FBv2Dq9|ZBU!>K@>e$Ko8DiXiTTQXNg8v zWxp}B6orma)*3@?6k0?1+8BCaCqg?Z?;AsZMQ9HC*Jb2AEDTm>W6WD=Z-h_J5x(oR zPY&$}9!KzEMtE1^)J(ZI%#hb+6k0<$YYeSHp(T}HjG-lSB;eE$*!vm?oIu}GnPP+= z%E&4E1pw!fsxNq)<+%C*HO)F0;U596o+EYDH$E6e4+;^Yobf>)dhkDbkk9y_4IX6n zRIa2LMB$*<*-#D}A3RMD*ibeYALOM6Xa=JE8y{TQkyBQmIptH;S3Mx96&M3o`WoR2 za)cj0>4V1;d^o|Y8sUR-gwNK&s}Q_C!Ifl#9Kv&i$LZkbUj_VbFyP-A;g_~UC{0M} zQ;ZJ|(Svg&t>MN8>*xV1@HOLuFX;g*Fv|GgT|9sSYa2t8>GgCUh2P3V6{vU8TJVJ1tx6&wu$u(vh%z2wT#G z?M7HlZIeYjbOed01?h|mC5_@qUH>hG+SAG*5)8jAq9>(TWBSh_r zI)SZdTVve@CNwu;pYS8fw`i+l7Ia^o(HX6Z zR)y(AXXML^ADYl9f>sLsF8hO&v8_(`$k%#ojdtO%+vCb?gi$B+$nRvQJCK^9G}%Z- zdRy6sFy+s|`D{~|?@M6Zp6T9-c4ciWNA@|3qDyq+H5j^kzFD?cXE#V`&)!LUH6>n2a^96?Yb4?t`*}R9f|{*L+ul( z_N4=aJs~R!+iWlPF1gAXv?c3Qk8Uz8O`zzPe>e?VH*;k zJlvU)HxDJ?DV(PT?HAkz`vtcsT7!ZzT9hF$X1c?0U5&2Q0*G=|%8?Sj=x{r1z)NM}ZmX^pPK3My{u{HqsyEGBVASdV^Bm4BLP{ z&WtFkSdbv5*E6CP(RGaLA0B@Y>&V4GXXaOWNuBO(`Fb`d|^KhhD%232WHbz2O@fh0}AJ6-b(u;^? zR7mA9uD8p?xRS!~Tg^Fc8!4xIR@s}keiOo>lQPKs_2g?j2;JmxJ?6r0R$ zDiTA&(e5bx-Y#H(qqEP8=9U*@%awhB#M~#-O?|SgKEP zqauBZtBEK`aTJwQ99^rVml)Rx=jIc^5eGJehxZ<|aZr3*V&-F0oT*!iIveaut`?p8 zPN~rRDVJm2g-S)ai$z9Ui*iTjjf}wl8UlQb+-VKptK9<31K%_P&BI-L}P;z`? zL{`Ls%wqO(EfJWt#hIFcDDNb{fGC@UhNk?DD4Rq#h)6jd?b?IqF%3@HQ#U|qv94`S z96%rK4ld<%rDHGetXOw)sZf=454)iNN(U&sseX!3eIDX^ZS0khn4I~fukhH*q4aTn z>}hX9rdpmdv(3|?$fZFl>KNE1X&Y0gI1!5k6%7;X{#!oVj;K|6(Sq0%;~Kn^+nb(I zW1XJmWZ7_ovz?yURmu;iY&arstT@bitg?3vMVAlJZKOX+D57B_dnc6gkwM# zsQ4|W+zJWaQs%~?_+130sEDI5k6sC68aPpi8?-Z>^t4S?2*I{^fWgBofI9!N3rHt3pJ^wmHjkz>^jxLey zegS~bb}2{ny_?l`uO2tpZgFHRlFe4wZj9tRH-v0=+aqlk#){sZM6Cu24oq{1a9PrJ z={49I+b&;cL#?Zk+VGV`4H4S-kFxlHCd&K>+tDmIF~imy{)|c#y(CK%T_e>XH@mD! zQLD3)LME2N=}K@RB;{8ziE)3;9t(3CY40N;s@JP}3rKt?Dj*psAezQ#AH?+6ps{_y zlow%x@X34z?8W_3V`PJ)qzxWvq}d?324yb3w9{;`-wGnh4KO+`1&yy(_%1eT6&hlj z&=A8HvH5U|LwZnm(`hPVwc1!bMuErI{amBbHz79lxx4UYxiMo0xUx&5MPzIiIaJ>G z_{J-c%Sz{t7J*z+l6ycP8>vuAfoLu`#&tnCvQG+SuqKqj*_v?;EDqEuu+4I#8UG(~ zUjiRRk^MiDi-14}1Pq7}6fvj>Q4u1b8Az}PCV&dwAXg$N5Fj%gA~HBLnz0>?2g!cJt1BKr0D%c$5>O$aB6tES^f)f3LI5TI?|aof(>*z0(f$4Tkm;_f_g=kv_3G8D zvwa}L{QiVCdnRg3Vo`_dSgpYwGz|8aI$~XiH7#Qu=J$GZ_$drL4Sc=#KJi7?gn!ik zY|+gD_^QZ?n*x*Inn@~5FuDrUd#;kNn_(xN(~c;a1)n_?PLM&#((Zyx?*q+9x27ps z5i%5Jfs~B8G%|E`&BB-1UT5I@{{ zmbLVwZrZGg2p{*hR9eOtOq@&EP?|0udXKh5=QR%HEi(S3d%dHgI-q_&oJ2(qpX(w` z*Y>Nw-T_f%fp$hv!wa_)&NKQrmfBD1P2gckd{IsrL?zqOQogiP?R z737q9xiQcgf$-EwS_%cnM9OTX;BXF#>sk-qt`S(9qXG+89qjl-v5$r7oBb@Ucwj~QUSuL%-U-9RNCXb%fN6aPT8l{ zegsKeBf!+d6lfCe$_2;d6?Oh<0VasTX+%Ja7()?~AtDzMG}t||2?N^ZcPCkHK3rQn z^N9KHb}jr4(muw!(O-%kA69Xpd3-ocA0Or?^B2Bh7oqcCz@JN$yf0C}^IH?i_d4Fn z3iApJc@S4PxnP<$i1XGUMT{6npmc0BH(?}&c4NbM#ir!O+x)}umlS$70@+Q6ECD2Z z)tTe&fvqfbl10$RmK}RXhbX;)S>M<)Jf&<(!Gv*!0o#ztFRhSx(@TH8HW)8oBr z=B-H=-BPV;^^27=FsBsPteA06KL#4f-{WW9Dd>Z2X0Bh;M$6@-@vDV zFXgP0l@ZCZ=R~4Id~nk_4}o~eM}s?Au}I5P79K9lvsk2MS#h3&&itm;u9=_^H>(+b z?nuI2Xp52jG zi0m3NTuGkJRVm0W!EY$?AhJm8~=hwku1)d7Sk;!J%G4Z7bPMU5T=BYh6~apH&k*AyU%ekV`sck-VZxkA&QPpdFDr1`6uSfIdTk@5k=BI;CieQose~njwYI28}c?qi7d5=PaqnS&Wfl zZJhM*Iw~&tDQX8~%vNI?x)QiFbD>=Kp~Or|cr{}DS;=HH-zE)1%yjaeFGhz=gUe4V zsJ)wtdQ`RFjG{gdx>`{K^Gh&d*Ib*ofKk`A(Nt`aP_bO};HT8zu`{ktfm8oQ1S*8drKEkLVJQJt zR)s&qcD9~kXAJ4={w?*ZD1BD$MmkA7zicI$dG+MwJed!lliIf!Ln3D=K7Au}KD8Q6 z5!IAmPu9BUmnBJF>LJK~0}!T<$YI4)QWV(@^Cj&2d~|pQ8SpJm>KyFpBRbBel!5w} ze}Y(`_xHmzw#aC!6B}i#_vJm%J5m|QM60uZ(HYD6LyUcgEp!IPEP}B`c8xL8Gxej( z8j+WnK;%*t9?^N)hY`lv3u~yErzx+ouvWdG@x+F=4|uW%W~FIWQExq}dk*UiJ@$tf zTKS1dNMF6m41IvZt6U*yAr|$uOTmz*qE}-K(TvEj2v1l1A)aVIpwP^Be{H=Zy=^z9|B7o z1&VRr@u89N<9_vL1j1QjjK>Y?D~b@KKN#2U5q>*C`?^+>aoCq+*G2e%`x`3hvgyD^1d^LZuI_?$JFbxMeVl`P#^*^`>G=y%<5^lxgE*d}FKzNDzK#jpF z2+R{frTSO5{T*1hsIws{L6BoVpx7*RoH_P2ioH}FYK|?Y*fwf!bL{# z`6X%@d|CLm%*S=$gNB3j^)mH$^e}1-e(H?(czrgDmH`8a=qdfWer@7-(&@KsWInth*qH!9efxI`S9@ z{m6IfkZeSIHe~VIFu)G~18Km*r2HqFxoM1egPTUvR~c!SXu01HLoJU5V3j`?BnSLW zz&`Ka{6@Q2{j%m(J6|1{G{4~R}>C#(dFgPeXVGo#yMAGV7aqv!os6@g%%6t zg!7NuaQM{~nm+7oC#Gto<=I^m@@@XX2{r}%VU_uDQGpA=x2V7wI?iF>hzcZ4Fje3y zU88ygZDBpaNHd~G^d72Ap*%N>rLaj5C?WwFUGg^!h<+>680~~i^#M^mOa8R}C3(+> zAAtc8jfK_&F|q(A`Do3Ddmfs3xH1R5;XEn@>u7f>B1uwxT+gj%q=;0_v<{V(Y-lb= za0Q3nT-q@6gHnlr-dyNCv`f-6xEUEh2W1jYU^VU6S&4;ui@LOnQ3tPL*@=2>OT-i( zfkFps=n>UH3+W)fo~^Op3Pl6;#n+K@$M^HCBr&VEny6pIEDP#fGm4m9QUbS`HJrMb zP$^1qrd4$Na;=J1LKLU1qNd=@IA)#E*J`XMx@{yqT&u=e`HAm%dl@3cWEQWCkjm^u$A~o~F^eGi9!7G6mD+(|MgA{X8Kkqa z2-0puDuR_lI8a7b?liM<2a+SKIEj_jplbJj+~BquD8#rynzzrQv3G{9i9y#AJbBd* zBeqg>VI}1H@}vlMvh36S{U=F%#b^z48aXstqfwiVScI^f5Y3w#+-h~X$6tE&onfm;Wa6X`Q*sH?t^{hGOYivp0?qm#UvB&cq z1bIHU>qgr~PL{E4^yt`_I!4;Y;2-p=PlQ)3wlWtxCayMcuVq7h=z|WNDb0rGjUerL=2|ReCL0I+H5hvrFg3dY0S-SLs#iVY3Ev z_s!F&Qk-z9V~{$$eP#w}3e$`jqyXp{4N~R5HG`B6HLN=YUDqJNHd@ptb*wJH61z9Z zlh-X0!JyA;boa(**e*wgQu5M=i`XI^dJ1LrQ^<27PI`o=w*$S8Tuqg+x-Xe_?tb1l z4=SP$#}Z#}A2sbX4uWYXP?+{CvuT$_Fg;X=98Tj8+^F|=+(0rZ!_)f%H+`qqe+CTB z*))*g3R45wjaeu(kjpZS4dl&sjWN^vd8^hys1DS%-|8%3*nL(k^)RzEOt4gYrLlpu z2TNztK+3<-xtV^J+`L?-H<0n@>DcCdPz|Ev zXTxj}yh!>{UjrHLu|sTE&v1w7bR8=Vs(@8{8vW5Uf-|xVN+WB%jqrOtz4j99l`}XK zTc04-s11lw<~e#M!$_Pf3iGDqO`v@Nw0k+Hgy4`tDc+aRyJ44;HkK^ z&e=u*FQo~4vF4f=5$@-`A>2+Vfuo-hjed@~dL*JKdy75oNaTZsO%0{%$>|E1GN|4o9w)(oF7 z;KvF0Atv|-2%c}HjPi4hfX@){<4y1mg8vdt#8BQO0dE!XKNTAJ=}7QznBliCWBF{I z&GLye(f|1xz~66%e@(#uO~5~DqW=NG4>7~f67Vww{NGLRj}d$aGyGryZxir$nBeas z_@7`%4CQSn;9Cj!OHJ^X6FklC8{qdYP&-x2Wdn&3Ys z_&dz-4-5E(0{$Tr{0jt+&cMjeEdu^V0e_PTehR^#pnfc>58VWO7Xg2v3BEtUZvs5` zGU9Z_)Si*G$W!WAW8h{4_!O;xW{>CkD8OFzN(90WYCYCo^&$!uXu(rz8w!p!p?{<}^Yy^$Ys!8YKI`L?87nOup$+ zzj_hXRejzNwTGfwsgD?L)4WNHCg?_5JhK3QK}7wsOA(kNPWi;b=+ev zRUbp{t1-DEE&*I%z^IJDNHkz5z`*q>BMjh+0S-0>7@~X>)k?k85H&M~=#rPBLbwJ* zY320m7qN2sYX*J};wRzz+S;W*h`+6PAA`Sp5RUt?wzi@3vdOGV=JT@oI4}F#InpC^ z{uDzmEV2HCp*YUVmKe{=zK2w?#Cj8PMn^-3b&M>r78=%!Cex(0w#1r44X3^(R@zWo zR*;{M%EY{x*oiGp(RL&TvHMu^DKteB=)In&&sP`I zIul|nYOZOI@Y~GDAdII5rL-nS6d!?Nasj8%jq6M$BACui4Xdy@mfrW|!LP^B*f`JO zf_yr{`!aMe^b0kkvRRY!W>3f2N*aEG(y4% z2Ll{Jjm&_wcns@Ay0oye&C((o`U)Gp^Vc=yvU~ChXcM^84w1<#`4!vK?U0U4r+05< z<|fR{o0vDvIavVl>$oX}I*^YoY)jk1`Id1m=OoEj1@eOXe^LcY2&yw)(75lw-0L*3 zMX`w}3+2J%RDD%_hM^D_6Z5EYBBd9C-b1hAr)+B8#K}~#+Ogwt#5itm)K1SF`>U4o zzz(E~6@bb~uocl-El{vldtKSYyjdE7<)ac79-e@DA{tZ+w3}rqC;*X#zq-A)w#?h# z|4FnXN0(3D2e-krwrtw|PVK}v)`8YJFQE;+v$}|Jk6oFSVpncSg+(n@yS-(_NWT<{ zxg6c1I3sYmUX)4T0&@sys6FibhbBbp{_`f$y6>ckjXF|YZ1f(QhK|6t)XJ6Q?F)6V zD}zPW*mW;?t%$*l8@Akc#2fb8=a;WbmX>c@cp|?5Vc$_S4BmVnd_MFG-tFc45{3p6 zuEV+0z<|sPF$nPoXx#++_h~hyp7X-?%r7Kw7_9Jl;RILMu3X)2;dK+o&AiX`o$Tki zJ+ZBuPrwUpqMJnH6$e)LS&N8-E)IGR-Ho3dyBhX?2)9syy2OSPa$3%2IU_%po#K>y zPa~NfN7{CWaR}}9GAgiXnY&BMthmy4x$%e48T>$`04~@k3 z#mIuW3`S$iY*;XV@j0!`$J$0$sp}LNi{iXsz8`Wmu2L^eH7%Hbj^s#TH(!LpUe1!# zmTl@`1;t<0l?VK#Vqftq@M$n6D1*3Z(HVPEbFsl5r_E`rFl>spO8r3<4YEry&;A5@ zu*e{S5w*!39alTFE{+g@0+y?Z5p2)`LH;PL+UXSdm#ii=?^SEC8WCVa97NMIp z%2@BI@l=Tb=Kl7A2z%ZB1ojsE-NatW{mkCn^ELK(L~Vq4d0Rj@+!ft77dEmM4bFIG znCv^9HTuUhG?!Q!kAwV6aF7~XA@YKn18>rn+*0*O2@1`F5OLOM5=f{mLEO0fB!eFJ zv|~~GY)DLJjf%)R>Gp))g>%$e$9jx(W<}mq*OYP2ys5%Df_pHISfqJxG7>;9!+Vh5 z#i%HjRk=P^C(I#MNlE!feer3H)uoU-Se3CwZA!t+n_qIGP`S&NqJMz8RZla z5+uV`P`n>d$LQ!GM#sjhN}S;$D^F*!9Y_^&ovO)oYD04U>&x}Xb=hoUmTb7V=H%d0 z8nekdvw0J93#cct`?I?y(nTuVndB1h#4@4kEQ|MJ>c4a%IYySLhoH@>e?h8X*`=}U zYKUd^r3lNC_aEr(^f6!UEa=+Ph|pak@=NeFYFf7N!<<#-lz}fD99v~e)!*hr|AkuN zs3p--mh!ALOp5yUxfIsz84lwsxoG2b0|)lr`g36?bFn!mw?y{T!0~y8v9Xy|!DSA1O@$klP|t@njk-xlP^hitgSm7Cl+JQ`GkPzBRGO^79kmJhG^H3Lga2dop(G z6dzs92A5-r+2ttHU5-a_dRg4#V#lQ-$UIdYm`8H0v>mO)PU79%ynBx%!hzL0fVPr* z(9x7{AW^1xkv(;w4}775c!#H|=iVH-8a(O^w zeK!nu-Te@C>QW5V7V20(0SiMlnvJNm(By=!W;77fdm?_XU(MG1r5+x4&LAEMOXPO0 zp4))f+(_HBoLJlF9UNG*i>AKbK-+WFm*YLi5px~F42px#$|7L}bKk}(gXJj7TJ3TL z&GC#}t^k9}mn*ErGYvKcM%EGvA0+#c;|5-dzNpB4t8g~;`;s*8RRNH=uL=emMjQU8 z;(}wlD47lM(iDCKQu!fv^3^+JfzSL%dop^Jn^4G)4LncjNE zu|{2Rq_K*NjKZ#2r3;34cKtz(TD-_4m=#mG%HrD^HOhOqF~)j7`l|*E6M}D6tkl_q zo&Ccab^I9>(EPZo*2(L4`|JojsPx*E&# zz>|?Yap0*2+9G&UlaO!dc|_RWkK+--=k_>Dc2OSh)*^+8v;k>*gC%-0Nu^u5$!dlEAto7ON9s@i9n~EY<^r)wvGVRRZe@fz>${ zYcOGjpz1uSDt0~0ZW-D2uvfh|8aSnnMj*6Gho%GALn-EUJ!TENS$%YrHEfB}^&rjQ zpN~NJ0g)L4H=~IAL7~GPG&((qic1TnqWhXD{;NKnnf^Krm@E~wx@-}(^k8wlST#!*`U*YX$2!b8J@wTruI z`NVjrh7iXCbqr7khi?lH6tvZJH_GbZz%liF3S5SB>|Kd4-OGz7tfCAHq!yn9122lW zkl&oWKxzwSQ^bAvPnwaoPXJe!s`JdTL5gjo=9y#PK&+8h^}#5w z(|Ec@_^s;*d!~Ac8G8!FW~r^rvA0m{rRvF6rUGVBY#a4QbL^#vHReCbkpKSURAJw# z&&Yu~LPy_2#VCVla)hhO&8Sh)$}h_2L>ldje)9pb7)*Diw;s=n!RlhfsqduF>GN#E zed4%H-1BpqtaQd{{;KeK`g)wb{D;I`D=x#usbxVx_J6B(`#WeU^Q&ON!`UXCOCX|$kB_n@zjN-*~P`)vtST3krGf+*pi zTlOz?<5HyxUlD$-SXxYD|22?|N4`{$_{J&Rh#)QSO-Hy)2+Nm+_a*Uu-$XnseCMHI z#aH;+(F6EJh{S^iPk1aAAu%x-C>5by;!z?VJbUO52){XC5qJkhT8((9;!!LfRpL=5 z9zi_biT4NY(w?&RbZF1pwC7muIYN7m#1pdyJjrhN|Bm^C>Bt)Mxnue95#|_r@f%H0 zy5NG3E^+vAQ<^xs4p$QM#`?W-n1K)z4YcD^;e~FX&!M6yyjqG-mI&QO55MNrtWM+m zQn&`x;Ai9zQ4D5e@4tuwT{z&Ii-1F6sNBGVsrK5z>2$k4)gR0hVW5|yS@#!jkF($- z3y6qwU~Lso$veCUpcG#(1Y}R}cT8?e(j#7;@NLloDk@J%SSVYoYIk8{N?h*=uwU2} zF(l4&XnKCra>;iGL6$|dCDTWhC;2SBX+VXK4k-8tL1vZY8Qz^D&Xbm19VdHET`N7Z zt}hVRTDnh9M$f3gf-+c^f6)7WAd=)vRZdZ)7Y3dtw=wnpu~D*U*?v47|x$aabmrlQ+TT z95-IhsIn_VlH`@+#!tx`G0r(j&e$qL5Z-;r-L3#~+>|K=v-2iqM<6F=7fc;Dd0L?k zN#BrV$O#40@+Z%nYKuTlwc+ORf(WGVcXZe$;TExQFTc(tT!;THH^qCd>=h&9Cjl5M z;||z0Wh&xtJyE4f9Ck(&7G_l0lp*me>DtMRtyHQ4l!_9k&n(E-5^sIwY{;H6yw0A zsB(A{P>={hjv2uS=%XWK?$vCxaI40(G2Hfu)uJ(gh!yenHZdYTmX3%r$Z*zV2*{op zCwZ$_JmaQKD{x}(<<)L6d_7lBt6q)t#a{JcsTfroKlVaAQENL{jo7MTR}qTEd)2%3P%QZjF!Om3k%Iybn%HHF)gu z7+z=ht1H7n9b$Mb2bOK&wf7blOq0BeiM@r_=DVigDwsCJ(ZXxT&Ag{j@@+%kYZ4fB zl#)-5Rp4hXi(z7IJ!-T#mWeTp1vPRN=FPO-lQ#`&L}J6$tB0Iy{%!(iY}BTXn={Vin?y-XE!&u;w z%skBdFmQ>EEM8_~KWrTK9%vm|w$3Z;)ttEl=T476a%fz{WO(;sNllc>0i!L2`5*|@Gd=wgt!8c+TNf8c{ z_?iUL*qIW02r;Jtw^h5Nfj*+4UBCj5%+L1WbSUCt zRdH5Ld~~EQRNOa1S_a<3-G7bc$kJ`>HJ$lKHa@2iLAWGIJ;hK?u7PkXFvNh_pDGSE%(~ms-x^KOnR}&}$o|MT|+l%dk=(vch8%g?k0& zPFDp@T5~@pY2~gk>lReV>JLyygvp2UklUhDaMz{K2NddHV+Nz|RZvi9WE`0%xG^9W zy0EEE$azT}R`!2Xf5pL}VMaj9%Jp?9v^QC&Q-QIKUL<3EQSYH^_afLxO}i-?zL2in zrGKEJ8uYZz*vm537cnOJ=3$XM^f!0`qP`~96%rlfq_S`mH4vzhyiOX%z!9V(`WK~> z0ED^gh1bvya*wzd8B12Qo?c-wVQ6YGev8P4lvxl8;#DT!P|z%{PjdfbuhdXno=KH_ zL>9NO&WnWVbY+3}uFr6~UNlQ%DYFYMHEHr==(o*6aUVQ+H-=x3;r6+B1MVV%VPf ziR8QYClqj9tkao{WXbn$l-A_ZW~9cr7rn`t#Y{RbppL=lgr7VQ5z(fT$*1-t-+RzK z6ZL=6p$p@b=416x=OcSY>N9|4qOLOU6QP49>Q-=JqCS``O$_fVV_p1@K;6B1EJ(r; z-H1NaMDu+fh8ZSdX?iG@=FnIt{6S!uI6lZ6ACIN(kClf+tu=<@dt+V2n@Jwr3>VjJ z+|8?ySbyVwj_~|Gs(Cc-6g)JoP371BkAuZf#Xc~@MY`Wmq^L&u#W_&TvLwTRVG#!g zjK0;&j;8v5)$j~{m^e;gY;>;{Lz4E)k0sx)d(r5op08Kby#{-!6=KkbqN^(6@J}*Pl>0kUEX8)!_7qv5>-^t;0$1(A}8K5rw?UP)M!9Qr6e!-M~r05*rF9 zTqXRrsfy=!`fXWt1dEOA@Bd#8#OgE?$-4)q-9yhs29~GDrPL}>FJBN*VhE8%RjDZ? zt+V}qoyv+#!FHx1ETPVh_3*te(IOZd8L!l8WxA^(QYMZTWx6fe$Z#N!ipPtYx_k7$ zo|`i&A8{r5a081w9nEvyhRI&KA=)(Nc!)SL*^RLY*-)rfr@Hor`z-N~?wcxna$ND6Av1 zIyZ2CtzF8-F;uSQmkEJFveFEVvKrsSz71aqCJUCE`5B=1Ig}TdaOhKn zzLS*~7c=gsDBO3_vH)$)a37Dy{TFz(kLO0noY@S29# zG69f|SGRcWMX>^)FJ4JI0GowZ>gn(* z#(ua+g!+n5u?W!!0+5SEs79ofh>&nn9xfFj>K6dHM1)9x5GvzP&Jw%^MFROv2w~(x zS(8Q~RL!BBQoQca5(KqfB1AfdG*y6=;Ps$LpovL@YD8#<0HdvA=$IEHA(>x&G&_$F zt)=Js|D7t*ixHD1(rFNgP`U__5+c+~fED4juSi%dz_Jj^^}i;IbT`sRh;-`k5xR}j zUm7bS=ZGTGCQKBVOc_9?BV_l#G)F{c2@tmk6$>gw2<7@8E)|iJ1jrH*B7YiG$`G>q z9}j9Eg6%31B0mct)d1w>n3bC-D~%63jLCRg5i6q$+V1rH=<2_&T z246;o1WkjY@d3z-9DxbR;bz5l&j#eT*?BJRr|F6e>3*87Y69i>1KphB`zz2xFEPzg z!B8O>z!59j@CauYn<1CdD{(X7(?m9NLnNU94rqiaF&|extCfHKIhMWySm{=$MCKOkMJjI9$MeAkV zLA2?<(bKcOSfkxOLYrbj-^Mj0mV;YCyW!-ml+5SwPFo{EE$f$nB5H(U#Mzm8i{&EP zbhPI5#VXTi4~)>Jm{5~5Lf)YvCq|GdCbS9Kbo!i2G~}vky;Kwv3IMr&J$o5|oLnz$ zs`vQ>VLzkXi?!T`L~^H?5Kh#e0qfLbQhqHW$P~l(WY*964_m+(77ZIH*@u+;9+K-V znMuW|OQWox0*cTDiV5Fwdd!0w=4}y7iV3IHi%D7Z6o3x@$?ygB7psLv3b!;n{P-?; zr3GpOt4F{1=hoZ_>}`Ia6}A-N+?}#|5;9c>=HkSF@+x)dSbtf9QBx`3D}oC}_!bc* z7q^Lw0zNw@aF4jJS)JW8m1T1!^gWXhw$iCl-6w1{Rn3NoD8{NH?4}1L~ z?Dfaa-geJ?>L2XNeB97^X1s;h;d}$S1~+oiWD_l4t23hk#ugL0Q9jfMt6PVjk$ix^ zMBqbG9Dvzipkx;iaH_*!sh%8yKDI6(n>5SlhECn)<@$ftnr`T_2J1}swv?xf9(6PDSWFqq!&Zmn)b@(Dm z299+MnR85JiVS3|L?#d+v-Hy_nU;0PY#3>jjmKpYx1X_!I+~ zAK_<(W<0>+KE25(n-K;w8#jZ@s0f)&IB2Ac7{lV2ntIGc zrm2C<-ZZPQ?Lng;WX5Euf+4LhamA?qR5o0q^L#$RNPo69(^)glKf$|1+ zw?^%LLnvfp31tzXj6HZJC_6Ni@q}{QVc3#7ToJ`Vl$-&+>rd`V$*s?*Sk$Kw#Y5|W zGW(2pq&|vJ))2~%*xy+{6E9P8;7CKsZc3hp1wTu6-h^hwps^GS^4QjM*A( z6?GfeEEAa{k4MQ&Au=_ZZUz!N8pzbOUp-A^-ZYT8n8>^nA=7qql$*M?T^(jDRGxv% zxA4b8_eRKkX0Ts%`@O%J$aFH0d5*|j6d`kyflOU%dWVV37lEj3Mi7~=HRTB;4lt0Z z+tZwDB2#Q2)0D_8ijcW-LsT|(?bpY-M%ma6WY)nI3=NBr@qQd7Q`ffpOl0B=Wabf> zCJ{2XZi$kqYum3gky-UvR5n)=nIKy7>6;BXXw=fmadAj!VuOwU@0478Mij}pBZ>ut zG8!A8PtOE-k%ZEpP+n~ag&;Z*#NNgrYE}bcLqiazE`Z!iBKjer)QJ1BXvWrH|0(%3 zN`3|u>$fP6P_pZcG9;IpD2^nQ#QzA<1QPGr6s_jE=Hb?%My31g(P%a2R)WmV2$>NZ zqh#uuhZGZ;fPqXBk$EaY=Bq|^cOyQR6!nq@8_2A!0GXi?GUWy`b*;=pCNj1DXrbm1 znS= zrx40otvT1}_)WSs9?wEiA0iVD7V z1IQ@Y&|Sa8jOAOR<@^}F5)e9poN@V1JkT%^G8V0$?j@nC?&zOe&U}#s{6IS##-$fa zbQ*FMK4*qxG8mjpFIqC*)E6i@T2Yz2`IavaO9maawkQ0;OkS&HY;x!Xb{1ie5yXjA zPNo-;Jcp967s({U2hIg+^dc_YajO@JG;*aljb21rk=jJ0k?G(xdeJZH3FC8R;D~%a zPNNr*wpiUF(yH||dJ$U$!Mw1)BMMWmIg&xy2yIv%}7mJG*>kjt@mcpObP+tQWY4x{=`)yTi?drM(=?&U>V`q`)2y`^1>H( z|1Yxtq_|Fp=AAOOsmoAmPYo6bKSJ2%uUKQvx1{+iGlFUs_~Df2kW$Hu-GqZJ5@S)| zZ2vLjWwEThFa>yJWTDh7LCZNAcR~cQDTeOZUXW8lKgIOp#*dGrMNcAvd+LHfr0+*a zv*%)FQ1Z?}9vMM7(4uL_rdVIqzL#Nh<3o{>7aw%w4Lg~YuK$FNQI;F8PO@Yxeet!E zG`nX@9Jo?XAu61rzHLr%;2Lo4t1t^UkT{HUf&p9$FMD>?IJ)n0-DVFAKL`$1y0w3_ z*gItz)^#JNrSpsFhKuGn@m5fsFP+?q>o2y_#eCc4F5B_Ew%r$2xyvy*^9xr`T=kNI zds${}4tJ$5v9!4A{HC~($b#~;u{d+&+I4bfwd)XNNl=esDZqIlz?uWhm>-wl*_O5h zq3nksuY0h&A<*LE4!8sk-(U*;3}N678WO7ZNr{(HexP-=meFj8XNSdR#WoAycoMrm zr#f4Ci-2wAKc?6geqw<@!fnLu(6-eSLe4S(qvCn9NoDts*DHp+$@rWXEOM5R}nIFw#ko1%YMT*o;n$W^*ED0LUgA9#_=R2d0=HJNgJ@}pF}5DQ1Vvnt~& zxgW1X(GC%djnc;zRc#z{Rq$MaIT9$l_Z< z+xh_}$Cc65;Wvps@<9o6u`?wJ+ncaAXiN&`{7L+V_Kj)Gui~3p)V*sHaf@y*(j{Mz zsJo@%RemhI1P1IoL}G1mbpqe5_|0MR4n~!(!CpIy`UEB+a7!JSbV;~!EogCFMD=wI z2ob;g@#JV{DBO&0vm+4aH(2(oQnyhWV4L9?tDm-8Zib4;N~)$JvhOQrmaHVom!eJk zg03w0fNZ?NOxV^?6BA$6_<$&4m1m5+;`}?Wx@zj4=S##FHO{}Y*VJ%d6y;zXih2^m z1@-l^M2mYsZFdlHt+Mfbi{jI6vo#{=6(1r zBl*72hHi6fG zCTMX;Ips389-Zq5w5=F`cIU5LVcGp_;=R`J^o1v`A1GO7b(JR{_I!K(Ah~@1m6JDT zA*%Z(Kue?I!izJFR5+Q;fIw<#T;-c_dlMkd+&uk(HxEN57-3VEX-ndisoH0HAXL zz~=ynrh9%)K|_(2iSH{y2tB$aYxuJNL^eL+5L6Sg{gs}5lC-S9lvVUV+uvmDaJ9K> zq}kudo^_`jf$X-YY%8c8+Pfc@18qH>k}WHE?*rU1lBPQTLv$7O^RHYdD}%vYRw`QO z%=eNk+%iYk?$XLpu7d{2Q6322HO5Y34_)}^P;HP&+Iux%V{O5>1 zElx%8{aa=KVX%J5sbtIO(Ch11_+EereG?r8H0c6tl(xD$OUtB{rFx5daMke1C(@>EoNPBoPt`59hQAi*DKKA69^ z3#OY&9uI(^%J`ODEsl0CM~DT>yRReuI7*#xUNk3M;$X3EM7grNm$Og1-StiA0YqkO z%h)J&&ceuOyR+cFjm>OQak&Y1_B}b?jjr)P%C?rz*s+o}@^JNJY!v1}v@b_yg|jE{ zrQ&r1k#!Tuo5VfPyUlf-y*Ajre5D1Af*GChX{Zg#1^&x-r@@c+ZxZyjp@N!8PpvE8 zgFCC%v5QM;kg-jVZYnR_MA1TzD2?lzvDuz^PFS51K9c9^QgMUTvcy`{gtREhQ_}9#NBhaKN0eV#-*KWe+8&e7w@K^Shk!&_*1a<$EWYSWX=j`QjAiS#oW;oVm&MZO8`{P-rE2_|0F9`f<(>u3ylEFFjI-nwPCXjf|svP@}RVJdkqD zF9u0xANjsuq(UN@OOIRwWU7>Nzya_a*5Hh4lq^n^j3jzPaz>B}uVs$@mgwzkfZkrz zhLK)(K`&m=GucljNS#3{uE(^xI!MdT^PC{*p191FQYPxGT=rLy+|SF&2)a*PW|N)) zM-`6l6%H$gAnW8~Uy>ddW^vnPKipa^b9}~861W?3q*j~ICnE1xA#NMXy29?Swp$On zz6;+h6Iz9Q>|5kxTS1l(g462@M#N!V=e)vpY`0%%lE=vN8&ZcAN?5F zME%kF{Cx}Ma}M%RSG-C7oJ2&-{^%nbku&o5e_Uen=e8r*s6V>+f(ZZ5;5CN-<|h8@ z^GCCeg8!lKg8$?HBL0UH5i|dl`1U3V;f(yzi_QGEJ01T!Fwq3!G~W6QuQB{Pw5-K= ztG@Ao`&aO{y!B>!6wWcjOKfl5Y@CN=c&jr;l}SE{Vs z%>$$|cuN>4@vYf+T$qFbFs{!Yghe>*w(P-(qxr=LyCmuOp6lbH_;U>S9d!JsF_Es} zCu#WCY4|sfz+9s2S&)orPCAdU7xBux%h4p0?;IVPgHW^q^LXr5jCcvhp~$_>f>a?kE~&vC1>ePn#8EJ)DbL;nP}jMJG8Wjg-G zHnA)CCL?Xa1nJspIwwJbpnSd|NU8{N4S47ign0rf3bImwsPE!QQ%OH{HcCtQ<2J|( zvq=u6j{_qqjF}-OQPZ2@cZUa1$e}Dqp^@@sd~PFpUPPSV*b;MoBOAHV`HiEr?=;F^ z4@B$CVy25_)}9$Vrrrp~pl@0DMh_-Gl*IKHqp@t=MePNZetl>k;HYxBV%0n>zk;$C zp2x(l&;r-j6*nYX32rUmqUsQ_*EAn@l+;K`Vp#&2WceUO88abQ1V*CuEhgj$jP>R| zB$60k=@fh4JI}{?eomz;>ruz(Jh1n!05bcJ^IDpRbOh$4@_Coa6gpqiEmyfmwJUdH z#JY3L&{nznCw|aE}x~Mi3KtlNoXjVLn%zLd-hwUhmzsnJNw(q_r~XB z{Ks&<3j39lb2Illy9`&l_M~ch2gSBkByBib?{t@OIhLkDGa|dKApafq7%q z@8BHD%Bo_@A8iqPDf1la@8=Wzh)ZNp{lNM)sC0LRoyeDsV;*O?(ux*w=?tvCdEd<}W1@dy#@ zUjeJW|8H`=qVoeh-`W`(r(#b|q^Il!6wT&ctYMD^cGOly=5N>@lRd$(u8F56z7Ta} z5~#D6rzXMG7j`+t?*9#D21hbJM1HWJcF*rtXKzPfK^j`V`fqr^Q0H(+^q!a~Uyu^M zQ1(>fnr9=$(8bT9`x8A2X7RN33B3YCF7QbPjp)Okw8{<4PNP;b9OQHT$HG79of4H< zCSbBE3)(|Ai{FAVF|23l{WGs$X#IMMFbt_`3q~E3rP=*UWM$B8+Iug&PuJcv(ad_G zx%H*qdSG}GjEJmmMQ%}eXEh?nsvn3*4bh2Zsd;nMeL$WO-F1k1nv{>%xK z@DDJq=~~Y_feCwf)W@BaWJ1|XU2j5=H-8%pbKEs}$j+)E@IO72Y($vY^yl}I*7!FvK-6^I|C z3vruyD7OZl1-AGKFFcGw-`wd<&_dVXyM_a+`zQt@Hx@*Ri^VS zzqW(=(Rmi(_U%Ow^-v02p$e`}2nM6UOU#j|%Mgs356MRg1%VkG?{N`TLJzHV zC6ZVak3pS%yemNQ7*yEDm(VI6gWCGK3q%V&G+MnyltDdxJnO4?3@Yi%6;K8>^xZC^ z#u{kl;oZIljM6_hI5a38!)wZxn|Ta(3IjM)!bD*C-fF{&V<@<{iD-hwprt-8l1uQe zG44Gn6uFd=3q-O(Al?HaIY`MPM6y9R-tR>+x9<#*Y!H<93z1CKp|%#u2BCRB63NNn zUOjRyb8ZlzcdbZHqvX#-vO$>M_e64EN?t0G4TAOlQzUcyepVzKgzWvRNS;L4vymKn zR7AKbA|DY^Av?3{Hs`Laq|LcMuIGH(#UNm4&+SD1rJ${~pfhaG-?V0_1S5zIwdeN% z7}K7yo{BYL3@fjv3D8l-ajENu(+)q|lJheLRKpl8FF*(0MjJBfu6f9YL_Ht|QPDx^ z#l$yUg$wW`KVnp?y5nW`e=vY|_)o&{;dA2~oC)Ocz}-*Iz`h>M-@;n9km#?)*O zQ`V+|4yM3eztHFydw1+uwJAI=d^0&#!w^T|nK{~cM^>I-c*TFlj};8*3D&sQ;TxM+ zX*TfwP&V3Ul%@P)hjIz5pycgCg{!U1mX^PridS`83W;)GeontPyHddmx90|2R!C0r zhEV3A0q-xAjl+Lj_UvvVd4EA9ua_uT$$x}7sNLu~B+^mDS}sx+%8&nUQI<1!lrf}6 z&{JOHT8knL4?Hl{GSu_HZy4L2H#Cs_8!ZiD2L(RCRjIaT#t+D~AA!f;Qb?7RWZU~z zdFyW5S}=*~#FrY{a`Pi3Y!<0he~?&lAgjPODuxUU*}0w!zZOlT@}huLILUJn z1RJ^=KcqO$9;7sVv=)&cMJbm3>(yDvjfUy)i!mGVpRnEBTVlV)QRh&D4&7kHZ$N+g zgrB0$w2rIYOq47%1Dt8PB|StNnEn*~3UvS_^|h8LPhdbRjLFpgFVbKPp{po#1&5;S z>+7}HvsM#7yBh{_y{Ja?4~UheQOL6ZBl&i+(!a^*5PdkaEJeg7TU()=QPn0d5i3iAss#5hV%*CrLVBASd+Q#_*?MCOxe z0UBjbs#AQ}FFXJAYdWX%yD zF`DM_;K-Z*Kz{Fo_4@LA0r3sw$M!dpWdSCwXoOkJ=Ku0}wkOq{$Y4mu;?f5y=_%NL8g%{QSvT-;G`>l^B zwfWu!FfGIJVeTqN_ZoTSzupl4RjDMr!y-L1+rj^~ZK-_0= zz4|b63h%{e5B*weOgM`I@NT{Ph#U5m#djBrd0MNJHcQ6yerVK{>L7yC8uw_@ywF7` znt@;1y$6%i%zv<+Nv$!M(3*w6{6;3Vb~oc3^x6w;ML1?sYmER=m*Gj>?Ea?Oe0+3% z{7;eBEui0ky!sIfMtO04iT1wswq%PX4mS-co)LIEDAy*taDT=s3aHPl#wL226~d~+ zpk(q>BnA*Oh_g6#ReAy}4Yskujm8@RwPPUcepy8^Y%hiYmMsWPHeEzBFt8*sT3 z1u3IL0U$-2W~}{*tPe~dYFrWM&UP<)9|PUz6uTa9H3-+U9&iDoBL%7BpX!qPujhL! zP-deDmmwU}G+q%P>R<6BF@2h3obM(5tdXt9cx8VOToOkh@#P1aV3P?J>cbc3U>DB~ z(z51OTXo2Gv>a|{H^2z~<;+u(w+VuF|6$p`70cT#u_a+nvOO@<8lIV7obBJ_+0z+c zTD!yQ`TlyF`}lXWt_Hn3;>y2IvQbRauMl}~W)C1FAYn+nXHS#zJ*{n=zWe%|raNs- zw}#V^99O<4sp*$C|5i+)24=>W?`dvp`e}}Tr?Cbhhr^EU+hpseoWPC8Y@QQ|(nGW? zZu1;Z!9RDU;`A^A!>Ac|l9N#wQHF$038b$!Pn-<$2%0n#~^#oAq zAOzBTxvoIE1zrKC)09j^I-y+%VHe1@5DmgucG#0Z@<|sWbXHYacg3Uo4Y=GWmV(ISJ|?Wb(+lfn5H zLCClN&Tjz!4GA-Tvw8M5v6b&lf}pdT9tpQX!YN3-Gr#@r`Cc;A0>AEoz`xXUk{+5C zDL=VnwuL8HbhqUAKed&IA-a<+y01udC)>HMBLE?~b)hbddJ>{LN4)iNbwau(x^*Ed zVk4pm9U*_WJGOpolDlt`tyOHm^!*u;`51lwH>ui5IA_kOP2kwAraja)?8t>l#6H(Y z@l|bHyvF;imHCTtn@ov^L9CJwTM%LHa1D`fo8-Nf0@x#s>xGK&0g+OyS}nmnAk#q& z`?ztNeO@tL3nGG5cIaI@ny)%hi;b1L9R5wY}oI~&a&mEUdtwK|9 zbUy?#LA+rPkL06?Q0&%dF5x<)GQ0FjRpH3oOboFO*`^?7BT;aj6K+l+ygK7^{Tm#J z7OXu)yW_&s&>z$2!q=7E&~$f_X9JiX8t9lQXC9F} zFCj2UTGp}Opldt!%?&KDI=7)LRk?n6L&*H`@DuLUbfUrHY>7co_(pgiyq#Q@miZMKv-K91zsa5ow8lMXjeB7C$gXV-V?C<^&2d-f zFpi5={EleJR=yj_yO3OEE8msm*@t#p$r(DIz=k{Qs@uqqh<-%;L418X)xE%GaVBJZ z70!So>j*4>UvPH{cIH&$>&fbcW3Xd$eznyF{{g$gm7HC6r6sqvkFdudvW4G*6<7B2 zZ0-kb7S}Rc#bBG&u5_|1wq{{;?RhHbeX+7P9V5~@B(`QpgMd( z2HvrK-9NY&J1}UN)*2>u6m@_tRB>oQ>kG%{X70tdce`{$MUMZA9Pc)}l(WGRXmhRI z|Djf2xtX67-Z?DLv8O%rBgu0T*rdYgP~l5+15>Te?{d3;kGrsFf2#k%v>gA59B-|2 zA!Qye;_j=Q6Sd8RZ_oU&@J7t0I7kw2 z5LBQ|UpowfM?nBhxua$9wH;eKzmVhSWl*ClSY4qt4y z9(N#!%&}RZaxe{2Vb|#F$y{udu&0zkEtSyvCCDQUA2t)gX2?>F^-*BodX%&k25xNAmZsM;d0hk zKiPU{YG6Qd3LR}}QAk1zB))%;LZgCfE<^t6YsHC{a8CfDJoBr7NC#eRoq z|Lpl0`tS=ZBdNrkt5@N+bIV%#QO6K@9K!PcfDoKhI-p1iyop0Q5l7~~?<(B=Zdpq| z>ZLjk&5LO`lt4HYmL7DFj!I?Y{rMP9%g4U6OEPx$yI!?@K*U#a*6r65_J{WF8yww_ z*fYPLoi!xj?D1-@^%y*1hkuW{8HLHU!jhm`=wuZ&BxMv@BM!t3L1oWOiP02NOx{r| zc2Z-RpU6D<2xOz6dT}Fk_yuurgBkcwk-qPYi}fvnF}0Zh4oJNHPa12J><6~oO0#>j zW4@J&Ub{JCqp`l-{iU85u}NNh^AVec(ec@>uAf45Hck!<$2`{V8oB#%SD_pjjGgD) zo0-mE_J1%5o_s-zU*_?%Ermx%GblbH6?DW>al!XEdAciK`fN9zU*cHi*ZFqo!5#K4 z)p%apZl^W33w)rhuFGUkIgVwP&#DZ=SixSn`#0(79Dw7Mh;-qM0XpH#a_M2-N1eIZ z6`v7Yk1|Cw)XD=b*UGYg{SvETgAA9zbe_T&7keHes*ekQCRd!c9{Z2c{A=cB$@4Uc z#{Ut#mS)OzsvO>oV7FD!3E25z=8eNIIh`8z+nLLH6SxKhCasw2Sw@VGxQu#u!#>RA))cDiN`R0y{9( z(?zkE_$b{aaL)bXjD7;@^HA42l4cE(=@W67)aLRZQxyg8rc1xb|G&diZy#PCZ zs0)ZzCge9XkkIqUAgLfB{m2bcL3Vly1)S+=^q835D_?T1<0HRGM{=YBM^Xv}9!N@~ z$CM;W{wQDisw!XlVk?dZ6hQa0fk8hX<>yd>4JrBX=6zcraeyDj-$|gH0?HShfZ+fo z?7?3c2|pv@b55Yaz>q+~6x}NkSG-hP^myeEg(7tc_kR0EWyiYH-1>AG(7N^ zhuR9(i+Q7O%db`oHs=7F+r|Z zU2^J23t;L{=mt=Y74lF4$b_4}V-1mU%h*WzrT9pl9afb(Q?9ilq@mV)ZakrdoiScX zhZ>d${{!|bo^_DUmE)@tP#&{Rb;#IAdBQIV7G^;eVC&bXcsDvL!dDurUp-gw4YD!P z^Ox)RGtqV63mum&rB(xvq}M@GW9>nQ+UsQA#$Scu4B04yAA+&KK@yx+<^GS<=N_c) zVP|rAcnci2cdE!ugB3WXR{CQ53w=C5^R00HMc=sa6bWZ$CmY|lyYQ3+GmbM;@U&Rb zd%~1qH25uQMUuPk#6SQ}*zC5LS56jqh5fRMuC|8$4lqNfhm|QCU3$Prho6OJWc$&B z*4k;iLk$K>LpaCS zTrgI6uFbu1S9VczYj#n#l_2B7U2N{%fZXUV-`_gRz4;(9mR;nqGDsXi;_X&2G&?0D z7@cQ}?8Y*USNwVw#-WKy?Y*F%loXHmyiTu2D)trlbk@@+4H$-8l zwd`*k9NpmO`I*&aOaY7#+z#s?rGEl^fPe#$`9+E4X%yJA9uB_@Xu?^Dn)1&w?Z(@H zD$L*_(Y(VnwQI}%WftgE_Pp8m9g2YWFZbzfs{tvIr;B~Rs}qn9Tr(h)FPSIctCmzT8oJwW-p~Bl?xH^9Ltn|e5cMrGFzbWEJ@aEpy!|CH?N`y^?WjmB zC^7<(aqi&jP)nuN#B6znH&<~X zCPi|tniL6M#az8Aa!HaUhKnBY44P!fCxl>-2R0%m;=cSzhW{%5+!pF~?H58+TTrDhs zqavzMu(^EnC$Q@s@%hvaiI^=8jgbI`>%(IH(!<&_Q40Ian-Dv(x@Jxp5f)-bhqt6l zc8LRox;das*skZgI6@eg50g}(S++`~Ci1*i6;)=<{PSwd%J;Lb7@kaL8tmYyx? z{z$g79^03zyLSN$9kD&R)(BeRxiK+AIWWkYumN#Qfz)>px5^4YI zJ_&wEuCgK021LVqwLp&x5C_PvW{{bX1gu>xuy%EY@e{RS?bV21!Ai)4!yhIv8E-w_ zl1KMs8R)Iwn9*TF*R_Wn=-NqO1{8~4Lxq3JfHPuXL_LH)u`3TX`!Gm3hHD`Vn6XGD zvXs6^U*tJ~7GK1V>90W)i-@<4xd(2H6LJ<{UMEMq<5Mdm %6XV>J2e>@*%u8uF< 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

v1Pq8Q>>soG?Fh1%E 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

y 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 z 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�~2R()sGy&Uz0xrjX4Nvo4TH< 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

y@C$t$T^^%86?$+w{S9`6i0yWnsuCfDh@zq( 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 diff --git a/vendor/agent-browser/runtimes/linux-arm64/agent-browser b/vendor/agent-browser/runtimes/linux-arm64/agent-browser deleted file mode 100755 index bd71951621a1cf06ff8d0e131172f3b089695ccd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 892664 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%0D7f4F&HRDWwS@maa7#hu5R-1)KA*?m}} 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%0ADZ!<)vrn8D*HHX4yV3s+AWwLX*Y8|dMoXs z-!01YX9h%najajL^Q^GjtvNTvS8lbt!?RN@Jd@%#-~-o_@5M@lDmF

L8T6-hRqxI}B0IJ~&bZ$h`C!G7c&CH+w#3!gcQ0%$2{-(d1~Y#IY{li- z17UPgI4<>XLC#^w+x~`aBDjBb2N&BDVd;(Rm;FC*x-637!Lx{Cjdx6}&_JNl5GLIR zFtO4|KL0@?!iWBeVcq8ZDOF}lyI7~>8N$e5)6rg{n((Al(#E3c>%6Tx) zx*vkL<8t=nS`=|Q%OuxCxcOZPH~*Da%($yVT%P!_@>t(k{S8e z79axe5F5719+OMeTaL*Me^a@~1i9wo{3CPuKT-bOHeXD=^C^6k(Ry><2*=js>_+ED z4QzJu9f3FvelW<9&*D^(N_D0p6^J`7eoHBNhtBBsTb?~NVw3|FLxZC`0E%VK9 zwoPs^Yh%Mc=J&J%+e5Ko&&eQ`$eyhg+56?VP}P<^G47pT#%OZ%C_VNhMkD(mMngod z)cXb48hagr59#)H_kUHys?gM~pMRcM<``l76usC%e7?m${(Q(`=yeWAom_%eSG^Ta z$E~IqCarbOl@;LY@jRFZ z#4<7~Wjv&S>y}K{-Z3t5#Rhp`chlEOu}Rhd+h6-kC(WtuY5(R=>7?_b`pI5gk-b3_ zCT~#P<8L^RMatb=ej5*>G`r3enmSM$dyoJ>Ig5XrW}LP4 zTlyo(`4qabDdr^(=u*{tr@FIa`r;E(-7efr&K{XO9QUS?&DbO4{Y$O{G-5Q3e+fZf zqup@gPnx~Hj{17{!lTWg$2$M0i=`)(DZ8^ONUC+gzLy2D+ zLPb4chdOh?j;dju9A)3=C2EHq*5p~Meh z0fgy|K>=~#(KRKN?9`o91VobK1FIP}F|cg{Ml|>VQh;CnH@_o--;w6mdisG7@171T z`ZoKvVb_gZ$N%TcB3FI+koQtXDD?BM#$K_Vmdr#htJmc)3LDnK#k!yBDnl~55+DdM1ss_f1)xjCWF5mea`WRLxWT7pFjg6 zNB^kkAZub&`wt{xioI(qA(fZl6GEU!E-VW#{_I8j=Fpf`WkL%qzPGURqbS} z4c9NBj3^2+lVGb|OJC|jVCS_XMGO5uiUZSgL^ zAG>#3bZbxwJ$AOgVGM19?cv4Z{W4>y$}m37rr<(Y*Eh3YvGmkG7wiutKdE!LFe-Uv zApXqx!#`^%jTCX$GYf_DHwW1a97uTaE!1kx;7{;*s*TWNURlkkV&kL2nLIYEt!kMuj*W1)?` zuca4+=_6`FR#6OksfaMMC73Ec=NT)OoSt&4e=m(1@^v>48JS6GcQ)z_o_k}%Hrf|^ zqT3j5kV+|g?&lY>$2tmivteY9<7_pNcw%Os1zJ~+W^wNhIC*39wCh=QwQMevBi8OK zbObRx#-#5cNAkZ%k0eEQE|Une7;XA+_FMgJ6N53ltp}ZTcld_^1tHB4lKkVL6wPPQ zr!D-`80+|F_7C_`8a~ljXgg2Gsy>_x4}6w6n5#P=KnU+agxYM~FZ$0?nS>UGJ!LSX z%wYVJ7{NOrC$Nm;%F4%s+ZH ze~<6UFQUH8@ryhfe(_q6yTC85C%JgNd=9_(8;a!lMO&fe7irD#i!eYX{@s{tXrG3o z21ROKCNsw`svP{He*O)=Sfx^Ve({c%_TU$Ff(+Q3|4n}J0DAa&{Nkfu@53+t;(|QC zcryX*;TJni*Wed_O%Q>Me9pcQzxd|~T4_E0@AB{kJLC*-)q4zprw zT4ErhKgP8X>9OaNi7}@v({aDEnBQ_-rp1*-s4Q-E02rh#0 zDp$%pNGfbe(paYxzt)`D`ytsiO^LZ3wZs3NMues{+mE)*SsDim?2G*?L0C6$6bw%K zoF06BTS3#?&d*Q(eRlf)V5h&;Zy}yVw#Gm4-+lhA!soU2^Ye0_f1A&(Cx?#8e*^1? z329hy-@nt~;Aa0J&iDQ^(1GIfYhnFk&jKjpj%C7)y^vrV^GsNLfIHOyCV3X9vNmdo z0Sx$#RE<3yJ~y#=wHx`Dp$Y$hbxwG5%=vKiUnr#YJ}Qf6g{hd@ZZ@^a9ftsp9JrQU zeFy;*P~7w;zb?U0y!Y|cY$US}vHVN2b7St{?@$dNo^C!I^^%PvrYO7Li&d8sAx3+j z-@$mz9{lEDgK-@tSA6@@E3>Fp2OpvDDSm3~^zziGgjaJP)*eALGUsjI%YFGP`=!~T zc1xJGh#bv%U>WHzf>%YT&k6S?`eG>7$bD#g7v)5;&g3QLmI+=~O`wBgxbYN{IXvKw zb<{VM<(0+w8TBaocN{QdjX@czLvN}AO!8Hxk$5z72Wh5j z(!Bcvb+p0sfoh6`4znWly@O=`fA!%=xy!=!za`&B^hUT4NHySDm+cXj$R<$*$&)$&R{4F&iO{vbaoy*@Uk6@N= z;s4))`Yh*0!7DR%AXhq_PHzXK#;?S94Z#V4AlS%YSS8xX!AaJHO>tQwzX(D3o6RuBDQ_MS;tR-VW>6llmVtA*!wI6^0 zLG0pfK=4Ce*Kt_|Azr%s6S{XC#WDKvmmq)Pv)jr*4O_)2Z4?9EL6qDfY5)6_!AOY9 zADpGOn_Ru(Mk;Awj#}luUF$yRNu)!nj4;zkRnX0FM%cvibM;+a^=ns8ig^>tCwa-& z`R}@JCVfL~)fR3glzCBtyITA~G-hVrORk&2jIT2@u82H1dHe64uCCNAS9h5C*UKZl zZ2_J%#he6R7>rM>3s63>u7LB2by{xg(oEm1TF3N=QJN9tgN3W-K*EkA7ehEkVjQxq zxkI+ZiZigG9{O@cGqx<&kAsm%q~x3`TgRx5eDVT9B`-((pC zOL&)4%&mPfkDp%hMQ(h=B&6*PFmsFFPhI#7N?t#MixThf->fE+Wk1XLmFbBa&7mRo z4Je`O&{-CvVKjXI?@dAP{NZ@6s8c<_12%YN)g~^)YaB`!W4&fVH4_L6V0bjJG5i+vW( zQhy^dIfm7m@P?;V3V7At!#CHp1MXn?++)iuo9xuSrPO9UuvChJW-DpVWGC^~0@8)g zlbwdQ(loC=P4@16Un8FEt$J%DzaYg*{~OfGqC~MB?abB$%W)Z2a%#D*Sr4?q$zO0- zqSc_JIb2QMP8%3aE8*sLwc$-hUl(1jK9oZ#2t;M}%E`{HZ)r-PKtD3GS^Y@3{zi0T z>=?c4@Wn}vnC#giGT=UCL&7;V;$1hmWR~-=riBQYvFgWCZ^lDUu&nxr7ZdqA9}jb~ zd$So6>>7084=S%DwMSCKn;M$s{AVszgSM&tic-hqQ~L+0+=5aXuYM%;+YF)|>}~r{ z47m1VFnlmVe7yYt-cg71ZdYK>sm!BD&ELrp$8NWYU~gwE&QgnW-CT|rZV<=w5{hX%wA%AOb1O(b+jP zh&wlGhU%P$1sSg2rMjEcCe`(peUHZS98Bh(9z+?=r*WrM*Is!M$PjpWO=woF?r@TY zf7~0#jo`^m!sVTH&Ohp$C*xJG#@pV41Z=N!p78q#3>E?N`%E#K_Fd*NLx2Ka0SsJY z`GxD+SOr5?5Lh?i-njrk_;-&+o!$zQz$kvx|$at)S-+X zX!`h0o%4aZSLfWZNf2jggZ_rWi&j5xIK^=NFQ~QF>8#q++ZwNW0c{Vlvb|eP`P@Pn z5b?%_i`PLXu^K~v*E*OxeX`rI(_)kM#FZAy8+KaUFNt{Pfcs`wQbCLRN(J}xsTTK@ z3htZKczs7{UG?*+-+~wCR9n2r{DP3#Fj8mn?w=-=4kz*lPq7E|whzq#eco&ER24AQ zel-I3h|>{C_k=PJlj)BjLH3F_P)mE+UQ`mwqYi|P&j3y zn}5sy>RPhQwKv}29b^&C^+Ap%xP~;#Xx5CIXru+reD&}Miuu#m zvB%;xHF!yJ8|{938|fDm_2*V<$wnFSdb|Yvo0R>vqDE56KAPlnJ{^oA(>#u`St-NFilLVyc^Gn(OiJ=DXqzyr5q( z@hzsve&~7|BI>6AHnJ-H)1@W8XIs*abLu88ura6~M*m_Hb-LR%c{R#|tSVz}Lzk9r_E+4A_2WeKb)9qO@2#H&;hVH1L5ATp zuRkjZYeD|i;%r8GwVUZd^gJc+tIx3 z#hQmbVpg7ZqVTlGKZ)P$jjZ&ShKOXK_d_=FvH!|yEl3PlI%n8JkW8J3l-rv6(gPgF zz}vFTr!ZxuoQXihXfr(V(wL{;C<7?F{R|@=TSihBN!W6i{on+}DiDu0`X26KLin~h z=1pz!e{73(YBKgBwbO4M$H(62*G{*k9=wPK{mV?T4*%2y>bthB^`4HKWntiW$pUu zExVte-obz1|J0YM^j049N8cNH^c#+69k_??W#ITyvNqw49<1lSeU)sOuIf`Lr}!Xb zyB&O*sQNH|1M`AwfYna@*Kwf1eZste6ZX;Hn=b^Pfm8$_pHZeUMGiN9 zLjI_iU`lGPRH|2YF+URY^;$un4%AJzix+}#6RQ*u&KSj#RmJEv&XUlG8a##G1O*SL zppo~z&#;ZW?|CQ(y?BdvZ^}S9ezb9PHphdgvw;ii5cIXu67I=QNxqkC7kye6Nxy`I z4+G4#(5FwJPh5NRSQKZ^y|YJJd1D=lPUus3af%j@@3o6Y5y>;Xc3}4Q_ULAsCmQKG z5FnSS0HD1Xm39fhMA4~l-5uG{IxtxsUh!1@mVvRJ7tNL(&_8-<*znxf1cEy)WTM;e z45cua-bHl~?1ACMY3iHR92AFInw|vW0bV=RvHv$-?=>|OZGUHKajx~=&KO?#n!pa@ zTuawL8Y}Q9xZx|`o4VP@o{-70a!w8xpmr0dc5q*Y$*H9h5Axf>FT^vo4Ax?04lIf4 zj=6^yFhb+EXE^uNS*IH@?!5OB;_#jGcbA{-CfjG6?S8j?_9Umaea0kv)Qr+dU8hp! zCou3~Vphk=qFHX)H_bbHESv}Lw-~%}29H&;z*lyfo;pN1&`^xvAcEXl+*FQj z(XO+K^ghzqVSJ=N)>6YuMi^_`K^S{0$@Jqx)YSeDs`&1P^(`b7ZHhJD8Lh40faT$w z;PNmem6>If@^3wmFT9%L+1-491vM!!ZOvgJONblhb6-cMMTb|f=0DYfSO;|} zCFapYg9s?=wMucyF4s?Q*+u+hhwy3k0)21i-Csnry@RXCGxT;i5BdYj2k__*(d@vh zUT`#Y@+zzm`1JE;aR>R3>zT&|pWExo{SQN~P!9w=-uonaB{-gct5F)bhS{ zaS0{H%6YGr!-C=m@|*21A-1llz^U-sa=)L+>-A4Ns+i#}*dJV6&P7TU=`+C$S?QMD z3PA1tfe{I=F2<4|^H*x|tFb4cRK|E@yj~y%pW}aV!@J7>8Uk>M*^F8*xUBjNE+XeP zUn~Bb>|NJWKH079DTiiNQW6PS4=3*rV?9q}mL3b#4jx@ctlEhLVFi-2jv06)bj*mm ziH_NDaV>H8=8m+PD;tc5^f__&{Eh`QUrwd$Z6)f3cW;OI0;8u8G@^2F$jS4OQe4#*Yr-Wf81`m|5C-0_6S>*$wnK;zsU*1Y0kPu_r4uHl1=Ti6 zx@G2PwQ-kqmIU_@wwgo}4}+$! z3s(aD-GcsZ-lEF@{ccSD{~7OjHXeGGkn@Oq-tqSv4(N?ljNqPGgYr8@?5O8CJde}t@XVB+k4!Sq znmC^1@61}eW^J-}{yimrJvGxREO}`fDUJ%TpN&yDIyM98&idJ;n+i#o!?QL=WlHKZ z#XR4<-t@-~Vul8x>NJoU1~-P%2sbI9x>~hcA{V5qyRDGr9lxLHfZ2=^)o&xKY7O7` zN4iIF*s3k@9&QFsoVgo|`f$UOXs-%OWLC4>X+o0&y(EHA1Uq*LUGSylcDYnHGuMCa zcMD$#ZrZ9O|8#CJB}uU&pi$nGob*%00_mqW1p$x|i7Ii7{nne(KS+fCDUA{K{H|G% zUMsGx|0iDN3!B+Uk-E)HhZldyNHog`X61f!EP&=l_r`M=3ULS28{~r9?DQ|!t2g8c zK4H=y^S2BW@x+)4_uIGo*SZET(Qz|daqs31b-Y+)4>}K_k<%jHDFbFXf7SR9oW?K# ze=8B%rj^)#?)M7N0Di1;3yws<))>gwN^n zU*yT({afHdyLkR zMZFW%eFRq2*(L1D5rrGGh9x-Qf(kZi8S=0@_nh3Hi#N=HYqcoS!`jCDQgh&uE8p9( z-gVipu*Is!Hgi6N!&XZHL-&$jqD{jX&w@B!{k;M#f=jytb=shWGZ#8AzJg!Gg;p|7bX6uSd> z!NCdXL2$=bzThm~4hkz(Qs>?nV2mYW#0+p&i zN<-ki~8|E*#c@`{+um$fgx-BMbs=gKNzMw=)X$#q5r0?fc~2{ z0{U;-cK#jxXM9GZJ%mQ$-bLC2jLJzGHcM7M_IDp5VBBYR)#_J8LBlsn$?JT8tp7Dg z|8KzM<`@B?U?IvNIvv+fHRxKa~yw)Gg-C%!D8FA zgFK+Kkymrw@#YNp_+C)#5q#+X;=ed>5w5DH)aEQ!&b7)ZQO?j9@swdoAO5OZ;mCGE z{}O)|Io9;fUAR=IUL*K#33LZ#ektB1I--pIN-_5@_!|4h{C%Xv3#C>}+DAZEZn0#g z6mtZbvwTTZ#hpJCuKiESL3M%Ub9k}Rp({(FBt|<9ty#{q*{I^)Stt_W?x86wYrWwC zn}A$FH#9iyvM5+VpW@#985X-r)0FR+Arm#36hKE?{97rZb;L)V@hS}6K*L_*`aBYD z{DV5;&g4vh<~;(p3PLUu$9f^(NZE}Vvwg-n-sShGSPLFA%B)e7Ztbfm3ir7UZu3c~ zO%fw8XUQB(Shc8?4n@M6hX;7osZFfSC)0wuQwO&cT^e_}u60U9%sb`B*p_W%khT2h zHhf?U*}V;8A3hEY3~E21#=s7x_5+4|{s(GRRGoD3s34o^L(U9Mr5u%#pvKYn<^Ziq z&7nGI3^UNUGj?;Zp`xKbu9D{&RH)~nJWmUrwKLm>3?Gaw!Exo2ozmmt^$RKi%D9oq zZ%Lv(qt5%i)?M6NwOPN=hgL%Smt$z}mk!m!XD*<}CeIsUn0}z^Z~3yxgEc?Df5_>Q zn>q0W`p+9N>d{QIU?<_kU-W?F^)Q3_aYU9D^?&_)LQriPTYO(Ov?H+MIK%n-EayjN z+a}FYfHP{bErW%=F_&yE%enw`Y}phZ_|Hd%fDKd8}c7XFEn2y zpAX`@>CnU7?L*;V>b2@7d8JY?u^x##+;^o`eGpzOAF)}EDajf%D;RJ69?mf{xB%%R zDl0k1JH^p*WUv3)G#-}fVTy2C4>2B^^e|?!d;ZtP3IExBwH{1>|8G>p9sC_7e*@`p zdHY<%w-{^@-!OPA0wKQeQPyuWa)>XaB;DYDPR_0dDI(?t&Ou@Pqb<25(3D#O&3e!h zSQ>Ne5}4#%x32sg@3=Jht@aTqX43|EW*s7L%u?QTLC>tCpjl($f+R94DP?vBq=`p552Obat{HwB>5_yliD1km4V$i)6GSk7*k3!^*v)oTWhc;0F z;`Fr{=H#js(r!QLifO^cSa9KnjQXjCVIEjnIs?J3)p_^Z^|fl9e(_MD(dGX2)BrVu zK;HYd(lKXYUE(SCj(@4C90`Hj@U)f)HyUt~>&ol?KMf^kDNpN!JZ}wnzQW&pqH#{fWSkesx=c6RXgq zf(tB;DPSvgj2mi;jjIfPk%dxe$2i$3l(dgC&OjpxL*v!_oCAx0Ys>#N{n<!ze^j!oQRU z%tG6`E2U`y_hfu#vzd_-@Hr8vqKA;i;>S_|2$N; zQSC21^Ujjw*0?)%xc^2NNW2lRKchq!U>0t*f1LEZ!XhukCER1U7I1iocx3L^xc(gwUIv>z`naEkN=&#akR{Ulti5LL zV=BQ3!A6stMX4nv`TNLJN}845P{y#DyZy&+Rs8qApjmGt(bRty_0Jw^B5=mtGl?3< z#xYLqt;EE|hR5m?DWJETyqR7QgUZFxLt0r3+%vb@EQSB&21(cmon; ze1B3Halh@KW_pw?{Yxl23T}BNyB53o=zh5d%zbLy@HT|Rhk9vMgv7Q=oDh_seWDl$ zo+j2wOd&?_enr$bsMZ}@!@tRL8}MaP7W;qY9)vvM9+#bHeOT!K5uhnX$#X~F~yGK)I% zB9N2uQ^V^#)H&PZ?x_mI6&rH+;&l;-Qzt$)I&OdlY#I>x6hn zW^Q$%m-8YRHLZvr81)jq%YN+Gi#qx3w&fmzAulFQmy;n#qW%7g}_xZ1RKBe2b_W)0Q+(QpCs%z@jD}b(`0WW zs>7b~JMovk;awT!>=8?S3P}m?zB!sshx(Ho5{6^Xi?9sB+9(GGFsmzlBI$+Z9iJ!Uxcuhtt6y;kU{z`e9!Ih>1si zfNK0g@u=5wKmFRPbw51;xYD#qd~DmFWZd*+yY8=@Ks@!e+)wY7ok5>tRU4DUx>{vg zAq?3Gxus+9AwBkM=DvC}j_ujeu@FJOUQKbc%xd+@e; ze<$;#UOewAGoP<9pSyHF$!Ft>d-S2uImTlyWKfM?Xg=GR&y8k2pUTgt?N74W^u^rE za6vvkKB>gUSM~Y+k3G=L-`ZGpS86+Y6cb!L#RYd(1BB2m&RERcjbtHxh7o0U1jm4# zG^(@hebO?Se-_c(9Q+l3mF?E)!B}h>AQm4yQhYEx@Sk{>_MfCP#V3y+pm$xVks6)n zS6BX+eXq8x4;t;sBxjF_tfFtMYQ$zH_CkNEVyXIn<3qy`U&6`rT0$EHR~zT~JK={B z%Gk)TIsEvo#g8tcr3Co#7itoIDCzU@!{qFNA0wy-{NT1A6Mz0+;>Q&?eja|P#{Yf% zF#Y*_{0KMPVi5P+RWj0e)QeKe{+Um4jdsoA~zuKM{!2VjiX@#WyB= zqtx7CfPAuS#k&^sg1xIh2&Tyikj}3`n^`z3WuMJsVWCiF-9P%AZ|oT$cS?l=^S?@S z>c}FZ=66TxcVn2i1YqdIhSMo;@K_}ehh~*j5{`OQtN#lcRr%pT8dit?jX_#Ptuv1c zTCXj)j9#|Z{{`lxg)V9pbx>CR6}^5tdDQ7Y%y0H9{#E~?s5zI|QyZt?)7c3Sr8j&8 z4_Hn`{t@(+^doKh<@xkMq#N0~n)oJlOOXCyND+Z*_dHMB@UBkjby|jx5oFa`ycpq` z^Su9%zLoG}`e4ybm|3iriB|Nne-Ak*Et5xRY2C_;+__n;Lxa`2!yg1*Wrp*ejl*j0 z$|1Vuc7Luab#J!qCjynW%&1IouuYX^DW}V^1 zuK`Rr*rk))n_rWlD^qRwdzw9&X7MThE}tU@Y1qIK9x$xhFx33ggmbS+gNp+O4K|&$ zO68k?s8pSXGraCf0G+&)1)-TMFmsuWC7}}Q8r)w))V%#|5Fd9?OufR`-o|1n^6Opz zF`U66VF73Lt@w|Oqlg6me2jN^~jcQNMtoyB5ZauQkYEk z4*4$P)=d~GT>UK!X%PXxNizHFDdUh(jvDH8)mC-mIgHA3oaQg?{KKC?_W@$pB=6pl z7C3rdHBy8#n1fFLbP5HMOfvxvw~caUbS5&6>nnQK;*tA;9mXGDu;aM*1q}pK5~CZk zc$XQ@tVp1MhxU-j>N2|aw~&I^?my}!MIPHnKG%`e15COF>2lQC2BaVDg~AktvW2Sl zFEkl}sGG$R>v@h)I!Llt1hVhdBxR8#MaM}u~xA<4n0-6{JzW7~r zn3-YpYST^22(l$l*7E8*yOCZg(po2Dc^h;V$Ie^Z1uvzUX^uKZ)2B5WbGi^*1(YV7 z9;F?qqj3z-(~M*fHf0I|w(7NNk|>BO=S-y&GnpN0q8td`Q4@mpOHtg*%z*$_h`*Y2 z3$SRIofl`xG?Qfv9l{OuEDH1>Y3)k<8uJ+Ih^^7hM7nX0v<)1lQEFF#hq50kn|Gj~ zm5XuE+JQTOdOR5?{j%g?lo*hzlCyPlF1SD|o&%kx%rQY>RlvX2?17kF@6wz7KqxKI ziuDbBi8HrB>gPx|tk}A|cXom5x-#(C-50UFQdm4;X6d+u``u7EPTHZ0gu5zaXXfUR z!D28NBwre?Ka=_eUNl;eWC);F3;vsjADb`GRmR+Ai~1J27PF=I1GZWl32*Eo5PDZ0 zp#fkEs0C6Rt?WS>45~(=0qo2nwDJEYoil%{XbT!P;|xziZ+%RgNX$9tv;N@FpftX2EX!0^Ze1dJ=)|IvC~ZEg@aj76 zyRVkVtG0!2)Zs*Q079IfH|WL)jVRQ?Lao{+YAo*}Ly=7c0qCqy$nW5&3h=(uOg7VCbcFUk9h7rV*EtDgwmWOw2&uIt$I{0h$DX28~8 z`~i^)C8-<6GyEGli%F$gZ82Wt-{==uM=EtpzHI-TAtgSu3N!ZG%mK0oK_}@RYy^8} zA>C1!AWHyVzS?BPb((hT{dO#(uXt)89Bt0y+iU*J)Nz87d+Sr7J z8_OtG>?$rqlAri26tfq=q-m;d6u#6se-b{#ogWDgg6)Ys3yG0*O0Xev*DTz@trvJp zoi_thr$fdiyyOezv!d0V^S&SRt|`X^(d+Q`ms#vbmo!OTzMjrsWezw;tKwqSd@d z_HO?vzGNjz?@{uR7FdrzhJ&mYrx40I$Tb-0p|d$7?ovgb)mhiNYh%5#%mg5Q+h0R! z@Rg!W=|mtlA+v@5s4#o7snuE)n2P0kv2dw>lfJ88*kZ4ZPy6%r&KdG5TVJc~g(TtDmh;50Ixn7y7A0b&CT5W!N{ExOv7LcZHqfgsYANW&M z>JqTmKq1B52{sI6K{uGBggyTi%d^aVR??TY`ZJrj*8>v=jw*0oMrT@9=k#O~?e(p+ z8d|d-|NED!A5zAGjaOK$wMY}lp3{roNL<9zA}KyyogKSJo+Uw!tyLi zh6DbSyTg&f-3A()^ZLW4ZznAZ#0J3x_4tcuQXk)sqfvgp%8x&|pJxP8z2*J5q&qo$ zc}PEprmqj3nEZ13`hF)S_l?zm+&_hgHajqVeg6}&^210(8e@O-O@bHaeOF38UpnT? z;HTksp8+%_Ybpe;)6@Zh3zsgywLW*2R_-Mi${m$x`ut3{GS5y63lU(1dWd33u^)2Rs@J=@7Y6me_ z`E#SsG#NCdj-g86w^BXfcZ7YfU#?&NIwr)*%+D12GtK^tQ(k+0n|{E)5e31-x*{BV z^13{Zy_Xu6JtiivHL&3rzRK?FUk;%pDbhXwyzjN3{dlX=Hv1>>o3lsB>pQ1_e3*Dv z#F46xg>seWunHF&103Jf*u*E!_0SnY*(++BKjl`Y~6l?$jmMoLO}XWpbLX zx5kZ|yRGN#XK2{>6{r7(_4@Xrb%Zd_Jr=rOWG`ZL=nh^TJK}4=bNwxfc?9>YEG|9{ zwXvjZ#Ajq3|9WlthU6KJnlm@*TluhA^H%9k8eBA4 z-7I`J`VYv!yO4o>oC!k=1TI=vRDXUw1UfFqYhW*RmYBOVoz-2u*znf0nGUa*xFF`9 zJ%=N0vodf$UqZAMf+7zScCk@Aj^fn~KR3-{m|H%@goZCkzH$SR6_j~2UHX>pxgMN!;FG_UByNm|;E}H&FWHK%;8{dbD`6HBy zXUvZA>9M0~!VQlzcy0F8+fwgk?=2uSC-`&WU$*SzdfgPJ?5VAzp306y*T;QfU3}gg ze1CK9`|YXsR4R|ZvFh#fC!>@s-4}(Ex&7(FD^W>t`_q>H(C^kV`)+T4>WB^7JS)!a zPpzT&Fs_i;gfDLW+KTK0h5D+Hsu?j#Xk)(pl0(25LmRc}OA%r2xE)S`czt_6eOf;j(->@vS|3umx~h+oL&Ro& zlu_zB(VvFL4<;k@4~UJCZoK2aq0E&O*I$}NhAUrNxZwgV4D0O45~MxLBs*rZ5gFO} zzg;N7n-R&nO!4WrOGp%MTw&B*7UlNoX4n4(38P-Z11^i?+@vEm7U`M(KHBl3h!xNy zZ^~Bm85nR71?DO4Lf)W@jRudVVDhkK{gRuPmD9g3YfNq2f3(Boewp0V7Ub*SWcMqD zui{!P6gBq>Sxw~kDBcb4#7_CTXALOe1O zG#y!|TZw;6X2t}D1G+$trK*VPf?889u=Y+@i5ch9K^xE5YVkRue}aVR;JfVP}h zQq@qfI8g|l086149z0~STKJ&ZZ2C^6NBpZ$@KlZ@g|7HJT zJ+B3WX5*LcAQ{CPDb|)PgBhsI9#~i{>}Mp6jP*X2JOaOT%=Pw)yTpQSq-x$VH|*xU z#82^_eO4MTont!vnY=?A5Yn#}4K30B=1!a;99y!sVMDlK`#=>yZs>l0_NbS#hlvvy z$wvm&V!f8~!uoO|Q%Ugsn0Ouyg8-)(poO`FSP*|D=6sNOmPhbIKHZs8K5{-_{s$I5 z1Ifb;W1!Edaq|oZNOqeJt$}gC2eNvrLJ+&VeC`A@zcJS}`L6SYe|~OCDxSyMQLPx3 z*m$h!?&5QqjzZ(we-rMpCW6=l2dERR6qY1`!|<%g>7K+F^Im~uDdJJMp__$^T!*!(4^+ z?K@Lz*lo;AAS;Sv&;QTzbE+HuDTz?HaXSA)3*!CQ{egByd|OUx{lj1(A+ za_{qE1Ff8y4RNV3g+I`~Nnc3Z>e^bo2p@afNDZ_EytV4{eV))4$g$#ad!cr-&K#E| zyg6(=@?^)GN0L%!eZ1-!k$BLv)h~aOR;-S*TieT0Sg*Db$aWq<#|i1&#%7;f5njgh8dvSxRb=vfsXmj z9Pt@^K)J$!FZ)^OHvHB!GY4hDoC<5kp#^skOGo;_6W$Qkyrom1dYv62$BP?Z*i_qAfWgO@;ANT(~ULPfmh4{tzQrO5r7}1M67^ z_Kg;fHg+N&hIkr=8*U(LM;ig(R|{E^r-xSp~}jvc#1=*Qm7Liw0rKvh&9eBZ29$oF0PK79ZGN3ZCDhzFGU z4d`7!H|VieGfO#Ke=<(yV+^x7WOU2f?28=8&GbbH}r8A4iSuG@B zm(gT0b#~6CKJWkLG^X3aH*=L{LNNe#)3mQjhf!&e8@4f&nHLbh1p={56|>xz=WE5P z*`vy{sgj;7P)kH9%0aVwvW@xn)ek$SZ-3!te0dbVxjvi#v2v{=Cc!uLVC=(t`kymYo`&avI7r&c*09+ALr_+YB^_3?8^k86Ka!X*SP* z`}3k#11G~d!EJtxuGW4)D8ye{3qgD5&lK`6h?FYiRznZ)XzEZ=(1ZdaT%Cs#4-#tbqp4J9nlt5DFn60Et@Tp zN3Dmq8ST#vkt?tu`0|7o*Ncg3BHbbwuOBmY8Rw-ngA5= zlmSX~n5k9uGleBtbSpql}NYx zZ@xl~J=3wEwRrqz#%m~c@e59`n?>dsgkjahSR^Q=;GH%o!_)e3SJ@@tEM&W06)Xd| zWcLocT5#nx{!Z?s3Klm2n#2<6SLY>%!(v>t+^|yIP}?59=@j6^-Kp{FSHle{p5efk zMcQi*Evd1mzvb+?_BPw_O(N{L3?E8wQ?1fa&tNc$8dU#DIDFIX8Z+$RAp{*U^qKp5 zVd=sRoA}H`8d;Zm7hn%HFug~(7@RCQTm>NUmtFD++Z$}U1stLkB*q1ZhZkQl*Z`~C zRC3%-4lbJdaN~_y4M8;257&c+SCUXXJ>%$l;cnsmv3TZcVWWn~?QeVPL+L+_g&Pc! zv8twb^;za`jFjtQ!i%5UN1d6vtgpShIVBMx!$0^&1SRGz6mB^5OQz#?*wJNJrnCs? zjV}F+tO%KXvDnsIn>AvkZ!~I7G@TbM&s=QFezuq<<9JG{luBzBGw1e!0Q@EQBcD;Y zA9?VqZ|PM02`A-jr|v`EkO=NWep2@#Cty%3I8;?+I|BM|=MY9+y)bi|dKW&2HkT&% zjrY77PDjbn!LU;l>@>96#3P=ox~au&coApPLa%`j4Ec5gV{cl$yI# zK(;uO>#uveyd?Q0nA^8m1PjXjpCVY9>@~b?HiY^yCCLX(@*N?6w}*xL3y7GL`&xD!MdPhHGzE>uzI$e5@Xbp8wAX9*?$8t~h$s zpI21n`9YPnXnbNE2xTtX_yACD5H>Swpn}WVmt0 zdral`_>bkP-f@e0ylrcxRH7Q3Yrql-M|ae^_o;Vu?ahcgWO&dwdiKKM`N66~sjo$y zkAe;wL)ON-0dRx}8sWv~P(kKTy!zwmo_ZUuKU-<%@t?ay_2+&Yy=-NfksC#L8!8IJT46!h83wRqO(kIX9`UN9+{f?pRdR=LDKdv|{q_hBJ z%AAo)ahoJMG{>~-s3yH~Ew3UZra;-N1k7h!P2$#N4qWW2a+AXQ?IJZw1l>3VIyx9d zuMg*55_8J_%YFl#bTCTAVs6>5ZBn?QU0>~4m2UQ-s+)?c`uI6h)%SAW{m6V5?aaJI z_hcgcI||q-`z7Zs?AfZh=a9#TQ# z>xclm5eL4;?~4$R`*sn@ z(j>NZSIU8w9Byu}-pHYN@pU|HLR6al^jAn#Y8*5Ud|N?Wak0ncDm+~N9jNz0szSfkcm ztrh1lWm)=rBi}*w5pIx6O2law6H^Ww2YQWp5h)>|m_JuCcrcj-$>1#jrC2ifPjnWk zEwyYX=b~6;%`WSRwlEoz>kH(1gy!n;LGg^no$h`A4muBdgDLwG_RK^r8K!I z2Vr=qyU57U}8U-8)B&Scba>@SSIi1)L-Csozn2YAaFo4tQoY3(TuoL1g?) zM#V)t@1(swAh~!2ZBhRZmDLxZi_2Kd{`bkqe4^eS&XZg4r2dRnz%6@w)4u`e1~Ll( zJ&$=R2IwEjwE!)l8F-G&;k0R3^A_M|&aRE^WjuMt3y_gc6O=j{XYj-9l-#gd-hpSI z6P*@r>@iqiP7NIfOyp}m1X#@Xkxigp{0%c_=0f6EKk^iH2Xm44qyt;+&St>cVVHEf zRpP($hVFts;7h9j@9*gqCxBe|iYW7C3fhooj`uB1qicdrvR2QxZ(ZuVgMGU_&p8o} zj)62hg2U{N?2(c1<6O4GhV?io9xRL*xrMPJq%BDlZR19};moVl%+9L{CUM@#Xv2=e zib;*l{)a(<-%?x!=RVJ*FVTyg^tp(*tf@$v#6I69N4h4EKf7_V%-8LHuGwzv`?=;_ zEU$f!@SdnPjC8p1r8n6Fx9}gRxIxN9r`_MO283GXD{b&yE2Zs)l~l}%su^Tl##BZz zWjPSgn`MABm$`bITA^T<(Djm}_y^@VuNubG-(WK*+M$#r56ORf-%g4>2pX68ciKY3 zppOdG9&RujSgw)#wCD78v1MI{%Prw9f%_BvK*OLa|8hR(Sqs`c1EFxkiO4cC6D1|_ zYHs6X1V;R04Hihl)ZmL6&M$@LjPrg}oCfbS&~X=&v)JU+eA)D{$StCf-_taZQ+{Hs7)$$jXx1{+w3(l z(Xmpr%^BUp0KgA^z*yZJB@muKQlOrp_PA64IfA%)8nxucbry&Aj8vI{1?*JJvYKYxU z4g6D+!I+J71?MOZLR^9vOw6~);8|$xm+)N3^;2pd%0gpcB--VfoNyGX3ji@Ci@p|HYE6IND? zaLFHK3;saW1_j@HsUPvJDHYzk4)2nO_*{SKZLz%${q0lz4Xd~ST`<-f)#f0`%oJJzMXmb0tSz)4ZBUw}dQ{#H#M8b~>pAQVzwmEH0(Uzu}ziIO;+A>3% zqQ7mb`&~!$jo%KHbUa(tdaI+x*+ZxC0{88wp~W^vb)$h`7t zufj_p4J<>QrIxyfct8!S(!zUU3l(r=y?oRHPx! zo!YLUhKvN}+S+z(u(&^WEr^xjMU^Di;Ibk16ye)hFM&=2DeXJc`wZp`x|-QR6Q-mc z^rVL2vz`0(EB6wi09ptuSNU+)|QB1WCno zO9&Hg{Jp+7o9rw%`#zExV+&@-2ddPf4qmfAC3Qq2O~yS91YQ8V*niTOOs^eHrpNwD zEL9}AJC-7BNvWCHg?ugGJ@BZRPob*62Ii5u6`An+ODy!6ZZ`apYAK>V``casQn!)d zpLCH0VNpwMs@GVt?hovi`G4U(i)r>Fgv>Ih27_U*j3QOIl56&t)R~>+zh>5)(nUE^ z`ZgesrscaHpcJ-P`phIeOM;o|u@eo^FzDI5uR%Ni>Q1_N3pM&b zYDvnt{DYwE6$8Rm(UzDO-HhyEIh9L&4DBWjIaJImb8i>#0WXNvo{U?MHN8t+3u3k! z9?=`!6YbNNhO?N}?1ieUZyR;AfzGOL{m1sH|84&{ z>DR|A`u0mqWYDk3f2UvH-J@TnLBFQ-?bqWI`ZhPp_N(kO{rb)x{VFf?>kk+Q`mo ze*JQM-{wMOBQqZOnSPzLN53|~um<$x8mj)n@cQM?i{aJlj}7|OM14hgU%E%XE+xBw z?AP2&uSG8*PR_baf=ph_U!FeZ?DtJTln)`2?f?h_+}DYzCq{4|l&L^kx z$&kW!h5ka{i>&&u^Og38{rz+Ld_R@%>)hWjrwrRDan{^5;u2y#>>^mVHXh8^>@fb` z>&*AzhC}!uQom?SD79b2T{PBz*LE!2pm+>qj0~lwMBS@U7r&7@b(Ai%>I%9(!hfb! zq9mEu1QHIp?Hc(o(nk0Yc!O)7{uEKoR{w9gYVAI;rbPu%y?n`kj7lWGvF3B`8grm0 zXOMrl&EYIxzi3=2RS|LL*P;Oqpq-op1TIlTJ9U)CP5-Pg-l7c z*11?$ae2uI#b|xoNWpd>WnxCLQ+xhoA|K8wV!Cu|S zV*Nk0Qa`4v4(2?pgs>l_8)&-Pwp7OIH(>3L&e(>|HvURRUz}gx@MFR;(^oJyxmSL_ zj(O9O5?sx{S;ZF@_VjiY?(*yLZ=fwekozk0eco|dDlRhJ7V$6OSFFj8Ru}nK)t}jK z-u?!Q4i*;8I}+3(%;GxD)*}=&DD$Rf>VESEqP+s5*;1L`k(M8i@z-+Cv~oL#9O|$y z*O?ary{#`-!a%|}UP=hd-IA*YLEA={r=e z-J@-JsNvBR5f04Y|1_ShY*m54%xcyk!xjAlCiY*Aul>h%d{iUa{5`7CW@}F&Hl$;& z;jf-<8n!olargpyfMxXlB;GWlW1>tyocM>O?=SVs;o0_Go1KaUqb`p*Jh7!~%wV#CQ^5S6T!7J0f9%_zH-JR|qsxP;k>r+S zr+>lz-PBwFgZg(&P|3}LaRCflaWO7TP3rpu^$89FMF$h-?mmSQ!Q4M{CYXKc7wk_D z7x}Sr&2rVW{EUwqT9f<#CG?qiqeb1D(x-bwEPbi~v5x}?$@48n!X4FqF>@G>ob?e?hQsZn0N4vt&Hp)9+-^U7Mg#EZB zWyB!{4x7O-A1AX-D?&|mFQz}>|Ci|Oc~yXl%GqL{@o%X>)k@{EM~V7`1x%tQE>hL0 zQzlAQ_BiM3x&GNU1smGT?k@%P+owx0ecBPxH~M`TUZg;&xVz#Y2mdHl>l^@b3jg}^ zPtYl*SNZ*b{jvVt8440lAnOxj?l;&B&LUE4w1t*vN)~Zbm-F5lym#{6^?>@3EgkhJ zo3Enu$dm*RHay?b2`{xYFK>w+0>*RKh>UL_tZ{*WESCw?+HEMC9J z`a3N0{Us~3%`CG14rlr|@+yDGYb#3d!wD|aGd_2j%g8cYv~|JzZ2W&C2XT*<*?9x8 z-33TwPz%#Imo*s~OwMR@JjQgaAbW*H!uP+STL{bHC=@oATF7-{uSQ7=FTj5nII2PE8+67G1$ zx=nu1i%j@6q7IaPlgk`TAS0l{O5s3vuZeY}WMdMOyBP33Nk|pkjEE)n1DDXq=OW#- z1>=tWkj|){m;++(VaCO6%jcA5#N;T-i?K3Q_b#kRxYY!c(&PY(Z&w8IukNM)Qbt}N z39U|A`tF^$6D^5%M9cMB6jn@*33W_u3^r#Pw#qB5rLmknn>3Du(;{gIfMuOr)Rg%Hi(QK==8iND818}!LMZLtd+rHv#$|Sa z%5YQn2d8?GMYQv%TY5u_wHGAuwr)JJ9#iS13{^l3;?s2?{oNsX@^OZv{am zLL>tjJR>uR7Zh8(6-l*PMMw~_a7h9x21G=u zC7{9?1{F~uT<80(z0X_%Xl>u`dA|Si{PR4SbI!hB)?Rz9wbx#&X_U2ag_JZ3FHkaq zqpVj}$PnTNQhUQvV;LP=AO8zO!l88dK*MM!<5^V(UIp6<-53#n z5}eM3$?3}4855Q=4CR$xY3&7UL+!#g)KXpcR%hD_5{0xC|Growk$%)DABkM%|1^j< zJuEBzQTMLv4+D19n*2cN->2Rjz}%T2A)2b7L$vbwhHiT>AFyb1!J;Q%p?z3dUpTe8 zDjK*@Sx3UQQD*@MbpNN(3FlUc$Mmh-_D4s^j37`rNMOaX}W*Qkq#G^trB*UPLWPS31CnjqL1E%?ZxD(ho0t>S!(h}soC|;N+CyV#A5}x`Q3)F8U9O(#3XJhCe@E>T#N&tVZc|S%3xZjYrgywqH%SBa+ z5)|AAa|AHvV&5+ZWaVBVPMi2s^hTi`Wd`jPcOC6^_W!rw8-UchQS6{a6<7=Yan=6Q zmof6yiJDJ9yUV7Rfn$~bN zBDF+d60N_Cv;B(l*`^zvv5R&E?L`Nks<4N~y_{CWMUTHJ+icJ}Cv6Yy^C@}6PJO>_ z6U%j?SVBvo!%#!Oz5!EcyRKCC_^J-(hx)Y`k8EPD^tidGT}_;;d?B{bc2)FiQO3}; zzLU0xCPXE$#Na7K9p`_ZQ==?PqFuHi(T@^ZhHcZm{DYnprpylN)v8YT=%|aul%A|} zk1k_A#tYqK{yFmQE^3ppkxyCFAPq%ePzk+yMLCXR!Hpw{Q$jIfii){yNcc#xAPaY- zTf?amSmj$(<+Dd)5p5)zT*}NB78c(Si%(cY)2r1i#b*BW8YBEV$`Ss4YuKB7;cYop zgGSjp<&paT+8)~3_R!-q_ND@*YpS=K-q%^fDRXFPdW&5_^)+bWKkqkkRZ2pn4TRX& zq^zMyVEaM%{@d4q9hcHixCP0vMrs+A7e1ewo0y5jjK*reic& zs|=lj%qzr>o^11CM9;dmZ;{LqcwMbo-UY|^6>tbyf9)%9z;p@`Bf)w=iqlrn1YO6U z$849+4lse^ym*!>$4KW+Wfo2FAhtH9+@U}}P1Ilv%?n(^JGj=-295@Keqv-Z!z zm@M2W0E{!qp=!%y;^m^{BI2M|=3?rL>uCao>P$Q|zH>_}qtoKFXLemNEj-Iu|mFE3G*iGV5H(EXMS| zYtKxQX~-lnWdltDHDnS9Wa>MB;pMqO{Ac_zzUNC$yKu*iLtkw$NbsC9_ab--L0BmB z3j&4*nMIPhNS-U_WNe}R_7ajopRmEv z?bQ;3oHc_X2JWPwysQdJDJ5}TR>O{?h=dMB6s&DF^tZi2$Bmn;=NB*IVeU^$m3kEc2}2s-DzMCWLN<-hoWW8ID;ut5 z0oVoN93yLq<5gkG6k5{hr3%{vhfH-Q)n)k4w7f#euWNTU2p+Izx3KLfU5n{+gG#wU zoYOxqo4OJ-*j(|!DIWKGpiAWias(&2yg(+0Vjza?#SGgVb8lJeF>0+%-EuNV(#(Z5Oaj2GYX*%jTr%1z?M%N^BX|l4-iG6RFCz?513Z`;_xPU!X zjO)-*Bo`J=|At~e`N2cXP{kqUL-FYHE>m`hnaZ|~!Bib8b}vx|_O1_j*K^F3gR9Zo zXhe-uYm)>!Ky+DkR1oMMfi1p zENxpI4$fkiv>${X1%;=>g`vR`>w;$$gs7|cfW#peLJFx!K3xboPTMcz|5vppX!Yyh|JQ97 zfm!s+O1(=E$S(0qsY$NDnWgQ@AF?u-0dJ2tqKPp^p@HoHv-4ljPR?2v1Tc|(uA_?_?kq457i( zw3(bwn$ezkPQK7*55lM7-&6yW$V^sNZwq?cSi)?W)eVzxOUthrkN+F~p}G9haX@xg z&yyp^O;0N@lI;=P3KP&4^iG_kY^AVs&yBaq(BSqHZgQ!tNDtl&I)hrGOEm@c+&F~} zp1MUI&5_%AkceJlrJBVnp=l;(8eiOCtC2u$!-I9MT$Zx*Kpw~6H^#IT;sCMi#h|>! z4Rc(vfJ7d7S!hqY*WDbnr2O0)XpF=U3yUOfNo{3GMypP=h#Vy8pOe5Vi_!ufnU~puU(_LCd_d%9Sw^US;vON@&W8iMrD4y0#b0 zOPayd!Jaz298sL?Hd&%Lb-#44Q#n_mIOQ?9k~=}h%zI_!S^Jbb`(f(%bOu;c1RC6a zXEZYI?5EGKdJuQ^pQ%M8?(CNqt5z;8;QS3GuYYdMxi#I&&&)!E> z%)}FFr_rbuHc9)k2W$Id>Y&11pUpZzuD3`J*ZP*7^8$O#q3(%0V=D7dD-QwA1X z^9G8rr!h)ugkUKj^e;T`n{WfBJq>(6y&<4{*`rDzydzfLW5$c?+%3V~OxPe(-t5Q! zR2b9EXhc+OmQ6uX`n(em+$@{II5j;kFIly@Slnd<_P!JFzQdIUc7$tx%7ANW(usc% zsH&cI#Fj8dO3)NLUX};pMmac0AVR8=fb8v{A&vIcc2GmxayxDlYCEWRp8mZc$yYWD z>W0kS>~06T`E_paqnq9BphG7XZq62g-9$k&rb8p^2C41DdUTMxBj~2q4U$^GZOGFW zOA0`i7N!{NvGvaJsxbHuhz25>)plSnY}R|h4(IcyB$KwQ~TW3$HTmsVQ8RX7haFS)9ED;KueH7>!Z3fsUt{l2iNXA-)kHz-ObcvX218O_p+VJFwWQnrppu|`{4?m7k<80t$ITAitE#1Jd{{NnEdSVSfR(G z&k^`PSh}NnUVM@uRcoUV*4YzbgvG5|Tvl2ZX{i2s(PSrHzF+c}rhj(DvUX_rkxNdl}M`+16gdhA@7fD4IfM@xX1 zsS@)5faQF7j%I^;g`))VL3G(~Q95ycKpxH8*veF+6NpN;Hao+9>+z)hQ~8AcA0tL2 zqa(|ekRmE&BtdW^%h9(sBJDtqiJG;tEVPtJbbJbf(T9qR7qxHu(qCAcVjsalUqL~&_5ui^l!{)zG*8%<$+`@Sh}nlyK;Mj{h9~hyHsrD$c2J< zJwK{yQD2UZF51)CYc{jZ%67X{;=~e5jY@Q!YWq{XLn2g2W15_k=x89?S#(UeLGnp_ zhAxhxMk1++Ro$;IVA8Tjh{-l@hI}xp4lgqH%^LAvC$})u_RX}>mw&+~ScAZ;vQM;( zUQi>0k>uwo=9n-5U0~*96F&;jrECiIx5#uP8D1lnr8N${qHI zMRrWwC9bB=dL$=buE)dVIQ(B|YrSf#o**;aEcVN+(YRM0Stz4#VqzcBl(+#FuV;xN za@KvlxG-g&tFFVjALFNurHNz0-PPEKTW$8+Etb16(z@4qa1Mo}we7R4;-Zv>`9ZPM z^gFr|U(XL#8RMs_=W1SAUirq1t~xvmAEb=%{0n__=VKZ6=Hf4-f9q^}f>zmOSJfk4 zc<^ksdhD_(@^!cR%2bziKCRCCi&;RN)3;<&2+*O`H5(i%#5A;vIZ;oUzB1>L*fPXD`SQV zx2D&_dHh-PlxgQYL3;#?Q*(X7nnCL{NV}1lotZCesh#_#1_OLG+v55_$PlQJ{m$pV zmLdEf#c$cKoT>IubyTz8*+5i49AjXW7itp}BQ|a#hO`eFCRL^!cvyZ2(227kwsP}* z97Mp`PDQ#wCHoyqYT$qY4ou0t!P1-rq5iesxtl1TqFE{+dfZb%Hd*&LP@kJk&+E*WlLJy58#81i9nDki-q2wCPs#*(m^59wsC3TC6@N%$qAX=4+$w^2T$f{f- zA0(MoA;~0jv~I0St|$hAPfbiLT&u|y?e8IF%F173T5bmSv?RJ{8kOL?%T1rkuZft{ zA&D(5ab=@WXhkZE>srPYDJbhwX4I`u(UyFTQz_LgM!2dLIQGj5uduGY3_iXq7h064 z1iI}q5T&L{qjrC?K-OIbZI^plAUv&@@h$IPb+e$+2|@dR)K(17fNQM-@{YeNW^ln3 zcF&L5*T7hNoDGkwiHiyAtdg@rIMH<)2#3o2p4Vy>^;cweIa5jotcw3!AX=p6e~}lv zZ2j-l)^}!IYE!(wFM3B?hYnb!`NxH>SDWuzZ&g~439>Y!3ttzCz_h+wVPEbA(jQ3$ z3%#a;J7otCmf&zB@}lpCn{!ep3s||BD;+&6v%JA?M|#o0H#0C@y$$w87GoBBL*twN zs2YE9n8ptz)_LVjYO>3=WQBiE!k^XQckA$1xh1V7sE-n!sXhz;q~v#G4n}`m1nZzr zRB+1UVt@~1g@GEt0Aa<;;Jar=8-Z{M`s9EiP%#LTSm-^KxaUfH(A9X~7?>}cCL%p~ zZ>JIrGY<5qFj2sfQ;*|N6=LOxF|2D_SULItmv>fpQkwy=n#94yJ{MKrc1V^uC?PD>r9Q`IE31jf$61&U6sj+Zfm zXr)r7?9rvp8V9Q!n(NVrQ4}NK4J%Zl;?N$^XSERWdL8Pe?~?V_QdxJfT?>ZWLlquW z_|HD?Vb;uf?2BV#SK1F=?ToUnJ+F{8a~{K>7A{8#=cyjKM(?y;XH+lFQ&_={YHW!- zm4xz+Fz>u#L2R>ssYGMv30s3e27*|*OMHl6Sj2%;;BRsHD#6E~%DIy5HWj~6NxzU7 zOVCvWDeNmt7^9;7jk?d6RJG3JMTvWCKWrxQ0KKeXb6iRr1=z7z0i_7Gv|b-vg6lzRvW>~?BeycqdxYw8FCjpM4HNSu3+fuE%GNd~^Kt42$ltU>hniDLn( z0}V8lbE+%r_3N1R5_?AV;=AnXuU<&3GyZgXVVAw16<#9Y6@;hm z17z&Ghj&hcf(g7v3i+!s?dkKEFrFUFK<$27-PWHk_n5`#)x-tyXFwiN|6eWtvjD;Z zf>5QvKlo?G&5_$!8}cU#cY(&8#SQXdmNsKK<9mC{;#N_JQWD;NVS3s%6=<&UCWhA@j z(MD@ocy(^+vZ~%H1#F$9cp{ZTE?QGgD(Azg@JF+9qSUh;dlxF>O{oORZf>)G1;Hr6 zz9A1;u!x&bf?XjFUMIHj_J%kpm>yGinwH4$I1Q;1WFRZU)0;e)pAs=1W96J*BZGwN zK;k%?7L7OTMxYkVABMQJE6_8guF@9F$LJE)c&dI!6J>~;oe%2*YQI$hi%At9FRj`E zI~kl%g0cBrqfR`RC|^lgBQp_YYsR!{D&x8J0OQ#+Yg9}(@`ltjO{5u#^6WV|%T01| zDnE`7m@#))k8@)=D6F0@5zd*EfFFK#wkA_d5Wzk!M<&3Y4MDAT zS~jwXvY%Sllt4J@&C{hdrxX)fgetUT!^V1H)c>qCqJJWWJTS((>iv{jS5LB_a8~h2 zRrb32{%JH9uPbT+?s`%soT3vx-XURU63R6w4k=}zdoe0q-Ug+NKIh*I3-Sj`^vcH4Vc`S3=%|8gL}` zlT4XbQ+V6y#^UR};jP1lZk~F9vG~ePjaxg1w+t&-J9O9N^G*A5xB`EJvH0>F?8i55 zJE3t)=WyGwf|i1Limf!E*AxUF-+h6MIYFVE4RT?^K@@)ujtl2-MTT*vTwoV!Z6 zVz<~IImeG-HluEc8jbgZ{q`F(K4FUxdBLf{A=6`13h7h}-ZcitrXL?)N0bo(_d~I5 zsyf9Sa${_YAqi@R7QOcH@$tW@_`mWS%n^1Ow)n6wi3*V151J&wE=h}An+8HiPM=$0 zEdJ?p{7n37p!QHLQ$P7k-{CiWhgbLq@0>E2GAfWNja>jFCgSH)gzitMbmx>)h8v5k z&YG+ITkq9LoVZw31m1kgN=wxLWLXVG8Z&}OY<#aV&7Lw(z61;*po}}Hq!e5o2ygbp z#p1ntp29r{agyT220!P5$Wm6j{RrA+u}2uY$kXIv^?*@_4%h^Jrj8qo#kp9Oc^8~D zm%hIy$)3gQVPvwO&{P&P4$n(fNtrH_0`R+d`10hP>v5m5Tphlbj$hUTT{N9 z9{&eV#m;hE?v_d8Lb3P{)TFf-b>f}?q*#9|NKt7quMt{1-pk`rH+O1R$ZE?hTdoJ_ zMaGy}jfoG)Ix&@18SmYX`(x+NWY55-tY0%c%v06H#)!97s=3{~RcguSim z7H2_gcHFV(y`sR&IEuYz_akRw4Ta|OXL!WWY?GL_X#8}LuXbCKgWjg&z|UXc2s!jH9(xlxdBq)D^48`8ju^VC>JKCfeGQG$>bJJ~8u$0~-?4S}a|e^Y z#)E}E?;EC_ci>N**g(pLq9PQUuw!&I*HJznF-C2^jVXtixp#X2KP89(t@crS`+f%6 zGreyG!fTP1euB3GKm@$ej>5iCD+Wk04Aq*rK)J6t1MuQ_s@1pT6;d_4Mf2PYi8Fjl zJ)XnzDLwUjKlU{q!i@`Q?MK#-&TsAT-LZQ1b3;9i@j`DS?YxF|0yvLD1_vhW4@L*I z2cv!W1M5EPD_pg5`ZM%Jumg>zHG#c&5NHjkMhEtO6!fkRpjit3!YY0zpYbc8Y$(UF z0PNe_Lj}#`pzaoxD@JcaUb;ykWL&0u8gnzoLIo|MevY~1%{TO)8lkOb-%3fy=2O)M3Xsn2G9p_D-qV zjF}%3nNl*a$czvyOdiqOrJJ7UZH?zYV5+T^Gc| zm;fHWfqo7Pdf!rCBlc64X^h;T2>i{P=vmpE)Bl2|5uN(WHNN;rW<|EuEeGqwD^5H2 zo5|0Iv$|g$#)MTEOLzOid)j>AraoMV ztH|*NyiLRHiXJ_~?Y*XyBDC@P?2*Ze(l+C<-;o}}g+~1{d9k+3nS_vCn`=Ct;Y}4o zycb+yk00n&Dip@z5#IWorV-u?g5EDU?|};5gf3-UqjS<(9wsDj;<}|x}nS9dw7L4EVu}&ynb-lmR3SNlr zBnoKbFU(2&h^B~+=~c7_g_VJ!3367I6YRHJ>kJOdZsm}i#D#kQ^7q?5+U`4q0~g8M zlSGuGatMO&!nbq+*H7FW;KUHJt0)W2d$RrnKZ7FVpyc78v2<01wK}|e*n;ws)}Xa4 zV6C|J4 z(0G2eMhajZV9o4}b#Pht!QQPwlJMWixmvLI1_4iN_l?VgrA<>%6O@m@-d&0Aq~)w= zFA_OW5boy$O7L0aSskH?_MYQAiP0QkL=w!(|)=AIW8#9 zsG?Vv1WQ*LVQi+*-OK5W$8Rj|na|JrKKqCB!Uu|tng2x}7@cLL2~Ie5PQbg|m;BJQ zeJq{J$=+gwMbto+Yf%KTeGr+Km-uS---_xt;VQwrR00sY53*AwxXXzAJ(Zv?m4LP2 zgNRiLrWg_NXQoP+z>CjVT#=uP?3?RtSC$N&XhfbQ6rm8ZhE|yQ0g@(s;0z<8k9u*Q zvq2=@BsTFVD}VxhHOI7|UEUG`+KG}%mQjTi&UsDOPJ6>%>J|tWvfQi=q;#5Io`nq2tSxNQF zn;4%}=ad_ds*mD0o{-|El&i?>y6&oeKq9`U#x7IGUDdZyKHWP`y62q1;KY|prHmwM zSpxg5j%ZON1~8)MS5F9tE28vh+WweagOk1c3*-p{ANYzvjOA40(UZj$UNJ7^rjp_c zC=OHls3aQqh8( zYL)w0^^Z&=;$k(2$`&Mk3C)iPE&01|`ENpJe^c5;Z0*O2 z_kB&cq@Bk9G5Pf|45i=^a7r<5LhrjrPD(%qgFprY5m30OWSc@IMZtc!yc1Nif3g88 z`S}lXtH%g8p3mv11NfmnOF$-N!Y4Aa1ZlOzml2xdAtU`x$DDTR7;yAFx~wH>g&kv|BcdU>95>EPs}cK^sx%{btv@QV-|XvF7z_D z&{ywBbw35q&_`weVXogGD9^?o-Z7+@G0k)?(D-8&Wa&pi%c6(_V>M zN#)zI%0A0*^uzZT#w)9XcGvD)_cIO#N*kv@NG!|FUXEeK-u@vcSFa3!IRoKkxulw$ zNcgy^gmkJpo!=av z@pvOK*LLsZzjO@z(c{bfb*roXDvpM4T)x1YrU%mYDa`04a0(Zr(U2z=qJev3#4cr9 z!JfX+r<}g}UMiAsJi83w8J@n;TZL(02o7rmQqX|{p=z1Hptm7fa2ydvWcsYu+x5Qd zls*)Dcu~Mw&*I}?I-gA+u5_c>hg;%XSY^hnSjNp#upfR2w3j8<30ybT9JvC%j)sK5 zn8^BW7C)Dd)Ds{I`y3v&2zuoca6?)RKA`E`rmR**qG!iMo+sK(kK?_`h}1|rxh85n zKbFk!nn|aYq;g?o0MA5)+#eZ69aBdgv)pG?xz(Hppm@RZ{7$03qG|Uy-Dn{_*@1wo7PR?E3qfy-7tB4$Z8D0m zzoMMf{0aS4BqXzSV9zpdb$1zF!JDrf*q=-c6~h&4Kh?Cou)32ArH|)S35~}*#i}ll zgDf$}zS}7#R3rq*kv8&dlaid-J`ppgT}3M)mnb((rU@BfV*MTQC(TnfK70+d+~Zs; za$ps}SB+c@>jeIk-F1V5u951FBEmuXP0q~|I+o76~jkP(|VMFUnz;sgO+WNUk!rx`{8ww^eM7rg_Ig2hA+HD+0`$%+&hl%oxF z$CT4ZIN@aUawxxIp~=(ChI9ih(ob*8opuZU>ol7z;KT-XW zmX;;I*U6)gFY8rbH2zibrSDFKk%O^Y?VKllDBW;hHxnd4+gCd%KZ0z49~B?uE7N+- zudq}Y4fr{$I>o(lTA24V7g|llwS{&Gq0T#eURkGi72DS8)KZk<*S;qIt;fzE-Qec; z{geECj-CI^RDMRGL;WrW*Y+?i^X5L+nxb{h{xfV*!_v%1|2HKS0(8U%HYWLCLqch>MK;1cvh8sN>bt1^sWf%9A&|Z}$_(Uitr;gZ^JYBUfHQ*Zl+9>qa z=}Oc=`DH8LSB17YAt^L1tasZ-{_@O(jb$)o!W10GD5tkBr-dM*WWMqqxlpxtBSpXY zwkn!QSmt~NYnEL)@ScIcQ9l6wK(-#Ig=8uCQ}K40O(c_co%An68W>K2kq-D_BLGFe zgllKetkA9|f4irC>^?R`$62w51$KNI8l7j|y}&tMib?la;|pwL-k|C`EciJ<3e9@{ zqQlzK>s1<eG+B0_?g8WZ&t+GqPpt{y z-@j3WUdV%|Z}f;d2mCI{aOT?#vnJU4`A;AoPG*~`?n2FpUb0~!6qM67X9RIVIUq($ z(@q~H3XUL`&Sa~~7!{X7UZ-VQe`-F$JI5$oY>jPKM#E&hm3kcrUEyJAvP?q*u<-sx z3e12M1u=k0-n)ZU5Rg*VrmQqixKkjhyjjK!xSbe)0};c%BJJp*zl~JVge@*t2C}(wc9A{^)4!E?s~2?E@-Uo^uR5C&Y3MaKHhEIw9Ho<6PKACvrkzM z`EGan)lHp9Q`ohU9MeYcHg0H?(=I4^U{C%YHv2TDtkvv#7)v$y^`fl0b=CP)pLZ%v z+->x@JfAZXtVwm~)N<->tXo(0ZsLOg*IEQsD*4kw@>^rqhwRCn%q4T&qYqyaDQ+v) zKrH`4*By1gHwMH+;*dBevtW=ZZ4O#fOQ6^+{zoNSM%m*Bd69(59i6K2%*XhF$qM@c zCM4Nq%K5k?oBDdNG>(1znq=P8ScNxcEFQa_iRswZI1Ik{p{eU51Lci{UoV!K>f&+@5uHI5k=XrL%Jk*Qj zg!C0UsL8orLS&gz4=*`!IY5%h^Vgw-(2I|F5kHby1a%26Jop>B9aW4Rq)Rc}V3301 zpMu=e=*qoM^R@D(H%#=p+fFcgTHf>)W+u||rmL^j z@}|L+YzbF!;V8Y|D&EOgv&-wtZ}HW%d#lHDQ>K`UHzh2GDc=vuwHdH(vXT7@VQ4TP zPos^%-@YzWpz24L1nnSF>Ld=~_j#-TVO$@R#lyViUBB~)#Z!bOUB$MVAsADoEioNFmViyJk0cuDs%S6ju_Eocxr_j%2 z9m8ImuW;s#%eCi@uajSmCa1*zEAp#se*PQejm1oqP=~dkEHz=@%-dgy@2<@L-T|Kh z$3UVe%Y>u*)m^_ZJGc}5y9=K4k&uXQ!~>3LOU#qqgg{Kjhz_oMRt1#kKb-ZARG+ev7p z9kp9M2XP;{-}86SLEUHqefDfmUp`)3M<{Vq25`OogW3Z%^wrmA>Yh!|Cu-8AgNf01gB$aiuSQ(ZKX!%_duzRApmN)i>^hUTxPPdG@|B?89 zyMy-6yk_b9#*9Dm4ZZMex!w>tczoaa!zWNeqop|%$cdDiubIzKG>2x~5X(C}u4A!P z(^Zi_k|HNpQQTOH3t8La)zUHw>6t2IYNn8vjx1zsRv|$ODRc`7kOy5Vx9*>J$QI9G z60wOvXrryV2Z>^&1Xreh=*KUCW&-DAxBf^ys%iaVr}LF-J?Oyi6h`(z2&-R>Et zdnsD}(#!9pdihGGu(z-8I8;X6+hoozOiuVI>eH`n|0G>Qmo8oCn+oo&Rihdb={F& z#KCh1APeYnhPlmCKz6A#FYeBP2C}~!Gyj_acP@W(RI#FjphnJx-M+e5r%al6Fn+&V zmo%s4Vfu-^eUhs^#a`2Khs zeahq*(;-KK+EZ)l;tnyY_Jir#w>rO&vL4stGm1H6-xf6hYN?LnYf&Io4b_*zWbG!g zoKc}oUKoE5{vs2Pl%>g8r{ec0cL5;K3}%~w)=;uB(Y5CFHg=`P9i3~o4y##RQ-76L zS(>l!?W_41QVJ9L_aou9u5`_*#aVjcNkA>8e<$oL#j@;hQQ zA>7_+>d6@9EZ=23_E#FlR?XSb5Kq;Q;?w!8{wb-4xv2-sVI2C>SUJwS=Ej_C`6uNh zF@l8!AGG>jD7%Q*>V#>PrbJF00typjSGPH}?;fUULp;^Rh$vE8g*PsDFpAC?G&{bL z(h6G8CSOzDBeh+2#vRhJUQbmZSUrt)Ih(c#z@^XY)s)~!(X=nxagQXOo?IgOQO?_y zGC0l7%Rj~^Duf#ZNlO33X{N@G^HJ=4@#=x3OoZ0-{i3%~WRs$i(>u=n zZppVw$$v$}mI0WweEp&ys&Nhv_85l(?$-fa-@s2DzE;P7dwyyRHa{Sa+L!{N zL^irlt^CmJZ*jk4?z6#tE^wdo|MZtXU-()%U(O6&w^6rd zbR(kTF(9@pV7&0%s*_wf&~&0D-xJr!jEH`gAR487q6G@&WO7b!V_*8SRMXg2Y=&Fp z{t&CF?1hQ4gt`s#DJ`QL*+XP8=>yN_6VI9;p zdQ9hb$S_ed;9vftQ#Z)~^tx!I)XzCj8MKEIAtuVDn-cWiZD=i*-dfIC;X%m%##F+%?*r=Jf~bOW3<=#%T)}?igd#H&R{iod!7FvqJw^u zYY(CY@--luxU=h#PGh!YmU=9`g-5g&hSp<6T6i}KYd2Dk(JwMr5=3hq0ZGe0*H~Oz zK&tvks}66_;qyrnQ?JS&NicfvEy3umw_jnOI*(8emp{UEEhDo*Mg~8|tgRE(wJ%Y^ z34XvOu%)z&LBt#ZF_ddBALG|a@kP)@(Sg2r^-`c=eVW^-f zWNi$v^axW1->jjXLsms+e4SKvE@YF(Le#pdi2-h|-(p6G<^(6?z7+7b_>yhGC3?&JkXdZPGGf3Dveg<6ed2v+(ss0T(kr#j?Ss>ka3AVmMBn~GSVwX zW0vapOpS$3jY!{3D3~1GvGQibW62|DBBKG>yBfMi1SVeBxHpnQGXQRxX9Av7& z4w5Ml{lfx@i)`XfXN>5oyQK(xU(P2uc;^@61j0{};$AiB?OLF)N{r!bG&rH5v{kF0YfFaS29c>Lo|Infm z9-zyuyoI7q>{5@{+IjdI)V4k3f~qm5u32ejRWArxJ44nxA?t96armP5A#7Y92w8hW z)(&lUra>&X;UGX7Yubw(^;lZS(}*4CnWUBfI@t?1g@bJVMA z`^cWlSI~NDzIrTLz{4m}E8pl5X;3L~Ghx{+Dt>mWdMw?@BWeq_&=!^JBOeiB&Hk8Q zW3ep=qTY`4LG#;rxXs^{dG*j{Mq2uppLs1z^`u#OfN--FyP-|W_7DiD9|6sgbKGEB z-=9~E6A$K*S~PP&{x89~1M$+%0qf+Lc5DMTLvAz{tL6rpYYU|b{PC)^%Xp5xjII%W0{XndYD}&Q?>pX@sYIoAulG-; z8xy+z-1M$ZZh86p$@2yupG4xNp0^N4W9003=wrDLHw0yfaD7e*Z9LjO)dV z-L(i9lK#0JQf?8-hzi=*(BDxa1|8*H;I*$xic`6ny^$aU?TgCkNnk?PUkAOP)04}j zC-d{%roU3Cn;x*Q?u67t4D2i9mD*ov=o}^@P{=1!%)HB z{ak~#?x8XoFP8nJ@lEjnMXTW%=hhLjhj$vVPSqlqMBzKi8kZ{n0Oc>F$AoRFur^V= z`SynaDSne-U7?G|s-Y^rIlja2cwQbXo!LZGAi0XsUq#_`K+r;>k1jvEow|9dwQ^h^ zC|!%Y96-oSt_j%{Cv*ZaWsNS)s5rqZeP7}Ww?AC9P+;fz_|1%f>Q*fckXi50twpy} zcLqjg9ofJ2jKwkg_YMt`xli}6i}dee>E8hn4+@+a$EyDBkQ~E>*~AU$ohWU zo%#kzeOSEoynKP_klEKqJiAf+>BNiDHfsYFD6-ZOnL7iuC?nNIff04MA60sR#WB8CY6c!w`_^hYFGkY6OthoB;K;c$3fi2M$kw(`})GF9nWf zvsI~a)@y84{23GxD#J^+(ylxsTnsh}Mb;U0`Q$h45r??VdT_wHpoLw!XY%zx>ALD|@eQqKzBJYm^1Iz;Jzn=3ql14 z!2^c1fgW=kma`vP8;WeIUKyWEV)8F-qp1Vd`5JmNz>p6W);_^p#~Cw!Ca`RucFRdT zCUlLO-uD>yY2b_G7S*spy0$*?c7^a(H}1&CriR~o)7SV38r!S6U0V!#ZwXrKc!h=^ zJNM<`Qi=73nBS@o&5z&1_;6cNPjNcuDsBstGepj{ypl7db2j3DE^#qLJt>Jy;0VC8JC|I9{A3u6(s##l7g}*$2)X)jCyyM$=hYHVHuiupO zQk_#a_P9u!IR*tpAjkD#pdK|#OPC|zd<9YQ-vcWd02WVcQRTNGIOI7YkgB^v zM9PbEt280%p9@=@Z!8YQ%mUYv`7kkm zS2zX>`;eEKYEvY@0BG8;;`h@pjD)n(P}=ea4RyyBGb}}v7Qc=JO^V*|#;;KCLW6kY zm#K{D!EFV(LIw#Dv8RxTjq*=&tx!5~TZLW>T}gtOyjuf;q}=y)mN>bUa|yIm#hOY)g*W93wZ& z+fillY=ps_r7~RTd}fax_f6tLz#X&5 z;E<)#79)Hqs7Mo|-uO?XHH(B8_Qr4e+MKvCmvMm<_9&&2ket)(hL<(!F5{35gck!{ z&gb}-7FA=rrAc;xRUN6p3N{F9H)A+8Me@iV@CIBRtQWy-17ZV%-Rk2|L0rhe?+Ehe zat*%0!_C0%$CF=;FC;xa`ULX%A2A{y-zx_fiN}kbD5d&vWj}WeOV|_FI3is27Vis_^(doF#Rfa0ZkKZ&P#L zZ2U@b7e=@zJ2$O6a_Z%F^*3Q#pQ?1;H2M+GrK&)9KP1P4?AaLL?2{P5_i@G}ckvCh zk17ByUelR@8-Y37wnAS)t3NuS6Vitg%!1{I3RVP+zrK;5=teH|Jua3~qJ6%p`eAPM zGSv}|*u>b!UhI90jiFG{11k-yjk*UIeju({32;ac{KGQSi0``lx=PDZ_|jA0dMVrZco1p@Jr)(ZJ2bx@ch507RCb3ndr13WFH&2N|cYE41Vr3+<9A zG}YI-9LBU}sbV0j9(4Ir(-lBu*i`eMvZ=M@3_0zp9V}1%n&Maq?Z~laSm@V8{1-n} zdj9q7t4_36P$Kql^kl_lZ|KOYeiM`qrA3fILiA!HH5T85qMVW^eMbK|WOiv!;O|5i zBw0i=KPHkO6z}KB?&-G<`obT9YCa0#rY~5a0wEVwTwPKzqEN4pzsbpq;`$fPVHJ3^Har%XuB&?yh+@uy%_%km7v{< z%v1;*l;j(oe0cgamDz%smttY`p)&A*=Rh_1=e~S8qXC(D!2o#DH{x$`3hsh{QTM1! zotXEFta9a0MqR0_CT%GeLdK*;f#{9!CyQKERZa-m1S%!+NZ}BsBOVbE7eo$bAMo7d z+Se94-b*C0lE7|p*1xhJNSC{hM&wU0Sc!RM8e zp{k6JIou(39Qpcwu(Y`P937PF1g&YiDy&KE*0_Ty(Hh2{fpvlU_$}zdNlBP#lYUfl z;-IYRIx8Vb>9zETL7O9`jkfwaqpb&>{E=3bQ#jlj@1SRgCt&z@YxWotriRQdJD0Kt ztV`9j2UVsJ!sh6_+a>9cdE=x$p#|l|S$USK?-q%(AmF#;1+Ae-a4FxqHlK+bpAW-P zm0zTcoT)O>A}6>ly=GH&{aotuVvR*p`^^#A^JI>IPjoGO4X{0m;rb+G{XNl{Ah;s- zhi2%zU;&V_wHS3YXy%2d(}= z>vlmDtwHM+QRJH?Gw)thz?t^a5mTJjB*%Ds@z)rU zZh)j3yl2mo=3+LIk&3I`DLTELa|Q9R02e8p!LWGHzArz~JJTY8*Cy8RTSna*^d%5} zsNGYwGZ4MZ*^T@tu{C7hc7m7D&03=I38Hk4okR++=Yn>?deeBsqt^cwhNR5y~2haSfl@|L|6sAmon6u+Br zWS(<_IT%>B76}H*!aiB$$6sN1)VEx+lwJ0dfc5wI1?h6*ayLeeozz{`UCxOjgMfTB z3?v6M1O>B{G>*{-x^&yrQF4el7;ARm;t$Qn5A)ppiYq+tIeiz)pf<7LRG$ftpB~fC zW3;{-U?_)Ir%65PZaYi+2z==!j?gh`!3!2u_%ea`gwP}KdP4psQls5^@u zQ;Ncw^N3Mef+6p_S)hb&A|n+)K?rphrLgTJleODDY!5;EuEB#s%w{q1oE|hV56BZD zOVkrK#CY+!mw3+_e72AHihVMJCkotQ86v)jPmHsLtS{ofRIkfJ*85pm81Rs_KK>YS z0#gipdX)h!EB855E?()*??KIFWVw?Bs!~S(#b(~ zr4;WH!{SfUU4m1j!2a$aC1u6gx!E|xaPNs*I)!X}sHcDCtVFPvxHD0ixGf<$6L;_< zkqC`8JM$%Sv=kUtrd~Z&J!tVpX|XL)IVx)U9M%F0w#Av26^IF7aZ|g%nLwau@%#=t zNYcyJQQPTI(zh6UJZeL8PVg|KM{U>VkP$|_YFVl~=c?{(cdnu&&Udar{h^ZoU2Vza zWS({WOIYeZ6_@({zxhm+Ep;FHFKv;!jto!L|9x~q7Hmfi11*!wc>b8@Nlr3Z%>N(x z9>lYWuyc6k@LWaudX!TC!T0xgF5v&iyOPPLp|_uNpYksM_whX)E#$l4@QR@t?}C0? z!gCnU|K_;{CCB&qU(WY3p11IPnr9K|Q~$pvtcJ83Dd!p9B|NQ<@vqsh83(kf`y}su ztNSF$m$MIWI_j&{?rZ`3iX~U;5cs>8B~IZ&NS5%b=_N&8>QMh&_c`Asr532~=!{9S z&4puJkGcZ-Vsd|0zM_v%Cy_;N&7Pwkk-73{j?Cwwa>^l)4dWXfZU&<>go+77A9IMJ zfFcrMHHWtn-mJ#jErJCtTW;_(iI9`QpC(q+sB4vh=g+qjAqP#8 z!^Uow6)ES{sUzZkWCPWC<_i=>!nM8l^OYObP1{-p)LanIvqLAH&Jvt+3BqLj~)(=6e50 zij$4u)GIl8b-ajV>b!{VtEO0r6qX(MA*jN+suS1tg}lmYexVG7kuI9}N^6FD|(dUchIyBUVGG+r*g4 z5u?a2;Yhz19P;e$HuC$7CxDyxC=>ByteqRH-l~7Vc{54GEBn=C*LgM{)Wnrk) zG3vfYHa2)jYCPWL_PZh)>?eDuP8zvg0fK^n=ol09y^-=zTT#8P6lhm@SLQ?6=yOv6d7xK75#yyc>WYx=QJ?2oNsh zvo9;Vo)ZSWXnGGPx0$7C`C*8RY>ats-?-d6JEDm{{Xxej-l_V8NV(0Z8=>B5?q8%a zQRQ$k-P|Gnw7F+wHFup#o!!<4Wy+6gs|>Mj>p!Uch_*J~AZ=9>lbZ1GzLTmR3hyhD z_C`cpNqmtSRizJP%*dCDjprkRM~EwtN54ic5<%}H(iB8fyHqfsy5kj@Aw|eh=_6Z6 zz|ua>cyUawv3OEvbk_J9EK9o>>)9q$jK!rI9J*wgw=$jovYFJ5!A(c&kuy#^Ng9IOk;+ZfzQUa3NDLa8HZ?v zz!R6c={g(XE7IxK9<`308*2}-lSDQ$Y(uX$B4YAhSYtkwjQI-)*Z62S!ae>L(277j zlTl7|AX?YCRRh#uK10!GyStw<1!lh%w}?4!KTY)SXKI3HTwEYXq%r(6n@TjD=f*#sqr>WdrqGPw@n^UTE@yV14tGJ-EY}u(k~9TE?< z03QPhaBQZR0WR(EK>5g@AF`^^XATvHtclnIxKYVfiOZ6!G8lp_5?B7zF z^JKc>uL<}@=Z)b#(Uq4;@*8|0&l=)CHjqlK3reP}o&8B@{k+KpR!2VKyegYVMimC;HvZk~zU`=AsFb82z#;j^1 zgVt(_7`IV%cy}N=sVFd{|CF{+)GQ7~%S)h|6%=Y@8?aW5j#d~*V=Ih8d2>cbuQhg! zwyrhuM_aiDc2SC|>O;2Axnf9_(Ta)8$!`U`?QyZ6$gm?~l(8y||5o-oyW4LLb@D7> zlTvpXo189y2=a{ZO5prCS@_83q;eOVgTDohv!)dq*JPwK@i!o2yDWF0lD|CMJtcox zN@31M206Zs$`WQ`WTHZD)VSIH@x-BI;$i|sYWG$#>jDEhXc#*pB@|)DfzugQm0qEn z!=z`SVoVD)Mnn}^DB_po7QqB|eALo*){$08E_-@2> z&0Nk64>ALe`;>S2e}V6mKH-u4ubhY~8yuZ+APxV@>c71l8_;+;x~@N*++Zk@kpZq+ z3`HO1@fcGV=(qMt``X6bkQER0TMMhXJYcO0^;-?|(Cn`}z@W=$8+9);BN)fZH=|SW zwz>F}iuxPhHKW52JI8|2%L38G!ZeSzPhFWyLKwEfP;_KT$cq;n#n-~B#wdr$(;Kt$ z&7FnHaRGv;$=v&H(7PGOCn3uT_1hTe*K!2QHxfg;o#Z$Zdr$kk_mv)t*F%YrCaA;v zx6s$De*J|L6DRy_2+ynn4h3fC8^e);UKpH}Dg3e;{1P4lcG(3ix+afI zTa4;XVe=iuq0I!i?FWh>Cp0*YDv{laC>EFO$)g5yo+I;-g?I37-w7H|jfl%rgNNbl zs3Twph2b1sjFzKt3U{u8=^R~Db3aVy@$N`bnnzBOB6kWdj&gJqy_KUQrD>xInnpOv z6}fQta}_8kk_WVj*)4Q#-nAkRvg)#SHh29bPS*S*SVxu6woUb%y*bt#4 zAU*V%NK1SKxseB8Ii#vO+&;jFluEP0(_6@JfxOz&QI^-0>GcE>{E$)$lU@gtZw7QmyVVS zh&8fn#EvYok*L!4~8d?~O=Q{;ms(ADzRR}`2Ik>BMLp@@R!NFlFo zsDPFGD)`tk^lX6fOn!-N_h zCZ}AcwNDfe)PMx6gM$6h(sM5TotP8D8J40I`=w~bnA7=>LI|LVm*}aJJLgj!Nj16X zw+=~*QM6OU#QC&Koe*6p_1oP>e3eC2Y;zVe!n8^?P7zEI#^3q$awvmhf!6SHklj-< zo&bytCP-V&u{BTn1@6}UQgjfYrNBc@qFvw>zRptW3+(?=jMHhHV1crG@xE%>y>{lM zNRo5rQ=DCv=*pqaVY=wtFp@_6PS%sqA)h&y7b%FU9+bG05KJsUf25|`NI@Wje>&;X zGfl)IX`vhoc9sYzkIS&rl6}9N8~|k(rbw$#QT7X_T@GEuBqljmy9^oxmcGvTbEjxE_F1e zX2v3YK7ze{ZNm)>Rq(CNsaVxtureX=1HLZ7fW*BQ!dJlqaLt#QTP8OKtj)|ki>~Q7 zK`_;4$XVcNe?Q!b6$hs9Bu?V<&GaX%K&#W0d_nvvS??>$ZrWscc7y&Mc#s`Z=4b6| z-wGbCd?tGg{tbB0PP0FEZvA%kZGQTHS)UvsN&h~7^;`Ato`1hSwo;GpC83w4zS?hB zUvlpMvVX;HeLcQieZTnM)>q=z_w>?lHJ+y*U7z@;(D&alrjHW{R!qzpK3}aEaZzz^ zF^dI>;6#*&z?#a9!IV1>C!4U36#1z7&w&-XPSC(C6@k>rs@6&4Q} zOz&Ibf*dAE*SMOmoo!eLi zDf}iL+`?_U%qRi{{0W|p$~4SH9myEHXr}VWaw8|g)fL3;~bx6 z=~M~6pu9xylztYHsqi*v)TUf9D04|w&-uAkJH+%%c*|i4F{(e6QhJ__r*rVROH&ODrCb9#?!6T1S*&JX=i zkhYvZi(6{mTpupZLy9y>daKVc?TdcWN9JJqXG^}I4^B?8wr7*z>0JDhqA7O3M>0#d zA7qx6N}^Z)AS6^~190upU{zcj3hv%v?9=1NAx`%A9cf?Q$(wsP=`3pys$1drBi8G? z$}frRb1~=9XWdoHK6kb(T{LGqF5RuZvHyPgpYHxklkP(kOl`eN+1bBsxu~IqbIWO1%7jYBwzFHF*yY&k$ZgCH zxtCLp`U9As?tzLC;@A$3upXB{<)8q?o3e-0*O8u}`tK80wt4aPPRbFMlCJ}zV#6vk z|H>YR@+Snw1_Hz^EQaKZgZ5eC11>H=OM1CZ5#D+bt!7!gCsy@QCQ3~EDwa5YYTCr4 zazK$jP0rjUhm(oT;eDM%SHL}lsaHN2TEP3h0tHA ztfXw`J=6~Xi6+xFGm5NsQa%Q+yvAcsONMAsQ+XkmwI3PLe`vDmJH#Acy*BaP%;Hh_ z-;6#`;@s1fbt~~N2(cD885=Nv%5-eND%CZk&IBq{)41&YXwbVQxkYy@WUX{oymS~g z$~ht$LiJ?U?pWF*{tm=5oT3&tJSFQ`kO}p@$FRs`-+VlPG3^h@&`%&5DA)5 z27*DS=U$1`wAEALXErF}nb91Sh^O=oMkgS_d>}vQgPeDvNI(qNCLdlRKiqBI@S2bV za`N#Q)2Qr~trjXAH&CB*Rz2AacyYn7hOE^q<@)+d2z@-{O$PgHVFfEoq-qJ2t_>Le z6*Nc*{FHZ|)B=T>O@R2jT|f)9RTAk<|KDhPTbRKW`(#BY3AV;QnPNo;0!3nx_OQXMq zJ>lf+Y>56h>g(^;*W=sO_lpkoWeuj@?3lb_Mvxs;M(_n}aq3a)!q>xUx|I`~p&)if zE{{3>$vwUsl+mL#&OjibBfMtzCv1F+1uQYD!nMT?DHX@XRzZjXzvC zESB41cDGM|K~ZWD*yRLfE+ueny7w0y25t!Xj>Z|E$shsR7tJ}^-kdoghK&pBAI3B0 z%rEfbAc|A6`N?06pJh48ddp|M?Xx}~uuAmnC@7V7y|o5A5XV{5xufo1G5N{{AzN^~ zX1#Ab6P)?B^{&rqQDN$WXwcdeur^7IJpI-?7#KnRG#^9n2wQ#DIw6Yu3le9-amRn5 zjsX1gr4{Tv3*2XmJpDKkZv3!#0D5fF(3*g?QA%ANiODt1svf$XHH^LV>45cCsNi+$ z3u{-n&C5}P^bPB9xSg3|MGz(UrCF(I|L94Z!AWylc zaYy%x0^BEyC8x8wiWVqn@mp~$Gj;QYx0L$|)@t+CWNO@zTT!qYIl_D{K_Ux0$#3oU zNggr6;>!c_IQdzeU|Cw_NKYsPyt^X zeYI^8MUze@pz+gF!`pHL1-mP(ZH=Fv5Z+eIJJn%S8mZsefr8b(#+@hnYCnn*6ew6x zVL6SCLElsFg=cw+Q!xaCN-rh~ZN5;!8zfc^v+dmBY=VK>HJ(l$&t7FyuO?_z?D{`+ zodI9NTf;#4)xpt~hVn8}))J zDhSkt3aY3eBtQi$sK?B=<_|Vf4Jw($2xXAx%cBeAL5Jdy^fT{3#C0Pyl1I~ z8*yRQdq1|pLU$a3ozmh?sn)xFralE#m5uHkXOK6&-#an<{6Fc{Yt>BsE8esyo~>ZX zD~#^fIXV@V_Br?TApL)OKWgv#j|%zQr?o%Lp>^V&-W}A}&e5sL^(;^3Zy8@1*lB#F z&b!RDPvDJcx6)w&9f!U<$JGK}x#M%Moz4@KGnL4@6MX>(72jZew{&c!b3Zy4I$9I@ zk89t?(!P6lNSzpK=v8?A-n)6H)UezIooEZ=n^Fy?mDm@(JMJd1yy)GDWtZp!efPcS zeep%)hYpP4vEeNVV|Ef>G~V-K>3|J>M*>F?zf6OM*@FFV#AjeecPbRU@^I1)FFGdu z9B$t|T5sikI{f_@xO&aiN$}8NbX#aRNN7O%;arN^$nHj2Ash(nJg9Q7x;$pE9tyX)A7acjqk38;QCsxfS{y;_>;!c>XWT2Tz+YV&3D#0C zi`1CQ5qtlMXV+QY^{4|A(Kl_WYA?{P?RH3I^q%qG9nF3R4odqLG#8?K(Cx7HfI5o$ z)%Q=R*j(!<|DJtH=nC^E=${W$b(|27JRj7inB@!}LT{mRdiQ99$O=DDS~`Q$_@?pI9*V^e0X}kKGxYzAwHKx<7ys3HH?n{I<Pt|`%MX>t`~KC0o|r(=`>wuEzQ2Q=?X^ETgF$f{wqV~^rket z!&`5-hkliL7*|s`lkNClFIxX~J+idrCQdp_TPC$|S_^M$;T>lI*TQGCkghA1wmheWFKFRQTKI|KcWL1#TDV&a_h{i4TKJU~exrro zYTh>wJ=W$PiWyOEiBZ+Vl6Du!ZIza(85YB ztk%LBEv(hTIxVc%!bUA@*1}dTY}dk0E$q_5%Lw1}Ti*@5`17SLKQ0zn;4T`5BZC+p zyXb4EkuI_s{LQHCef2(X2B<_lUc4$igGnrCrrz9Uu#H4IA+# z>t0L>BQ9h;NY;OoMIQr>>>=wTvi?Zc|B&?#Ss`T6Ly=vnWW7cf{k6N1XUVD|i{8lX z8X=3`n(bO4z*5Qj4q0o+dX+3%c)9E6WYPWBu8+vVpWR#9wU?}`WVw+=KMl1jh%9>T zyep2ZIqauklBc$XX&Rk}TZju#q6LEM$3+g}*4pM(D}g zF8V2wk#ES_N7g4~9VF`mvJ%MpC0W^Iy-8LHSuc@wo~-R;T_o!fvWCgpOx6@x4rE#5 zggIhEmIGNU$aK^2kae zE1j(4WYJ%K+(pZFMzG3hX;(8@{$%x$MSuBm*Em^!B?}*>u#qpwGLrQtvNn~>!gpXxyVm2h zI&vE~oV%VO>pEG#C2N4Je~{HlRya@TO;#XTUSxTY6+zbD$x0>bE3!_JwTrB? zWW7&T2U))$Yly5jVBt&tRgX$xB8wIDt|Chm0x|CKZzsZmf_rOlGmPgmK9NFsZ zde$gQq3c<$!NzkvyKRsWdwr$cv7X&9T2-xQ5jIlrdKPSJle3-`*~&fZSjU=sk;Y5; z3DPeq^8R%!YVD`UIn*wWBf{DKqJS8ubrci3PR?G(kFU2XThF`Jub*4b>s9%V%DYs@ z|5XQjzUJ{A_}eCb-NIN5x60(G(0^KEDPj|Mc=)+^&OUvRu@G*6mBg*`I6wNoQqe;y zF8x+Mz}ZJ{Xw3-U>RI{EYzJJjS6M&K)**+bh+NJyIZMXTNEWtEn^=MhLhYg{S&*|46K2H4kDqA?B_r8px$ zZj>(>d8u(TV^@sQgpmi?Nbxp2!sg#QrarmEZJ4)$J1IpDSj$3{zu(o)A=Np9oV${> z8Gc9YyPmIQp4hV|w;JGVh)cIQpZLFzm6j$9X~MYGBxf^R@)Ed{@c-=3+I7XcwiPU9 z#m|@bzs}AuDzXJ`IHY4q!a5Hfs}havB5M`@sFh_E^FTv*h;ck!$ByVWVk=FzF43+cx5$UsP-- zHnY^V#+J?O&f2w6n^~BhmEUGoV6VU8$Zk5!33s-zTvdO>kxi@X4mh&J4Gu2Y!A1wK z%`9=_ZgjIv4vQ9+wMl8Ru$oO4UkjVx^qou#>$%T(eha&CpV4~@i`^_|Z|1$5^<$g) zoy~f;Exc=seqsxcu}G;F9(KQ+c0Z55|9>?u9V2^-O%i9n(Ytc?{*M{U;QCXX=ltg| zEk(S_pJ%i@pqiTp^{k&`;GuEX9@n#@qUnyFwdqV)EqX{V?OVYT^u{JVJEq6DZq-Y@ zdfu%^8~U0JP1?BwbK-nWKlt|>(q{CB-0@DkuI3*#}5G^|DM!nqOXh>KgX?ihdM-7Q5sX%{%a_KD)jPDk-q`WI z_Ffe8jn%Y4+#BCp#0Hn&u=2oe5B^ZgCFh5$hmhyY5A}7(CH_s#>wVMV+OWW4-_oCL z6WG98G9@Ybk%K4x6jaQQH;`BSV``OKKh;-u3M}ns`Xu1+&mHoSN&YV!+WQ0+^0xj! ztH9dcwyuNc@=Glf_g~p|p;@|qrH{t>)alo&Z+GE6$glNx(0<2$v%(o@{>|!El-BE= z2YV2g{mzC8VDh)7PBhZ^y9PhxIsYye(}ljb;V@!y-;?JdmAv;dUSGbiN$Ky)JhaE}<8P)4qzL%O zhA~{f2mX)k1>lGimveD=Tb;OJAF}Cp;!omaPBf%JSgWH^Ep>ZkR&H%J8II`#ibn64X1M-1;Io z?Zs^ek!!OzH$jNC&p^;ijAID3cGDDZbB#)6GC|0GH3Bh&2J+;Dsj33*_sm z`^4<$wq0P(e%i^yddBH@1UOQT!Yo%4lvicLB#B zhFiyjEiv5I6C94=bf;8xm`ek7Xw7(J26;4|TUBH0oAG=DX5s`cAI3p)P2_R_2GiL@ zzKRA%_z`Y<3=B@@Yo`#Ol8kdS3rpd8@|;t-+|eVjnqTr#=!7#cVuQ#+_t zS=`hLw>yhlH-i_lxuFIJwJV!4*`LErr=h0gaO)y4@feNhsSgxT>T?BrQzK%h3YKI03%MZ_EjLj}v57_8bR2mU6>)1f@MJN!?L`5? zPIE&rQWc!WKG56xOSmZ)JXFeMicc)%$8hl4%TYiyN zLux7ZY%Sk(0jti7 zq85V|L>D*8`y3pW&?4@S3gLkA|Av{uTyr&VkV#TqZrZlRt3=gY4`@^g@)d^&;is)5SL>p@he~ zaBioahIgY+fS0@ZhEx=0tcS0TLV~hhzNzbyz^?XUEFzn8eca>?y}yrJw_HY{`njnT zEbr&meqdd{)**)nxM>!fIbGq_GvLG(ZlK*PT%o<^402OH)S5wV-3ulTEw|$I5H}rz z?>~&pzlCx8jB^!$M17%!?rxhT&qcLA5bl^%lHi`Z)( z%du5nf+-!bPTqnvfT?P~w_xl7uXqb;Gw8cdkWYX|_ARID0c+tG`3PzSIN&2}rtMRF zh1F&7o%{s#6s7kQWYX{W38o2jtYiLyG~9%#$6qk^fCmEvwH-ViAjn6Mt}|dcU2vda zs)s%iD5%w7*nVL%ZQr$DSX~MKSdgF=gPlQwO!|>v!IoOTJVa1Vpd+`32r~J1zzDRY zN2s73y{-eodOBy^J}B7Jr9s;vp^MYC&xr^@PnSDoAe|;VBLvG~Bn*xeEM8!7q@Z1% zT!2p(40j@hjdWEI6D1hR;Aew5V0)BcX}*C5j20}>U}3bNr-D?1)XOeIpThpaVvr83 z2aCbEnB{a%u>$Vsf^fr6S5~R9f+YuRi4|n>2V;eGbgrn26Reu*Fks>Y1D%$qK$;(; z4hxoPTuZfrEnq;rU^xw*iWdxY5^PBjY{yW`=>%a@ASSgliGpntny)BHsM1b`RmprQSZ2A{c0Tn@tf+RE>dD!S)O$;-oY|I~QM06E?ZxED(||*p6bN zs03+8L+Qfm1vIBuhG3J09hGDV_maNo(ggxS1{0-tUFh*9mZ+==yAceA9TwTY%hb6d4iq}Y<1ppfwJ=jTPK>K@&#i& z;!95mk96aL<@iZqJss!VQ$m2Y!|DRTSd8f)vrw?j1#5}~QxYc9E5*Wk+R?yiVLk0= zv_x1>JMt|R40M`yDHGOH3nY{Y#!NJ&XSuMRS|FudFwzuR1k&7=ULmZfeD|FZZ1=%W zJ|kFD%}<;Wj2^gLY&x^tu?j1N^%P%FC9J1{U#b#}G?Cu`eNi6wYQacXc!xlmqBE<7 zl{ER4RpZE@hc|;XqqLtD)-N?-zcqpbjf9>W;XJ3llT#}gXsW3IX(DI^oiMo!*9!Jj zAdmBco?1K*q!tecsl^gNYO$l|1tX;^gHH`p3sS?hg48fQ=Y>`0(I;=gr-oSosX;vJ z1U)stevm2{0a67MK`Lk_NCiDvCm5-mE)9a!Osl}_8_+P50v~A>OgR??UeLPi4}uim z-6mvlO5ofnq;pDBckC^{lz}cydQHQFW~9-!|=^}@UzxoS2>G*HWnA( z#m~P-QNAxVb0550zxC>d@=?xCzHYjScMw%OObI~E&J7*IoHf6(As8rl%hWi;S<}x< z2Y~)xnED1eYy0J&n~>+JU%xSdJN{;Bnl1HaDJu?32Uy1 zit3)_xC&umwcK&Bg|qznZlp#kZ03d*6rv7(1=t6sg419i z=!t8vIqW8+g=2|rd<%CV?{o_;1@OeLy@l&3w?61p*7+75=Sa_!@Yw4XXCE;3fj;47 zmV^24WfrWnt$rC#GOP+-W`257lJs)lODsqK7BufrnV`b{g{m-#u56N{evC|K|h;;|wu_}Ctd3`4i4VCh+ZNf_|>=7d} zo_NFt38%mJcJ6bm|FO3No@1j=*qr$Ro7x)AFZ_UIY_rMz0ZZI&6Y>KV{HuzwoaPk7qtB+1pq)X2b)YKe}TeXwTw)&&n_a%I-Ce*|Uaw|H4>} zwXxftby&k}#B&*Y)+^UyBxJ04ZNbEDt$7?b28zuQd*-xu=WP=^yLK02*><)r_N>A# z7@4-2^hnoh(j#)v6szrqo>e}~!tuN$T(&8-WvOy2-sm{3db7=z)vkIE^<8b-Wy|7i z^$?P6Kcu43HtU%uMv$j?SeGENlzVEC*_4$HYt=yn`z+MO2ZtI z+*w(TeV47)5_Z@dA`vxc{{&-)9Mmq@MGn#e5NkGs0~uz-^qAF7*lz2znA7X*THtl9 zlWqg?>uq{~>+7vjfJD{iGH_f?#7OMiEaT>lEo@$O4Vbf-O0fIp`;FsRVRq~OmE?sy zAm4x&`@js|vV=XhJ{wN%W5-dzk*!8wO0aF^5oqVPIRpYh+l}+cDsDTTSNc6|GYC8C zX{^&c_>4_2?Br*haX?dEe46%G_=>3!oA|%_y)@)=?p51ncpzV#Moh-u)fsT=_Sysim-qT1!PsBY z`EewV|C<~ST>hJ_KXBu39Y|mE4_j|Io&RH?UXb%o0~Mq6p9VTUb^rW6o{&3nn^VZ@ zkQ2X#ygb~wZQF6U?z{p$<&r12^+W80CyzsJ`@OmC1l$B~-iR4*+MnAlA+dJ={}vrC zfZN`I7Zk_?(E4$~+}a0e=YzSeHy9AYe}ktQA-La%ml4WsPlF|)9P=(q5978|*!FZ7 zUxZt9h}%rSJ%5Ooq7?p-e6<^D5sN1!OW0@>yaO&oa(V%FFp1laA$3|3cSRMBrgED> zxW%bds@yc(nZv6}<4(xADjj!?a68j^5*}PS74VJa1)Rqg@b75%{Bk$EHarRV*VM55 zE&-P^cxPohg{xxWVH#VJIv%FOW#g?KtW-!sb%*qZu^ntu?}MEztuWQ>WKs7>u5Ykt zD^vPTj5x9*tiRX26O+ghwA~FGhbueS;Z;^pQdi;iM$;;X+8xYoH3_||?W%S#FI%z$ zZ4r6W)>OTdwb@EHce1`UrqrFxQz84J^3H)b*iCym3C{OHNWITAw}Um^M=56Rv+Lc-S{xN*oUp~< zvx8-CL6t9WF{STd^IN34oov=(3fsZL?kC&z0mIDeEbsv;kqx-xs%mBJT8pvU`3D85USm3ns}YfZFT36TAnhsz0MY%l3;sm z!^WB0OpULz%iBnB*=~o8JGSSEC|by~jU44{dhU;KW}g2MViI2b0LsuyEgVkaE0}x} zUNs;#?^OdDzxq`J8m#kG1EqNte{pB-Rb#wISdO<|-@AU$P?EZfp-*l+C?+Sd2l1(r!>{_OP&( z=Da<414hb?m2&PLcEo7T+{3Dkq=ed-Q}?hu8?wjoPHzuOS!Isj!)jJZP<&V04SdSZ zuQoM(iU7O#MHHM|nS+Qa${EVGbT4_|;8k9F#9?4am10#bu@Q=fqq4qH*Pk}e9pQzL-yKYZux?x zY@rO}EQYDi*-;DRHjBCb3wGN=nM~Yoxb-<(xF2%T1LkvIu&M_rlduQPgO2 zB8kt#=F%@%`opxN`G?K;u!7WE9-Uf(yI`izBs9|bJ_zWK}^*8P2w^PV-A z>|t%sl3n`)!->yW#}AOiR(x3MeMJY%rDsNuZ^ysu$B?u6gWZc3ZQv-;+l^W<&3p2R>$A?@Ng7eBZX~V;1&1)47jX z=I^W%K4x(rIM)4{HGJTB=+A8S1Jl^IEc*A3C%}AD&a7^CIuK&R?bT5nkqvNG-Slu5T6Te}Le{{U|H9PvDWA@kV@`sMm zUo-zdIr@CfivQ$z`zv<+PmU#DvHc%y!b8rF3>Zok9~sd7TR$>j%nW~IK=a)B$bgRJ zyUT#%7`@AY*38&t^!bt%?=mia!7l7FUjKsi>@qg&VK;Uez4tJekBzgRvEYx5bGupH z$JeYp{+pM7CEfap_kAV9p8HDj_?r8FEgkxr$9*lOf6a5hmWIFP^aSQ(=t&*n(R^8;J1a%$k-;tlW<5TDuZlIQy!K`xbUm zH7;ysH&xTzW)`?Xg;Kdencd9XH=1TPv-pjqjBhkeZDxL($nM-^y0sZE?IqZOj*cfS zti;hV$-?>_(LLNY8<2hQW&`SUc(Vbe%-(G5Ly0#VvHqZ8GtQTNn~jH2_$`lIx9}8; zlxyLI7HP!7TP!k^UJIT+{;P@6#tHB7sQ0c2wiiz8@s*TKC2(PdAw5CQGOTRL3y@8z z3p&;<%jMHLmSNab473?GlbE>DR0wZr<)(Zf#i)rhM%&}?YHc=U0n;`zrR-g0sZ>31dwB=i8t)z5O`T8 z)emSlNtANRzF44wdTdZaee|qmgLKIS-bS?@NZqKCII>Y`g_pfaZ2(#}X=22EYAw9V z`(#Sec;8XsW$CC9&V4T!oi*zuF00xL+bM=OQ>|*L)I;T`*&n2Sn0!t(1UuG|2;z$Rt%kg)KCE2c+7A(OwSe{E2DnB zRY^t;(}jRNo;&sX@wX5idqR2zoLl?ugJ&X6~3w_0t2r~l+yP#g<7rVHRTXI|JNl? zWLERKI)EhCUsp-Y*r7DTo7$n40*7{LV*5@x8(!EOYAkU24T)0TctZ&Uj{i_vgm~kJ zYBv!2rb=S-n@S_R$hXu&pyVx0TzX5+gjf6{H3As?kwht@eykPA^(RUk+OO&-(iGxc zf2wu@M}Df3IQUbg9^TQPsrf+b&mT%i8fDrPw~Kx#@~}VAf~;qmI4>v zS4s5$ostKy^>=C_aOZcLc=7`|9Nz5@R39Mr_Y$S7{=FNgBUk%hzhf-z59-x;9QHrR z?rD0~`A4+`p8JQIxBo+Qz*8TpLy&qulqXX4Z1hiR0ld(UG%x8Rt-YOgDJ>{n#V+X# zdb!ibY5|b&u}Wh9$4WlDv`^Fw;KC=G=>Msl0`L5%Y78*-sYEFkX&K;=-KuLeT5Y!+ zj^bSWOdZ7-blIbM*Y_BLF+S(^AYH=e>J`LX_*{!|`$9>uL5=dt%-hrkuSrm{fpWNO#Vfpl!1TM zdPwnK6+e{B;=*^TW9G%Esc514uUNvMf)#a5PbjD_6asw!1E?er{Z8LLnO5xD5(;%liJ9rWf(Bbunon@fpK@b_^w z7AyowpWDZkX!zwmTs;I1futw-awQD@bziOqfkA%DdV?Px&cYA&=c*4_;LjyWf7YL8 zYbTI9fgByTgO-_~7@m0koP(aZ56euV;Adl*3HeD_QF;q)bu5G$qYH~p4pQpS<=B`5 zT#3O+sRbNG=22l>?Ey=}_?x7c9pvg2_}30{nf%# z;yz4!AnD$bT$zF25XsdEa0(o!bnA=O-)A@6_@7>mVcxzy>4>G>>ITfpcVu9AMK24fR`;yJF?foDO|y|4hK z7JgMNSF6A=ko3&+TslMkd9Id#!F3qZ(DUoKavsNf4!$e;XZ{7Q&Z5ySf~1Gnb7cyC zUp)SQIpKsS^53 zGgnK&h!(Dr-r2&H)9?>tIm;=qrj<*i-)voOkE}MX_`#oSA@Xb ziG_c$12Y@A1d?9d$>kvU3!RwTz{HDOB7Ni{Z`1l+Krc7spdliA>7bwKL~0DlB4iUzoP4zbe%%dsO^)l!7m=_~YCr&0>8Y?( z!R6TFL#Q(RF05{$yiW~twGe*q@UmYq#+4Ej(d#OgYA}seT;=K+a2O>0$ThB%!ymuK z)nYLC`m)|}9ZPZG9~|duK3Fo&B}$(>!G}efZ=P^r$QjkdRh{SP6M~R9Oq;u#v9Z_f(Z~-J8D{Pbs_--+R zdKydyNnZp{!B4^38S?961tkH4HY5(^!%SWuC#cuKNs#nohXv&-{JFz|It0eY3lizq z;swPAr-bYTL2|*!xRxNO3n=&gL_sCJK2cES;2%s9)M>B~Bz-Ok%d+5~IwGj!VBZlz zB7NeB@FDewq!d93fj^oeNd9QIq*Oum25Uglz0(B66MjRQpt^vwX@W$0M!H}}+ec>z z%2|xi<_y6&h;kh`iX~m(DUkHpqk_^6zcf=&JHaa;=_y%))J}eupf-Vi*@8rRL^k>- z@=eVVl-tm;0!IqFqhqPZ1T_e(14;MG6_h~uExD*CI17?qd0ddZ;k)Ds>Sf&XrsfF} z>BsT}x)OpKic|i+e5`K3C=5G+-iV`9d}7(pIVl)sQOnaODfRG4L7hQtz^Ua}-vU9o zffIgxfgoi}p>GrlY7CeKl0IH2C{gh9iv)E)*j*$@q^A_4Por+viUr9DV)?C|`UdoUrGheuV>SUcqa3+qf^>=eGAvgEL&~u%4ti6$ptQn| zs1Vc!u)IQ$NFS;Ylm*l_?TjE*LmxULsO6wfCHfBZno2<_g&$NUsD)r2NcvQjpqzqV zR4u5-!QN^?BK_!DK{|@DKYCU$g@Z0Ng7w6lj^)${=d{W5V4a|JpaNZWg0vqS9=w1~ z0~Ug$W0kTpk3m&lkHHHL)e92oxebDJ83zsP3QaYjSEFDZ3m$A-?hK1yI0{gP56uR! z-C~oVc7unT1(o#PWBk2IH3K_&h4sGv;2_Z-7o zP%skT zko2?(!B__W+JvAMf%uw4BK_h`3~uC`dTY6yQIp6Y?b16bNT<;rQB#6?3@imncbXQI zZ1~mFf*K57okl*;=VowHK8!2G+kz?JCLWXB7Oea5tZ!*nF!fy5v9LRWbvbzcj-Xv- z%-s=`boArXbAl9r_L`d$RA(?|9w%$)m*)j#2?IT8K~V32bqj(-`tZW?Bs;t)C^hJZ z=}UstiumCr3{=q9NmNNc=Oii@;0HUy2Me4OIH*g#z{baBxxxk+a7S-Fx z=TL|!k?tKTZX1MuJyi78QNgRjMa2UZ@s1FsGDMt-5Y-}Z1SI`fq$m}@ACDB(JTN#) zlt_1p5v{t>5JfTK8uwc|)(|6F_n{{Q#)@k)Ch#;hRfdD%uXh&rB25Ua&Py zlqr2qx~N_5bfk;QFzOkVAxa6Te@6xy7+e5JFFYzL2jIJ9imES|oGD7A&w=wOSALdg z8U`<9iPptncb2G~o@=v3r4;D`b3`cx9ji7+RHMKNko3%Bq7ngr=9s7kfDyUN`Y5;$ ze&}&grgXW-MSt!7)iYmI8Zbo9<%?23p1ymY5Y@|I8c6!+2~p{SpL0@F+rUj(T82fhaejVFC+9Qy!RHC|di1&4r>J^`x0XQLcfXS0tKl z;{eqaiPm*sMzN^4BK}6PC>0~$jMJie5^MlT4=fRteE97pqM8Fbm5LJSk)_KG{u)v7hM#s0BN5wO07*YoD@t?lTWUr12DkuU)6XxL^A=cu1Cn1S zO4V4`bE{5N%fYY;Mmd0nMUip&mEi;2<~$o(HpAL`yC>1V(^St)gY|0%!tY?{JI%Yodj=!q!->6rJL|?-xk$tVC*a= zZ0J?9IIif=K6gZE0mrZE4$chV7)W~RoTyC0zd46~4jz~nCDJd>i>4g(`&;v(^*%6Z zK{R@S!waHm66JDQ6s;S;z(vtW$Dwx-;|PA@62>9+-@AnIG=}?RC!I=qg_BO1gYWCC zQ>Vc!ko0k9oy{ct92cEB4z_}%hq~%)uff0Qs#Ax-C6M%DH=XSud^dNU+6yMT>m<^z zx$8{zqu8H^&N>e)^3d5GML9e@b*A%37vrh3jt6@@m-SRHohbl*nU~Jm4|Mfj*3WzE zOtaYjinq>s229$wtWWIInfl>-`RJ^B!Gk_JZ9>20qq8)h#l4BI&JqfCgRRx*$9_6X z7VtIZ8E_IL{aCP0DThB7tW%4@n2=?CBt$0_!cPpn!c)XGda|+hZg~XYqs|6RWdS7vuR7m;?I6=`4|8Dd+*tfD=V{sCZZxBOFCXDNWGr zz@p4VokHHxM4crY(F0%v7?8AlSaXwfmaanF-h-83=#l00Jx6rf^}+lR>>hefvd(e? zYtx6pi(qt$&Tn!6Zai;=ifmgwB@NfpY z19(0|XQ1IV3jYiq7{(seSu(*^@DS*m2|XWocwi=Y8yw2REoYX_(f|&C1z>o#&XNe$ zgM-KMSSv?osRy%jbOw45SqFbU7ms0%As##h)`Jt^elRIlXPG;OJ5=xr7<3#uSPjnQ z;BgIj12Tb(RxgEf@p36zMEI8R&*!4R{^&0TYTb z{L;}4K|e6?w9Ybu{?AietBSFW?1O-8-IW8gHn4@|GnStgI*eOQIgKrfyq;U9;edIseO zdq8jSKqbnbgnEIw;7p~?cqb9vyh>-d3?^5hpMaOa>j`-5RIM|%fKk;t?GE?|{ML9p z&I8YYoz*zbxPuEktFsh=m0%D!56;J7c-81+y2C54!E^wB7IXn~&gm@Wv3Pd?W`GH` z7@lA!*dBxY&Z9qqm7ps)4_=GLc6FFuz+tcy48EWIa?zdqU9v!8kCf4dnp4z^P#L|8|rE ztOoPIMQ}0*{l5d_aX<4dx{$NzM&Oi_3PIaSy_|Ov(oh2Gf>d{$}y-{8;2n_1Q z@%2J^!LyzyFL(^h?ZfE@90gB$puGKR5gj)9$Xx*t=zyakAJZ^+dVA3a}P*_0sd3AjL0v>197}JrDKP%kf|u*atR%6d&iK zmot6zJRiIcUIIzq@2i({d=U?lKL}33p9lB(>3NW!UXBHm!91`SoB{_xO1}W+`s;bT z|FVBBKreR$=y@-AFi_7u1DEwUu%tlGtH2iMm%uUb7MQwU&kyZiPL~6gz^?|E!0UJQ znIOIF6|CncgY|MJcowAn_kk1eZ-X8odhQ>hmm|Rh@FG|PQo4RHJXFuUL-k&qgsd>V zd?rlK&x04ie((l33;G{Kg%0ZF2CxLA^c|q*Aw8eI>mNO&m#g8of&<`HFf$wt7Opo@ z`o3@!4E}AVHV-Dx&prW3--kg2Uhh zxCna0=;e?YJ&y#Nz%r21Uj&0<_1rmj*$)Sk;b(!xU?sQ!UcDRd9;cTJbSN+#B)tTjfj@ZHUjp;u^*k|tIsQfh4qO5bd?NOjsOK3VZI_>f`X`~@ zpxY7D8zkNL22tu0EGW1|9=P!48nhbrW(O93{9JGh?7XYr0-cM|kBaqj7#IU)fXBgd@EquJTF-BQl>ffdAp9&M{EJ{v z3Fd{8Wj`EDhMxrvfvtD-aWJVAeFdzPDupVp&2f^#$Jm^+|a#i5O2_}PC;1JjfQoiG0(ixQJ%-!;Uh43rD zMz9kc1}DHHm3n@layeZlI0*kbxCDAu;e=F$6DgPto&>AF3t$g849iOrgK>4&KTw16z|RCrz-q7q>;-RvcR;Um=*Qp2Wj`I9g@59%?_7_5T90u6W`g-(HCPY!f}`MV(5XQ$ z?{B~f9ZUstz;dt_yaWz{hZ-@i8khGI2e!kny6g9VAx$W6({g+ySP#GKuHOL`qP%l= zea~k7^Z!|_uKfnx<~0X6`^3tXv#;*Qr>o?Z5_B8S3oWja66!7QNbZ%7GQGmda58TT`L~Yqll(#2Uj%dv=CCH@LpW)Mw9p z6_Ps?(A*%Y6FRUPE6mt7^d7R^tPB(OY`>L-v3x6YvIDzlMe?|0=(T6_61Gga*WtQ7tG!ot zbzpa_sdApwidnL`&7L*Oa)<-IY&KWhGmn*IPpqWMEzqw_CK=6@_N>N8a*2)7VUOR{ zv(2<;8LP}0_N;D|3dL=;l4j2;SDRDp+0bfI5^N=W_T6b~#_u1@*^+X6jTCRs#@3kQ zs5MEcROA?Y{0yl%3hCEMP>R-Cj+oi4wU+&6mSSg_b70+emMf^G$#TJg6;K=2nhdDf zMUyezfn7BjP^dYR5tZ__H`bu^4zF~Zd832e_0fpWujJN6w(10JDM^tY)mdsu|un*_NQ3TYSXPJ zS?+4GFRxa7pJG0?#;&cb!q!y2mG#-GP!6t93b(ShHKyZR+0+_RG8OsgR(3@(9odS{ zIwUCBYZW)-u+~_+6+digD&ESD+o@2-?37bmS*ppDwG~~M6c>9reJeX*Z#uk{b=pf% z`t8v(d>u@^PqI`8DdZ`ZU^X?PT4u5@m@y@=#&ycrlWb|7F&vw&H-&Cxt?N}N_z)*} zD?6u}{I}w_v`LBIAp4>LHkdrOvbhZs6t|7YK4YV)=t*{Nqg3$}eV}{bNjA8N?AH4X zHCtK#eN+NRQvpigC}lmxGB%s`Bl%{sk8LqjZ)GK0kYr?w$@fX-X`w9xEf^qq7L(_b ztl2{8+U{3su(t<{OHZ((2TXUKU>6@yq3nN9x%~t_)-~OFf?a=*l;nq`8;E_#boB`~ z`w%I|z9Wx5!A8Dgy7C0``K|;d?z@gI&#;E?I*vchoF8`VdYWZF?3nR1>wVa9Zadrm zh~w~fR{Drz%XW6-5y!IaEbe=bncG>z_Z%0t;k!!5(QPdIQOCAztoKpJ#BFTk)O^V&dlebBY+j!|V z8L^$)q$}I_wQbVvZQN}TcByDPKeJt`-_F~&Oa0sV*mh}pJ73%`B|pu> zo~AVahq*TajI*lx#_yA4lFVe%Nn5%=((-iDB|s)=xFBr{1y zl9{|SleR%#ElULfSyU9+M6fK%CZM3af}o%*A_$1eA_YWcM?_J<{(tA(d!J>N((nDh zpLHOeXYO;?bI(2ZZ1>z-7ki&sY&^uzzg_HoZL#sE#omt=8+#hPw>279Hd3B%Hd;$> z|7F-}f8r5uBHY89{_@M3#NYid0(pKjuKc%4#MyyK?>C9>1OmI8#9srI|6C$2shEzG z$0{a$xI}z;eC6MlAZ{f6-F$vq_bAqA0>3FBKn6LX3jHPpi$_(Gb@;^z!GIh&@LFR~|DRDNh|U>AOqB<+YV}ED=AbrIcrDpGE%f)=m2T67h0f z;QA$EZ++#pOT>fq(~yBA#)8UQ(fJ!r6B( z6Xz_Ny?2@T;iB2UN4%0nv!7@dHy%6t?q>1Qv9mwhEG{{2_B%_(W5>{*CgSnc^qOlx6zPvH;(omjpesAiQhEV zW9MHIIIl^(($w^|<;L|({oh?`+_TjG`cmUJOZ`ZBZ>j&ZX5(|s{_i#$dz&fco@W1} z&BjyB{+F7K*P8uTEi*p5Y$}yq=Kt<8vo6KkN_3$SC^~R>p z(62pP_}6t?_}#uOb(Hh!t^Dh`t^DqvTQ4;z>uuZk=TqCb;F~9M)|CqDBqSM;sZ41WE_X~uU8 zx$quCwz~&$pef<0vyA7!-%+fH(n+Pu#WdXUfafalC!pM)j47XkYexZMu|8dJ#J)oD zb^!uVaNdg2keFJN_3W=M-67_CqoQe@e7Dx~pW;7S^7M+)@+%GFbOX4qYLjJ-^K2JOxxdql zsdGG7=?Bp*Rhuw)7e?|uwR^tdfUQmFRsgGwH#%YE)4V^n}M&Qy};^G;>>t>4o zo^klYGjUQjaP>^_){II#pBp^E5ht9(xz8}Z=fs)I z78-SM!M+k6LvR>}pLoGVsOYUi|5fm{C>(b=jsq1wkXm3hyp z5Vw{gYNt47ocB8u#Mj16J$r)q@wmWi;}P!O|C{mR!*Tvc$BT0U{vVGQmjnX$kH`6D z|6Sw38i2idFi`%F3h{KH{0|l4mB9EPSAbU-e_jRngT6mbFwULey>)_d^#nhj@0#F$ zWrFeK1TUVSo8Ukt^cV0M3H;0upZO02wlTc>4CB`>_-r@UioNLc-lEft-+4>EQtbbJ zX~~a@J$Qbvc*@Vco(oE*;rW@8Dff9j`%4<|d}}EpH@sfzxxnlBzLzro*gNG#ukoxG zyAsWd@m~Ol{h_rd-T@TeDL5K4@L1v8OW==F2uxty7=OM|ju1b44bP2+_$I|Pmg$w^ zFR11(#$?c~^9tr6K1M+`9`_Ysx@c~K;vU33yC?8U;TeaCt0zvO*g2E;947uS@$j<_ z6Q>YZO&`>kN%AG^b}`^3E(Q|6-xIs1Qhqy1MT!DE(E1c)!5&n+owpk>{}r z@ov$%fXauZ-p4D%9xn;?&y{-~tq|V`Onzd#xHmBO$?>?2V%i1c#f24t*MSBV{(TkV zmWs;XR)~iy=*|U(y+{a=2!O7gVU&H@FfdjdcR|lAy1w5iD)Ee`zLXy6X%jPBsr)Qs z#yZa<2#RO~K(5}#ObNKIKUiQqUEn_(*K-tL)yjdPTn0U8FhbQ;xKZJ}lJb89#4Y3K z`B&otH&lq50yFXaL|_}1Vuk;Q6~58--j}f)8hwz zD)@zRDtLMMk1;CTgn>r?Hm)4qxFArDTJ{FYQOn(da+H4}P>%e+50oSS-vZvVDvS#% zyjN5hdn>%RR~UC!cpt1V9;@*Fy2993;eDgR_;ZDKe}!?@c<&d+8<&pv?j3L3G~Rp9 zc;ma{-Eg?jFwQmRmA+6d8n2iEHPnp2g|l&$?~ymn5*Gvye|(m>DHynZmbfoiiRTxB zhrcva{4E%Gex^95+JDDPaY=RHwwdCFYX9{!#huktch3|*ug1Z%GiLg)nQ8oFrvFzn zjo;1mUpdS8+${e!vy5A3`5&2OJUPq%+1bYLXZg>aZM-+j1hJp(zjZclh?uOWX#ZuG z7zXaEIRoV5i~`?TrMQY{(GN?-orQ~TDiwQ*>Tp}ngGD~1yjtW#$~#2>=_MW?lCLJk z($770e=ZT17T4`7p~=KECKJ!6mmuFaOQ^y-N~S}oFDb|4D<$5yON_skcuy}i&MEa? zTxwiV>b<_yxV6-Kcd3EUUQd-8kCwXOR&EsUGYYRS(-ekqc&pKgD-{sv56-+kM7;1m z>=S<}^dl79Q$?To$S0okY)0$F-aq=pW5vfJVNb~enD~cFeR%#e?wY}i-DUnSl^N%i zp|!7;d9HHRKf|b;b?jq^IB9skWr&N6RS3spl>WgmUUVWi(GmxbRJzEsO)O!$(qb(6 zazWrOct;jgUjQG!g6g*l#U+K+xEAXNg;Nkc3eJ(Z{^#97?>R*V9QO7U8F2Huy~wz% zs6o#RjdPMQzHZ7Y(GEUl)N`p}oU&BEMcWnPj{w0R3nxB6J8gv5{R9ED$KQ1Y&rB9q zOn4GhmFih%AeFA>;qiREMBLz6kA>p#e62)$zu0q4iMY3T zC3ugLsmOgr2_9cADSfZRc)i4$8nj>iS)&s7v^-JZxwcq5T)4O3{$laA2h;wQ;_@F5 z-vllNZI>IRl_hhP&-KBI@*FOId|Gi!O!~aGp0>Dk0 z`S3|%_mtBMUOWjZq|-sH&YV8+q8_nt`m)FiId2*}RV|wuX53~Qwlf=Fm2v95T znCbu4Hu1xmw_u=e&+%S-lK5Z_2%p%0ln2je9{m9@;KO4k|M*04Rc+O6CyM84D;_#g zd?VyJf2(*guklk>OSyj8rupd2sn zSm=3pi#TJE_q8qJ(nTH={o0~;QT>I-mHu@rWKe{B6=yUB{WS1y$@^=Zyrx$eB^{VNV%_L^7$u;tMm%za11`2U)8Y zcLe><1dYq8{XeZXuB(RbOmPQ<4?iq0zE@DYr}&P|;(hO);=P;2;}ZifY(x-T|5cmC z>rgOsgVN7ff7sWy zip$p@_R#D)=;1%7vw%S2n*lUcgTXf4?(sEx~1e7QcjWSHQQw7mmMXnK-xT z5^Oow9N~YrS=<})-`Xs0sq=^!}w; zTyt#sZO!7(i!1JI7H2lny1sqs_`8;g2bY$gjXXl>T}2$<^J<0h{wzQr%fQqVDAL+%YgsF3F4&yhRpdY#QorN@1Np% z7FU2xff%&^vXD_DC>Z7$MN=N|ig${=H+seAyc2KriYvYTo4trgSo*5hc)`IPu@0fy z(<$mbgW^O_pAm+Y%ZAs2hsJyFs}c`PSbuL7g82G>R0Umn`FmB+qK|v3N<3aU88@lD zT8WO|Ugh~gmAI=4K*#*mhzB9EKIl8_y@2>xS@~N5v9EmGa{*jT_Ac$!7 z$9tfdeBTIs6`{fl?3c6-R+o*6E~%#|omko;Dxra)GJ#kCOz$p)A$}K^#26Z_2@dYD zfFGX}^gLB4=9~{?_)byj14YIUY;jh~B11w9P1$1z1VQ<#VO-=G4fSE1r&de^&!+HW ziKv03)n2;MSZ9x#=LsQlF@Ns4%SP0$@r^|l&m(l`aa&(mE%rAC zuRLDtUsADum3Y1RKI7`u2>IlHYZWek^51ei;&IMEWXj`9UpU_QO?6(ZJiKPq0k)BpD6AI6! zDcg)L7d-rLLnJGPYK_<(hR+wUM!zt{^Q|c`KhYW`+`b$my?nCgJCnuNC(AUa{;&eq znbDPIrBJmzP8YFonIEA4KRDb2`{DhE6P`oHd)w>zi&y;FJ5%Cs*}gK*AIik5W$Jgi zz`Cg)2XS-hNgBrw6Q>AqN&qY4T*6CnDP41dx~c@lrTnuIcp9e;aBl+Qk`+zI^OZ$l zC-J_twKOJ907pm9$9hf_O|AS~A!skZ+VI?GK$&)eP6LIyy1;`VzSkA3M%rcLfn6Jf z*x>(>VVnrWli-$jPW}~{|5{Lv^L4itdiHq4cM5-qD&H^i?uI{55wv%Xxq%+@#|5SP zaF(#J^d1x_^1lqX%_5Mjmy0~FX+lr1x!dr7r}&|9 z?kV-WU5+rqxJOVtYW_v($AH^p#Q&kd@ShgZ7Jd&N z9`*du@L>CT%aCclPn3SGK=e|~Y0l$+6VqNQ{#5WDDrNr(krET zJz%_M$ahnbI2M3B*I0n3dyTJPet%iG5zpT$8YlbqvEu=qpYp!pxw}yO9rr9k?ky~P ztBLGSKO?~`G@$1rWgP}U7vigxD#dDQ` zXQqpHDkncMU7TAr`K{^V+N!`0r;G1bO~vz5Rg=FkUA$2h`22M7QI-F#Y2w^zfj6d! z%cuEYnuhqkQ(v4W?w>~SwRwJ~UQpyYt=PC3CrOHpOFgYu78}3yOvAHUbu>SVp&S?Z z^Z&^&-Yt32xT##6Q#SRwapGzUiGP{je_J_p%(LGt7eDu7#=cYT|3kTPU-^GobBs9q zQ%Z4{<#x~chUo28xKf44*eG6B_u*vmP}%L^7e1WyX*~aZGUPJMsb64i9bI;cSonYV zcZGNXV1L1wij|2-F`TwZfV7=deodt~`7RLTYYq?mVw$+~@QH6$iJu>S#FwUtw+;{d zp-P;7L=~Q|I%4v9U{Q_;oK+qq#Xs1$!YqVl_y;!BmkBhXO$ z6#`N<{sLgFpQlA3`70=o1TG}|8P3Jx!XX^~Dj?E%TT$Rg@F*|xK3in`x~N(Yo!1qD zt6z!$@udDn9oSU9Rgm&r+%9%qh2;)L<0q}+e($t>ZBSud?N^$k#z-Mv6!{Pu+J>TegwMAUA#Cy(4aqW_ESG0@AmP|xFuP!M^ zJs&J7|FBIw+Ejx)uP-e}ogXbNzp71qeVKWCt9W?XG~~Q=dBs;(h>Kb_oV`MvyTZR` zrEyiO_vTjPyR8ow;K!XSr~PuJaqcSb^{b38t@7Wr%D8G3b}ez$>azD&D@4S6OnJ1x zdtI^ksIYKvvDjT)jpu8MvAYtCOD)^cesIwbVX_`NV)FNd~TZfd!_%4DsgsI;I%68)hhpsRpPp;sbG5Vts)vC>#q_o z16N-ztNp_i#3$VcTzzNq4m`g)1=}*(&*1&m87l=`!thsdA-Ha%8hrTK1^#or;?=^A zf0l|{JRKjFiknNTf9e&_lvZEt#nqtR>%7J-Uhj{*#v@+uH9q4hFQ}Qd_i;z~pSi6< z%x$-S(-Wofw@%+Je~aDkXMBu|kIE-}>Jth@cSZX~)8XEsXlNvy9@H7scPJDd8cOVp zMnaLqa5xqRb$5M2p}s`CKb9O0h5OR6M4U2*`eUdp+}9UPrBrzXuN@U1LK;zfs>tL19th?%hS6-MfoRcJG$ZTul&e zCjg^7L1zU62f!1^U*O13zl%J@R(bi`uJ7@Tk8ZtQeeTWp9G>wpGd>lEeY9Vc;!k|E z|JFA?-2V=4DBu2<{rji=egA&^zkk^>-Gcnyo$;v%j4St-`Mjki#h#+V0wa*|!Mqn3 z1qFrlS5R13WE6S;75noJ9-S==Z-3;MwHsdV+tqUI=Krib_j|)%XnX9huN=PX&4n+G zJ-zso!(Cg~wY9J8S+v0HTHo2--qzDo=Ss4EtM~V3d~{n&)rWpdDnoQ+|Ngu0`aCuT zn0D0nJHOfw*nr%q?@t}({_k?Ub^cv?xck4q2={*qOhSWgZpNoI5sw4UfsAG{nu-EN zQ|bEfXnHWzHx#S;WXd#KXh|T_jr5N>njA7ip-6Nj zJvf-y5lxy+YV{x5>3@b zb|$X+>FaymdvxDt2<8x26!yKNzg7ANpZUVm>xzH=&h9o%CuDxHTlZJ@b0nGA5sO5V zwa9>7L-b)x1Bv8V$NHYu^=sF6Dta~$j>i);-XEDl#DEZy-XQ?I@8n2gXPkg>a&)XW z5l%)@@$d*i8}$-ZO(vtm2@E(zaNhuOy)mASrH7)CVbI#}Ks1$%{^w{kl_vNPW8J6v zvHrVar$nhR5whU~O2(oQRbOf-F)$E~tcf!nij5BUhEX&Y2P!c6OAd#3wb8uxj}8rO zKm&Td`(yEl8BY&J(V0<EM3L%<~<)kq?qLOD!tye~QsO`C)1 z;UW4Cr_;$DvFOf`L^3@T#yCbJ(L}0;HwL1S$+#Iz(RffUY@)7MeBepIYY>yrA2DYv zHA4*@qeD#RXy2lZA&EblJd$zZiAXdOP6IvAc5)yUiN?o1nM%Za!+j?M9z%o#kz{y) zaF9@*#+F9I)IWmNXe1WFI8wANVz#2m#85N^SPq3#Y0N^D=PKHtPK9?wF-JR7>BI=l zT_ik~qOnE7$&(5HRz-kV4a^$muTv4(lajp8pg7#lXjDRX!f3u!EFnlUW3P_vm% zjz+N_nxgU1;W%I(ipBf;FpiS}?-THcVF?I_qGNsg7KrvkqF z4?UQYbR>-Vj$;+q)z$ODwi4XGT2{4pboZ?2T)(-iy|ah9+r}kLjN0s{t)tHD!h~h# zGo$exv1B4nxMuFa@Q9Bv6G<~U8aMl~wV6P)PlCXJS|n*dO^(&MYw23wdO~}5PurT# zEp4lMIyZK7uUXelKY?ttt0w{1XtK`r%UwfTOZ&R@9S!cpuJ*33HS0UviL2XN+S=RP zY3*CuTQ_#MtXSLLv!SJXb>_?N_71A2%bniRxhf-NBSDTcxpQvlT)$;&j-;LyTQ{_H zWmK|eRmb|y_MX+<-5a`k+B-YfcV=X0S-W=q=AM;n(Ak#ORtzz#W_ssN?CNgm&PYP1 zHmzxE?{sHev%agRt$ov)){NW=lsz3S>oVT7t>4_Sc701*4#;s&v0b*UU)QoG3w*8J zfN9T$^=sF(W&o#keaFf*o$D|>%F>lcnM@AM`3tSbhK9~)DlwYui<;@^Fo*}xZfMLL zjfZ!HV?%_1?dw+(4Ko|ezQhpLkvVroGI4S=ZjQu8Kw(ss3l~_A4Rh`1c~QO3@vyzT7yEgFn?;MKzOlxrW$=OefA3-2~)DIRWWYn>^rC-n&B?fiyop~dhhBY29;BpV)AQ{ zHBO0OKS)PU3}(p-l%UvI@VauB0uxPp8+dE(k6kzk8qo73QP@*q9WGd=% z)B)=X^+iSwqK;T(C_IXN6yQo|u8Kt)Ue3HprGSo!WEXg#VYzu=v!G491w}}XB2LWg z2NFj?=hrC4rnPN@NjqdC|BDSHl{R~$=0GwE5GT#_U>Nv~E^a^`d~Hk)Q3+KW@pZDo z4T>?zeq#%O)E6~{gyC{}c*cm$X(58lv$7IBY~j_wKckU0DH~#y5wSKUAXLNX2?=%B z-xKj31^&or{Ny+|9bPSoxGPI6vdu;8x0|%mm_OyIOVJ3d8XM`tM&V3Z6H&ihlS;E< zfjA7_#f>8A1Q?RRX!2vqFe>ECOE{9hS~c9BzQph_a_OHCHC4)R3`;UT(1Qgt%6yw* zYkP>jis~O~;r0-7LK7q^x6N-D<|lrhKa7M$oZu$yOjTDgTn4}nB;xMZ$9HA!lq)x` zUF*)%*1lpRYywS8mTO94@w!Fn6nNwHqv;VSPZ&WrB*4IrDddwlOJxXE9pbysh1_Nc ztArM`S~-NKa;ccDYuAAHN}4TeOfHi0`8E=Z-za}-&d6+1DAa6jBXYal+?E)j^^)4| z^R+^=Vzx@8!wzMdi4p9AO_0}`U4jw)=m_tK4S=MW>4dqlb1gEnK*F+GR_<1kRZJyh zm^J9;@?^CCC=}9yOpbDGiBZxr$!b+ulpr=-;@tCOZykz; zle`Qm6Y`E=D}?k3Vaidd9Qg)*g*RqRJ1JLc&F*k-Er1nIgU>%EOk>ePnChalbKEmZ zkQ)w&@epN)kOD>{W!A(KU;(5E<*Er=a5S0bf@-j9I0dYXsw)ABfVvgk0dku{FKm%I zYY?kh+O|PyOWRplSF#{(XSD_KtgNjpqjQGd#4hxJwlyubXXM_fUO95haqB4p0jsO4 zQ>D5XBxWR;7@@r!=t!7~7Dx<3iDX~1*#t#^vynD>MWmHVQD<1j($!<4A;_x+Hp*9= zMwKdATIVG>PSxC|Ur}DOcTD0sD6j+3Qhh)Kpc*6>tgVq<+wCO-EeO4;86ByoM(T$k z1=c5H1A}RrY*~=dmZV$Nx-6^;s%em@O_@-Nq)^U#>Tt?AeiYnHuZR}ta(GO~hNH4A zt&iD8<8ySfJA87K`l8+=^GKxMY;r)s9+24uK9JbH6~^gZU4=+zyK(IYDxK43kZ(Jkr~Ui7K)NFtO*c*Ub9`qiD$J5ZG&pkR@I@& z9kEmlB)S%2J;_lKR7{mbBR=0sQuwqhtx{HftPW}-rWztX)-d-M-*RWfz-TZuDAJ*z z>pV2bYEkrkWGLJh9ZU?7*31kKVHj#;q{4`y57yw%&AnJ770rs;8ZU(I~BTY!urfyRda?UKV(IBt@$UfQ!qs?%F2rP!v5lzER zadOru;xgTW8tO}82Lil!8E%6N*Gr2s1p7*4O!bF`IU1Mwwjm!+tWrFhDAGs!FnSRp z@r{HOB0BhvH=`$Azz||%P)A=PaWd>V<~A&WQvu3TRY9zvb>TQNSvhJ5+NseIA`mIa zdyMo@IkVhRiv*%-^sV)e^qhiWD+z4F6IKjqC+Ru5YXkydiV3ys3g&^NLG*y-VkW+- z{hiTXtS9cU&j$v9nJDN4&291MPCz?FeFhOawFzUhyG>d{pRbJ+u8Cy%PeiZiwzUiQH=v!n9v3w&FDOPZ_&kp879#v z>N07^sn2QH->`c?Z;F|LUK1Oj-d#GQeXw|$8-~JTP&ESIWM&jnvSTtwIaR2Y&0S_& zbVoN7qA6VhWuYCUTDe8NNilAjCP-Kkpn+PQbQ_e7HtL$q(cX15i&jbWGUEeWlVTaE zIb;nefbAv)GUUKitJo&mu=RWB#)soIV{!@QKeN?QEC>fMr zu1_b~y0El{N5E-9vKsA6k0!xYI!l8+P?kp^ifgXd#$d*m3@TeDsjU>{);yMLfp+yl zG$zrvwX4gL+Sw4IEu9?dN4LS@ zq?Wc=Y9mlW(qDjg4>Fq3-XL}F*!#nd@hCWNr1veP+06l8+o&Z013cUX3W*{x@;mA> zH}DIYPRgSkb+IArAcrp72@)>{a|;cjkv6mC4fBqzn~VP%8e#vRD+kDVl_de}b^^9< z*)yrtqwNxXCb<;)U5E#qBVYfNRqp?$o4V;B^N>_~?a_5i>*COS06Ang-Cj;?;*dD7 zhHV7Agu2W==!RgPC#M0MqW~(93x?AaqS2>?UhwJ#oCxqKT6fa(N|`uV8DiEj;|2S^ z2^Xy~p3Mybx#WVzTmO!xc!EnHO59fNKTCkE?^P$uoY6_z^?+k#Y6R;>rpn91TZPu4=}-1Bgf)$s{CblNeU;uNe1;NPOG2TVOx1;IS%Bg*JXf~6{{^c#8~FU zYK8-`sr8_k5a}$QO6`U~l z#Mri{t+5s1Bi3mZIPBc_2NLR zhP3x9mjDas#KbGdQtZgO$E_fb@TsC%koH8vU`!F^mi^D(c(sX0`4zZZaI&U6v1=T> zs;gpI`h-@ zZpWW`2?I7^%04pxG6Y-65VjYl93)hj=Da$yu0BUkWGVG8C@A?Rg=Bf6k4Y#QWCio< z%=R3bsn6sP5Qc z>wr=XsqM%pVZEc;XvvTOrLxPqDXB&=$0;)?-vt}Fc`4^eKtgsk&35gu0(>PGH83yI zYKYa%zG^Zrwt8$5!_g$X9_7vrL4kDDk)wF*?YqLmBaoY1kYd!7Bl?uP8?|N-_3s)( zuQX?Cv5bw!%{^{zQ05@;Q=Ynd#XN*aDFW{up93GM1-GoG);|G4em0O;1!yY_vP3+L z)rMns}r|MeZ_a}v3$+f99hVH2+X4!I9!Tw@gO^%(H<4Ila+7Ne5?H#S1 zTQ{(;*a_`hQP-jcA=>Z2LhWK3DVv+xyF&98E()z`U8i<(Fd@k?ZCP~J$j)#*?OQgi zfuCJl%hoQ%9!aGVi^Y&w$rK?SYdXN^jDc8LQKxMhoNrJa-`-WVKtEl2f%Wq2Z_YEM<@Lot*L|7kd$n?bUq%`T?cQ{jw(zy)9ubo zZX(XSW*)}dU8+U7g;*v3hs?LTR(4Ras>DOaM(56*!`0IKcu~wGhpark-S&Ij38hS~jlj?jcuV_zT%JI&BuPpMwb^hJDz%z~?Q*35o1ZI-Owc zDPeJfcVwwi`&f$hG4zL(=>JnH^nXn(6=gplx$JCjSqHAX6F{U-JKKd#m|nUPunR-) z4-bIwFfrf|8^}7RCHuwm=FQIrqwQlX>$B!MLqCv(dQ@;@+nP32%$`z5L3*E65c^_= zPnmfzLR(fnwmhY}ur9odg)gYBNysD2bO>iz}h3Gy`oU3Cicw zHVUX;Nrg&Q2D0_T$WO9B2pj<$K03+Y6~1sR6vRh{v0$-4pxz0=E6B;CqIa&}Rz?eD z^h34Trrm!mwO9>18L(Fkc*Jf<@5Jm%0>SMOir3({%ue!BVAD4^Xjn5x2L{a!9MAyc zr@FW+qaW;Z7nRH+DFngD$scSsa`!naZ|0yZGjb@Vha zzO4G#K`RtuaFJ?vxY>j(-JW|&NVbGRPiy*U$CmD)j)|m7+vo*>Bu7uMm|3oXoIX4j9vR6| z0af8JX{i!9>T)UW^3|rs=vL#AFhTkW&{JqPTL*C*3agbwBz}ej#BY@RI(s(l`H-NI z2eX$Ni~^0J@Pj*_<}B1Uo&rLIApp=JDy;3SK4&gg6IHumoDXHPGFr13ie)vU)>(rY zBtg}+&azunndd>+gvBJ7ok6et`C0A!Zw|*^SF|VAjgU%%cIvL!@F+~BSZg5r%AJ1; zoo{2cI&AYWQ7{>G!!a~MCWxHal}*A(aiZikQ<@jDhN|i#%P~29n;B*Z*$_F+5cYOy zRg27=uQF9t4m-ZxMNl4gme5ehCNipLshv2fMDA$^_@HN;3ywQv1)IxKDr>*o37K@!p_VBdu;A4aMqRva`aah&0ZW)xy{3c1|M!|Yg| z+l`&Gv(uU7tqIjCsj>8`M7#7;X}&Fs<}4l2zERAp%WK%TNp^EjaiMpbpqFlpj1iHir_uP+_@z0CL!-*0Vv1^i(7& zV;acCAj?yLu+mc6srQ_hbyZ*>rK=xL6I?vpHuW0Ys1E(0wy6_)ZRx?B^P5BL|Nq5w z@Z4x%4uCHj?PW$LbC>6Qwo+?8B&jT{*QxtbJ)C_^SqxL&}74HU_!nru^PGXca&YO6*jcK4Duume%~ zH?{}>8iZ;r&#?>21r$jDNx1-7F`56Dx^4?=RV{F-1-XN2Sap-hFm@oH1H<7g!Bt5X z37Gl+9sv))it+%}fuD?}4PJ>|qa8rgNgoS0l~I9C7yI9Vp04fR1Auy@5{4NdR9@pD znBSP8Bs9<-VuVI{uuc~9`D7_cADzWA(F}ABlnA2B%7vuj&x3WUGyfi7Q$ysgW&lm{ zE+HkPkRd|)qvrvZ%no-Ic@76o+K@M*J40~wfgf@!9bqEkk+G|&I_u1C+H6!=Fo-bh zk}=NdA6DzzLc(_~f!6K~iB8HA&gKP+w^Ke3*o?`5;M!JHx12}^Ptr*6;nJ&;vU5;hye*;VmY*=M^0R@T7}|~ zc$qC!%51rWLsfx7XxJ5DiXY2YL9o7FX56-%j-oA{Bb%MGJzoKmc`Z!J+)b?WZy{(I z9OvC^{K$i?RzVwK;g9X8;y}0x?gBEfbaR50K;bQfSszdnvx*=e6g>l5prcDTISlzV znL5-vjWzOMHI6c{BVLH){%rVLIhRKlW&)liAEFJ;Gk~-#V{!NkLERl4!ZDVdM<}_d z4R%wW%p($kx+IZxRKlVP6@len9seWhZS$qn_c~uUF>17YlnIg7zUUCIDQNTbBLN*j2stW_0MWZ&4{uE;%EiVoVUTs{p5BO~i| z>wFvILouAAqha7+63uCZcs}AP`Ls&*tgxgBaywJI2$Pfg9uv_ zBmFVi?0N0M(L4%MQ7S=-l$AtA#zqKv8HNgj^>Q`o0nyyxAr2&mh*eAOe5vTV7(hLaOK4xFd5ek1p`>vEvM|%cIC4U=G}uJ|5ySyA$FNf>UJV=P+2< z*{GT<6@Xg3hkCWi-UX|f%)wC?TTM2+WF{;&A0MjBfETAh3~l98n{fJ~Z#sURd&`p9 zo$%sVXBTAwQ&Watgo=B}URX zr;`m>oq2imIG?1?8IYBUK+-Oz-oQ0YC7>~-%_9$ZRXH2F>VPnv+ouCfB%cv?%aOx| z$u(D22L_8Y^{QO6-5Tsu>}7YTQC1BsSk33J!OEDyja}J*RoTF_nn5|Td3iGht7#iR zMabA7zvjuW`B{t-M@@j7;fj!un_j2@3mi5J$3Q6_UNjBhQ&}f@RyIEsUJDvm&d4s& zG{J`&;5-c4oWcVGbPxuR;hidU3a}>|rktIW-$Zp~;D`*AR?#FtE1a<-a>G#Nb)qrY zLK%Jnn9mis(U@PeR+8OqfX*a}{F`iAYB<4a>LmyQx)y}fYy>+kg&?X!w1_OGUzH)Y zzpkE-7&nk{NB@{7Ej@0IP5bG9Zdi8ru!M&*@W#jT_f|d52_Q!}ps`Zs*mZzaL$puD zyATbxN|TL{?1z$@qp@eR6;vxwy+uc3B1Tj$V(`JvPrFn=Q4Lb(P~+4OkzQyyG%LjV zQkBk<{7l*-6QKt{@rZ@geS~d;`?ZrS?9e(!?oe~=%DY34eqG{F{TtYc0F zhHW5)C#D-Y2>SE|^Dmu$J;44X3v-wtpO0$*cI2xAp)hqE0v7opFrgKqp%F5ZQ*>2U zsaR$u>a4GejEKm30I;v+<$4873J5mZhevtJxfZrZ{6zK^$Wc2t z;>Z?1v|$3&<61x&~v^$~qj-KEzlkXNrM`vA9u4zUyWUXs$PEOvms6bEoGJ zSp$JI`aO^Km~7LmYMUp^he;*u&cH&Int_Lu(X7$3FZA0{*c+i^&8dshRpi7*uE|{y zi{xpRH3<)4G6pSDZ9scrNuUr{hxoX=#!<%FL%pBt(K5`lW>mjbGebZh9mxhc#>{pU z0;^oM`C*H^3bLJY9`r)z{bDDKxIE3EzyxN35yAZ508Hq3ULfI}22nP2r2Gs3g?G|$ z+ChMt zC1Oj(Hiwi^b5JG*PXx<5#HlK>)I@X0LxUU;h}~insy2W~A^WA>Uox?z!Nm~Gg&|I> zT(cBbq}=o6R$8^fEk!G^h`6tVa;z@_RDiphb}1rK&N{T5k?UCJNCy^Jmxz~DVcG!&)?5;Y0i{_+XgSoo=77=Va0-i*n{X9k zqfZBdTsN|=j~b_K0ZunMJf0?x;iII^ju@6X+?hF)m3*&!@~kFimnHzpajkW5%oZ~` zuG#uGSX>gdc_M?X&90T|>>1f21t8V$J~%(7R8F_lSTjtbs*AaE4!dz z7U7Cx1w9O#3Nz~++EiUI1CHIm&T2?nD1P(kVwG9&glGS8JMI4Zv z4zUd2m@Ez>v0fQImxxc0L8oLQ$at5GtVhUo05iDCzD?pAC zvm~B3#CFl4a?naOCc7NmXF!eDJ0h&)3SZ)qH;B@KVDhj@JZ4;hJ0zy+&`J-oOIi4$ z#>{LD&Ryht4?;ID|678(*^vLeuATj|q$>c9uf=xM$=2zJWtw3WqzfDHk?CaT$cd%& zf`Yu+*s272P+-g>y~@LX*cEemTaL|vs=(zKOfgsoHeOookY_4K>LUdi<)QjmxN^9& z*{%IsOuhv+C>#=Wn?g2iwR_C)f#N31$}2r;ZHH@2p0r!#0XgTl0FBU^r%Lhwre!mt zYN`{siM_JnCv zXQ6&Uk%9BO>A^9sf_Wo1*JM?}?<{bUiw^Gv)G{q*?y?<^&MM|m@}Mwy5}eM3k7|va zarXNpO$zmev@syAZMrr^Wu=tnXoiL1P>6!9(peD4v~@eqk2xlZXWZ%}S^{X{#D8e1 z?@mI+U^T%F;$kQTJ1(|_?Dfa_KxwlHF~5=67d-mt`bao6$XrmKI#*)R*+zw{lK9|u-pUz2f}5j5m}B?{Lv4~bt2Gq|P*bU{II=o4RX_$k`{d6$ z*9Rh{BkHFkSMBj4}HL7Abp#EiZ1VZ6xOm5H%;i!RKl+0_>>XnRMiam!&)!|4BNg zrFS7oB%DWXh(h4A9qIF83-ZtK{NrH<&Cbk7ik zP%Js}Wm_IaR5LoB<;NGAVf({RONJR1a^?s z$>~)HQ0+V*uU3{l?LIQ1xXA z)RH$!jtW8au^_?ru&F=?QQksaKBf>=LIV8J+c&brjtny_eM~@-f1if8Q@Lo`J>FWQdfjkd3gr^MNY0WsG=#+{NHF1s08~n0~i+X{`sRw$88PjkCFx=lNW5}-bmY{92grMUxDS#f!jk87vI0^pF9waf7G+ zv_YOiwX$K!B~Va91C6&UZiju35k-l_Q{7qb|t2UXZ1{6TK z{~=%vA_yk>QuR3g2)P~_8Au<8bkFB$2wKK|4!NJrMax`@LD#{%>c~KwFRxW2`}RuT zo;7ZlF3{~=KBsw=GYlZ?10kLsk1Y2)lMe09rTQmdALuOll$ge!7 z0*DzG7FCrxg<8=}1Omn5meB(gWDy;wK-aBx7h}J-+~tT-lCOC<4p$?fEFJD~7ITEg zq;l5TA6WwmFhy|DIqL@%V7`d+Ag??sZM}CsP+pC@P*5Q=`^q`HVrOq96~0tp5#80Z zjY9B*&0WM~FmudJDnj{ca0$v-EqL(=oy{7=onGo*9=;eQXEoeQ?26dIK+0u4d$tg* z@GrLuXHGC$VFL_ZLWeAs>1`##h+MV5J9*z?8jP_Z&!^4!F5w) zQQb*&L}dhU)%84XRL)gIXXL=cDn24?{8)t4ci?*NM)@t~qCN?YA?^ggor^O6AzlbJ z5P&6cWC;&tBMI{8QQId7;i#5{llG`k8BCN>Tuo;=oo8ST$FIR*2D$`^=2dH}q`532IB`tGUE~z1mLtVFoGcrWmQaGFit5BbAg9KRw`(y*5 zjA{@~(tfD~T;;F3R$j`)h6;|r(?tJjJAk6SJTUYgmoB#O9Zht-2x+?LRs~|AaazBR zFE?X4AT9S^lwC8fR&Hy_Q> z1NXsM8rMp>OR2(gMlo>8kX1@jL- zR}PVHPz#3&gEGJhh{-wtHj^lA0K7rzq#T?Wu=mpGC_($W<1jk9z=nT{5!kW0^{{O(jY{4(CjIpq-@V$#)5q(ctn;3HshAx6t! z7xYDt{)5ubIE$EZPPuA=?eYvKO~k<+N; zD{^PUypkCTx6(0^ShqQDfN~?HO2}8xJ=)$TwTR;!QPx>FOJtU&An)vS>Z$>4W!!ov z``0C1aAfy5$01%ivL_5kxOwDs1(8_@bXhAyzJlLqCidE8Om^AHlR?5Lmw$<@K)w$x zoNLY{?99MTy0;GeCP(o`kS47Uz+Nt|70iQ~R1Ab!UoMD4IPyAQ3I3ZItqSX&xWWx||)Y~8WPE?8`a8s^Qb zThOq00RZEc%&0;=w+!&?*LtoIC2C7ZM%ktSQ7qcZ$WYm3oO2zH3`3a=e;VkG8|KZ= z*#$Yx6b|tKujLJYYTDE-o637ElLF`)HW4gI-L=WW14YWG6-q2T;tSI8dGKg?$bqgS z=T^lg0jdtW0D|(ex00$6PThR%C%aRF(P~HE_7L+?A-A%-@JT4Y@1O^MsZa(1YlIwxDnIT4OQnpA^|8&w{0>Z)gzP z_Bwe9t?LrloMOE$(nMkp;!IhbCnS3KMB`s3Q4s7^m9*jMD~6Z^D3y4ZY#Ymzyuevz z=d2p(^tZD-0H{^#`Za&Mt0ZxYj!Y0cOgsST$z#fv|f-UH#NQ57g zmv%ES5YV6mX)npfN_W)~A@en_=a(i8LPK&*#HVhn%3wG3jmj48YW`4X&#jiy#axK1 zm`;VU85L#OrC9e&agTD~nFGUeJ!-7ez0k@9BH9E-Wvb8!XWNctWfJ>jVYy>yl^A)% z0qN7Yq$wXdy8B}zrvKyG!iJdSnOI{ov zvB;p@fXF#hTA1bKTeyoH@k(Rb$=9kD52{NlpXRxp0X5Y{dgSGr<5nrVE>#of)Ai6E zpvvpZwCw^JPXzka2(rqKCv*ppSp&{@2iRtp6<=y@)CFT+U;5Ow;a#V8;QYT<9Cbm7M7Mq8J^~7bkEtg`5#Ra^B_RBE zp{*Yt(YaOI?UX@!{!kXPW@9|Ii#@hJ5K%bBR~o5aQqQ#Qj;*bk z^hxGpgw}gd544%VaBm;jYh|{l33XJ+L4Y;tE0<(CE9P{UaLZnVIBv51G3{aoXnE?0 zwQ%TkE)MBTK)sT<2sNcfVbx7`EKtjfCX}Z0fPJ9;_HcY!Gq`K)6x>cq?2xL#9q5)( zgVq=_SnZN=9Ds%qiu@cL0OOuy<8yv!(7o*^Ly+hJJ?4tNuY zW;1hoA46h3wIJm`h@FsXAhN*ATCH8>DU-Pg<_rqXLI)8DuE@FRQLN8xz+g-LM>GoT zTb%9~rtE;2^s3m#N_;CHJCaZa_SVB~oCtZxA`oYzIn-KzC&i^W;&fyLsz@pd5rwn= z%gK)$tK~4W(%_4e%DxnV`VH7*VUkL>NP%N5=FB@UXKHT07OGp$LW57vdj>Nm6SGlI zrsu;xRjSF7A>bO9!Goy^vUn}Rj;xP`HyZP0=|eobYLql*{Yj9f4A5~JAg3@>{!}bx z9vz9yV_CCKW#$R$4hy$onvcm$*w*OK2qQf9WXcIQK=c9-b)EOLYI8CRPTx}I@MNvP z9IhyH0#pZdgLY$wcm^aW$RDIP8VSiUWJ@V3mwc@Pc=9~N)42lV%Iq}8OowjTBJHK% z-r$K(hXfBUJ-2wmWpnDjGL%_#?nR3Wu6ba0d#5IlSQ{MqNYK^vs&!1D{Oxd!(v_^` zjLHm;MsR%FRv}YCy4E4rhlxCO3tWU6Bo52~)uizrY#xO$kgRQrZtKg@xV*+s6^9x+ z9VV>{ox1^Nl1d?@bA+8!acd2ocgwCpMw7vKT^+&NAaEUwR3nG48B^=-4kfUVL@Ld< z^kglSjXJr86g4rxOG*H`&m@_otQ(FIqec$Jt{u8Qx+fcqgf1c-INjCAG#mEpC8`Uk zGeGPvif)htK3_B?tI!<>_odDSH&K72V%gBwcSX_KLhR3byc2gVdKoCZTO%9r#K+b!G1uDwA)#aS09th%Hdz9apllV3Df z%kU`T#Ai1Gs7lPfp5yxGhat;k+o~95j`tD7nSlksU5`w}9Il2C3B#pkz+}2Lbs6ZV zN;PRPL7hwGSxcJ@uGy3K3^>)kq>8~6&9X{b?DT1o ziLzzbk8F=Jo+4QnyV3x8;6+H6M$3}=-!_?8kF!sGbQQM*$G=*CkrVuK#MxNSU1X;s zz#}+JLJvhi%$HFO8-biDBAdG>82RGz1+ixX)xB(IYJ)k&yY z(+Rkakbc6FCt(h!L_05OLzuR!k^PGmRJp*;W6YX02|79cy87WUgt3;9^m12`$aW9W zHDLS*iW%)49guZ!6v7MyzzQM$6`PmF0lru=ia35dx^YE1&Sp!0B0kcga_3=ot-4&O zA=e~1fmqm)qe|r{n%VdUeLGf7YukpS%x-`J6HiwZU|*59SMe>+GzNWqku-B)T4Afk zX*%3<36-cdm<`UsgyYenS`gr5KeXB~wyrU2wBl_vR!5zr^g6f-)FW~fwlNt=LxL9u zwxO{Uwv;qMDG&Z?BBQ<~{z@=m7?}F}m}}*dMmFL~&_^04xL;leF80^4i8T>RPs|{l z*#vv0@8XvIc4X9w8-R)rQIe@4=LZmwqa^(@9RaH~cN_=BB%hnBHG9e7UMi3oLSX6t z)%3F(At+PuFSekTwXEbDAbRdqr|(WXD18h2i^BCfpC`YgEnb5RdA2o6#o%T-YOkCF z?D_bZE)zpzb1JySK66eSQ^GS+M@(rCrVOZ-y*Xs|QFccW3JL-ML$1BZoa>96tayEq zF_umwxRzKW-I)m)byyM%T4QE292{}bP&LV=^r~yL0G_$za9Ww@d?#57y=5W3@=HrtT9+l*j%f&(~#K_ zI$vdUA~~0-qnr}wzxj4{Iq~E!~e>Ij&({- zjL!_}&a(P~?2~FvrHF??QtZP_ArRVE+yJQVkIXP2+2L=pidkpS-Pbc$<9IZ}gOfp! z%t=GxZ0`XHN=a9l;TTTvqRMJQl1+-h?fOs?ypwSC6k0$_h?zsPTEa?1?bYUb?d1VE z39NfRdoHHQPbsT$t1R)A#1^SuTA*?&*tzmfg+{U@mYx>-NLkGUv4#+oRK)^ zb2a}S09F9WT$yU18oYxzxXO;E84$M80p!&>4=9U1FP3N5wu{+j4Z`fyD2$K@$g6AO z<74XR8O2_s{g$VZbmo>IicRZ~3V&92!9ilXfoD`m^*NhMv-9S-H;y*|Kr+L|#>sgg zDT}z|GvzEr8uePVqFFY1WJWXRUE;6r8(@R0{D&#a~_$D1gNOb4)YSPh#Fi-#)DmL2dR zY~G-X$XH;R3G9;4Hc%E>Dm4nZ3%BnQBO;9ph+ob}65)D?twBA?(w#Dk-5!cba=T5z zlC#4P6Mo7=mR-G-yg-#vgv)9-G17aYIoy?lh(3sQ7zvNrh6)pcFdJH=djp*p2MfV_ z8FrKwea|#hCzK2p9r7)rDfUH)(>?R&=i4+|}OM)79S9wPt-sPe;qT zcATBv5lbfGbOQ(V zIpM`uS5KOLn4U1jQY6i!$>i!1Bf-D0kRRBUP_9XsxvwC zpDs&5oP-I_Oq;YUp*uj7 z2{0o%pOM{^gpmAuh!F=hw&BrkuQ6Ij?lq)VBURTXr&^bk$6gQd8jur_jVCfaw|9<3 zrC>t^QL=T5E&*PO6h{2@-+EaDkG#ZZBtQRrO91o z!d>gQQiTkTx>Ar?X{KgMMI>29o?-FaW-#H%>8M`LI$e_q{h#b?Y7FFl7@QKB>Okbs zU)+lsi;wP7mi_~no>U!K;MH|IS|;mS92ci$08ga?c&+li(_FM8h6}9QHsoPzbkQb? zBz-DWIq*DEm9UB-Y$iwJaT4J)=(t-HrHCtbtFY(>&~yT);!M^$s|#^4o8$qFrs%jV zRGwC4;DXx83Xjc)tbOGn@5smPWSDV6xS3Qr7oOd!Tv_-l$xEX#`=1Qcq#c!Y5`8r`T=Na)tx{fSyX~G zcWK_QaV3%6gGQ6urW<#7>KLl3Hs$~a6RC8g?q0~_VB1~9Hz|C4+8u9rhSFO-qsS@4j!2EDMZNK$6kxq;{ zSeXciMa)}s@Sx_-Jk4(&5Z&dyoPo?Z&^h+-laO6Ql4$9l$05XK1Xd zoQJKbs8fPPB~FpG&g7f7VN*iQ;h`AcGm|vuaBt>7nnjp6=+H^cNuCT4%qXNv-w-yI z^q6$Ur(VdA7i9l}A|9s06t*^8l@eRuh1jkA$egh)aLC^b9^l|yZb&4sPFX1?;Xv*Q zG=4j>4aW({7I`UCu4qxA5i^EMUAPWucxeO^#n-LZ%uz8W<{TCDrFO*)+hJc;CJs!LDKqLSv7#Js#(d&{IsC^s_6YV> z%m}P8-~!}TK|2vpnsgMvT)tJE4uN9Fl~p1d0^&Skr=feh>5dM*iaK-uuxrN*j%M8F zLE8|85CeYe&htD=%OSQHE0uf+<$WI7DA;Ib-{SGF!xS~y8WLFx)b*a@PUO0T!SI2@I9VOi?{jPIO>d zY#kgL$SMm2)dYr+nW}{!Ycvkk48l|}$s@zG+0+kaN@@lrM$63M0XTetfe*ud8ZMKR zlkWi4eI!3WVyYUTqQTcZ2S=v+h~wz2Or&AzZnmK#jbw_*N$zDgbzbZ6ALVyUJXjtp z)TUDEPTMMB5DKzr0l9%r?Kuzr$vDVXku;`^#0wlsLOC*n!xG_`K5_$N zv;t*SGe-2$jS76_H?}vBPWI?yjU(tHqQ7W_IGA~{bGy)oVgEmvs}(N1BGE++#Ttpr znHVrj(3B}lOcTwdLb?sGO0ytGLuVXfRJDwzIG&D!N_dkbQ2-S|QH!e{5bqF+VF>Ec zxgnr2KCOsO0=>7|wg4`j!=~|b>l#!gAA>+Pv@kN@4r$rAb?$+TnNN@Qhs6=rzS}Dm z6csYYLCj9}dOX0CgzN_F=JCX`t)2xtk240Cg_+uu9pKD07^*kdfTYU|WLw-*5|S4m z;kFvO-){g1&CQPRj@W=amBv?f=vR%b$o`lMYaA0!%D97@Cq)^Q)cfzT(hsTX(?x`V zv2Hb@>#c(jsZ*YH>0Q}dq%31E2nYF)$D(syF>z3(Y=S`9`F?8W%AQ-7Edg@9v|O}E zkG+`OEuBJ>^$yZQ#Q7pOJe;-dXmIAYD%vs6m5i;&f`<>+M#cxCk#Iy_Zg(?gI(IZ1B$r9LwS)kgikje`uHwm_m#ch>BU7HKn0aAhmP?sx^82oJ>MR z^55Y@hH6m^eAjN?nIKr!nQVNR4%$l0EbHDaK9q!6sv5c@sgH%V9Y<*f6OmQz-RK_Qcuzq$(1aCOM2Cbyuy0t3 zFdAvE>*1fR@`p4uMI)Uux(GQI=p;l?#oTZlVi|>amyAr?4@qS+hb5+`m0{fSHOAqi zdT}ak0P$<$5#DtWItMnWPQ+jxO=0|e*f0XjOhPrT+`y7O{F_`TMxqfueuZH510+dB zBP*4yjXmdJO{6URj6(RKoL2b<5msoeG~93r9xcOpSB{IXkKlhk-MoKn6r_@79MwBP*0zShWA%_j1oF#7 z=~lL(rF%7QVFhE~q&MYLZKA?DUFr|#&>0*AJ6}2k0^+Q471bKBas+#7k7A-C} zvmC#0CqkWX$s4jGY{+%Dz)6a`=4Y#g?XotDv}XKt3||d1e}?QglJm@$?tq(ufYl2$ zYqOHfY#t~_b_06!`QJ#$XTQ&YCE3JX{4+x@qi^{Dj{7Z!Bz&`YO>Q_Vm0GhAlB?x9 zC_N|pm#^gmOm%jn`l1s^RaUobLC;EZ%dU0?Ck|8P&aUPy>>Ldd&r=Z&LaC_eXEbuE zic3Y;DmHT{)h1GWW6QIHD`fI)?nofFS||Wz z*D|xn(6u@^w4I5MJ`r*_s&kAyyVhI<9MPZcnq5`OK+Xs5q6D!F=xkTR?eQqH;x^~X z#6q~Oy>@_uE0Q5an@EKTeAyX4b#&xZ4lqi9Ll98x5Zh%Q%3?p6O%%y_teI2jm74X@ z5%s{8&@&rf3DKFFBLV7QxiLv~y|ZtaRCo?xkK2xK>~N9Zq0CI!7hJbkNDxvOG+s2& z*)lrQ;F?w7XU7Xk#2g7Ksu+gZ%p7GZ0uLy>XYLFml%8JA^0)jk3ddS=(PFGjn({N73zN@ZRr+(0Q>=gObjYL!?3)wGo zB&iClH`IXZhst2-rRCkxAe_)-gZ${Rs)XG4VB6Vv_|4m8ZaUFJhYuVuVX2yr>Do_r z07FUxYY3E4ZwcOxM^r?-VzWx>k6RC}OJXS%)${`k$e0f2DVhR2sq6$&$D@J(vFzBL z_=Ppabd4`}7ymM8r5kDS%(EiwJM)AgjFuIxZS5;ptzL8d32WDNtl#h-on74h~Y~rx{t7$#RWLnwF}9 z!YC*#@)VbpdVOX7@^OKR@e?K84u@3XYlM-cedOIzEPOmNwDr= zCud1PPdz0xN=J%ey5;7fKSR;x_=gOdB_F|eaLl)?pm6+JN1}3sf7`A*j9vmeRSrkjF~us; zdH_)(6#|Ek6Yi`!z80u%-mb|0y35f3X{xPZN+`H9$uujXn1+x$6R_0*QS8_xoWk~p z&`$J(1RYukkInL#Qf15*2XTdwr

`mWTXEF){b-mwBNu$<%~nR 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 MUR1E)okr9D0iuPMbpQYW diff --git a/vendor/agent-browser/runtimes/darwin-x64/agent-browser b/vendor/agent-browser/runtimes/darwin-x64/agent-browser deleted file mode 100755 index da8e093212ccf8674698356b3f41617f7cee35d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 942880 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