diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a20ef5437..2cbe9838f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -72,7 +72,18 @@ jobs: - name: Install skills dependencies run: cd skills && yarn install --frozen-lockfile + - name: Build sidecar core binary + run: cargo build --manifest-path rust-core/Cargo.toml --release --target x86_64-unknown-linux-gnu --bin openhuman-core + + - name: Stage sidecar for Tauri bundler + run: | + mkdir -p src-tauri/binaries + cp rust-core/target/x86_64-unknown-linux-gnu/release/openhuman-core src-tauri/binaries/openhuman-core-x86_64-unknown-linux-gnu + chmod +x src-tauri/binaries/openhuman-core-x86_64-unknown-linux-gnu + - name: Build Tauri app - run: yarn tauri build --bundles none -- --target x86_64-unknown-linux-gnu + run: | + TAURI_CONFIG_OVERRIDE='{"bundle":{"createUpdaterArtifacts":false}}' + yarn tauri build -c "$TAURI_CONFIG_OVERRIDE" --bundles none -- --target x86_64-unknown-linux-gnu env: NODE_ENV: production diff --git a/.github/workflows/macos-arm64-build.yml b/.github/workflows/macos-arm64-build.yml index 1b81d4e81..6b1ec26bc 100644 --- a/.github/workflows/macos-arm64-build.yml +++ b/.github/workflows/macos-arm64-build.yml @@ -87,6 +87,23 @@ jobs: VITE_SENTRY_DSN: ${{ vars.VITE_SENTRY_DSN }} VITE_DEBUG: ${{ vars.VITE_DEBUG }} + - name: Build sidecar core binary + shell: bash + run: | + cargo build \ + --manifest-path rust-core/Cargo.toml \ + --release \ + --target aarch64-apple-darwin \ + --bin openhuman-core + + - name: Stage sidecar for Tauri bundler + shell: bash + run: | + mkdir -p src-tauri/binaries + cp rust-core/target/aarch64-apple-darwin/release/openhuman-core \ + src-tauri/binaries/openhuman-core-aarch64-apple-darwin + chmod +x src-tauri/binaries/openhuman-core-aarch64-apple-darwin + - name: Build, package (no GitHub release upload) uses: tauri-apps/tauri-action@v0.6.2 env: diff --git a/.github/workflows/package-and-publish.yml b/.github/workflows/package-and-publish.yml index 6bc51315e..7a6a3cfcd 100644 --- a/.github/workflows/package-and-publish.yml +++ b/.github/workflows/package-and-publish.yml @@ -167,8 +167,8 @@ jobs: args: '--target x86_64-apple-darwin' target: 'x86_64-apple-darwin' - platform: 'ubuntu-22.04' - args: '' - target: '' + args: '--target x86_64-unknown-linux-gnu' + target: 'x86_64-unknown-linux-gnu' runs-on: ${{ matrix.settings.platform }} steps: - name: Checkout @@ -288,6 +288,28 @@ jobs: VITE_SENTRY_DSN: ${{ secrets.VITE_SENTRY_DSN }} VITE_DEBUG: ${{ vars.VITE_DEBUG }} + - name: Build sidecar core binary + shell: bash + run: | + cargo build \ + --manifest-path rust-core/Cargo.toml \ + --release \ + --target "$MATRIX_TARGET" \ + --bin openhuman-core + env: + MATRIX_TARGET: ${{ matrix.settings.target }} + + - name: Stage sidecar for Tauri bundler + shell: bash + run: | + mkdir -p src-tauri/binaries + SOURCE="rust-core/target/$MATRIX_TARGET/release/openhuman-core" + DEST="src-tauri/binaries/openhuman-core-$MATRIX_TARGET" + cp "$SOURCE" "$DEST" + chmod +x "$DEST" + env: + MATRIX_TARGET: ${{ matrix.settings.target }} + - name: Build, package and publish uses: tauri-apps/tauri-action@v0.6.2 id: build-tauri @@ -305,7 +327,7 @@ jobs: # macOS 10.15+ required for std::filesystem used by llama.cpp MACOSX_DEPLOYMENT_TARGET: ${{ matrix.settings.platform == 'macos-latest' && '10.15' || '' }} with: - args: '-c ${{ steps.config-overrides.outputs.json }} ${{ matrix.settings.args }}' + args: '-c ${{ steps.config-overrides.outputs.json }} ${{ matrix.settings.args }} -- -- --bin OpenHuman' includeDebug: ${{ needs.get-version.outputs.should-publish == '' && inputs.forceRelease != 'true' }} includeRelease: ${{ needs.get-version.outputs.should-publish != '' || inputs.forceRelease == 'true' }} # TDLib dylibs are now bundled natively via build.rs + tauri.conf.json macOS.frameworks diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 01d7cb5b9..098d442b8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -219,8 +219,8 @@ jobs: # target: x86_64-apple-darwin # artifact_suffix: x86_64-apple-darwin - platform: ubuntu-22.04 - args: '' - target: '' + args: --target x86_64-unknown-linux-gnu + target: x86_64-unknown-linux-gnu artifact_suffix: ubuntu env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -305,6 +305,28 @@ jobs: VITE_SENTRY_DSN: ${{ vars.VITE_SENTRY_DSN }} VITE_DEBUG: ${{ vars.VITE_DEBUG }} + - name: Build sidecar core binary + shell: bash + run: | + cargo build \ + --manifest-path rust-core/Cargo.toml \ + --release \ + --target "$MATRIX_TARGET" \ + --bin openhuman-core + env: + MATRIX_TARGET: ${{ matrix.settings.target }} + + - name: Stage sidecar for Tauri bundler + shell: bash + run: | + mkdir -p src-tauri/binaries + SOURCE="rust-core/target/$MATRIX_TARGET/release/openhuman-core" + DEST="src-tauri/binaries/openhuman-core-$MATRIX_TARGET" + cp "$SOURCE" "$DEST" + chmod +x "$DEST" + env: + MATRIX_TARGET: ${{ matrix.settings.target }} + - name: Build, package and upload to release uses: tauri-apps/tauri-action@v0.6.2 id: tauri-build @@ -328,51 +350,43 @@ jobs: # the desktop UI app binary is packaged. # Yarn v1 strips one "--" layer when invoking scripts, hence the # double-separator when forwarding flags to Cargo. - args: -c ${{ steps.config-overrides.outputs.json }} ${{ matrix.settings.args }} + args: -c ${{ steps.config-overrides.outputs.json }} ${{ matrix.settings.args }} -- -- --bin OpenHuman includeDebug: false includeRelease: true releaseId: ${{ needs.create-release.outputs.release_id }} owner: tinyhumansai repo: openhuman - - name: Verify macOS app bundle excludes standalone core binary + - name: Verify macOS app bundle sidecar layout if: matrix.settings.platform == 'macos-latest' shell: bash run: | APP_PATH="src-tauri/target/${{ matrix.settings.target }}/release/bundle/macos/OpenHuman.app" echo "Inspecting bundle at: $APP_PATH" ls -la "$APP_PATH/Contents/MacOS" + ls -la "$APP_PATH/Contents/Resources" | grep openhuman-core || true if [ -f "$APP_PATH/Contents/MacOS/openhuman-core" ]; then - echo "Unexpected standalone binary found inside app bundle: openhuman-core" + echo "Unexpected standalone core binary found in MacOS dir" + exit 1 + fi + if ! ls "$APP_PATH/Contents/Resources"/openhuman-core-* >/dev/null 2>&1; then + echo "Sidecar core binary missing from app resources" exit 1 fi - - name: Build standalone CLI binaries + - name: Build standalone CLI binary shell: bash run: | - # Temporarily inject [[bin]] entries that were removed from Cargo.toml - # to prevent Tauri's bundler from trying to copy them into app bundles. - printf '\n[[bin]]\nname = "openhuman-core"\npath = "src/standalone/openhuman-core.rs"\n\n[[bin]]\nname = "openhuman-cli"\npath = "src/standalone/openhuman-cli.rs"\n' >> src-tauri/Cargo.toml - - CARGO_TARGET="" - if [ -n "$MATRIX_TARGET" ]; then - CARGO_TARGET="--target $MATRIX_TARGET" - fi - cargo build --manifest-path src-tauri/Cargo.toml --release --features standalone-bins $CARGO_TARGET --bin openhuman-core --bin openhuman-cli + cargo build --manifest-path rust-core/Cargo.toml --release --target "$MATRIX_TARGET" --bin openhuman-cli env: MATRIX_TARGET: ${{ matrix.settings.target }} - - name: Resolve standalone CLI artifact paths + - name: Resolve standalone CLI artifact path id: cli-paths shell: bash run: | - if [ -n "$MATRIX_TARGET" ]; then - BASE_DIR="src-tauri/target/$MATRIX_TARGET/release" - else - BASE_DIR="src-tauri/target/release" - fi + BASE_DIR="rust-core/target/$MATRIX_TARGET/release" echo "base_dir=$BASE_DIR" >> "$GITHUB_OUTPUT" - echo "core_path=$BASE_DIR/openhuman-core" >> "$GITHUB_OUTPUT" echo "cli_path=$BASE_DIR/openhuman-cli" >> "$GITHUB_OUTPUT" env: MATRIX_TARGET: ${{ matrix.settings.target }} @@ -382,7 +396,6 @@ jobs: with: name: standalone-bins-${{ matrix.settings.platform }}-${{ matrix.settings.artifact_suffix }} path: | - ${{ steps.cli-paths.outputs.core_path }} ${{ steps.cli-paths.outputs.cli_path }} cleanup-failed-release: diff --git a/.gitignore b/.gitignore index 428fc2ab6..838620ff8 100644 --- a/.gitignore +++ b/.gitignore @@ -51,3 +51,4 @@ coverage/ tauri.key tauri.key.pub +/target/ diff --git a/CLAUDE.md b/CLAUDE.md index 49f8bbc96..427e0f6f4 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -2,6 +2,12 @@ Cross-platform crypto community communication platform built with **Tauri v2** (React 19 + Rust). Targets desktop (Windows, macOS) and mobile (Android, iOS). Features deep Telegram integration via MTProto, real-time Socket.io communication, V8-based skill execution engine, and an MCP (Model Context Protocol) tool system for AI-driven Telegram interactions. +## Runtime Scope + +- Tauri host/runtime is desktop-only. +- Always run and validate Tauri codepaths as desktop (`windows`, `macOS`, `linux`). +- Do not add or maintain Android/iOS/web runtime branches inside `src-tauri`. + ## App Theme & Design System **Design Philosophy**: Premium, sophisticated crypto platform with calm, trustworthy aesthetic. diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 000000000..1991cfca8 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,11298 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "OpenHuman" +version = "0.49.16" +dependencies = [ + "aes-gcm", + "anyhow", + "argon2", + "async-imap", + "async-trait", + "axum", + "base64 0.22.1", + "chacha20poly1305", + "chrono", + "chrono-tz", + "clap", + "console", + "cron", + "dialoguer", + "directories", + "dirs 5.0.1", + "env_logger", + "fantoccini", + "futures", + "futures-util", + "glob", + "hex", + "hmac", + "hostname", + "http-body-util", + "keyring", + "landlock", + "lettre", + "log", + "mail-parser", + "matrix-sdk", + "nusb 0.2.3", + "once_cell", + "openhuman-core", + "opentelemetry", + "opentelemetry-otlp", + "opentelemetry_sdk", + "parking_lot", + "pdf-extract", + "postgres", + "probe-rs", + "prometheus", + "prost 0.14.3", + "rand 0.9.2", + "regex", + "reqwest 0.12.28", + "ring", + "rppal", + "rquickjs", + "rusqlite", + "rustls", + "rustls-pki-types", + "schemars 1.2.1", + "serde", + "serde-big-array", + "serde_json", + "sha2", + "shellexpand", + "tauri", + "tauri-build", + "tauri-plugin-autostart", + "tauri-plugin-deep-link", + "tauri-plugin-notification", + "tauri-plugin-opener", + "tauri-plugin-os", + "tempfile", + "thiserror 2.0.18", + "tinyhumansai", + "tokio", + "tokio-rustls", + "tokio-serial", + "tokio-stream", + "tokio-tungstenite 0.24.0", + "tokio-util", + "toml 1.1.0+spec-1.1.0", + "tower", + "tower-http", + "tracing", + "tracing-subscriber", + "url", + "urlencoding", + "uuid", + "wa-rs", + "wa-rs-binary", + "wa-rs-core", + "wa-rs-proto", + "wa-rs-tokio-transport", + "wa-rs-ureq-http", + "webpki-roots 1.0.6", +] + +[[package]] +name = "accessory" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28e416a3ab45838bac2ab2d81b1088d738d7b2d2c5272a54d39366565a29bd80" +dependencies = [ + "macroific", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "adobe-cmap-parser" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae8abfa9a4688de8fc9f42b3f013b6fffec18ed8a554f5f113577e0b9b3212a3" +dependencies = [ + "pom", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures 0.2.17", +] + +[[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 = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[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.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[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 = "anymap2" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d301b3b94cb4b2f23d7917810addbbaff90738e0ca2be692bd027e70d7e0330c" + +[[package]] +name = "aquamarine" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f50776554130342de4836ba542aa85a4ddb361690d7e8df13774d7284c3d5c2" +dependencies = [ + "include_dir", + "itertools 0.10.5", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ar_archive_writer" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eb93bbb63b9c227414f6eb3a0adfddca591a8ce1e9b60661bb08969b87e340b" +dependencies = [ + "object 0.37.3", +] + +[[package]] +name = "archery" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e0a5f99dfebb87bb342d0f53bb92c81842e100bbb915223e38349580e5441d" + +[[package]] +name = "argon2" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3610892ee6e0cbce8ae2700349fcf8f98adb0dbfbee85aec3c9179d29cc072" +dependencies = [ + "base64ct", + "blake2", + "cpufeatures 0.2.17", + "password-hash", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +dependencies = [ + "serde", +] + +[[package]] +name = "as_variant" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dbc3a507a82b17ba0d98f6ce8fd6954ea0c8152e98009d36a40d8dcc8ce078a" + +[[package]] +name = "assign" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f093eed78becd229346bf859eec0aa4dd7ddde0757287b2b4107a1f09c80002" + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener 5.4.1", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-compression" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f9ee0f6e02ffd7ad5816e9464499fba7b3effd01123b515c41d1697c43dad1" +dependencies = [ + "compression-codecs", + "compression-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "async-executor" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-imap" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a78dceaba06f029d8f4d7df20addd4b7370a30206e3926267ecda2915b0f3f66" +dependencies = [ + "async-channel 2.5.0", + "async-compression", + "base64 0.22.1", + "bytes", + "chrono", + "futures", + "imap-proto", + "log", + "nom 7.1.3", + "pin-project", + "pin-utils", + "self_cell", + "stop-token", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix 1.1.4", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener 5.4.1", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel 2.5.0", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener 5.4.1", + "futures-lite", + "rustix 1.1.4", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "async-signal" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix 1.1.4", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[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 2.0.117", +] + +[[package]] +name = "atk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" +dependencies = [ + "atk-sys", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "auto-launch" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f012b8cc0c850f34117ec8252a44418f2e34a2cf501de89e29b241ae5f79471" +dependencies = [ + "dirs 4.0.0", + "thiserror 1.0.69", + "winreg 0.10.1", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "aws-lc-rs" +version = "1.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a054912289d18629dc78375ba2c3726a3afe3ff71b4edba9dedfca0e3446d1fc" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa7e52a4c5c547c741610a2c6f123f3881e409b714cd27e6798ef020c514f0a" +dependencies = [ + "cc", + "cmake", + "dunce", + "fs_extra", +] + +[[package]] +name = "axum" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8" +dependencies = [ + "axum-core", + "axum-macros", + "base64 0.22.1", + "bytes", + "form_urlencoded", + "futures-util", + "http 1.4.0", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "serde_core", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sha1", + "sync_wrapper", + "tokio", + "tokio-tungstenite 0.28.0", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" +dependencies = [ + "bytes", + "futures-core", + "http 1.4.0", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "sync_wrapper", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "604fde5e028fea851ce1d8570bbdc034bec850d157f7569d10f347d06808c05c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "backon" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cffb0e931875b666fc4fcb20fee52e9bbd1ef836fd9e9e04ec21555f9f85f7ef" +dependencies = [ + "fastrand", + "gloo-timers", + "tokio", +] + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + +[[package]] +name = "bincode" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" +dependencies = [ + "bincode_derive", + "serde", + "unty", +] + +[[package]] +name = "bincode_derive" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf95709a440f45e986983918d0e8a1f30a9b1df04918fc828670606804ac3c09" +dependencies = [ + "virtue", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitfield" +version = "0.19.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21ba6517c6b0f2bf08be60e187ab64b038438f22dd755614d8fe4d4098c46419" +dependencies = [ + "bitfield-macros", +] + +[[package]] +name = "bitfield-macros" +version = "0.19.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f48d6ace212fdf1b45fd6b566bb40808415344642b76c3224c07c8df9da81e97" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +dependencies = [ + "serde_core", +] + +[[package]] +name = "bitmaps" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d084b0137aaa901caf9f1e8b21daa6aa24d41cd806e111335541eff9683bd6" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest", +] + +[[package]] +name = "blake3" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2468ef7d57b3fb7e16b576e8377cdbde2320c60e1491e961d11da40fc4f02a2d" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "cpufeatures 0.2.17", +] + +[[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 = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + +[[package]] +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel 2.5.0", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "brotli" +version = "8.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" + +[[package]] +name = "bytecount" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +dependencies = [ + "serde", +] + +[[package]] +name = "bytesize" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bd91ee7b2422bcb158d90ef4d14f75ef67f340943fc4149891dcce8f8b972a3" + +[[package]] +name = "cairo-rs" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +dependencies = [ + "bitflags 2.11.0", + "cairo-sys-rs", + "glib", + "libc", + "once_cell", + "thiserror 1.0.69", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "camino" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.18", +] + +[[package]] +name = "cargo_toml" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" +dependencies = [ + "serde", + "toml 0.9.12+spec-1.1.0", +] + +[[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.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1e928d4b69e3077709075a938a05ffbedfa53a84c8f766efbf8220bb1ff60e1" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cff-parser" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31f5b6e9141c036f3ff4ce7b2f7e432b0f00dee416ddcd4f17741d189ddc2e9d" + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[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 = "chacha20" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures 0.2.17", +] + +[[package]] +name = "chacha20" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.0", +] + +[[package]] +name = "chacha20poly1305" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" +dependencies = [ + "aead", + "chacha20 0.9.1", + "cipher", + "poly1305", + "zeroize", +] + +[[package]] +name = "chrono" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link 0.2.1", +] + +[[package]] +name = "chrono-tz" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6139a8597ed92cf816dfb33f5dd6cf0bb93a6adc938f11039f371bc5bcd26c3" +dependencies = [ + "chrono", + "phf 0.12.1", +] + +[[package]] +name = "chumsky" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eebd66744a15ded14960ab4ccdbfb51ad3b81f51f3f04a80adac98c985396c9" +dependencies = [ + "hashbrown 0.14.5", + "stacker", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", + "zeroize", +] + +[[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 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "cmake" +version = "0.1.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" +dependencies = [ + "cc", +] + +[[package]] +name = "cobs" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd93fd2c1b27acd030440c9dbd9d14c1122aad622374fe05a670b67a4bc034be" +dependencies = [ + "heapless", + "thiserror 2.0.18", +] + +[[package]] +name = "colorchoice" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "compression-codecs" +version = "0.4.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb7b51a7d9c967fc26773061ba86150f19c50c0d65c887cb1fbe295fd16619b7" +dependencies = [ + "compression-core", + "flate2", + "memchr", +] + +[[package]] +name = "compression-core" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75984efb6ed102a0d42db99afb6c1948f0380d1d91808d5529916e6c08b49d8d" + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "console" +version = "0.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d64e8af5551369d19cf50138de61f1c42074ab970f74e99be916646777f8fc87" +dependencies = [ + "encode_unicode", + "libc", + "unicode-width 0.2.2", + "windows-sys 0.61.2", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom 0.2.17", + "once_cell", + "tiny-keccak", +] + +[[package]] +name = "const_panic" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e262cdaac42494e3ae34c43969f9cdeb7da178bdb4b66fa6a1ea2edb4c8ae652" +dependencies = [ + "typewit", +] + +[[package]] +name = "constant_time_eq" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "convert_case" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "cookie" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" +dependencies = [ + "time", + "version_check", +] + +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "percent-encoding", + "time", + "version_check", +] + +[[package]] +name = "cookie_store" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15b2c103cf610ec6cae3da84a766285b42fd16aad564758459e6ecf128c75206" +dependencies = [ + "cookie 0.18.1", + "document-features", + "idna", + "indexmap 2.13.0", + "log", + "serde", + "serde_derive", + "serde_json", + "time", + "url", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" +dependencies = [ + "bitflags 2.11.0", + "core-foundation 0.10.1", + "core-graphics-types", + "foreign-types 0.5.0", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.11.0", + "core-foundation 0.10.1", + "libc", +] + +[[package]] +name = "core_maths" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30" +dependencies = [ + "libm", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +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 = "cron" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f8c3e73077b4b4a6ab1ea5047c37c57aee77657bc8ecd6f29b0af082d0b0c07" +dependencies = [ + "chrono", + "nom 7.1.3", + "once_cell", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "typenum", +] + +[[package]] +name = "cssparser" +version = "0.29.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "matches", + "phf 0.10.1", + "proc-macro2", + "quote", + "smallvec", + "syn 1.0.109", +] + +[[package]] +name = "cssparser" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dae61cf9c0abb83bd659dab65b7e4e38d8236824c85f0f804f173567bda257d2" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf 0.13.1", + "smallvec", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "csv" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde_core", +] + +[[package]] +name = "csv-core" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782" +dependencies = [ + "memchr", +] + +[[package]] +name = "ctor" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "curve25519-dalek-derive", + "digest", + "fiat-crypto", + "rustc_version", + "serde", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core 0.20.11", + "darling_macro 0.20.11", +] + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core 0.23.0", + "darling_macro 0.23.0", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.117", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.117", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core 0.20.11", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core 0.23.0", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-encoding" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" + +[[package]] +name = "date_header" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c03c416ed1a30fbb027ef484ba6ab6f80e1eada675e1a2b92fd673c045a1f1d" + +[[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" +dependencies = [ + "tokio", +] + +[[package]] +name = "deadpool-sync" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524bc3df0d57e98ecd022e21ba31166c2625e7d3e5bcc4510efaeeab4abcab04" +dependencies = [ + "deadpool-runtime", +] + +[[package]] +name = "decancer" +version = "3.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9244323129647178bf41ac861a2cdb9d9c81b9b09d3d0d1de9cd302b33b8a1d" +dependencies = [ + "lazy_static", + "regex", +] + +[[package]] +name = "deku" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9711031e209dc1306d66985363b4397d4c7b911597580340b93c9729b55f6eb" +dependencies = [ + "bitvec", + "deku_derive", + "no_std_io2", + "rustversion", +] + +[[package]] +name = "deku_derive" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58cb0719583cbe4e81fb40434ace2f0d22ccc3e39a74bb3796c22b451b4f139d" +dependencies = [ + "darling 0.20.11", + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "delegate-display" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9926686c832494164c33a36bf65118f4bd6e704000b58c94681bf62e9ad67a74" +dependencies = [ + "impartial-ord", + "itoa", + "macroific", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "powerfmt", + "serde_core", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_more" +version = "0.99.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" +dependencies = [ + "convert_case 0.4.0", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.117", +] + +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl 1.0.0", +] + +[[package]] +name = "derive_more" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl 2.1.1", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.117", + "unicode-xid", +] + +[[package]] +name = "dialoguer" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25f104b501bf2364e78d0d3974cbc774f738f5865306ed128e1e0d7499c0ad96" +dependencies = [ + "console", + "fuzzy-matcher", + "shell-words", + "tempfile", + "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 = "directories" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16f5094c54661b38d03bd7e50df373292118db60b585c08a411c6d840017fe7d" +dependencies = [ + "dirs-sys 0.5.0", +] + +[[package]] +name = "dirs" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" +dependencies = [ + "dirs-sys 0.3.7", +] + +[[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 0.5.0", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users 0.4.6", + "winapi", +] + +[[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]] +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 0.5.2", + "windows-sys 0.61.2", +] + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.11.0", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dlopen2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dlv-list" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "442039f5147480ba31067cb00ada1adae6892028e40e45fc5de7b7df6dcc1b5f" +dependencies = [ + "const-random", +] + +[[package]] +name = "docsplay" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8547ea80db62c5bb9d7796fcce5e6e07d1136bdc1a02269095061e806758fab4" +dependencies = [ + "docsplay-macros", +] + +[[package]] +name = "docsplay-macros" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11772ed3eb3db124d826f3abeadf5a791a557f62c19b123e3f07288158a71fdd" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "document-features" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] + +[[package]] +name = "dom_query" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521e380c0c8afb8d9a1e83a1822ee03556fc3e3e7dbc1fd30be14e37f9cb3f89" +dependencies = [ + "bit-set", + "cssparser 0.36.0", + "foldhash 0.2.0", + "html5ever 0.38.0", + "precomputed-hash", + "selectors 0.36.1", + "tendril 0.5.0", +] + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" +dependencies = [ + "serde", +] + +[[package]] +name = "dtoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "ecb" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a8bfa975b1aec2145850fcaa1c6fe269a16578c44705a532ae3edc92b8881c7" +dependencies = [ + "cipher", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "serde", + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand_core 0.6.4", + "serde", + "sha2", + "subtle", + "zeroize", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "email-encoding" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9298e6504d9b9e780ed3f7dfd43a61be8cd0e09eb07f7706a945b0072b6670b6" +dependencies = [ + "base64 0.22.1", + "memchr", +] + +[[package]] +name = "email_address" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449" + +[[package]] +name = "embed-resource" +version = "3.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63a1d0de4f2249aa0ff5884d7080814f446bb241a559af6c170a41e878ed2d45" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 0.9.12+spec-1.1.0", + "vswhom", + "winreg 0.55.0", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "endi" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "env_filter" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0621c04f2196ac3f488dd583365b9c09be011a4ab8b9f37248ffcc8f6198b56a" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "jiff", + "log", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased-serde" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + +[[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 = "esp-idf-part" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5ebc2381d030e4e89183554c3fcd4ad44dc5ab34961ab09e09b4adbe4f94b61" +dependencies = [ + "bitflags 2.11.0", + "csv", + "deku", + "md-5", + "parse_int", + "regex", + "serde", + "serde_plain", + "strum", + "thiserror 2.0.18", +] + +[[package]] +name = "espflash" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46f05d15cb2479a3cbbbe684b9f0831b2ae036d9faefd1eb08f21267275862f9" +dependencies = [ + "base64 0.22.1", + "bitflags 2.11.0", + "bytemuck", + "esp-idf-part", + "flate2", + "gimli", + "libc", + "log", + "md-5", + "miette", + "nix 0.30.1", + "object 0.38.1", + "serde", + "sha2", + "strum", + "thiserror 2.0.18", +] + +[[package]] +name = "euclid" +version = "0.20.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bb7ef65b3777a325d1eeefefab5b6d4959da54747e33bd6258e789640f307ad" +dependencies = [ + "num-traits", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener 5.4.1", + "pin-project-lite", +] + +[[package]] +name = "eyeball" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93bd0ebf93d61d6332d3c09a96e97975968a44e19a64c947bde06e6baff383f" +dependencies = [ + "futures-core", + "readlock", + "readlock-tokio", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "eyeball-im" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4790c03df183c2b46665c1a58118c04fd3e3976ec2fe16a0aa00e00c9eea7754" +dependencies = [ + "futures-core", + "imbl", + "tokio", + "tracing", +] + +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + +[[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 = "fancy_constructor" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28a27643a5d05f3a22f5afd6e0d0e6e354f92d37907006f97b84b9cb79082198" +dependencies = [ + "macroific", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "fantoccini" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7737298823a6f9ca743e372e8cb03658d55354fbab843424f575706ba9563046" +dependencies = [ + "base64 0.22.1", + "cookie 0.18.1", + "http 1.4.0", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "mime", + "serde", + "serde_json", + "time", + "tokio", + "url", + "webdriver", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", + "zlib-rs", +] + +[[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 = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared 0.1.1", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared 0.3.1", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[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 = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[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-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[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 2.0.117", +] + +[[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 = "fuzzy-matcher" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54614a3312934d066701a80f20f15fa3b56d67ac7722b39eea5b4c9dd1d66c94" +dependencies = [ + "thread_local", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "gdk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", + "once_cell", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkx11" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" +dependencies = [ + "gdk", + "gdkx11-sys", + "gio", + "glib", + "libc", + "x11", +] + +[[package]] +name = "gdkx11-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps", + "x11", +] + +[[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 = "gethostname" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" +dependencies = [ + "rustix 1.1.4", + "windows-link 0.2.1", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[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 0.11.1+wasi-snapshot-preview1", + "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", + "rand_core 0.10.0", + "wasip2", + "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 = "gimli" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" +dependencies = [ + "fallible-iterator 0.3.0", + "indexmap 2.13.0", + "stable_deref_trait", +] + +[[package]] +name = "gio" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "once_cell", + "pin-project-lite", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[package]] +name = "glib" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +dependencies = [ + "bitflags 2.11.0", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "glib-macros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 2.0.2", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "gloo-utils" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" +dependencies = [ + "js-sys", + "serde", + "serde_json", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "growable-bloom-filter" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d174ccb4ba660d431329e7f0797870d0a4281e36353ec4b4a3c5eab6c2cfb6f1" +dependencies = [ + "serde", + "serde_bytes", + "serde_derive", + "xxhash-rust", +] + +[[package]] +name = "gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" +dependencies = [ + "atk", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk3-macros" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[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 1.4.0", + "indexmap 2.13.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", +] + +[[package]] +name = "hashify" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "149e3ea90eb5a26ad354cfe3cb7f7401b9329032d0235f2687d03a35f30e5d4c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[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 = "headers" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3314d5adb5d94bcdf56771f2e50dbbc80bb4bdf88967526706205ac9eff24eb" +dependencies = [ + "base64 0.22.1", + "bytes", + "headers-core", + "http 1.4.0", + "httpdate", + "mime", + "sha1", +] + +[[package]] +name = "headers-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" +dependencies = [ + "http 1.4.0", +] + +[[package]] +name = "heapless" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af2455f757db2b292a9b1768c4b70186d443bcb3b316252d6b540aec1cd89ed" +dependencies = [ + "hash32", + "stable_deref_trait", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[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.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hidapi" +version = "2.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1b71e1f4791fb9e93b9d7ee03d70b501ab48f6151432fbcadeabc30fe15396e" +dependencies = [ + "cc", + "cfg-if", + "libc", + "nix 0.30.1", + "pkg-config", + "udev", + "windows-sys 0.61.2", +] + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "hostname" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617aaa3557aef3810a6369d0a99fac8a080891b68bd9f9812a1eeda0c0730cbd" +dependencies = [ + "cfg-if", + "libc", + "windows-link 0.2.1", +] + +[[package]] +name = "html5ever" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" +dependencies = [ + "log", + "mac", + "markup5ever 0.14.1", + "match_token 0.1.0", +] + +[[package]] +name = "html5ever" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55d958c2f74b664487a2035fe1dadb032c48718a03b63f3ab0b8537db8549ed4" +dependencies = [ + "log", + "markup5ever 0.35.0", + "match_token 0.35.0", +] + +[[package]] +name = "html5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1054432bae2f14e0061e33d23402fbaa67a921d319d56adc6bcf887ddad1cbc2" +dependencies = [ + "log", + "markup5ever 0.38.0", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[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-auth" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "150fa4a9462ef926824cf4519c84ed652ca8f4fbae34cb8af045b5cbcaf98822" +dependencies = [ + "memchr", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.4.0", +] + +[[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 1.4.0", + "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 1.4.0", + "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 1.4.0", + "hyper", + "hyper-util", + "log", + "rustls", + "rustls-native-certs", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots 1.0.6", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-util", + "http 1.4.0", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.62.2", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ico" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e795dff5605e0f04bff85ca41b51a96b83e80b281e96231bcaaf1ac35103371" +dependencies = [ + "byteorder", + "png", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke 0.7.5", + "zerofrom", + "zerovec 0.10.4", +] + +[[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 0.8.1", + "zerofrom", + "zerovec 0.11.5", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap 0.8.1", + "tinystr 0.8.2", + "writeable 0.6.2", + "zerovec 0.11.5", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap 0.7.5", + "tinystr 0.7.6", + "writeable 0.5.5", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections 2.1.1", + "icu_normalizer_data", + "icu_properties", + "icu_provider 2.1.1", + "smallvec", + "zerovec 0.11.5", +] + +[[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 2.1.1", + "icu_locale_core", + "icu_properties_data", + "icu_provider 2.1.1", + "zerotrie", + "zerovec 0.11.5", +] + +[[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 = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr 0.7.6", + "writeable 0.5.5", + "yoke 0.7.5", + "zerofrom", + "zerovec 0.10.4", +] + +[[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 0.6.2", + "yoke 0.8.1", + "zerofrom", + "zerotrie", + "zerovec 0.11.5", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "icu_segmenter" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a717725612346ffc2d7b42c94b820db6908048f39434504cb130e8b46256b0de" +dependencies = [ + "core_maths", + "displaydoc", + "icu_collections 1.5.0", + "icu_locid", + "icu_provider 1.5.0", + "icu_segmenter_data", + "utf8_iter", + "zerovec 0.10.4", +] + +[[package]] +name = "icu_segmenter_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1e52775179941363cc594e49ce99284d13d6948928d8e72c755f55e98caa1eb" + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[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 = "ihex" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "365a784774bb381e8c19edb91190a90d7f2625e057b55de2bc0f6b57bc779ff2" + +[[package]] +name = "imap-proto" +version = "0.16.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1f9b30846c3d04371159ef3a0413ce7c1ae0a8c619cd255c60b3d902553f22" +dependencies = [ + "nom 7.1.3", +] + +[[package]] +name = "imbl" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fade8ae6828627ad1fa094a891eccfb25150b383047190a3648d66d06186501" +dependencies = [ + "archery", + "bitmaps", + "imbl-sized-chunks", + "rand_core 0.9.5", + "rand_xoshiro", + "serde", + "version_check", +] + +[[package]] +name = "imbl-sized-chunks" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f4241005618a62f8d57b2febd02510fb96e0137304728543dfc5fd6f052c22d" +dependencies = [ + "bitmaps", +] + +[[package]] +name = "impartial-ord" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ab604ee7085efba6efc65e4ebca0e9533e3aff6cb501d7d77b211e3a781c6d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "include_dir" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" +dependencies = [ + "include_dir_macros", +] + +[[package]] +name = "include_dir_macros" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[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 = "infer" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" +dependencies = [ + "cfb", +] + +[[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 = "io-kit-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617ee6cf8e3f66f3b4ea67a4058564628cde41901316e19f559e14c7c72c5e7b" +dependencies = [ + "core-foundation-sys", + "mach2 0.4.3", +] + +[[package]] +name = "io-kit-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06d3a048d09fbb6597dbf7c69f40d14df4a49487db1487191618c893fc3b1c26" +dependencies = [ + "core-foundation-sys", + "mach2 0.5.0", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.48.0", +] + +[[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.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8e7418f59cc01c88316161279a7f665217ae316b388e58a0d10e29f54f1e5eb" +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 = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[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.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "javascriptcore-rs" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "jep106" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a1354c92c91fd5595fd4cc46694b6914749cc90ea437246549c26b6ff0ec6d1" +dependencies = [ + "serde", +] + +[[package]] +name = "jiff" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a3546dc96b6d42c5f24902af9e2538e82e39ad350b0c766eb3fbf2d8f3d8359" +dependencies = [ + "jiff-static", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", +] + +[[package]] +name = "jiff-static" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a8c8b344124222efd714b73bb41f8b5120b27a7cc1c75593a6ff768d9d05aa4" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys 0.3.1", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "js_int" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d937f95470b270ce8b8950207715d71aa8e153c0d44c6684d59397ed4949160a" +dependencies = [ + "serde", +] + +[[package]] +name = "js_option" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7dd3e281add16813cf673bf74a32249b0aa0d1c8117519a17b3ada5e8552b3c" +dependencies = [ + "serde_core", +] + +[[package]] +name = "json-patch" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "jsonptr" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.11.0", + "serde", + "unicode-segmentation", +] + +[[package]] +name = "keyring" +version = "3.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eebcc3aff044e5944a8fbaf69eb277d11986064cba30c468730e8b9909fb551c" +dependencies = [ + "log", + "zeroize", +] + +[[package]] +name = "konst" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4381b9b00c55f251f2ebe9473aef7c117e96828def1a7cb3bd3f0f903c6894e9" +dependencies = [ + "const_panic", + "konst_kernel", + "typewit", +] + +[[package]] +name = "konst_kernel" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4b1eb7788f3824c629b1116a7a9060d6e898c358ebff59070093d51103dcc3c" +dependencies = [ + "typewit", +] + +[[package]] +name = "kuchikiki" +version = "0.8.8-speedreader" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" +dependencies = [ + "cssparser 0.29.6", + "html5ever 0.29.1", + "indexmap 2.13.0", + "selectors 0.24.0", +] + +[[package]] +name = "landlock" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49fefd6652c57d68aaa32544a4c0e642929725bdc1fd929367cdeb673ab81088" +dependencies = [ + "enumflags2", + "libc", + "thiserror 2.0.18", +] + +[[package]] +name = "language-tags" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" + +[[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 = "lettre" +version = "0.11.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e13e10e8818f8b2a60f52cb127041d388b89f3a96a62be9ceaffa22262fef7f" +dependencies = [ + "base64 0.22.1", + "chumsky", + "email-encoding", + "email_address", + "fastrand", + "httpdate", + "idna", + "mime", + "nom 8.0.0", + "percent-encoding", + "quoted_printable", + "rustls", + "socket2", + "tokio", + "url", + "webpki-roots 1.0.6", +] + +[[package]] +name = "libappindicator" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" +dependencies = [ + "glib", + "gtk", + "gtk-sys", + "libappindicator-sys", + "log", +] + +[[package]] +name = "libappindicator-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" +dependencies = [ + "gtk-sys", + "libloading", + "once_cell", +] + +[[package]] +name = "libc" +version = "0.2.183" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "libredox" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ddbf48fd451246b1f8c2610bd3b4ac0cc6e149d89832867093ab69a17194f08" +dependencies = [ + "libc", +] + +[[package]] +name = "libsqlite3-sys" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "133c182a6a2c87864fe97778797e46c7e999672690dc9fa3ee8e241aa4a9c13f" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "libudev-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c8469b4a23b962c1396b9b451dda50ef5b283e8dd309d69033475fa9b334324" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[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.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[package]] +name = "litrs" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" + +[[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 = "lopdf" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7184fdea2bc3cd272a1acec4030c321a8f9875e877b3f92a53f2f6033fdc289" +dependencies = [ + "aes", + "bitflags 2.11.0", + "cbc", + "ecb", + "encoding_rs", + "flate2", + "getrandom 0.3.4", + "indexmap 2.13.0", + "itoa", + "log", + "md-5", + "nom 8.0.0", + "nom_locate", + "rand 0.9.2", + "rangemap", + "sha2", + "stringprep", + "thiserror 2.0.18", + "ttf-parser", + "weezl", +] + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "mac-notification-sys" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29a16783dd1a47849b8c8133c9cd3eb2112cfbc6901670af3dba47c8bbfb07d3" +dependencies = [ + "cc", + "objc2", + "objc2-foundation", + "time", +] + +[[package]] +name = "mach2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d640282b302c0bb0a2a8e0233ead9035e3bed871f0b7e81fe4a1ec829765db44" +dependencies = [ + "libc", +] + +[[package]] +name = "mach2" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a1b95cd5421ec55b445b5ae102f5ea0e768de1f82bd3001e11f426c269c3aea" +dependencies = [ + "libc", +] + +[[package]] +name = "macroific" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89f276537b4b8f981bf1c13d79470980f71134b7bdcc5e6e911e910e556b0285" +dependencies = [ + "macroific_attr_parse", + "macroific_core", + "macroific_macro", +] + +[[package]] +name = "macroific_attr_parse" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad4023761b45fcd36abed8fb7ae6a80456b0a38102d55e89a57d9a594a236be9" +dependencies = [ + "proc-macro2", + "quote", + "sealed", + "syn 2.0.117", +] + +[[package]] +name = "macroific_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a7594d3c14916fa55bef7e9d18c5daa9ed410dd37504251e4b75bbdeec33e3" +dependencies = [ + "proc-macro2", + "quote", + "sealed", + "syn 2.0.117", +] + +[[package]] +name = "macroific_macro" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4da6f2ed796261b0a74e2b52b42c693bb6dee1effba3a482c49592659f824b3b" +dependencies = [ + "macroific_attr_parse", + "macroific_core", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "mail-parser" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f82a3d6522697593ba4c683e0a6ee5a40fee93bc1a525e3cc6eeb3da11fd8897" +dependencies = [ + "hashify", +] + +[[package]] +name = "maplit" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" + +[[package]] +name = "markup5ever" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18" +dependencies = [ + "log", + "phf 0.11.3", + "phf_codegen 0.11.3", + "string_cache 0.8.9", + "string_cache_codegen 0.5.4", + "tendril 0.4.3", +] + +[[package]] +name = "markup5ever" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "311fe69c934650f8f19652b3946075f0fc41ad8757dbb68f1ca14e7900ecc1c3" +dependencies = [ + "log", + "tendril 0.4.3", + "web_atoms 0.1.3", +] + +[[package]] +name = "markup5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983d30f2915feeaaab2d6babdd6bc7e9ed1a00b66b5e6d74df19aa9c0e91862" +dependencies = [ + "log", + "tendril 0.5.0", + "web_atoms 0.2.3", +] + +[[package]] +name = "match_token" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "match_token" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac84fd3f360fcc43dc5f5d186f02a94192761a080e8bc58621ad4d12296a58cf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + +[[package]] +name = "matrix-pickle" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c34e6db65145740459f2ca56623b40cd4e6000ffae2a7d91515fa82aa935dbf" +dependencies = [ + "matrix-pickle-derive", + "thiserror 2.0.18", +] + +[[package]] +name = "matrix-pickle-derive" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a962fc9981f823f6555416dcb2ae9ae67ca412d767ee21ecab5150113ee6285b" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "matrix-sdk" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b33f9bc45edd7f8e25161521fdd30654da5c55e6749be6afa1aa9d6cf838ace0" +dependencies = [ + "anymap2", + "aquamarine", + "as_variant", + "async-channel 2.5.0", + "async-stream", + "async-trait", + "backon", + "bytes", + "bytesize", + "cfg-if", + "event-listener 5.4.1", + "eyeball", + "eyeball-im", + "futures-core", + "futures-util", + "gloo-timers", + "http 1.4.0", + "imbl", + "indexmap 2.13.0", + "itertools 0.14.0", + "js_int", + "language-tags", + "matrix-sdk-base", + "matrix-sdk-common", + "matrix-sdk-indexeddb", + "matrix-sdk-sqlite", + "mime", + "mime2ext", + "oauth2", + "once_cell", + "percent-encoding", + "pin-project-lite", + "reqwest 0.12.28", + "ruma", + "serde", + "serde_html_form", + "serde_json", + "sha2", + "tempfile", + "thiserror 2.0.18", + "tokio", + "tokio-stream", + "tokio-util", + "tracing", + "url", + "urlencoding", + "vodozemac", + "zeroize", +] + +[[package]] +name = "matrix-sdk-base" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70f404a390ff98a73c426b1496b169be60ce6a93723a9a664e579d978a84c5e4" +dependencies = [ + "as_variant", + "async-trait", + "bitflags 2.11.0", + "decancer", + "eyeball", + "eyeball-im", + "futures-util", + "growable-bloom-filter", + "matrix-sdk-common", + "matrix-sdk-crypto", + "matrix-sdk-store-encryption", + "once_cell", + "regex", + "ruma", + "serde", + "serde_json", + "thiserror 2.0.18", + "tokio", + "tracing", + "unicode-normalization", +] + +[[package]] +name = "matrix-sdk-common" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54fae2bdfc3d760d21a84d6d2036b5db5c48d9a3dee3794119e3fb9c4cc4ccc5" +dependencies = [ + "eyeball-im", + "futures-core", + "futures-executor", + "futures-util", + "gloo-timers", + "imbl", + "ruma", + "serde", + "serde_json", + "thiserror 2.0.18", + "tokio", + "tracing", + "tracing-subscriber", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "matrix-sdk-crypto" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "304fc576810a9618bb831c4ad6403c758ec424f677668a49a196e3cde4b8f99f" +dependencies = [ + "aes", + "aquamarine", + "as_variant", + "async-trait", + "bs58", + "byteorder", + "cfg-if", + "ctr", + "eyeball", + "futures-core", + "futures-util", + "hkdf", + "hmac", + "itertools 0.14.0", + "js_option", + "matrix-sdk-common", + "pbkdf2", + "rand 0.8.5", + "rmp-serde", + "ruma", + "serde", + "serde_json", + "sha2", + "subtle", + "thiserror 2.0.18", + "time", + "tokio", + "tokio-stream", + "tracing", + "ulid", + "url", + "vodozemac", + "zeroize", +] + +[[package]] +name = "matrix-sdk-indexeddb" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b6096084cc8d339c03e269ca25534d0f1e88d0097c35a215eb8c311797ec3e9" +dependencies = [ + "async-trait", + "base64 0.22.1", + "futures-util", + "getrandom 0.2.17", + "gloo-utils", + "hkdf", + "js-sys", + "matrix-sdk-base", + "matrix-sdk-crypto", + "matrix-sdk-store-encryption", + "matrix_indexed_db_futures", + "rmp-serde", + "ruma", + "serde", + "serde-wasm-bindgen", + "serde_json", + "sha2", + "thiserror 2.0.18", + "tokio", + "tracing", + "uuid", + "wasm-bindgen", + "web-sys", + "zeroize", +] + +[[package]] +name = "matrix-sdk-sqlite" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4325742fc06b7f75c80eec39e8fb32b06ea4b09b7aa1d432b67b01d08fbacc28" +dependencies = [ + "as_variant", + "async-trait", + "deadpool", + "deadpool-sync", + "itertools 0.14.0", + "matrix-sdk-base", + "matrix-sdk-crypto", + "matrix-sdk-store-encryption", + "num_cpus", + "rmp-serde", + "ruma", + "rusqlite", + "serde", + "serde_json", + "serde_path_to_error", + "thiserror 2.0.18", + "tokio", + "tracing", + "vodozemac", + "zeroize", +] + +[[package]] +name = "matrix-sdk-store-encryption" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162a93e83114d5cef25c0ebaea72aa01b9f233df6ec4a2af45f175d01ec26323" +dependencies = [ + "base64 0.22.1", + "blake3", + "chacha20poly1305", + "getrandom 0.2.17", + "hmac", + "pbkdf2", + "rand 0.8.5", + "rmp-serde", + "serde", + "serde_json", + "sha2", + "thiserror 2.0.18", + "zeroize", +] + +[[package]] +name = "matrix_indexed_db_futures" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245ff6a224b4df7b0c90dda2dd5a6eb46112708d49e8bdd8b007fccb09fea8e4" +dependencies = [ + "accessory", + "cfg-if", + "delegate-display", + "derive_more 2.1.1", + "fancy_constructor", + "futures-core", + "js-sys", + "matrix_indexed_db_futures_macros_internal", + "sealed", + "serde", + "serde-wasm-bindgen", + "smallvec", + "thiserror 2.0.18", + "tokio", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm_evt_listener", + "web-sys", + "web-time", +] + +[[package]] +name = "matrix_indexed_db_futures_macros_internal" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b428aee5c0fe9e5babd29e99d289b7f64718c444989aac0442d1fd6d3e3f66d1" +dependencies = [ + "macroific", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "md5" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae960838283323069879657ca3de837e9f7bbb4c7bf6ea7f1b290d5e9476d2e0" + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "miette" +version = "7.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f98efec8807c63c752b5bd61f862c165c115b0a35685bdcfd9238c7aeb592b7" +dependencies = [ + "cfg-if", + "miette-derive", + "unicode-width 0.1.14", +] + +[[package]] +name = "miette-derive" +version = "7.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db5b29714e950dbb20d5e6f74f9dcec4edbcc1067bb7f8ed198c097b8c1a818b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime2ext" +version = "0.1.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbf6f36070878c42c5233846cd3de24cf9016828fd47bc22957a687298bb21fc" + +[[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 = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[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.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" +dependencies = [ + "libc", + "log", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.61.2", +] + +[[package]] +name = "mio-serial" +version = "5.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "029e1f407e261176a983a6599c084efd322d9301028055c87174beac71397ba3" +dependencies = [ + "log", + "mio", + "nix 0.29.0", + "serialport", + "winapi", +] + +[[package]] +name = "moka" +version = "0.12.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "957228ad12042ee839f93c8f257b62b4c0ab5eaae1d4fa60de53b27c9d7c5046" +dependencies = [ + "async-lock", + "crossbeam-channel", + "crossbeam-epoch", + "crossbeam-utils", + "equivalent", + "event-listener 5.4.1", + "futures-util", + "parking_lot", + "portable-atomic", + "smallvec", + "tagptr", + "uuid", +] + +[[package]] +name = "muda" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "once_cell", + "png", + "serde", + "thiserror 2.0.18", + "windows-sys 0.60.2", +] + +[[package]] +name = "multimap" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" + +[[package]] +name = "native-tls" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.11.0", + "jni-sys 0.3.1", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys 0.3.1", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", +] + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.11.0", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +dependencies = [ + "bitflags 2.11.0", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "no_std_io2" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a3564ce7035b1e4778d8cb6cacebb5d766b5e8fe5a75b9e441e33fb61a872c6" +dependencies = [ + "memchr", +] + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + +[[package]] +name = "nom_locate" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b577e2d69827c4740cba2b52efaad1c4cc7c73042860b199710b3575c68438d" +dependencies = [ + "bytecount", + "memchr", + "nom 8.0.0", +] + +[[package]] +name = "notify-rust" +version = "4.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21af20a1b50be5ac5861f74af1a863da53a11c38684d9818d82f1c42f7fdc6c2" +dependencies = [ + "futures-lite", + "log", + "mac-notification-sys", + "serde", + "tauri-winrt-notification", + "zbus", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num-conv" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi 0.5.2", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "nusb" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f861541f15de120eae5982923d073bfc0c1a65466561988c82d6e197734c19e" +dependencies = [ + "atomic-waker", + "core-foundation 0.9.4", + "core-foundation-sys", + "futures-core", + "io-kit-sys 0.4.1", + "libc", + "log", + "once_cell", + "rustix 0.38.44", + "slab", + "windows-sys 0.48.0", +] + +[[package]] +name = "nusb" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a330b3bc7f8b4fc729a4c63164b3927eeeaced198222a3ce6b8b6e034851b7a" +dependencies = [ + "core-foundation 0.10.1", + "core-foundation-sys", + "futures-core", + "io-kit-sys 0.5.0", + "linux-raw-sys 0.12.1", + "log", + "once_cell", + "rustix 1.1.4", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "oauth2" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51e219e79014df21a225b1860a479e2dcd7cbd9130f4defd4bd0e191ea31d67d" +dependencies = [ + "base64 0.22.1", + "chrono", + "getrandom 0.2.17", + "http 1.4.0", + "rand 0.8.5", + "reqwest 0.12.28", + "serde", + "serde_json", + "serde_path_to_error", + "sha2", + "thiserror 1.0.69", + "url", +] + +[[package]] +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", + "objc2-exception-helper", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.11.0", + "block2", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.11.0", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.11.0", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-location" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-exception-helper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" +dependencies = [ + "cc", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.11.0", + "block2", + "libc", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-system-configuration" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7216bd11cbda54ccabcab84d523dc93b858ec75ecfb3a7d89513fa22464da396" +dependencies = [ + "objc2-core-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags 2.11.0", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-core-location", + "objc2-core-text", + "objc2-foundation", + "objc2-quartz-core", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-web-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" +dependencies = [ + "bitflags 2.11.0", + "block2", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + +[[package]] +name = "object" +version = "0.38.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271638cd5fa9cca89c4c304675ca658efc4e64a66c716b7cfe1afb4b9611dbbc" +dependencies = [ + "flate2", + "memchr", + "ruzstd", +] + +[[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 = "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43bb73a7fa3799b198970490a51174027ba0d4ec504b03cd08caf513d40024bc" +dependencies = [ + "dunce", + "is-wsl", + "libc", + "pathdiff", +] + +[[package]] +name = "openhuman-core" +version = "0.49.16" +dependencies = [ + "aes-gcm", + "anyhow", + "argon2", + "async-imap", + "async-trait", + "axum", + "base64 0.22.1", + "chacha20poly1305", + "chrono", + "chrono-tz", + "clap", + "console", + "cron", + "dialoguer", + "directories", + "dirs 5.0.1", + "env_logger", + "fantoccini", + "futures", + "futures-util", + "glob", + "hex", + "hmac", + "hostname", + "http-body-util", + "landlock", + "lettre", + "log", + "mail-parser", + "matrix-sdk", + "nusb 0.2.3", + "once_cell", + "opentelemetry", + "opentelemetry-otlp", + "opentelemetry_sdk", + "parking_lot", + "pdf-extract", + "postgres", + "probe-rs", + "prometheus", + "prost 0.14.3", + "rand 0.9.2", + "regex", + "reqwest 0.12.28", + "ring", + "rppal", + "rquickjs", + "rusqlite", + "rustls", + "rustls-pki-types", + "schemars 1.2.1", + "serde", + "serde-big-array", + "serde_json", + "sha2", + "shellexpand", + "tauri", + "tempfile", + "thiserror 2.0.18", + "tinyhumansai", + "tokio", + "tokio-rustls", + "tokio-serial", + "tokio-stream", + "tokio-tungstenite 0.24.0", + "tokio-util", + "toml 1.1.0+spec-1.1.0", + "tower", + "tower-http", + "tracing", + "tracing-subscriber", + "url", + "urlencoding", + "uuid", + "wa-rs", + "wa-rs-binary", + "wa-rs-core", + "wa-rs-proto", + "wa-rs-tokio-transport", + "wa-rs-ureq-http", + "webpki-roots 1.0.6", +] + +[[package]] +name = "openssl" +version = "0.10.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "951c002c75e16ea2c65b8c7e4d3d51d5530d8dfa7d060b4776828c88cfb18ecf" +dependencies = [ + "bitflags 2.11.0", + "cfg-if", + "foreign-types 0.3.2", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[package]] +name = "openssl-sys" +version = "0.9.112" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d55af3b3e226502be1526dfdba67ab0e9c96fc293004e79576b2b9edb0dbdb" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "opentelemetry" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b84bcd6ae87133e903af7ef497404dda70c60d0ea14895fc8a5e6722754fc2a0" +dependencies = [ + "futures-core", + "futures-sink", + "js-sys", + "pin-project-lite", + "thiserror 2.0.18", +] + +[[package]] +name = "opentelemetry-http" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a6d09a73194e6b66df7c8f1b680f156d916a1a942abf2de06823dd02b7855d" +dependencies = [ + "async-trait", + "bytes", + "http 1.4.0", + "opentelemetry", + "reqwest 0.12.28", +] + +[[package]] +name = "opentelemetry-otlp" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f69cd6acbb9af919df949cd1ec9e5e7fdc2ef15d234b6b795aaa525cc02f71f" +dependencies = [ + "http 1.4.0", + "opentelemetry", + "opentelemetry-http", + "opentelemetry-proto", + "opentelemetry_sdk", + "prost 0.14.3", + "reqwest 0.12.28", + "thiserror 2.0.18", +] + +[[package]] +name = "opentelemetry-proto" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7175df06de5eaee9909d4805a3d07e28bb752c34cab57fa9cff549da596b30f" +dependencies = [ + "opentelemetry", + "opentelemetry_sdk", + "prost 0.14.3", + "tonic", + "tonic-prost", +] + +[[package]] +name = "opentelemetry_sdk" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ae4f5991976fd48df6d843de219ca6d31b01daaab2dad5af2badeded372bd" +dependencies = [ + "futures-channel", + "futures-executor", + "futures-util", + "opentelemetry", + "percent-encoding", + "rand 0.9.2", + "thiserror 2.0.18", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-multimap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49203cdcae0030493bad186b28da2fa25645fa276a51b6fec8010d281e02ef79" +dependencies = [ + "dlv-list", + "hashbrown 0.14.5", +] + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "os_info" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4022a17595a00d6a369236fdae483f0de7f0a339960a53118b818238e132224" +dependencies = [ + "android_system_properties", + "log", + "nix 0.30.1", + "objc2", + "objc2-foundation", + "objc2-ui-kit", + "serde", + "windows-sys 0.61.2", +] + +[[package]] +name = "pango" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +dependencies = [ + "gio", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[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 0.2.1", +] + +[[package]] +name = "parse_int" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c464266693329dd5a8715098c7f86e6c5fd5d985018b8318f53d9c6c2b21a31" +dependencies = [ + "num-traits", +] + +[[package]] +name = "password-hash" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" +dependencies = [ + "base64ct", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "pathdiff" +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 = "pdf-extract" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28ba1758a3d3f361459645780e09570b573fc3c82637449e9963174c813a98" +dependencies = [ + "adobe-cmap-parser", + "cff-parser", + "encoding_rs", + "euclid", + "log", + "lopdf", + "postscript", + "type1-encoding-parser", + "unicode-normalization", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "petgraph" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" +dependencies = [ + "fixedbitset", + "hashbrown 0.15.5", + "indexmap 2.13.0", +] + +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_shared 0.8.0", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_macros 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7" +dependencies = [ + "phf_shared 0.12.1", +] + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros 0.13.1", + "phf_shared 0.13.1", + "serde", +] + +[[package]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_codegen" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf_codegen" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand 0.8.5", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared 0.11.3", + "rand 0.8.5", +] + +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared 0.13.1", +] + +[[package]] +name = "phf_macros" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher 0.3.11", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher 0.3.11", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher 1.0.2", +] + +[[package]] +name = "phf_shared" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06005508882fb681fd97892ecff4b7fd0fee13ef1aa569f8695dae7ab9099981" +dependencies = [ + "siphasher 1.0.2", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher 1.0.2", +] + +[[package]] +name = "pin-project" +version = "1.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[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 = "piper" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "plist" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" +dependencies = [ + "base64 0.22.1", + "indexmap 2.13.0", + "quick-xml 0.38.4", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi 0.5.2", + "pin-project-lite", + "rustix 1.1.4", + "windows-sys 0.61.2", +] + +[[package]] +name = "poly1305" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +dependencies = [ + "cpufeatures 0.2.17", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "pom" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60f6ce597ecdcc9a098e7fddacb1065093a3d66446fa16c675e7e71d1b5c28e6" + +[[package]] +name = "portable-atomic" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" + +[[package]] +name = "portable-atomic-util" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "091397be61a01d4be58e7841595bd4bfedb15f1cd54977d79b8271e94ed799a3" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "postgres" +version = "0.19.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c48ece1c6cda0db61b058c1721378da76855140e9214339fa1317decacb176" +dependencies = [ + "bytes", + "fallible-iterator 0.2.0", + "futures-util", + "log", + "tokio", + "tokio-postgres", +] + +[[package]] +name = "postgres-protocol" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ee9dd5fe15055d2b6806f4736aa0c9637217074e224bbec46d4041b91bb9491" +dependencies = [ + "base64 0.22.1", + "byteorder", + "bytes", + "fallible-iterator 0.2.0", + "hmac", + "md-5", + "memchr", + "rand 0.9.2", + "sha2", + "stringprep", +] + +[[package]] +name = "postgres-types" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54b858f82211e84682fecd373f68e1ceae642d8d751a1ebd13f33de6257b3e20" +dependencies = [ + "bytes", + "chrono", + "fallible-iterator 0.2.0", + "postgres-protocol", +] + +[[package]] +name = "postscript" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78451badbdaebaf17f053fd9152b3ffb33b516104eacb45e7864aaa9c712f306" + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec 0.11.5", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.117", +] + +[[package]] +name = "probe-rs" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ee27329ac37fa02b194c62a4e3c1aa053739884ea7bcf861249866d3bf7de00" +dependencies = [ + "anyhow", + "async-io", + "bincode", + "bitfield", + "bitvec", + "cobs", + "docsplay", + "dunce", + "espflash", + "flate2", + "futures-lite", + "hidapi", + "ihex", + "itertools 0.14.0", + "jep106", + "nusb 0.1.14", + "object 0.37.3", + "parking_lot", + "probe-rs-target", + "rmp-serde", + "scroll", + "serde", + "serde_yaml", + "serialport", + "thiserror 2.0.18", + "tracing", + "uf2-decode", + "zerocopy", +] + +[[package]] +name = "probe-rs-target" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2239aca5dc62c68ca6d8ff0051fe617cb8363b803380fbc60567e67c82b474df" +dependencies = [ + "base64 0.22.1", + "indexmap 2.13.0", + "jep106", + "serde", + "serde_with", + "url", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +dependencies = [ + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit 0.25.8+spec-1.1.0", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[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 = "prometheus" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ca5326d8d0b950a9acd87e6a3f94745394f62e4dae1b1ee22b2bc0c394af43a" +dependencies = [ + "cfg-if", + "fnv", + "lazy_static", + "memchr", + "parking_lot", + "thiserror 2.0.18", +] + +[[package]] +name = "prost" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" +dependencies = [ + "bytes", + "prost-derive 0.13.5", +] + +[[package]] +name = "prost" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568" +dependencies = [ + "bytes", + "prost-derive 0.14.3", +] + +[[package]] +name = "prost-build" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "343d3bd7056eda839b03204e68deff7d1b13aba7af2b2fd16890697274262ee7" +dependencies = [ + "heck 0.5.0", + "itertools 0.14.0", + "log", + "multimap", + "petgraph", + "prost 0.14.3", + "prost-types", + "regex", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" +dependencies = [ + "anyhow", + "itertools 0.14.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "prost-derive" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" +dependencies = [ + "anyhow", + "itertools 0.14.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "prost-types" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8991c4cbdb8bc5b11f0b074ffe286c30e523de90fee5ba8132f1399f23cb3dd7" +dependencies = [ + "prost 0.14.3", +] + +[[package]] +name = "protobuf" +version = "3.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d65a1d4ddae7d8b5de68153b48f6aa3bba8cb002b243dbdbc55a5afbc98f99f4" +dependencies = [ + "once_cell", + "protobuf-support", + "thiserror 1.0.69", +] + +[[package]] +name = "protobuf-support" +version = "3.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e36c2f31e0a47f9280fb347ef5e461ffcd2c52dd520d8e216b52f93b0b0d7d6" +dependencies = [ + "thiserror 1.0.69", +] + +[[package]] +name = "psm" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3852766467df634d74f0b2d7819bf8dc483a0eb2e3b0f50f756f9cfe8b0d18d8" +dependencies = [ + "ar_archive_writer", + "cc", +] + +[[package]] +name = "pulldown-cmark" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c3a14896dfa883796f1cb410461aef38810ea05f2b2c33c5aded3649095fdad" +dependencies = [ + "bitflags 2.11.0", + "memchr", + "pulldown-cmark-escape", + "unicase", +] + +[[package]] +name = "pulldown-cmark-escape" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "007d8adb5ddab6f8e3f491ac63566a7d5002cc7ed73901f72057943fa71ae1ae" + +[[package]] +name = "quick-xml" +version = "0.37.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" +dependencies = [ + "memchr", +] + +[[package]] +name = "quick-xml" +version = "0.38.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" +dependencies = [ + "memchr", +] + +[[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 0.9.2", + "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 = "quoted_printable" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478e0585659a122aa407eb7e3c0e1fa51b1d8a870038bd29f0cf4a8551eea972" + +[[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 = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg", +] + +[[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 0.9.0", + "rand_core 0.9.5", +] + +[[package]] +name = "rand" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc266eb313df6c5c09c1c7b1fbe2510961e5bcd3add930c1e31f7ed9da0feff8" +dependencies = [ + "chacha20 0.10.0", + "getrandom 0.4.2", + "rand_core 0.10.0", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[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]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[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]] +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 = "rand_core" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c8d0fd677905edcbeedbf2edb6494d676f0e98d54d5cf9bda0b061cb8fb8aba" + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_xoshiro" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f703f4665700daf5512dcca5f43afa6af89f09db47fb56be587f80636bda2d41" +dependencies = [ + "rand_core 0.9.5", +] + +[[package]] +name = "rangemap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "973443cf09a9c8656b574a866ab68dfa19f0867d0340648c7d2f6a71b8a8ea68" + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "readlock" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6da6f291b23556edd9edaf655a0be2ad8ef8002ff5f1bca62b264f3f58b53f34" + +[[package]] +name = "readlock-tokio" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7e264f9ec4f3d112e8e2f214e8e7cb5cf3b83278f3570b7e00bfe13d3bd8ff" +dependencies = [ + "tokio", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.11.0", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.18", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[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 = "relative-path" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bca40a312222d8ba74837cb474edef44b37f561da5f773981007a10bbaa992b0" +dependencies = [ + "serde", +] + +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http 1.4.0", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-tls", + "hyper-util", + "js-sys", + "log", + "mime_guess", + "native-tls", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tokio-rustls", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams 0.4.2", + "web-sys", + "webpki-roots 1.0.6", +] + +[[package]] +name = "reqwest" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab3f43e3283ab1488b624b44b0e988d0acea0b3214e694730a055cb6b2efa801" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http 1.4.0", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "sync_wrapper", + "tokio", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams 0.5.0", + "web-sys", +] + +[[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 = "rmp" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ba8be72d372b2c9b35542551678538b562e7cf86c3315773cae48dfbfe7790c" +dependencies = [ + "num-traits", +] + +[[package]] +name = "rmp-serde" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f81bee8c8ef9b577d1681a70ebbc962c232461e397b22c208c43c04b67a155" +dependencies = [ + "rmp", + "serde", +] + +[[package]] +name = "rppal" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ce3b019009cff02cb6b0e96e7cc2e5c5b90187dc1a490f8ef1521d0596b026" +dependencies = [ + "libc", +] + +[[package]] +name = "rquickjs" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c50dc6d6c587c339edb4769cf705867497a2baf0eca8b4645fa6ecd22f02c77a" +dependencies = [ + "rquickjs-core", + "rquickjs-macro", +] + +[[package]] +name = "rquickjs-core" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8bf7840285c321c3ab20e752a9afb95548c75cd7f4632a0627cea3507e310c1" +dependencies = [ + "async-lock", + "hashbrown 0.16.1", + "relative-path", + "rquickjs-sys", +] + +[[package]] +name = "rquickjs-macro" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7106215ff41a5677b104906a13e1a440b880f4b6362b5dc4f3978c267fad2b80" +dependencies = [ + "convert_case 0.10.0", + "fnv", + "ident_case", + "indexmap 2.13.0", + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "rquickjs-core", + "syn 2.0.117", +] + +[[package]] +name = "rquickjs-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27344601ef27460e82d6a4e1ecb9e7e99f518122095f3c51296da8e9be2b9d83" +dependencies = [ + "cc", +] + +[[package]] +name = "ruma" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9f620a2116d0d3082f9256e61dcdf67f2ec266d3f6bb9d2f9c8a20ec5a1fabb" +dependencies = [ + "assign", + "js_int", + "js_option", + "ruma-client-api", + "ruma-common", + "ruma-events", + "ruma-federation-api", + "ruma-html", + "web-time", +] + +[[package]] +name = "ruma-client-api" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc977d1a91ea15dcf896cbd7005ed4a253784468833638998109ffceaee53e7" +dependencies = [ + "as_variant", + "assign", + "bytes", + "date_header", + "http 1.4.0", + "js_int", + "js_option", + "maplit", + "ruma-common", + "ruma-events", + "serde", + "serde_html_form", + "serde_json", + "thiserror 2.0.18", + "url", + "web-time", +] + +[[package]] +name = "ruma-common" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a01993f22d291320b7c9267675e7395775e95269ff526e2c8c3ed5e13175b" +dependencies = [ + "as_variant", + "base64 0.22.1", + "bytes", + "form_urlencoded", + "getrandom 0.2.17", + "http 1.4.0", + "indexmap 2.13.0", + "js-sys", + "js_int", + "konst", + "percent-encoding", + "rand 0.8.5", + "regex", + "ruma-identifiers-validation", + "ruma-macros", + "serde", + "serde_html_form", + "serde_json", + "thiserror 2.0.18", + "time", + "tracing", + "url", + "uuid", + "web-time", + "wildmatch", + "zeroize", +] + +[[package]] +name = "ruma-events" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dbdeccb62cb4ffe3282325de8ba28cbc0fdce7c78a3f11b7241fbfdb9cb9907" +dependencies = [ + "as_variant", + "indexmap 2.13.0", + "js_int", + "js_option", + "percent-encoding", + "pulldown-cmark", + "regex", + "ruma-common", + "ruma-identifiers-validation", + "ruma-macros", + "serde", + "serde_json", + "thiserror 2.0.18", + "tracing", + "url", + "web-time", + "wildmatch", + "zeroize", +] + +[[package]] +name = "ruma-federation-api" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcb45c15badbf4299c6113a6b90df3e7cb64edbe756bbd8e0224144b56b38305" +dependencies = [ + "headers", + "http 1.4.0", + "http-auth", + "js_int", + "mime", + "ruma-common", + "ruma-events", + "ruma-signatures", + "serde", + "serde_json", + "thiserror 2.0.18", + "tracing", +] + +[[package]] +name = "ruma-html" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6dcd6e9823e177d15460d3cd3a413f38a2beea381f26aca1001c05cd6954ff" +dependencies = [ + "as_variant", + "html5ever 0.35.0", + "tracing", + "wildmatch", +] + +[[package]] +name = "ruma-identifiers-validation" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9c6b5643060beec0fc9d7acfb41d2c5d91e1591db440ff62361d178e77c35fe" +dependencies = [ + "js_int", + "thiserror 2.0.18", +] + +[[package]] +name = "ruma-macros" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a0753312ad577ac462de1742bf2e326b6ba9856ff6f13343aeb17d423fd5426" +dependencies = [ + "as_variant", + "cfg-if", + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "ruma-identifiers-validation", + "serde", + "syn 2.0.117", + "toml 0.9.12+spec-1.1.0", +] + +[[package]] +name = "ruma-signatures" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146ace2cd59b60ec80d3e801a84e7e6a91e3e01d18a9f5d896ea7ca16a6b8e08" +dependencies = [ + "base64 0.22.1", + "ed25519-dalek", + "pkcs8", + "rand 0.8.5", + "ruma-common", + "serde_json", + "sha2", + "thiserror 2.0.18", +] + +[[package]] +name = "rusqlite" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "165ca6e57b20e1351573e3729b958bc62f0e48025386970b6e4d29e7a7e71f3f" +dependencies = [ + "bitflags 2.11.0", + "fallible-iterator 0.3.0", + "fallible-streaming-iterator", + "hashlink", + "libsqlite3-sys", + "smallvec", +] + +[[package]] +name = "rust-ini" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "796e8d2b6696392a43bea58116b667fb4c29727dc5abd27d6acf338bb4f688c7" +dependencies = [ + "cfg-if", + "ordered-multimap", +] + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.11.0", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags 2.11.0", + "errno", + "libc", + "linux-raw-sys 0.12.1", + "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 = [ + "aws-lc-rs", + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[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.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef" +dependencies = [ + "aws-lc-rs", + "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 = "ruzstd" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ff0cc5e135c8870a775d3320910cd9b564ec036b4dc0b8741629020be63f01" +dependencies = [ + "twox-hash", +] + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive 0.8.22", + "serde", + "serde_json", + "url", + "uuid", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" +dependencies = [ + "dyn-clone", + "ref-cast", + "schemars_derive 1.2.1", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.117", +] + +[[package]] +name = "schemars_derive" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d115b50f4aaeea07e79c1912f645c7513d81715d0420f8bc77a18c6260b307f" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.117", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scroll" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1257cd4248b4132760d6524d6dda4e053bc648c9070b960929bf50cfb1e7add" + +[[package]] +name = "sealed" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22f968c5ea23d555e670b449c1c5e7b2fc399fdaec1d304a17cd48e288abc107" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +dependencies = [ + "bitflags 2.11.0", + "core-foundation 0.10.1", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "selectors" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416" +dependencies = [ + "bitflags 1.3.2", + "cssparser 0.29.6", + "derive_more 0.99.20", + "fxhash", + "log", + "phf 0.8.0", + "phf_codegen 0.8.0", + "precomputed-hash", + "servo_arc 0.2.0", + "smallvec", +] + +[[package]] +name = "selectors" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5d9c0c92a92d33f08817311cf3f2c29a3538a8240e94a6a3c622ce652d7e00c" +dependencies = [ + "bitflags 2.11.0", + "cssparser 0.36.0", + "derive_more 2.1.1", + "log", + "new_debug_unreachable", + "phf 0.13.1", + "phf_codegen 0.13.1", + "precomputed-hash", + "rustc-hash", + "servo_arc 0.4.3", + "smallvec", +] + +[[package]] +name = "self_cell" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b12e76d157a900eb52e81bc6e9f3069344290341720e9178cde2407113ac8d89" + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +dependencies = [ + "serde", + "serde_core", +] + +[[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-big-array" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11fc7cc2c76d73e0f27ee52abbd64eec84d46f370c88371120433196934e4b7f" +dependencies = [ + "serde", +] + +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "serde-wasm-bindgen" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "serde_bytes" +version = "0.11.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" +dependencies = [ + "serde", + "serde_core", +] + +[[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 2.0.117", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_html_form" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2f2d7ff8a2140333718bb329f5c40fc5f0865b84c426183ce14c97d2ab8154f" +dependencies = [ + "form_urlencoded", + "indexmap 2.13.0", + "itoa", + "ryu", + "serde_core", +] + +[[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_path_to_error" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +dependencies = [ + "itoa", + "serde", + "serde_core", +] + +[[package]] +name = "serde_plain" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1fc6db65a611022b23a0dec6975d63fb80a302cb3388835ff02c097258d50" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876ac351060d4f882bb1032b6369eb0aef79ad9df1ea8bc404874d8cc3d0cd98" +dependencies = [ + "serde_core", +] + +[[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 = "serde_with" +version = "3.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5414fad8e6907dbdd5bc441a50ae8d6e26151a03b1de04d89a5576de61d01f" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.13.0", + "schemars 0.9.0", + "schemars 1.2.1", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3db8978e608f1fe7357e211969fd9abdcae80bac1ba7a3369bb7eb6b404eb65" +dependencies = [ + "darling 0.23.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_yaml" +version = "0.9.34+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +dependencies = [ + "indexmap 2.13.0", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serialport" +version = "4.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4d91116f97173694f1642263b2ff837f80d933aa837e2314969f6728f661df3" +dependencies = [ + "bitflags 2.11.0", + "cfg-if", + "core-foundation 0.10.1", + "core-foundation-sys", + "io-kit-sys 0.4.1", + "mach2 0.4.3", + "nix 0.26.4", + "scopeguard", + "unescaper", + "windows-sys 0.52.0", +] + +[[package]] +name = "servo_arc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741" +dependencies = [ + "nodrop", + "stable_deref_trait", +] + +[[package]] +name = "servo_arc" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930" +dependencies = [ + "stable_deref_trait", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shell-words" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77" + +[[package]] +name = "shellexpand" +version = "3.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32824fab5e16e6c4d86dc1ba84489390419a39f97699852b66480bb87d297ed8" +dependencies = [ + "dirs 6.0.0", +] + +[[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 = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "simd-adler32" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "siphasher" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" + +[[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" +dependencies = [ + "serde", +] + +[[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 = "softbuffer" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" +dependencies = [ + "bytemuck", + "js-sys", + "ndk", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "redox_syscall", + "tracing", + "wasm-bindgen", + "web-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "soup3" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" +dependencies = [ + "futures-channel", + "gio", + "glib", + "libc", + "soup3-sys", +] + +[[package]] +name = "soup3-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "stacker" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d74a23609d509411d10e2176dc2a4346e3b4aea2e7b1869f19fdedbc71c013" +dependencies = [ + "cc", + "cfg-if", + "libc", + "psm", + "windows-sys 0.59.0", +] + +[[package]] +name = "stop-token" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af91f480ee899ab2d9f8435bfdfc14d08a5754bd9d3fef1f1a1c23336aad6c8b" +dependencies = [ + "async-channel 1.9.0", + "cfg-if", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "string_cache" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared 0.11.3", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared 0.13.1", + "precomputed-hash", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", +] + +[[package]] +name = "string_cache_codegen" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", + "proc-macro2", + "quote", +] + +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "swift-rs" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[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 2.0.117", +] + +[[package]] +name = "sys-locale" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4" +dependencies = [ + "libc", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml 0.8.2", + "version-compare", +] + +[[package]] +name = "tagptr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" + +[[package]] +name = "tao" +version = "0.34.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9103edf55f2da3c82aea4c7fab7c4241032bfeea0e71fa557d98e00e7ce7cc20" +dependencies = [ + "bitflags 2.11.0", + "block2", + "core-foundation 0.10.1", + "core-graphics", + "crossbeam-channel", + "dispatch2", + "dlopen2", + "dpi", + "gdkwayland-sys", + "gdkx11-sys", + "gtk", + "jni", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "once_cell", + "parking_lot", + "raw-window-handle", + "tao-macros", + "unicode-segmentation", + "url", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tauri" +version = "2.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da77cc00fb9028caf5b5d4650f75e31f1ef3693459dfca7f7e506d1ecef0ba2d" +dependencies = [ + "anyhow", + "bytes", + "cookie 0.18.1", + "dirs 6.0.0", + "dunce", + "embed_plist", + "getrandom 0.3.4", + "glob", + "gtk", + "heck 0.5.0", + "http 1.4.0", + "jni", + "libc", + "log", + "mime", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "percent-encoding", + "plist", + "raw-window-handle", + "reqwest 0.13.2", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "swift-rs", + "tauri-build", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "thiserror 2.0.18", + "tokio", + "tray-icon", + "url", + "webkit2gtk", + "webview2-com", + "window-vibrancy", + "windows", +] + +[[package]] +name = "tauri-build" +version = "2.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bbc990d1dbf57a8e1c7fa2327f2a614d8b757805603c1b9ba5c81bade09fd4d" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs 6.0.0", + "glob", + "heck 0.5.0", + "json-patch", + "schemars 0.8.22", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "toml 0.9.12+spec-1.1.0", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "2.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a24476afd977c5d5d169f72425868613d82747916dd29e0a357c84c4bd6d29" +dependencies = [ + "base64 0.22.1", + "brotli", + "ico", + "json-patch", + "plist", + "png", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2", + "syn 2.0.117", + "tauri-utils", + "thiserror 2.0.18", + "time", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "2.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d39b349a98dadaffebb73f0a40dcd1f23c999211e5a2e744403db384d0c33de7" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-plugin" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddde7d51c907b940fb573006cdda9a642d6a7c8153657e88f8a5c3c9290cd4aa" +dependencies = [ + "anyhow", + "glob", + "plist", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri-utils", + "toml 0.9.12+spec-1.1.0", + "walkdir", +] + +[[package]] +name = "tauri-plugin-autostart" +version = "2.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "459383cebc193cdd03d1ba4acc40f2c408a7abce419d64bdcd2d745bc2886f70" +dependencies = [ + "auto-launch", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 2.0.18", +] + +[[package]] +name = "tauri-plugin-deep-link" +version = "2.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94deb2e2e4641514ac496db2cddcfc850d6fc9d51ea17b82292a0490bd20ba5b" +dependencies = [ + "dunce", + "plist", + "rust-ini", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "tauri-utils", + "thiserror 2.0.18", + "tracing", + "url", + "windows-registry", + "windows-result 0.3.4", +] + +[[package]] +name = "tauri-plugin-notification" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01fc2c5ff41105bd1f7242d8201fdf3efd70749b82fa013a17f2126357d194cc" +dependencies = [ + "log", + "notify-rust", + "rand 0.9.2", + "serde", + "serde_json", + "serde_repr", + "tauri", + "tauri-plugin", + "thiserror 2.0.18", + "time", + "url", +] + +[[package]] +name = "tauri-plugin-opener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc624469b06f59f5a29f874bbc61a2ed737c0f9c23ef09855a292c389c42e83f" +dependencies = [ + "dunce", + "glob", + "objc2-app-kit", + "objc2-foundation", + "open", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 2.0.18", + "url", + "windows", + "zbus", +] + +[[package]] +name = "tauri-plugin-os" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8f08346c8deb39e96f86973da0e2d76cbb933d7ac9b750f6dc4daf955a6f997" +dependencies = [ + "gethostname", + "log", + "os_info", + "serde", + "serde_json", + "serialize-to-javascript", + "sys-locale", + "tauri", + "tauri-plugin", + "thiserror 2.0.18", +] + +[[package]] +name = "tauri-runtime" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2826d79a3297ed08cd6ea7f412644ef58e32969504bc4fbd8d7dbeabc4445ea2" +dependencies = [ + "cookie 0.18.1", + "dpi", + "gtk", + "http 1.4.0", + "jni", + "objc2", + "objc2-ui-kit", + "objc2-web-kit", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror 2.0.18", + "url", + "webkit2gtk", + "webview2-com", + "windows", +] + +[[package]] +name = "tauri-runtime-wry" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11ea2e6f801d275fdd890d6c9603736012742a1c33b96d0db788c9cdebf7f9e" +dependencies = [ + "gtk", + "http 1.4.0", + "jni", + "log", + "objc2", + "objc2-app-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "softbuffer", + "tao", + "tauri-runtime", + "tauri-utils", + "url", + "webkit2gtk", + "webview2-com", + "windows", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219a1f983a2af3653f75b5747f76733b0da7ff03069c7a41901a5eb3ace4557d" +dependencies = [ + "anyhow", + "brotli", + "cargo_metadata", + "ctor", + "dunce", + "glob", + "html5ever 0.29.1", + "http 1.4.0", + "infer", + "json-patch", + "kuchikiki", + "log", + "memchr", + "phf 0.11.3", + "proc-macro2", + "quote", + "regex", + "schemars 0.8.22", + "semver", + "serde", + "serde-untagged", + "serde_json", + "serde_with", + "swift-rs", + "thiserror 2.0.18", + "toml 0.9.12+spec-1.1.0", + "url", + "urlpattern", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-winres" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1087b111fe2b005e42dbdc1990fc18593234238d47453b0c99b7de1c9ab2c1e0" +dependencies = [ + "dunce", + "embed-resource", + "toml 0.9.12+spec-1.1.0", +] + +[[package]] +name = "tauri-winrt-notification" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b1e66e07de489fe43a46678dd0b8df65e0c973909df1b60ba33874e297ba9b9" +dependencies = [ + "quick-xml 0.37.5", + "thiserror 2.0.18", + "windows", + "windows-version", +] + +[[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 1.1.4", + "windows-sys 0.61.2", +] + +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[package]] +name = "tendril" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4790fc369d5a530f4b544b094e31388b9b3a37c0f4652ade4505945f5660d24" +dependencies = [ + "new_debug_unreachable", + "utf-8", +] + +[[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 2.0.117", +] + +[[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 2.0.117", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "time" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" + +[[package]] +name = "time-macros" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinyhumansai" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c731df99d616c1918cab54ee749e51f1e181675e2df1f30be3f46f1e9d9d727" +dependencies = [ + "log", + "reqwest 0.12.28", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", +] + +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec 0.11.5", +] + +[[package]] +name = "tinyvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +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 2.0.117", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-postgres" +version = "0.7.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcea47c8f71744367793f16c2db1f11cb859d28f436bdb4ca9193eb1f787ee42" +dependencies = [ + "async-trait", + "byteorder", + "bytes", + "fallible-iterator 0.2.0", + "futures-channel", + "futures-util", + "log", + "parking_lot", + "percent-encoding", + "phf 0.13.1", + "pin-project-lite", + "postgres-protocol", + "postgres-types", + "rand 0.9.2", + "socket2", + "tokio", + "tokio-util", + "whoami", +] + +[[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-serial" +version = "5.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa1d5427f11ba7c5e6384521cfd76f2d64572ff29f3f4f7aa0f496282923fdc8" +dependencies = [ + "cfg-if", + "futures", + "log", + "mio-serial", + "serialport", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[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 0.24.0", + "webpki-roots 0.26.11", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" +dependencies = [ + "futures-util", + "log", + "tokio", + "tungstenite 0.28.0", +] + +[[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", + "futures-util", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-websockets" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dad543404f98bfc969aeb71994105c592acfc6c43323fddcd016bb208d1c65cb" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-sink", + "http 1.4.0", + "httparse", + "rand 0.10.0", + "ring", + "rustls-pki-types", + "simdutf8", + "tokio", + "tokio-rustls", + "tokio-util", +] + +[[package]] +name = "toml" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "toml" +version = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap 2.13.0", + "serde_core", + "serde_spanned 1.1.0", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + +[[package]] +name = "toml" +version = "1.1.0+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8195ca05e4eb728f4ba94f3e3291661320af739c4e43779cbdfae82ab239fcc" +dependencies = [ + "indexmap 2.13.0", + "serde_core", + "serde_spanned 1.1.0", + "toml_datetime 1.1.0+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 1.0.0", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_datetime" +version = "1.1.0+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97251a7c317e03ad83774a8752a7e81fb6067740609f75ea2b585b569a59198f" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.13.0", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.13.0", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.25.8+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16bff38f1d86c47f9ff0647e6838d7bb362522bdf44006c7068c2b1e606f1f3c" +dependencies = [ + "indexmap 2.13.0", + "toml_datetime 1.1.0+spec-1.1.0", + "toml_parser", + "winnow 1.0.0", +] + +[[package]] +name = "toml_parser" +version = "1.1.0+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2334f11ee363607eb04df9b8fc8a13ca1715a72ba8662a26ac285c98aabb4011" +dependencies = [ + "winnow 1.0.0", +] + +[[package]] +name = "toml_writer" +version = "1.1.0+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d282ade6016312faf3e41e57ebbba0c073e4056dab1232ab1cb624199648f8ed" + +[[package]] +name = "tonic" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fec7c61a0695dc1887c1b53952990f3ad2e3a31453e1f49f10e75424943a93ec" +dependencies = [ + "async-trait", + "base64 0.22.1", + "bytes", + "http 1.4.0", + "http-body", + "http-body-util", + "percent-encoding", + "pin-project", + "sync_wrapper", + "tokio-stream", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tonic-prost" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a55376a0bbaa4975a3f10d009ad763d8f4108f067c7c2e74f3001fb49778d309" +dependencies = [ + "bytes", + "prost 0.14.3", + "tonic", +] + +[[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 = [ + "async-compression", + "bitflags 2.11.0", + "bytes", + "futures-core", + "futures-util", + "http 1.4.0", + "http-body", + "http-body-util", + "iri-string", + "pin-project-lite", + "tokio", + "tokio-util", + "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-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "tray-icon" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e85aa143ceb072062fc4d6356c1b520a51d636e7bc8e77ec94be3608e5e80c" +dependencies = [ + "crossbeam-channel", + "dirs 6.0.0", + "libappindicator", + "muda", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "once_cell", + "png", + "serde", + "thiserror 2.0.18", + "windows-sys 0.60.2", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "ttf-parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" + +[[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 1.4.0", + "httparse", + "log", + "rand 0.8.5", + "rustls", + "rustls-pki-types", + "sha1", + "thiserror 1.0.69", + "utf-8", +] + +[[package]] +name = "tungstenite" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" +dependencies = [ + "bytes", + "data-encoding", + "http 1.4.0", + "httparse", + "log", + "rand 0.9.2", + "sha1", + "thiserror 2.0.18", + "utf-8", +] + +[[package]] +name = "twox-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" + +[[package]] +name = "type1-encoding-parser" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa10c302f5a53b7ad27fd42a3996e23d096ba39b5b8dd6d9e683a05b01bee749" +dependencies = [ + "pom", +] + +[[package]] +name = "typed-builder" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31aa81521b70f94402501d848ccc0ecaa8f93c8eb6999eb9747e72287757ffda" +dependencies = [ + "typed-builder-macro", +] + +[[package]] +name = "typed-builder-macro" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "076a02dc54dd46795c2e9c8282ed40bcfb1e22747e955de9389a1de28190fb26" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "typewit" +version = "1.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8c1ae7cc0fdb8b842d65d127cb981574b0d2b249b74d1c7a2986863dc134f71" +dependencies = [ + "typewit_proc_macros", +] + +[[package]] +name = "typewit_proc_macros" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e36a83ea2b3c704935a01b4642946aadd445cea40b10935e3f8bd8052b8193d6" + +[[package]] +name = "udev" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af4e37e9ea4401fc841ff54b9ddfc9be1079b1e89434c1a6a865dd68980f7e9f" +dependencies = [ + "io-lifetimes", + "libc", + "libudev-sys", + "pkg-config", +] + +[[package]] +name = "uds_windows" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" +dependencies = [ + "memoffset", + "tempfile", + "windows-sys 0.61.2", +] + +[[package]] +name = "uf2-decode" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca77d41ab27e3fa45df42043f96c79b80c6d8632eed906b54681d8d47ab00623" + +[[package]] +name = "ulid" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "470dbf6591da1b39d43c14523b2b469c86879a53e8b758c8e090a470fe7b1fbe" +dependencies = [ + "rand 0.9.2", + "web-time", +] + +[[package]] +name = "unescaper" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4064ed685c487dbc25bd3f0e9548f2e34bab9d18cefc700f9ec2dba74ba1138e" +dependencies = [ + "thiserror 2.0.18", +] + +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-ucd-ident" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + +[[package]] +name = "unicase" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-normalization" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" + +[[package]] +name = "unicode-segmentation" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[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 = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "unty" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" + +[[package]] +name = "ureq" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dea7109cdcd5864d4eeb1b58a1648dc9bf520360d7af16ec26d0a9354bafcfc0" +dependencies = [ + "base64 0.22.1", + "cookie_store", + "log", + "percent-encoding", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "ureq-proto", + "utf8-zero", + "webpki-roots 1.0.6", +] + +[[package]] +name = "ureq-proto" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e994ba84b0bd1b1b0cf92878b7ef898a5c1760108fe7b6010327e274917a808c" +dependencies = [ + "base64 0.22.1", + "http 1.4.0", + "httparse", + "log", +] + +[[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", + "serde_derive", +] + +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + +[[package]] +name = "urlpattern" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" +dependencies = [ + "regex", + "serde", + "unic-ucd-ident", + "url", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8-zero" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8c0a043c9540bae7c578c88f91dda8bd82e59ae27c21baca69c8b191aaf5a6e" + +[[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 = "uuid" +version = "1.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9" +dependencies = [ + "getrandom 0.4.2", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version-compare" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "virtue" +version = "0.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1" + +[[package]] +name = "vodozemac" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c022a277687e4e8685d72b95a7ca3ccfec907daa946678e715f8badaa650883d" +dependencies = [ + "aes", + "arrayvec", + "base64 0.22.1", + "base64ct", + "cbc", + "chacha20poly1305", + "curve25519-dalek", + "ed25519-dalek", + "getrandom 0.2.17", + "hkdf", + "hmac", + "matrix-pickle", + "prost 0.13.5", + "rand 0.8.5", + "serde", + "serde_bytes", + "serde_json", + "sha2", + "subtle", + "thiserror 2.0.18", + "x25519-dalek", + "zeroize", +] + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "wa-rs" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fecb468bdfe1e7d4c06a1bd12908c66edaca59024862cb64757ad11c3b948b1" +dependencies = [ + "anyhow", + "async-channel 2.5.0", + "async-trait", + "base64 0.22.1", + "bytes", + "chrono", + "dashmap", + "env_logger", + "hex", + "log", + "moka", + "prost 0.14.3", + "rand 0.9.2", + "rand_core 0.10.0", + "scopeguard", + "serde", + "serde_json", + "thiserror 2.0.18", + "tokio", + "wa-rs-binary", + "wa-rs-core", + "wa-rs-proto", +] + +[[package]] +name = "wa-rs-appstate" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3845137b3aead2d99de7c6744784bf2f5a908be9dc97a3dbd7585dc40296925c" +dependencies = [ + "anyhow", + "bytemuck", + "hex", + "hkdf", + "log", + "prost 0.14.3", + "serde", + "serde-big-array", + "serde_json", + "sha2", + "thiserror 2.0.18", + "wa-rs-binary", + "wa-rs-libsignal", + "wa-rs-proto", +] + +[[package]] +name = "wa-rs-binary" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3b30a6e11aebb39c07392675256ead5e2570c31382bd4835d6ddc877284b6be" +dependencies = [ + "flate2", + "phf 0.13.1", + "phf_codegen 0.13.1", + "serde", + "serde_json", +] + +[[package]] +name = "wa-rs-core" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed13bb2aff2de43fc4dd821955f03ea48a1d31eda3c80efe6f905898e304d11f" +dependencies = [ + "aes", + "aes-gcm", + "anyhow", + "async-channel 2.5.0", + "async-trait", + "base64 0.22.1", + "bytes", + "chrono", + "ctr", + "flate2", + "hex", + "hkdf", + "hmac", + "log", + "md5", + "once_cell", + "pbkdf2", + "prost 0.14.3", + "protobuf", + "rand 0.9.2", + "rand_core 0.10.0", + "serde", + "serde-big-array", + "serde_json", + "sha2", + "thiserror 2.0.18", + "typed-builder", + "wa-rs-appstate", + "wa-rs-binary", + "wa-rs-derive", + "wa-rs-libsignal", + "wa-rs-noise", + "wa-rs-proto", +] + +[[package]] +name = "wa-rs-derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75c03f610c9bc960e653d5d6d2a4cced9013bedbe5e6e8948787bbd418e4137c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "wa-rs-libsignal" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3471be8ff079ae4959fcddf2e7341281e5c6756bdc6a66454ea1a8e474d14576" +dependencies = [ + "aes", + "aes-gcm", + "arrayref", + "async-trait", + "cbc", + "chrono", + "ctr", + "curve25519-dalek", + "derive_more 2.1.1", + "displaydoc", + "ghash", + "hex", + "hkdf", + "hmac", + "itertools 0.14.0", + "log", + "prost 0.14.3", + "rand 0.9.2", + "serde", + "sha1", + "sha2", + "subtle", + "thiserror 2.0.18", + "uuid", + "wa-rs-proto", + "x25519-dalek", +] + +[[package]] +name = "wa-rs-noise" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3efb3891c1e22ce54646dc581e34e79377dc402ed8afb11a7671c5ef629b3ae" +dependencies = [ + "aes-gcm", + "anyhow", + "bytes", + "hkdf", + "log", + "prost 0.14.3", + "rand 0.9.2", + "rand_core 0.10.0", + "sha2", + "thiserror 2.0.18", + "wa-rs-binary", + "wa-rs-libsignal", + "wa-rs-proto", +] + +[[package]] +name = "wa-rs-proto" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ada50ee03752f0e66ada8cf415ed5f90d572d34039b058ce23d8b13493e510" +dependencies = [ + "prost 0.14.3", + "prost-build", + "serde", +] + +[[package]] +name = "wa-rs-tokio-transport" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfc638c168949dc99cbb756a776869898d4ae654b36b90d5f7ce2d32bf92a404" +dependencies = [ + "anyhow", + "async-channel 2.5.0", + "async-trait", + "bytes", + "futures-util", + "http 1.4.0", + "log", + "rustls", + "tokio", + "tokio-rustls", + "tokio-websockets", + "wa-rs-core", + "webpki-roots 1.0.6", +] + +[[package]] +name = "wa-rs-ureq-http" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d0c7fff8a7bd93d0c17af8d797a3934144fa269fe47a615635f3bf04238806" +dependencies = [ + "anyhow", + "async-trait", + "tokio", + "ureq", + "wa-rs-core", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[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.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasi" +version = "0.14.7+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" +dependencies = [ + "wasip2", +] + +[[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 = "wasite" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66fe902b4a6b8028a753d5424909b764ccf79b7a209eac9bf97e59cda9f71a42" +dependencies = [ + "wasi 0.14.7+wasi-0.2.4", +] + +[[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 2.0.117", + "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 2.13.0", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasm_evt_listener" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc92d6378b411ed94839112a36d9dbc77143451d85b05dfb0cce93a78dab1963" +dependencies = [ + "accessory", + "derivative", + "derive_more 1.0.0", + "fancy_constructor", + "futures-core", + "js-sys", + "smallvec", + "tokio", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.11.0", + "hashbrown 0.15.5", + "indexmap 2.13.0", + "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", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "web_atoms" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57ffde1dc01240bdf9992e3205668b235e59421fd085e8a317ed98da0178d414" +dependencies = [ + "phf 0.11.3", + "phf_codegen 0.11.3", + "string_cache 0.8.9", + "string_cache_codegen 0.5.4", +] + +[[package]] +name = "web_atoms" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57a9779e9f04d2ac1ce317aee707aa2f6b773afba7b931222bff6983843b1576" +dependencies = [ + "phf 0.13.1", + "phf_codegen 0.13.1", + "string_cache 0.9.0", + "string_cache_codegen 0.6.1", +] + +[[package]] +name = "webdriver" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91d53921e1bef27512fa358179c9a22428d55778d2c2ae3c5c37a52b82ce6e92" +dependencies = [ + "base64 0.22.1", + "bytes", + "cookie 0.16.2", + "http 0.2.12", + "icu_segmenter", + "log", + "serde", + "serde_derive", + "serde_json", + "thiserror 1.0.69", + "time", + "url", +] + +[[package]] +name = "webkit2gtk" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1027150013530fb2eaf806408df88461ae4815a45c541c8975e61d6f2fc4793" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup3", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "916a5f65c2ef0dfe12fff695960a2ec3d4565359fdbb2e9943c974e06c734ea5" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pkg-config", + "soup3-sys", + "system-deps", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "webview2-com" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows", + "windows-core 0.61.2", + "windows-implement", + "windows-interface", +] + +[[package]] +name = "webview2-com-macros" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "webview2-com-sys" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" +dependencies = [ + "thiserror 2.0.18", + "windows", + "windows-core 0.61.2", +] + +[[package]] +name = "weezl" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" + +[[package]] +name = "whoami" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6a5b12f9df4f978d2cfdb1bd3bac52433f44393342d7ee9c25f5a1c14c0f45d" +dependencies = [ + "libc", + "libredox", + "objc2-system-configuration", + "wasite", + "web-sys", +] + +[[package]] +name = "wildmatch" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29333c3ea1ba8b17211763463ff24ee84e41c78224c16b001cd907e663a38c68" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "window-vibrancy" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" +dependencies = [ + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "raw-window-handle", + "windows-sys 0.59.0", + "windows-version", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-registry" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +dependencies = [ + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[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" +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 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[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" +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 0.2.1", + "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-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-version" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[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" +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.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[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" +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.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[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" +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.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[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" +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.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[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" +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.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[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" +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.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[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" +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 = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a90e88e4667264a994d34e6d1ab2d26d398dcdca8b7f52bec8668957517fc7d8" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +dependencies = [ + "winapi", +] + +[[package]] +name = "winreg" +version = "0.55.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" +dependencies = [ + "cfg-if", + "windows-sys 0.59.0", +] + +[[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 0.5.0", + "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 0.5.0", + "indexmap 2.13.0", + "prettyplease", + "syn 2.0.117", + "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 2.0.117", + "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 2.11.0", + "indexmap 2.13.0", + "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 2.13.0", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "wry" +version = "0.54.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a8135d8676225e5744de000d4dff5a082501bf7db6a1c1495034f8c314edbc" +dependencies = [ + "base64 0.22.1", + "block2", + "cookie 0.18.1", + "crossbeam-channel", + "dirs 6.0.0", + "dom_query", + "dpi", + "dunce", + "gdkx11", + "gtk", + "http 1.4.0", + "javascriptcore-rs", + "jni", + "libc", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "sha2", + "soup3", + "tao-macros", + "thiserror 2.0.18", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "x25519-dalek" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" +dependencies = [ + "curve25519-dalek", + "rand_core 0.6.4", + "serde", + "zeroize", +] + +[[package]] +name = "xxhash-rust" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive 0.7.5", + "zerofrom", +] + +[[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 0.8.1", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[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 2.0.117", + "synstructure", +] + +[[package]] +name = "zbus" +version = "5.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca82f95dbd3943a40a53cfded6c2d0a2ca26192011846a1810c4256ef92c60bc" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener 5.4.1", + "futures-core", + "futures-lite", + "hex", + "libc", + "ordered-stream", + "rustix 1.1.4", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow 0.7.15", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897e79616e84aac4b2c46e9132a4f63b93105d54fe8c0e8f6bffc21fa8d49222" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffd8af6d5b78619bab301ff3c560a5bd22426150253db278f164d6cf3b72c50f" +dependencies = [ + "serde", + "winnow 0.7.15", + "zvariant", +] + +[[package]] +name = "zerocopy" +version = "0.8.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efbb2a062be311f2ba113ce66f697a4dc589f85e78a4aea276200804cea0ed87" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e8bc7269b54418e7aeeef514aa68f8690b8c0489a06b0136e5f57c4c5ccab89" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[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 2.0.117", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke 0.8.1", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke 0.7.5", + "zerofrom", + "zerovec-derive 0.10.3", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke 0.8.1", + "zerofrom", + "zerovec-derive 0.11.2", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[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 2.0.117", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zvariant" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5708299b21903bbe348e94729f22c49c55d04720a004aa350f1f9c122fd2540b" +dependencies = [ + "endi", + "enumflags2", + "serde", + "winnow 0.7.15", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b59b012ebe9c46656f9cc08d8da8b4c726510aef12559da3e5f1bf72780752c" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75c23a64ef8f40f13a6989991e643554d9bef1d682a281160cf0c1bc389c5e9" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn 2.0.117", + "winnow 0.7.15", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 000000000..d7d65f7dd --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,3 @@ +[workspace] +members = ["rust-core", "src-tauri"] +resolver = "2" diff --git a/eslint.config.js b/eslint.config.js index 2fade18b2..5d8e51a76 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -22,9 +22,12 @@ export default [ { ignores: [ 'node_modules/**', + 'target/**', + '**/target/**', 'dist/**', 'coverage/**', 'src-tauri/**', + 'rust-core/**', 'skills/**', 'references/**', 'scripts/**', diff --git a/package.json b/package.json index 55996991b..1f38e3dc9 100644 --- a/package.json +++ b/package.json @@ -20,8 +20,6 @@ "macos:build:sign:release": "yarn macos:build:release:signed", "macos:run": "open 'src-tauri/target/debug/bundle/macos/OpenHuman.app'", "macos:dev": "yarn macos:build:debug && open 'src-tauri/target/debug/bundle/macos/OpenHuman.app'", - "android:dev": "tauri android dev", - "android:build": "tauri android build", "test": "vitest run --config test/vitest.config.ts", "test:unit": "vitest run --config test/vitest.config.ts", "test:unit:watch": "vitest --config test/vitest.config.ts", diff --git a/rust-core/Cargo.toml b/rust-core/Cargo.toml new file mode 100644 index 000000000..1df78fb83 --- /dev/null +++ b/rust-core/Cargo.toml @@ -0,0 +1,110 @@ +[package] +name = "openhuman-core" +version = "0.49.16" +edition = "2021" +description = "OpenHuman core business logic and RPC server" +autobins = true + +[lib] +name = "openhuman_core" +crate-type = ["rlib"] + +[dependencies] +tauri = { version = "2.10", optional = true } +serde = { version = "1", features = ["derive"] } +serde_json = "1" +reqwest = { version = "0.12", default-features = false, features = ["json", "blocking", "rustls-tls", "native-tls", "stream", "http2", "multipart", "socks"] } +tokio = { version = "1", features = ["full", "sync"] } +once_cell = "1.19" +parking_lot = "0.12" +log = "0.4" +env_logger = "0.11" +base64 = "0.22" +aes-gcm = "0.10" +argon2 = "0.5" +rand = "0.9" +dirs = "5" +sha2 = "0.10" +hmac = "0.12" +uuid = { version = "1", features = ["v4"] } +anyhow = "1.0" +async-trait = "0.1" +chacha20poly1305 = "0.10" +hex = "0.4" +tokio-util = { version = "0.7", features = ["rt"] } +landlock = { version = "0.4", optional = true } +tokio-tungstenite = { version = "0.24", features = ["rustls-tls-webpki-roots"] } +futures = "0.3" +rusqlite = { version = "0.37", features = ["bundled"] } +chrono = { version = "0.4", features = ["serde"] } +cron = "0.12" +futures-util = "0.3" +directories = "6" +toml = "1.0" +shellexpand = "3.1" +schemars = "1.2" +tracing = { version = "0.1", default-features = false } +tracing-subscriber = { version = "0.3", default-features = false, features = ["fmt", "ansi", "env-filter"] } +prometheus = { version = "0.14", default-features = false } +urlencoding = "2.1" +thiserror = "2.0" +ring = "0.17" +prost = { version = "0.14", default-features = false } +postgres = { version = "0.19", features = ["with-chrono-0_4"] } +chrono-tz = "0.10" +dialoguer = { version = "0.12", features = ["fuzzy-select"] } +console = "0.16" +glob = "0.3" +regex = "1.10" +hostname = "0.4.2" +rustls = { version = "0.23", features = ["ring"] } +rustls-pki-types = "1.14.0" +tokio-rustls = "0.26.4" +webpki-roots = "1.0.6" +clap = { version = "4.5", features = ["derive"] } +lettre = { version = "0.11.19", default-features = false, features = ["builder", "smtp-transport", "rustls-tls"] } +mail-parser = "0.11.2" +async-imap = { version = "0.11", features = ["runtime-tokio"], default-features = false } +axum = { version = "0.8", default-features = false, features = ["http1", "json", "tokio", "query", "ws", "macros"] } +tower = { version = "0.5", default-features = false } +tower-http = { version = "0.6", default-features = false, features = ["limit", "timeout"] } +http-body-util = "0.1" +opentelemetry = { version = "0.31", default-features = false, features = ["trace", "metrics"] } +opentelemetry_sdk = { version = "0.31", default-features = false, features = ["trace", "metrics"] } +opentelemetry-otlp = { version = "0.31", default-features = false, features = ["trace", "metrics", "http-proto", "reqwest-client", "reqwest-rustls-webpki-roots"] } +tokio-stream = { version = "0.1.18", features = ["full"] } +url = "2" +tinyhumansai = "0.1.6" +rquickjs = { version = "0.11", features = ["futures", "macro", "loader", "parallel"], optional = true } + +matrix-sdk = { version = "0.16", optional = true, default-features = false, features = ["e2e-encryption", "rustls-tls", "markdown"] } +fantoccini = { version = "0.22.0", optional = true, default-features = false, features = ["rustls-tls"] } +serde-big-array = { version = "0.5", optional = true } +nusb = { version = "0.2", default-features = false, optional = true } +tokio-serial = { version = "5", default-features = false, optional = true } +rppal = { version = "0.22", optional = true } +probe-rs = { version = "0.30", optional = true } +pdf-extract = { version = "0.10", optional = true } +wa-rs = { version = "0.2", optional = true, default-features = false } +wa-rs-core = { version = "0.2", optional = true, default-features = false } +wa-rs-binary = { version = "0.2", optional = true, default-features = false } +wa-rs-proto = { version = "0.2", optional = true, default-features = false } +wa-rs-ureq-http = { version = "0.2", optional = true } +wa-rs-tokio-transport = { version = "0.2", optional = true, default-features = false } + +[dev-dependencies] +tempfile = "3" + +[features] +tauri-host = ["dep:tauri", "dep:rquickjs"] +sandbox-landlock = ["dep:landlock"] +sandbox-bubblewrap = [] +hardware = ["dep:nusb", "dep:tokio-serial"] +channel-matrix = ["dep:matrix-sdk"] +peripheral-rpi = ["dep:rppal"] +browser-native = ["dep:fantoccini"] +fantoccini = ["browser-native"] +landlock = ["sandbox-landlock"] +probe = ["dep:probe-rs"] +rag-pdf = ["dep:pdf-extract"] +whatsapp-web = ["dep:wa-rs", "dep:wa-rs-core", "dep:wa-rs-binary", "dep:wa-rs-proto", "dep:wa-rs-ureq-http", "dep:wa-rs-tokio-transport", "serde-big-array"] diff --git a/src-tauri/ai/AGENTS.md b/rust-core/ai/AGENTS.md similarity index 100% rename from src-tauri/ai/AGENTS.md rename to rust-core/ai/AGENTS.md diff --git a/src-tauri/ai/BOOTSTRAP.md b/rust-core/ai/BOOTSTRAP.md similarity index 100% rename from src-tauri/ai/BOOTSTRAP.md rename to rust-core/ai/BOOTSTRAP.md diff --git a/src-tauri/ai/CONSCIOUS_LOOP.md b/rust-core/ai/CONSCIOUS_LOOP.md similarity index 80% rename from src-tauri/ai/CONSCIOUS_LOOP.md rename to rust-core/ai/CONSCIOUS_LOOP.md index e647e692e..274b82f8a 100644 --- a/src-tauri/ai/CONSCIOUS_LOOP.md +++ b/rust-core/ai/CONSCIOUS_LOOP.md @@ -19,14 +19,14 @@ items that are: Return a JSON array of actionable items. Each item must have this exact structure: { - "title": "Short descriptive title (under 80 chars)", - "description": "1-2 sentence explanation with context", - "source": "email|calendar|telegram|ai_insight|system|trading|security", - "priority": "critical|important|normal", - "actionable": true, - "requires_confirmation": false, - "has_complex_action": false, - "source_label": "Human-readable source name (e.g. Gmail, Telegram, Notion)" +"title": "Short descriptive title (under 80 chars)", +"description": "1-2 sentence explanation with context", +"source": "email|calendar|telegram|ai_insight|system|trading|security", +"priority": "critical|important|normal", +"actionable": true, +"requires_confirmation": false, +"has_complex_action": false, +"source_label": "Human-readable source name (e.g. Gmail, Telegram, Notion)" } ## Rules diff --git a/src-tauri/ai/IDENTITY.md b/rust-core/ai/IDENTITY.md similarity index 100% rename from src-tauri/ai/IDENTITY.md rename to rust-core/ai/IDENTITY.md diff --git a/src-tauri/ai/MEMORY.md b/rust-core/ai/MEMORY.md similarity index 100% rename from src-tauri/ai/MEMORY.md rename to rust-core/ai/MEMORY.md diff --git a/src-tauri/ai/README.md b/rust-core/ai/README.md similarity index 100% rename from src-tauri/ai/README.md rename to rust-core/ai/README.md diff --git a/src-tauri/ai/SOUL.md b/rust-core/ai/SOUL.md similarity index 100% rename from src-tauri/ai/SOUL.md rename to rust-core/ai/SOUL.md diff --git a/src-tauri/ai/TOOLS.md b/rust-core/ai/TOOLS.md similarity index 100% rename from src-tauri/ai/TOOLS.md rename to rust-core/ai/TOOLS.md diff --git a/src-tauri/ai/USER.md b/rust-core/ai/USER.md similarity index 100% rename from src-tauri/ai/USER.md rename to rust-core/ai/USER.md diff --git a/src-tauri/src/ai/encryption.rs b/rust-core/src/ai/encryption.rs similarity index 100% rename from src-tauri/src/ai/encryption.rs rename to rust-core/src/ai/encryption.rs diff --git a/src-tauri/src/ai/memory_fs.rs b/rust-core/src/ai/memory_fs.rs similarity index 100% rename from src-tauri/src/ai/memory_fs.rs rename to rust-core/src/ai/memory_fs.rs diff --git a/src-tauri/src/ai/mod.rs b/rust-core/src/ai/mod.rs similarity index 100% rename from src-tauri/src/ai/mod.rs rename to rust-core/src/ai/mod.rs diff --git a/src-tauri/src/ai/sessions.rs b/rust-core/src/ai/sessions.rs similarity index 100% rename from src-tauri/src/ai/sessions.rs rename to rust-core/src/ai/sessions.rs diff --git a/src-tauri/src/auth/anthropic_token.rs b/rust-core/src/auth/anthropic_token.rs similarity index 100% rename from src-tauri/src/auth/anthropic_token.rs rename to rust-core/src/auth/anthropic_token.rs diff --git a/src-tauri/src/auth/mod.rs b/rust-core/src/auth/mod.rs similarity index 100% rename from src-tauri/src/auth/mod.rs rename to rust-core/src/auth/mod.rs diff --git a/src-tauri/src/auth/openai_oauth.rs b/rust-core/src/auth/openai_oauth.rs similarity index 100% rename from src-tauri/src/auth/openai_oauth.rs rename to rust-core/src/auth/openai_oauth.rs diff --git a/src-tauri/src/auth/profiles.rs b/rust-core/src/auth/profiles.rs similarity index 100% rename from src-tauri/src/auth/profiles.rs rename to rust-core/src/auth/profiles.rs diff --git a/src-tauri/src/standalone/openhuman-cli.rs b/rust-core/src/bin/openhuman-cli.rs similarity index 94% rename from src-tauri/src/standalone/openhuman-cli.rs rename to rust-core/src/bin/openhuman-cli.rs index e1a0c8956..fe8779861 100644 --- a/src-tauri/src/standalone/openhuman-cli.rs +++ b/rust-core/src/bin/openhuman-cli.rs @@ -310,24 +310,24 @@ fn execute(cli: Cli) -> Result { } } -fn load_config() -> Result { +fn load_config() -> Result { let runtime = tokio::runtime::Builder::new_current_thread() .enable_all() .build() .map_err(|e| format!("failed to build runtime: {e}"))?; runtime - .block_on(openhuman::openhuman::config::Config::load_or_init()) + .block_on(openhuman_core::openhuman::config::Config::load_or_init()) .map_err(|e| format!("failed to load config: {e}")) } fn status_value( - status: openhuman::openhuman::service::ServiceStatus, + status: openhuman_core::openhuman::service::ServiceStatus, ) -> Result { serde_json::to_value(status).map_err(|e| format!("failed to serialize service status: {e}")) } fn command_response_json( - status: openhuman::openhuman::service::ServiceStatus, + status: openhuman_core::openhuman::service::ServiceStatus, log: &str, ) -> Result { Ok(json!({ @@ -338,35 +338,35 @@ fn command_response_json( fn local_service_install() -> Result { let config = load_config()?; - let status = openhuman::openhuman::service::install(&config) + let status = openhuman_core::openhuman::service::install(&config) .map_err(|e| format!("service install failed: {e}"))?; command_response_json(status, "service install completed") } fn local_service_start() -> Result { let config = load_config()?; - let status = openhuman::openhuman::service::start(&config) + let status = openhuman_core::openhuman::service::start(&config) .map_err(|e| format!("service start failed: {e}"))?; command_response_json(status, "service start completed") } fn local_service_stop() -> Result { let config = load_config()?; - let status = openhuman::openhuman::service::stop(&config) + let status = openhuman_core::openhuman::service::stop(&config) .map_err(|e| format!("service stop failed: {e}"))?; command_response_json(status, "service stop completed") } fn local_service_status() -> Result { let config = load_config()?; - let status = openhuman::openhuman::service::status(&config) + let status = openhuman_core::openhuman::service::status(&config) .map_err(|e| format!("service status failed: {e}"))?; command_response_json(status, "service status fetched") } fn local_service_uninstall() -> Result { let config = load_config()?; - let status = openhuman::openhuman::service::uninstall(&config) + let status = openhuman_core::openhuman::service::uninstall(&config) .map_err(|e| format!("service uninstall failed: {e}"))?; command_response_json(status, "service uninstall completed") } diff --git a/src-tauri/src/standalone/openhuman-core.rs b/rust-core/src/bin/openhuman-core.rs similarity index 68% rename from src-tauri/src/standalone/openhuman-core.rs rename to rust-core/src/bin/openhuman-core.rs index 7e10d092f..a23cbb3fe 100644 --- a/src-tauri/src/standalone/openhuman-core.rs +++ b/rust-core/src/bin/openhuman-core.rs @@ -1,6 +1,6 @@ fn main() { let args: Vec = std::env::args().skip(1).collect(); - if let Err(err) = openhuman::core_server::run_from_cli_args(&args) { + if let Err(err) = openhuman_core::core_server::run_from_cli_args(&args) { eprintln!("openhuman-core failed: {err}"); std::process::exit(1); } diff --git a/src-tauri/src/core_server.rs b/rust-core/src/core_server.rs similarity index 100% rename from src-tauri/src/core_server.rs rename to rust-core/src/core_server.rs diff --git a/rust-core/src/lib.rs b/rust-core/src/lib.rs new file mode 100644 index 000000000..3d48b5ad7 --- /dev/null +++ b/rust-core/src/lib.rs @@ -0,0 +1,12 @@ +#[cfg(feature = "tauri-host")] +pub mod ai; +pub mod auth; +pub mod core_server; +pub mod memory; +pub mod models; +pub mod openhuman; +pub mod runtime; + +pub fn run_core_from_args(args: &[String]) -> anyhow::Result<()> { + core_server::run_from_cli_args(args) +} diff --git a/rust-core/src/memory/mod.rs b/rust-core/src/memory/mod.rs new file mode 100644 index 000000000..d6e43e01b --- /dev/null +++ b/rust-core/src/memory/mod.rs @@ -0,0 +1,453 @@ +//! TinyHumans Neocortex persistent memory layer. +//! +//! Wraps `TinyHumanMemoryClient` with helpers for skill data-sync. +//! The client is initialised at runtime with the user's JWT token (from Redux +//! `authSlice.token`) via the `init_memory_client` Tauri command, not from env vars. + +use std::sync::Arc; +use tinyhumansai::{ + DeleteMemoryParams, InsertMemoryParams, Priority, QueryMemoryParams, RecallMemoryParams, + SourceType, TinyHumanConfig, TinyHumansMemoryClient, +}; +use uuid::Uuid; + +/// Shared, cloneable handle to the memory client. +pub type MemoryClientRef = Arc; + +/// Shared app-state slot for the memory client. +pub struct MemoryState(pub std::sync::Mutex>); + +pub struct MemoryClient { + inner: TinyHumansMemoryClient, +} + +impl MemoryClient { + /// Construct from a JWT token (sourced from `authSlice.token` in the Redux store). + /// Returns `None` if the token is empty or client construction fails. + pub fn from_token(jwt_token: String) -> Option { + log::info!( + "[memory] from_token: entry (token_len={})", + jwt_token.trim().len() + ); + if jwt_token.trim().is_empty() { + log::warn!("[memory] from_token: exit — token is empty, returning None"); + return None; + } + let config = if let Ok(base_url) = + std::env::var("OPENHUMAN_BASE_URL").or_else(|_| std::env::var("TINYHUMANS_BASE_URL")) + { + log::info!( + "[memory] from_token: constructing client (base_url={base_url}, source=memory_env)" + ); + TinyHumanConfig::new(jwt_token).with_base_url(base_url) + } else { + let backend_url = std::env::var("VITE_BACKEND_URL") + .ok() + .filter(|url| !url.trim().is_empty()) + .unwrap_or_else(|| "http://localhost:5005".to_string()); + log::info!( + "[memory] from_token: constructing client (base_url={backend_url}, source=fallback_env_default)" + ); + TinyHumanConfig::new(jwt_token).with_base_url(backend_url) + }; + match TinyHumansMemoryClient::new(config) { + Ok(inner) => { + log::info!("[memory] from_token: exit — client created successfully"); + Some(Self { inner }) + } + Err(e) => { + log::warn!("[memory] from_token: exit — client construction failed: {e}"); + None + } + } + } + + /// Store a skill data-sync result. + /// + /// Inserts the document then polls `ingestion_job_status` every 30 s until + /// the job reaches `completed` (or `failed`/`error`). Returns only after the + /// ingestion job is confirmed complete. + pub async fn store_skill_sync( + &self, + skill_id: &str, + integration_id: &str, + title: &str, + content: &str, + source_type: Option, + metadata: Option, + priority: Option, + created_at: Option, + updated_at: Option, + document_id: Option, + ) -> Result<(), String> { + let namespace = skill_id.to_string(); + log::info!( + "[memory] store_skill_sync: entry (namespace={namespace}, title={title:?}, content_len={})", + content.len() + ); + + let document_id_final = document_id.unwrap_or_else(|| Uuid::new_v4().to_string()); + + log::info!( + "[memory] insert_memory: calling SDK (namespace={namespace}, title={title:?}), content_len={}", + content.len() + ); + + let insert_resp = self + .inner + .insert_memory(InsertMemoryParams { + document_id: document_id_final, + title: title.to_string(), + content: content.to_string(), + namespace: namespace.clone(), + source_type, + metadata, + priority, + created_at, + updated_at, + ..Default::default() + }) + .await + .map_err(|e| { + log::warn!( + "[memory] insert_memory: SDK error — kind={:?} msg={e}", + classify_insert_error(&e) + ); + format!("Memory insert failed: {e}") + })?; + + log::info!( + "[memory] insert_memory: accepted (namespace={namespace}, status={:?}, job_id={:?})", + insert_resp.data.status, + insert_resp.data.job_id + ); + + // If the API returned a job_id, poll until the job completes. + if let Some(job_id) = insert_resp.data.job_id { + log::info!("[memory] ingestion job queued (job_id={job_id}), polling every 30s..."); + + loop { + tokio::time::sleep(std::time::Duration::from_secs(30)).await; + + match self.inner.get_ingestion_job(&job_id).await { + Ok(status_resp) => { + let state = status_resp.data.state.as_deref().unwrap_or("unknown"); + + log::info!( + "[memory] ingestion job status: job_id={job_id}, state={state}, \ + attempts={:?}, completed_at={:?}", + status_resp.data.attempts, + status_resp.data.completed_at + ); + + match state { + "completed" => { + log::info!( + "[memory] ingestion job completed (job_id={job_id}, namespace={namespace})" + ); + break; + } + "failed" | "error" => { + let err_msg = status_resp + .data + .error + .unwrap_or_else(|| format!("job state={state}")); + log::warn!( + "[memory] ingestion job failed: job_id={job_id}, error={err_msg}" + ); + log::warn!( + "[memory] store_skill_sync: exit — ingestion failed (namespace={namespace})" + ); + return Err(format!("Ingestion job failed: {err_msg}")); + } + _ => { + // pending / processing / queued — keep waiting + log::info!( + "[memory] ingestion job still in progress (state={state}), waiting 30s..." + ); + } + } + } + Err(e) => { + log::warn!( + "[memory] ingestion job status poll error (job_id={job_id}): {e} — retrying in 30s" + ); + } + } + } + } else { + log::info!("[memory] no job_id returned — insert assumed synchronous, proceeding"); + } + + log::info!("[memory] store_skill_sync: exit — ok (namespace={namespace})"); + Ok(()) + } + + /// Query relevant context for a skill integration (RAG). + pub async fn query_skill_context( + &self, + skill_id: &str, + _integration_id: &str, + query: &str, + max_chunks: u32, + ) -> Result { + let namespace = skill_id.to_string(); + log::info!("[memory] query_skill_context: entry (namespace={namespace}, max_chunks={max_chunks}, query={query:?})"); + log::debug!( + "[memory] query_skill_context: payload → namespace={namespace} | max_chunks={max_chunks} | query={query}" + ); + let res = self + .inner + .query_memory(QueryMemoryParams { + query: query.to_string(), + namespace: Some(namespace.clone()), + max_chunks: Some(f64::from(max_chunks)), + ..Default::default() + }) + .await + .map_err(|e| { + log::warn!( + "[memory] query_skill_context: exit — error (namespace={namespace}): {e}" + ); + format!("Memory query failed: {e}") + })?; + let response = res.data.response.unwrap_or_default(); + log::info!( + "[memory] query_skill_context: exit — ok (namespace={namespace}, response_len={})", + response.len() + ); + Ok(response) + } + + /// Recall context from the Master memory node for a given namespace. + /// Returns the synthesised `response` string, or `None` if the server returned nothing. + pub async fn recall_skill_context( + &self, + skill_id: &str, + _integration_id: &str, + max_chunks: u32, + ) -> Result, String> { + let namespace = skill_id.to_string(); + log::info!( + "[memory] recall_skill_context: entry (namespace={namespace}, max_chunks={max_chunks})" + ); + let res = self + .inner + .recall_memory(RecallMemoryParams { + namespace: Some(namespace.clone()), + max_chunks: Some(f64::from(max_chunks)), + }) + .await + .map_err(|e| { + log::warn!( + "[memory] recall_skill_context: exit — error (namespace={namespace}): {e}" + ); + format!("Memory recall failed: {e}") + })?; + let response = res.data.context; + log::info!( + "[memory] recall_skill_context: exit — ok (namespace={namespace}, has_response={})", + response.is_some() + ); + Ok(response) + } + + /// List all ingested memory documents as returned by the API. + pub async fn list_documents(&self) -> Result { + self.inner + .list_documents(tinyhumansai::ListDocumentsParams::default()) + .await + .map_err(|e| format!("Memory list documents failed: {e}")) + } + + /// Delete a specific document from a namespace. + pub async fn delete_document( + &self, + document_id: &str, + namespace: &str, + ) -> Result { + self.inner + .delete_document(document_id, namespace) + .await + .map_err(|e| format!("Memory delete document failed: {e}")) + } + + /// Query memory context by namespace directly. + pub async fn query_namespace_context( + &self, + namespace: &str, + query: &str, + max_chunks: u32, + ) -> Result { + let res = self + .inner + .query_memory(QueryMemoryParams { + query: query.to_string(), + namespace: Some(namespace.to_string()), + max_chunks: Some(f64::from(max_chunks)), + ..Default::default() + }) + .await + .map_err(|e| format!("Memory query failed: {e}"))?; + Ok(res.data.response.unwrap_or_default()) + } + + /// Recall memory context by namespace directly. + pub async fn recall_namespace_context( + &self, + namespace: &str, + max_chunks: u32, + ) -> Result, String> { + let res = self + .inner + .recall_memory(RecallMemoryParams { + namespace: Some(namespace.to_string()), + max_chunks: Some(f64::from(max_chunks)), + }) + .await + .map_err(|e| format!("Memory recall failed: {e}"))?; + Ok(res.data.response) + } + + /// Delete all memories for a skill integration (e.g. on OAuth revoke). + pub async fn clear_skill_memory( + &self, + skill_id: &str, + _integration_id: &str, + ) -> Result<(), String> { + let namespace = skill_id.to_string(); + log::info!("[memory] clear_skill_memory: entry (namespace={namespace})"); + log::debug!("[memory] clear_skill_memory: payload → namespace={namespace}"); + let result = self + .inner + .delete_memory(DeleteMemoryParams { + namespace: Some(namespace.clone()), + }) + .await + .map(|_| ()) + .map_err(|e| format!("Memory delete failed: {e}")); + match &result { + Ok(()) => log::info!("[memory] clear_skill_memory: exit — ok (namespace={namespace})"), + Err(e) => { + log::warn!("[memory] clear_skill_memory: exit — error (namespace={namespace}): {e}") + } + } + result + } +} + +fn classify_insert_error(e: &tinyhumansai::TinyHumansError) -> &'static str { + let msg = e.to_string(); + if msg.contains("dns") || msg.contains("resolve") || msg.contains("lookup") { + "dns_failure" + } else if msg.contains("tls") || msg.contains("certificate") || msg.contains("ssl") { + "tls_failure" + } else if msg.contains("Connection refused") || msg.contains("connection refused") { + "connection_refused" + } else if msg.contains("timed out") || msg.contains("deadline") { + "timeout" + } else if msg.contains("error sending request") { + "transport_error" + } else { + "other" + } +} + +#[cfg(test)] +mod tests { + use super::*; + + /// Integration test against the real TinyHumans production API. + /// + /// Verifies: JWT is accepted, endpoint is reachable, and request shape is correct. + /// A `400 Insufficient ingestion budget` response is treated as a PASS because it proves: + /// - auth succeeded (not 401/403) + /// - the endpoint and payload are correctly formed (not 422) + /// - the account quota is the only limiting factor + /// + /// Run with: + /// JWT_TOKEN= \ + /// cargo test --manifest-path src-tauri/Cargo.toml test_memory_skill_sync_flow -- --ignored --nocapture + #[tokio::test] + #[ignore] + async fn test_memory_skill_sync_flow() { + let jwt_token = std::env::var("JWT_TOKEN").expect("JWT_TOKEN must be set"); + + let client = MemoryClient::from_token(jwt_token).expect("client creation failed"); + + let skill_id = "gmail"; + let integration_id = "test@openhuman.dev"; + + let dummy_content = serde_json::json!({ + "integrationId": integration_id, + "type": "gmail_sync", + "summary": "Synced 45 emails from inbox", + "labels": ["Work", "Personal", "Finance"], + "recentSenders": ["alice@example.com", "bob@example.com"], + "unreadCount": 12, + "syncedAt": "2026-03-17T12:00:00Z" + }); + + // ── 1. Insert ───────────────────────────────────────────────────────── + let insert_result = client + .store_skill_sync( + skill_id, + integration_id, + "Gmail OAuth sync — test@openhuman.dev", + &serde_json::to_string_pretty(&dummy_content).unwrap(), + None, + None, + None, + None, + None, + None, + ) + .await; + + println!("[test] insert result: {insert_result:?}"); + + match &insert_result { + Ok(()) => { + println!("[test] ✓ INSERT succeeded — quota available"); + + // ── 2. Query ───────────────────────────────────────────────── + let context = client + .query_skill_context( + skill_id, + integration_id, + "What emails were recently synced and who sent them?", + 10, + ) + .await; + println!("[test] query result: {context:?}"); + assert!(context.is_ok(), "query_memory failed: {context:?}"); + println!("[test] memory context:\n{}", context.unwrap()); + + // ── 3. Cleanup ──────────────────────────────────────────────── + let del = client.clear_skill_memory(skill_id, integration_id).await; + println!("[test] delete result: {del:?}"); + assert!(del.is_ok(), "delete_memory failed: {del:?}"); + } + Err(e) if e.contains("Insufficient ingestion budget") => { + // Account quota exhausted — auth + endpoint + payload all correct. + println!( + "[test] ✓ API REACHABLE — auth accepted, endpoint correct.\n\ + Quota limited: {e}\n\ + Integration is wired correctly; upgrade the TinyHumans account \ + to enable full insert/query/delete flow." + ); + // Not a code failure — pass the test. + } + Err(e) => { + panic!("Unexpected error (not a quota issue): {e}"); + } + } + } + + /// Smoke test: from_token() returns None for an empty token. + #[test] + fn test_from_token_returns_none_for_empty_token() { + assert!(MemoryClient::from_token(String::new()).is_none()); + assert!(MemoryClient::from_token(" ".to_string()).is_none()); + } +} diff --git a/src-tauri/src/models/auth.rs b/rust-core/src/models/auth.rs similarity index 100% rename from src-tauri/src/models/auth.rs rename to rust-core/src/models/auth.rs diff --git a/rust-core/src/models/mod.rs b/rust-core/src/models/mod.rs new file mode 100644 index 000000000..321ecbfb7 --- /dev/null +++ b/rust-core/src/models/mod.rs @@ -0,0 +1,2 @@ +pub mod auth; +pub mod socket; diff --git a/src-tauri/src/models/socket.rs b/rust-core/src/models/socket.rs similarity index 100% rename from src-tauri/src/models/socket.rs rename to rust-core/src/models/socket.rs diff --git a/src-tauri/src/openhuman/agent/agent.rs b/rust-core/src/openhuman/agent/agent.rs similarity index 100% rename from src-tauri/src/openhuman/agent/agent.rs rename to rust-core/src/openhuman/agent/agent.rs diff --git a/src-tauri/src/openhuman/agent/classifier.rs b/rust-core/src/openhuman/agent/classifier.rs similarity index 100% rename from src-tauri/src/openhuman/agent/classifier.rs rename to rust-core/src/openhuman/agent/classifier.rs diff --git a/src-tauri/src/openhuman/agent/dispatcher.rs b/rust-core/src/openhuman/agent/dispatcher.rs similarity index 100% rename from src-tauri/src/openhuman/agent/dispatcher.rs rename to rust-core/src/openhuman/agent/dispatcher.rs diff --git a/src-tauri/src/openhuman/agent/loop_.rs b/rust-core/src/openhuman/agent/loop_.rs similarity index 100% rename from src-tauri/src/openhuman/agent/loop_.rs rename to rust-core/src/openhuman/agent/loop_.rs diff --git a/src-tauri/src/openhuman/agent/memory_loader.rs b/rust-core/src/openhuman/agent/memory_loader.rs similarity index 100% rename from src-tauri/src/openhuman/agent/memory_loader.rs rename to rust-core/src/openhuman/agent/memory_loader.rs diff --git a/src-tauri/src/openhuman/agent/mod.rs b/rust-core/src/openhuman/agent/mod.rs similarity index 100% rename from src-tauri/src/openhuman/agent/mod.rs rename to rust-core/src/openhuman/agent/mod.rs diff --git a/src-tauri/src/openhuman/agent/prompt.rs b/rust-core/src/openhuman/agent/prompt.rs similarity index 100% rename from src-tauri/src/openhuman/agent/prompt.rs rename to rust-core/src/openhuman/agent/prompt.rs diff --git a/src-tauri/src/openhuman/agent/tests.rs b/rust-core/src/openhuman/agent/tests.rs similarity index 100% rename from src-tauri/src/openhuman/agent/tests.rs rename to rust-core/src/openhuman/agent/tests.rs diff --git a/src-tauri/src/openhuman/agent/traits.rs b/rust-core/src/openhuman/agent/traits.rs similarity index 100% rename from src-tauri/src/openhuman/agent/traits.rs rename to rust-core/src/openhuman/agent/traits.rs diff --git a/src-tauri/src/openhuman/approval/mod.rs b/rust-core/src/openhuman/approval/mod.rs similarity index 100% rename from src-tauri/src/openhuman/approval/mod.rs rename to rust-core/src/openhuman/approval/mod.rs diff --git a/src-tauri/src/openhuman/channels/cli.rs b/rust-core/src/openhuman/channels/cli.rs similarity index 100% rename from src-tauri/src/openhuman/channels/cli.rs rename to rust-core/src/openhuman/channels/cli.rs diff --git a/src-tauri/src/openhuman/channels/commands.rs b/rust-core/src/openhuman/channels/commands.rs similarity index 100% rename from src-tauri/src/openhuman/channels/commands.rs rename to rust-core/src/openhuman/channels/commands.rs diff --git a/src-tauri/src/openhuman/channels/context.rs b/rust-core/src/openhuman/channels/context.rs similarity index 100% rename from src-tauri/src/openhuman/channels/context.rs rename to rust-core/src/openhuman/channels/context.rs diff --git a/src-tauri/src/openhuman/channels/dingtalk.rs b/rust-core/src/openhuman/channels/dingtalk.rs similarity index 100% rename from src-tauri/src/openhuman/channels/dingtalk.rs rename to rust-core/src/openhuman/channels/dingtalk.rs diff --git a/src-tauri/src/openhuman/channels/discord.rs b/rust-core/src/openhuman/channels/discord.rs similarity index 100% rename from src-tauri/src/openhuman/channels/discord.rs rename to rust-core/src/openhuman/channels/discord.rs diff --git a/src-tauri/src/openhuman/channels/email_channel.rs b/rust-core/src/openhuman/channels/email_channel.rs similarity index 100% rename from src-tauri/src/openhuman/channels/email_channel.rs rename to rust-core/src/openhuman/channels/email_channel.rs diff --git a/src-tauri/src/openhuman/channels/imessage.rs b/rust-core/src/openhuman/channels/imessage.rs similarity index 99% rename from src-tauri/src/openhuman/channels/imessage.rs rename to rust-core/src/openhuman/channels/imessage.rs index 3e0f0acde..5e6cdf4a9 100644 --- a/src-tauri/src/openhuman/channels/imessage.rs +++ b/rust-core/src/openhuman/channels/imessage.rs @@ -247,7 +247,7 @@ end tell"# } async fn health_check(&self) -> bool { - if !cfg!(target_os = "macos") { + if std::env::consts::OS != "macos" { return false; } diff --git a/src-tauri/src/openhuman/channels/irc.rs b/rust-core/src/openhuman/channels/irc.rs similarity index 100% rename from src-tauri/src/openhuman/channels/irc.rs rename to rust-core/src/openhuman/channels/irc.rs diff --git a/src-tauri/src/openhuman/channels/lark.rs b/rust-core/src/openhuman/channels/lark.rs similarity index 100% rename from src-tauri/src/openhuman/channels/lark.rs rename to rust-core/src/openhuman/channels/lark.rs diff --git a/src-tauri/src/openhuman/channels/linq.rs b/rust-core/src/openhuman/channels/linq.rs similarity index 100% rename from src-tauri/src/openhuman/channels/linq.rs rename to rust-core/src/openhuman/channels/linq.rs diff --git a/src-tauri/src/openhuman/channels/matrix.rs b/rust-core/src/openhuman/channels/matrix.rs similarity index 100% rename from src-tauri/src/openhuman/channels/matrix.rs rename to rust-core/src/openhuman/channels/matrix.rs diff --git a/src-tauri/src/openhuman/channels/mattermost.rs b/rust-core/src/openhuman/channels/mattermost.rs similarity index 100% rename from src-tauri/src/openhuman/channels/mattermost.rs rename to rust-core/src/openhuman/channels/mattermost.rs diff --git a/src-tauri/src/openhuman/channels/mod.rs b/rust-core/src/openhuman/channels/mod.rs similarity index 100% rename from src-tauri/src/openhuman/channels/mod.rs rename to rust-core/src/openhuman/channels/mod.rs diff --git a/src-tauri/src/openhuman/channels/prompt.rs b/rust-core/src/openhuman/channels/prompt.rs similarity index 100% rename from src-tauri/src/openhuman/channels/prompt.rs rename to rust-core/src/openhuman/channels/prompt.rs diff --git a/src-tauri/src/openhuman/channels/qq.rs b/rust-core/src/openhuman/channels/qq.rs similarity index 100% rename from src-tauri/src/openhuman/channels/qq.rs rename to rust-core/src/openhuman/channels/qq.rs diff --git a/src-tauri/src/openhuman/channels/routes.rs b/rust-core/src/openhuman/channels/routes.rs similarity index 100% rename from src-tauri/src/openhuman/channels/routes.rs rename to rust-core/src/openhuman/channels/routes.rs diff --git a/src-tauri/src/openhuman/channels/runtime/dispatch.rs b/rust-core/src/openhuman/channels/runtime/dispatch.rs similarity index 100% rename from src-tauri/src/openhuman/channels/runtime/dispatch.rs rename to rust-core/src/openhuman/channels/runtime/dispatch.rs diff --git a/src-tauri/src/openhuman/channels/runtime/mod.rs b/rust-core/src/openhuman/channels/runtime/mod.rs similarity index 100% rename from src-tauri/src/openhuman/channels/runtime/mod.rs rename to rust-core/src/openhuman/channels/runtime/mod.rs diff --git a/src-tauri/src/openhuman/channels/runtime/startup.rs b/rust-core/src/openhuman/channels/runtime/startup.rs similarity index 100% rename from src-tauri/src/openhuman/channels/runtime/startup.rs rename to rust-core/src/openhuman/channels/runtime/startup.rs diff --git a/src-tauri/src/openhuman/channels/runtime/supervision.rs b/rust-core/src/openhuman/channels/runtime/supervision.rs similarity index 100% rename from src-tauri/src/openhuman/channels/runtime/supervision.rs rename to rust-core/src/openhuman/channels/runtime/supervision.rs diff --git a/src-tauri/src/openhuman/channels/signal.rs b/rust-core/src/openhuman/channels/signal.rs similarity index 100% rename from src-tauri/src/openhuman/channels/signal.rs rename to rust-core/src/openhuman/channels/signal.rs diff --git a/src-tauri/src/openhuman/channels/slack.rs b/rust-core/src/openhuman/channels/slack.rs similarity index 100% rename from src-tauri/src/openhuman/channels/slack.rs rename to rust-core/src/openhuman/channels/slack.rs diff --git a/src-tauri/src/openhuman/channels/telegram.rs b/rust-core/src/openhuman/channels/telegram.rs similarity index 100% rename from src-tauri/src/openhuman/channels/telegram.rs rename to rust-core/src/openhuman/channels/telegram.rs diff --git a/src-tauri/src/openhuman/channels/tests/common.rs b/rust-core/src/openhuman/channels/tests/common.rs similarity index 100% rename from src-tauri/src/openhuman/channels/tests/common.rs rename to rust-core/src/openhuman/channels/tests/common.rs diff --git a/src-tauri/src/openhuman/channels/tests/context.rs b/rust-core/src/openhuman/channels/tests/context.rs similarity index 100% rename from src-tauri/src/openhuman/channels/tests/context.rs rename to rust-core/src/openhuman/channels/tests/context.rs diff --git a/src-tauri/src/openhuman/channels/tests/health.rs b/rust-core/src/openhuman/channels/tests/health.rs similarity index 100% rename from src-tauri/src/openhuman/channels/tests/health.rs rename to rust-core/src/openhuman/channels/tests/health.rs diff --git a/src-tauri/src/openhuman/channels/tests/identity.rs b/rust-core/src/openhuman/channels/tests/identity.rs similarity index 100% rename from src-tauri/src/openhuman/channels/tests/identity.rs rename to rust-core/src/openhuman/channels/tests/identity.rs diff --git a/src-tauri/src/openhuman/channels/tests/memory.rs b/rust-core/src/openhuman/channels/tests/memory.rs similarity index 100% rename from src-tauri/src/openhuman/channels/tests/memory.rs rename to rust-core/src/openhuman/channels/tests/memory.rs diff --git a/src-tauri/src/openhuman/channels/tests/mod.rs b/rust-core/src/openhuman/channels/tests/mod.rs similarity index 100% rename from src-tauri/src/openhuman/channels/tests/mod.rs rename to rust-core/src/openhuman/channels/tests/mod.rs diff --git a/src-tauri/src/openhuman/channels/tests/prompt.rs b/rust-core/src/openhuman/channels/tests/prompt.rs similarity index 100% rename from src-tauri/src/openhuman/channels/tests/prompt.rs rename to rust-core/src/openhuman/channels/tests/prompt.rs diff --git a/src-tauri/src/openhuman/channels/tests/runtime_dispatch.rs b/rust-core/src/openhuman/channels/tests/runtime_dispatch.rs similarity index 100% rename from src-tauri/src/openhuman/channels/tests/runtime_dispatch.rs rename to rust-core/src/openhuman/channels/tests/runtime_dispatch.rs diff --git a/src-tauri/src/openhuman/channels/tests/runtime_tool_calls.rs b/rust-core/src/openhuman/channels/tests/runtime_tool_calls.rs similarity index 100% rename from src-tauri/src/openhuman/channels/tests/runtime_tool_calls.rs rename to rust-core/src/openhuman/channels/tests/runtime_tool_calls.rs diff --git a/src-tauri/src/openhuman/channels/traits.rs b/rust-core/src/openhuman/channels/traits.rs similarity index 100% rename from src-tauri/src/openhuman/channels/traits.rs rename to rust-core/src/openhuman/channels/traits.rs diff --git a/src-tauri/src/openhuman/channels/whatsapp.rs b/rust-core/src/openhuman/channels/whatsapp.rs similarity index 100% rename from src-tauri/src/openhuman/channels/whatsapp.rs rename to rust-core/src/openhuman/channels/whatsapp.rs diff --git a/src-tauri/src/openhuman/channels/whatsapp_storage.rs b/rust-core/src/openhuman/channels/whatsapp_storage.rs similarity index 100% rename from src-tauri/src/openhuman/channels/whatsapp_storage.rs rename to rust-core/src/openhuman/channels/whatsapp_storage.rs diff --git a/src-tauri/src/openhuman/channels/whatsapp_web.rs b/rust-core/src/openhuman/channels/whatsapp_web.rs similarity index 100% rename from src-tauri/src/openhuman/channels/whatsapp_web.rs rename to rust-core/src/openhuman/channels/whatsapp_web.rs diff --git a/src-tauri/src/openhuman/config/daemon.rs b/rust-core/src/openhuman/config/daemon.rs similarity index 100% rename from src-tauri/src/openhuman/config/daemon.rs rename to rust-core/src/openhuman/config/daemon.rs diff --git a/src-tauri/src/openhuman/config/mod.rs b/rust-core/src/openhuman/config/mod.rs similarity index 100% rename from src-tauri/src/openhuman/config/mod.rs rename to rust-core/src/openhuman/config/mod.rs diff --git a/src-tauri/src/openhuman/config/schema/agent.rs b/rust-core/src/openhuman/config/schema/agent.rs similarity index 100% rename from src-tauri/src/openhuman/config/schema/agent.rs rename to rust-core/src/openhuman/config/schema/agent.rs diff --git a/src-tauri/src/openhuman/config/schema/autonomy.rs b/rust-core/src/openhuman/config/schema/autonomy.rs similarity index 100% rename from src-tauri/src/openhuman/config/schema/autonomy.rs rename to rust-core/src/openhuman/config/schema/autonomy.rs diff --git a/src-tauri/src/openhuman/config/schema/channels.rs b/rust-core/src/openhuman/config/schema/channels.rs similarity index 100% rename from src-tauri/src/openhuman/config/schema/channels.rs rename to rust-core/src/openhuman/config/schema/channels.rs diff --git a/src-tauri/src/openhuman/config/schema/defaults.rs b/rust-core/src/openhuman/config/schema/defaults.rs similarity index 100% rename from src-tauri/src/openhuman/config/schema/defaults.rs rename to rust-core/src/openhuman/config/schema/defaults.rs diff --git a/src-tauri/src/openhuman/config/schema/gateway.rs b/rust-core/src/openhuman/config/schema/gateway.rs similarity index 100% rename from src-tauri/src/openhuman/config/schema/gateway.rs rename to rust-core/src/openhuman/config/schema/gateway.rs diff --git a/src-tauri/src/openhuman/config/schema/hardware.rs b/rust-core/src/openhuman/config/schema/hardware.rs similarity index 100% rename from src-tauri/src/openhuman/config/schema/hardware.rs rename to rust-core/src/openhuman/config/schema/hardware.rs diff --git a/src-tauri/src/openhuman/config/schema/heartbeat_cron.rs b/rust-core/src/openhuman/config/schema/heartbeat_cron.rs similarity index 100% rename from src-tauri/src/openhuman/config/schema/heartbeat_cron.rs rename to rust-core/src/openhuman/config/schema/heartbeat_cron.rs diff --git a/src-tauri/src/openhuman/config/schema/identity_cost.rs b/rust-core/src/openhuman/config/schema/identity_cost.rs similarity index 100% rename from src-tauri/src/openhuman/config/schema/identity_cost.rs rename to rust-core/src/openhuman/config/schema/identity_cost.rs diff --git a/src-tauri/src/openhuman/config/schema/load.rs b/rust-core/src/openhuman/config/schema/load.rs similarity index 100% rename from src-tauri/src/openhuman/config/schema/load.rs rename to rust-core/src/openhuman/config/schema/load.rs diff --git a/src-tauri/src/openhuman/config/schema/mod.rs b/rust-core/src/openhuman/config/schema/mod.rs similarity index 100% rename from src-tauri/src/openhuman/config/schema/mod.rs rename to rust-core/src/openhuman/config/schema/mod.rs diff --git a/src-tauri/src/openhuman/config/schema/observability.rs b/rust-core/src/openhuman/config/schema/observability.rs similarity index 100% rename from src-tauri/src/openhuman/config/schema/observability.rs rename to rust-core/src/openhuman/config/schema/observability.rs diff --git a/src-tauri/src/openhuman/config/schema/proxy.rs b/rust-core/src/openhuman/config/schema/proxy.rs similarity index 100% rename from src-tauri/src/openhuman/config/schema/proxy.rs rename to rust-core/src/openhuman/config/schema/proxy.rs diff --git a/src-tauri/src/openhuman/config/schema/routes.rs b/rust-core/src/openhuman/config/schema/routes.rs similarity index 100% rename from src-tauri/src/openhuman/config/schema/routes.rs rename to rust-core/src/openhuman/config/schema/routes.rs diff --git a/src-tauri/src/openhuman/config/schema/runtime.rs b/rust-core/src/openhuman/config/schema/runtime.rs similarity index 100% rename from src-tauri/src/openhuman/config/schema/runtime.rs rename to rust-core/src/openhuman/config/schema/runtime.rs diff --git a/src-tauri/src/openhuman/config/schema/storage_memory.rs b/rust-core/src/openhuman/config/schema/storage_memory.rs similarity index 100% rename from src-tauri/src/openhuman/config/schema/storage_memory.rs rename to rust-core/src/openhuman/config/schema/storage_memory.rs diff --git a/src-tauri/src/openhuman/config/schema/tools.rs b/rust-core/src/openhuman/config/schema/tools.rs similarity index 100% rename from src-tauri/src/openhuman/config/schema/tools.rs rename to rust-core/src/openhuman/config/schema/tools.rs diff --git a/src-tauri/src/openhuman/config/schema/tunnel.rs b/rust-core/src/openhuman/config/schema/tunnel.rs similarity index 100% rename from src-tauri/src/openhuman/config/schema/tunnel.rs rename to rust-core/src/openhuman/config/schema/tunnel.rs diff --git a/src-tauri/src/openhuman/cost/mod.rs b/rust-core/src/openhuman/cost/mod.rs similarity index 100% rename from src-tauri/src/openhuman/cost/mod.rs rename to rust-core/src/openhuman/cost/mod.rs diff --git a/src-tauri/src/openhuman/cost/tracker.rs b/rust-core/src/openhuman/cost/tracker.rs similarity index 100% rename from src-tauri/src/openhuman/cost/tracker.rs rename to rust-core/src/openhuman/cost/tracker.rs diff --git a/src-tauri/src/openhuman/cost/types.rs b/rust-core/src/openhuman/cost/types.rs similarity index 100% rename from src-tauri/src/openhuman/cost/types.rs rename to rust-core/src/openhuman/cost/types.rs diff --git a/src-tauri/src/openhuman/cron/mod.rs b/rust-core/src/openhuman/cron/mod.rs similarity index 100% rename from src-tauri/src/openhuman/cron/mod.rs rename to rust-core/src/openhuman/cron/mod.rs diff --git a/src-tauri/src/openhuman/cron/schedule.rs b/rust-core/src/openhuman/cron/schedule.rs similarity index 100% rename from src-tauri/src/openhuman/cron/schedule.rs rename to rust-core/src/openhuman/cron/schedule.rs diff --git a/src-tauri/src/openhuman/cron/scheduler.rs b/rust-core/src/openhuman/cron/scheduler.rs similarity index 100% rename from src-tauri/src/openhuman/cron/scheduler.rs rename to rust-core/src/openhuman/cron/scheduler.rs diff --git a/src-tauri/src/openhuman/cron/store.rs b/rust-core/src/openhuman/cron/store.rs similarity index 100% rename from src-tauri/src/openhuman/cron/store.rs rename to rust-core/src/openhuman/cron/store.rs diff --git a/src-tauri/src/openhuman/cron/types.rs b/rust-core/src/openhuman/cron/types.rs similarity index 100% rename from src-tauri/src/openhuman/cron/types.rs rename to rust-core/src/openhuman/cron/types.rs diff --git a/rust-core/src/openhuman/daemon/mod.rs b/rust-core/src/openhuman/daemon/mod.rs new file mode 100644 index 000000000..1cb1b1409 --- /dev/null +++ b/rust-core/src/openhuman/daemon/mod.rs @@ -0,0 +1,11 @@ +use crate::openhuman::config::Config; +use std::path::PathBuf; + +/// Shared daemon state file path used by health/doctor reporting. +pub fn state_file_path(config: &Config) -> PathBuf { + config + .config_path + .parent() + .map_or_else(|| PathBuf::from("."), PathBuf::from) + .join("daemon_state.json") +} diff --git a/src-tauri/src/openhuman/doctor/mod.rs b/rust-core/src/openhuman/doctor/mod.rs similarity index 98% rename from src-tauri/src/openhuman/doctor/mod.rs rename to rust-core/src/openhuman/doctor/mod.rs index 4ec4f891f..9dec9d14e 100644 --- a/src-tauri/src/openhuman/doctor/mod.rs +++ b/rust-core/src/openhuman/doctor/mod.rs @@ -564,25 +564,21 @@ fn check_workspace(config: &Config, items: &mut Vec) { } fn available_disk_space_mb(path: &Path) -> Option { - #[cfg(target_os = "windows")] - { - let _ = path; + if std::env::consts::OS == "windows" { + let _ = path; // TODO: add a Windows-specific implementation return None; } - #[cfg(not(target_os = "windows"))] - { - let output = std::process::Command::new("df") - .arg("-m") - .arg(path) - .output() - .ok()?; - if !output.status.success() { - return None; - } - let stdout = String::from_utf8_lossy(&output.stdout); - parse_df_available_mb(&stdout) + let output = std::process::Command::new("df") + .arg("-m") + .arg(path) + .output() + .ok()?; + if !output.status.success() { + return None; } + let stdout = String::from_utf8_lossy(&output.stdout); + parse_df_available_mb(&stdout) } fn parse_df_available_mb(stdout: &str) -> Option { diff --git a/src-tauri/src/openhuman/gateway/client.rs b/rust-core/src/openhuman/gateway/client.rs similarity index 100% rename from src-tauri/src/openhuman/gateway/client.rs rename to rust-core/src/openhuman/gateway/client.rs diff --git a/src-tauri/src/openhuman/gateway/constants.rs b/rust-core/src/openhuman/gateway/constants.rs similarity index 100% rename from src-tauri/src/openhuman/gateway/constants.rs rename to rust-core/src/openhuman/gateway/constants.rs diff --git a/src-tauri/src/openhuman/gateway/handlers/health.rs b/rust-core/src/openhuman/gateway/handlers/health.rs similarity index 100% rename from src-tauri/src/openhuman/gateway/handlers/health.rs rename to rust-core/src/openhuman/gateway/handlers/health.rs diff --git a/src-tauri/src/openhuman/gateway/handlers/linq.rs b/rust-core/src/openhuman/gateway/handlers/linq.rs similarity index 100% rename from src-tauri/src/openhuman/gateway/handlers/linq.rs rename to rust-core/src/openhuman/gateway/handlers/linq.rs diff --git a/src-tauri/src/openhuman/gateway/handlers/mod.rs b/rust-core/src/openhuman/gateway/handlers/mod.rs similarity index 100% rename from src-tauri/src/openhuman/gateway/handlers/mod.rs rename to rust-core/src/openhuman/gateway/handlers/mod.rs diff --git a/src-tauri/src/openhuman/gateway/handlers/pair.rs b/rust-core/src/openhuman/gateway/handlers/pair.rs similarity index 100% rename from src-tauri/src/openhuman/gateway/handlers/pair.rs rename to rust-core/src/openhuman/gateway/handlers/pair.rs diff --git a/src-tauri/src/openhuman/gateway/handlers/webhook.rs b/rust-core/src/openhuman/gateway/handlers/webhook.rs similarity index 100% rename from src-tauri/src/openhuman/gateway/handlers/webhook.rs rename to rust-core/src/openhuman/gateway/handlers/webhook.rs diff --git a/src-tauri/src/openhuman/gateway/handlers/whatsapp.rs b/rust-core/src/openhuman/gateway/handlers/whatsapp.rs similarity index 100% rename from src-tauri/src/openhuman/gateway/handlers/whatsapp.rs rename to rust-core/src/openhuman/gateway/handlers/whatsapp.rs diff --git a/src-tauri/src/openhuman/gateway/mod.rs b/rust-core/src/openhuman/gateway/mod.rs similarity index 100% rename from src-tauri/src/openhuman/gateway/mod.rs rename to rust-core/src/openhuman/gateway/mod.rs diff --git a/src-tauri/src/openhuman/gateway/models.rs b/rust-core/src/openhuman/gateway/models.rs similarity index 100% rename from src-tauri/src/openhuman/gateway/models.rs rename to rust-core/src/openhuman/gateway/models.rs diff --git a/src-tauri/src/openhuman/gateway/rate_limit.rs b/rust-core/src/openhuman/gateway/rate_limit.rs similarity index 100% rename from src-tauri/src/openhuman/gateway/rate_limit.rs rename to rust-core/src/openhuman/gateway/rate_limit.rs diff --git a/src-tauri/src/openhuman/gateway/server.rs b/rust-core/src/openhuman/gateway/server.rs similarity index 100% rename from src-tauri/src/openhuman/gateway/server.rs rename to rust-core/src/openhuman/gateway/server.rs diff --git a/src-tauri/src/openhuman/gateway/state.rs b/rust-core/src/openhuman/gateway/state.rs similarity index 100% rename from src-tauri/src/openhuman/gateway/state.rs rename to rust-core/src/openhuman/gateway/state.rs diff --git a/src-tauri/src/openhuman/gateway/tests.rs b/rust-core/src/openhuman/gateway/tests.rs similarity index 100% rename from src-tauri/src/openhuman/gateway/tests.rs rename to rust-core/src/openhuman/gateway/tests.rs diff --git a/src-tauri/src/openhuman/hardware/discover.rs b/rust-core/src/openhuman/hardware/discover.rs similarity index 100% rename from src-tauri/src/openhuman/hardware/discover.rs rename to rust-core/src/openhuman/hardware/discover.rs diff --git a/src-tauri/src/openhuman/hardware/introspect.rs b/rust-core/src/openhuman/hardware/introspect.rs similarity index 100% rename from src-tauri/src/openhuman/hardware/introspect.rs rename to rust-core/src/openhuman/hardware/introspect.rs diff --git a/src-tauri/src/openhuman/hardware/mod.rs b/rust-core/src/openhuman/hardware/mod.rs similarity index 100% rename from src-tauri/src/openhuman/hardware/mod.rs rename to rust-core/src/openhuman/hardware/mod.rs diff --git a/src-tauri/src/openhuman/hardware/registry.rs b/rust-core/src/openhuman/hardware/registry.rs similarity index 100% rename from src-tauri/src/openhuman/hardware/registry.rs rename to rust-core/src/openhuman/hardware/registry.rs diff --git a/src-tauri/src/openhuman/health/mod.rs b/rust-core/src/openhuman/health/mod.rs similarity index 100% rename from src-tauri/src/openhuman/health/mod.rs rename to rust-core/src/openhuman/health/mod.rs diff --git a/src-tauri/src/openhuman/heartbeat/engine.rs b/rust-core/src/openhuman/heartbeat/engine.rs similarity index 100% rename from src-tauri/src/openhuman/heartbeat/engine.rs rename to rust-core/src/openhuman/heartbeat/engine.rs diff --git a/src-tauri/src/openhuman/heartbeat/mod.rs b/rust-core/src/openhuman/heartbeat/mod.rs similarity index 100% rename from src-tauri/src/openhuman/heartbeat/mod.rs rename to rust-core/src/openhuman/heartbeat/mod.rs diff --git a/src-tauri/src/openhuman/identity.rs b/rust-core/src/openhuman/identity.rs similarity index 100% rename from src-tauri/src/openhuman/identity.rs rename to rust-core/src/openhuman/identity.rs diff --git a/src-tauri/src/openhuman/integrations/mod.rs b/rust-core/src/openhuman/integrations/mod.rs similarity index 100% rename from src-tauri/src/openhuman/integrations/mod.rs rename to rust-core/src/openhuman/integrations/mod.rs diff --git a/src-tauri/src/openhuman/integrations/registry.rs b/rust-core/src/openhuman/integrations/registry.rs similarity index 99% rename from src-tauri/src/openhuman/integrations/registry.rs rename to rust-core/src/openhuman/integrations/registry.rs index 8367af345..e0912ea76 100644 --- a/src-tauri/src/openhuman/integrations/registry.rs +++ b/rust-core/src/openhuman/integrations/registry.rs @@ -682,7 +682,7 @@ pub fn all_integrations() -> Vec { description: "Native support + AppleScript", category: IntegrationCategory::Platform, status_fn: |_| { - if cfg!(target_os = "macos") { + if std::env::consts::OS == "macos" { IntegrationStatus::Active } else { IntegrationStatus::Available @@ -694,7 +694,7 @@ pub fn all_integrations() -> Vec { description: "Native support", category: IntegrationCategory::Platform, status_fn: |_| { - if cfg!(target_os = "linux") { + if std::env::consts::OS == "linux" { IntegrationStatus::Active } else { IntegrationStatus::Available @@ -913,7 +913,7 @@ mod tests { let entries = all_integrations(); let macos = entries.iter().find(|e| e.name == "macOS").unwrap(); let status = (macos.status_fn)(&config); - if cfg!(target_os = "macos") { + if std::env::consts::OS == "macos" { assert!(matches!(status, IntegrationStatus::Active)); } else { assert!(matches!(status, IntegrationStatus::Available)); diff --git a/src-tauri/src/openhuman/memory/backend.rs b/rust-core/src/openhuman/memory/backend.rs similarity index 100% rename from src-tauri/src/openhuman/memory/backend.rs rename to rust-core/src/openhuman/memory/backend.rs diff --git a/src-tauri/src/openhuman/memory/chunker.rs b/rust-core/src/openhuman/memory/chunker.rs similarity index 100% rename from src-tauri/src/openhuman/memory/chunker.rs rename to rust-core/src/openhuman/memory/chunker.rs diff --git a/src-tauri/src/openhuman/memory/embeddings.rs b/rust-core/src/openhuman/memory/embeddings.rs similarity index 100% rename from src-tauri/src/openhuman/memory/embeddings.rs rename to rust-core/src/openhuman/memory/embeddings.rs diff --git a/src-tauri/src/openhuman/memory/hygiene.rs b/rust-core/src/openhuman/memory/hygiene.rs similarity index 100% rename from src-tauri/src/openhuman/memory/hygiene.rs rename to rust-core/src/openhuman/memory/hygiene.rs diff --git a/src-tauri/src/openhuman/memory/lucid.rs b/rust-core/src/openhuman/memory/lucid.rs similarity index 100% rename from src-tauri/src/openhuman/memory/lucid.rs rename to rust-core/src/openhuman/memory/lucid.rs diff --git a/src-tauri/src/openhuman/memory/markdown.rs b/rust-core/src/openhuman/memory/markdown.rs similarity index 100% rename from src-tauri/src/openhuman/memory/markdown.rs rename to rust-core/src/openhuman/memory/markdown.rs diff --git a/src-tauri/src/openhuman/memory/mod.rs b/rust-core/src/openhuman/memory/mod.rs similarity index 100% rename from src-tauri/src/openhuman/memory/mod.rs rename to rust-core/src/openhuman/memory/mod.rs diff --git a/src-tauri/src/openhuman/memory/none.rs b/rust-core/src/openhuman/memory/none.rs similarity index 100% rename from src-tauri/src/openhuman/memory/none.rs rename to rust-core/src/openhuman/memory/none.rs diff --git a/src-tauri/src/openhuman/memory/postgres.rs b/rust-core/src/openhuman/memory/postgres.rs similarity index 100% rename from src-tauri/src/openhuman/memory/postgres.rs rename to rust-core/src/openhuman/memory/postgres.rs diff --git a/src-tauri/src/openhuman/memory/response_cache.rs b/rust-core/src/openhuman/memory/response_cache.rs similarity index 100% rename from src-tauri/src/openhuman/memory/response_cache.rs rename to rust-core/src/openhuman/memory/response_cache.rs diff --git a/src-tauri/src/openhuman/memory/snapshot.rs b/rust-core/src/openhuman/memory/snapshot.rs similarity index 100% rename from src-tauri/src/openhuman/memory/snapshot.rs rename to rust-core/src/openhuman/memory/snapshot.rs diff --git a/src-tauri/src/openhuman/memory/sqlite.rs b/rust-core/src/openhuman/memory/sqlite.rs similarity index 100% rename from src-tauri/src/openhuman/memory/sqlite.rs rename to rust-core/src/openhuman/memory/sqlite.rs diff --git a/src-tauri/src/openhuman/memory/traits.rs b/rust-core/src/openhuman/memory/traits.rs similarity index 100% rename from src-tauri/src/openhuman/memory/traits.rs rename to rust-core/src/openhuman/memory/traits.rs diff --git a/src-tauri/src/openhuman/memory/vector.rs b/rust-core/src/openhuman/memory/vector.rs similarity index 100% rename from src-tauri/src/openhuman/memory/vector.rs rename to rust-core/src/openhuman/memory/vector.rs diff --git a/src-tauri/src/openhuman/migration.rs b/rust-core/src/openhuman/migration.rs similarity index 100% rename from src-tauri/src/openhuman/migration.rs rename to rust-core/src/openhuman/migration.rs diff --git a/src-tauri/src/openhuman/mod.rs b/rust-core/src/openhuman/mod.rs similarity index 100% rename from src-tauri/src/openhuman/mod.rs rename to rust-core/src/openhuman/mod.rs diff --git a/src-tauri/src/openhuman/multimodal.rs b/rust-core/src/openhuman/multimodal.rs similarity index 100% rename from src-tauri/src/openhuman/multimodal.rs rename to rust-core/src/openhuman/multimodal.rs diff --git a/src-tauri/src/openhuman/observability/log.rs b/rust-core/src/openhuman/observability/log.rs similarity index 100% rename from src-tauri/src/openhuman/observability/log.rs rename to rust-core/src/openhuman/observability/log.rs diff --git a/src-tauri/src/openhuman/observability/mod.rs b/rust-core/src/openhuman/observability/mod.rs similarity index 100% rename from src-tauri/src/openhuman/observability/mod.rs rename to rust-core/src/openhuman/observability/mod.rs diff --git a/src-tauri/src/openhuman/observability/multi.rs b/rust-core/src/openhuman/observability/multi.rs similarity index 100% rename from src-tauri/src/openhuman/observability/multi.rs rename to rust-core/src/openhuman/observability/multi.rs diff --git a/src-tauri/src/openhuman/observability/noop.rs b/rust-core/src/openhuman/observability/noop.rs similarity index 100% rename from src-tauri/src/openhuman/observability/noop.rs rename to rust-core/src/openhuman/observability/noop.rs diff --git a/src-tauri/src/openhuman/observability/otel.rs b/rust-core/src/openhuman/observability/otel.rs similarity index 100% rename from src-tauri/src/openhuman/observability/otel.rs rename to rust-core/src/openhuman/observability/otel.rs diff --git a/src-tauri/src/openhuman/observability/prometheus.rs b/rust-core/src/openhuman/observability/prometheus.rs similarity index 100% rename from src-tauri/src/openhuman/observability/prometheus.rs rename to rust-core/src/openhuman/observability/prometheus.rs diff --git a/src-tauri/src/openhuman/observability/traits.rs b/rust-core/src/openhuman/observability/traits.rs similarity index 100% rename from src-tauri/src/openhuman/observability/traits.rs rename to rust-core/src/openhuman/observability/traits.rs diff --git a/src-tauri/src/openhuman/observability/verbose.rs b/rust-core/src/openhuman/observability/verbose.rs similarity index 100% rename from src-tauri/src/openhuman/observability/verbose.rs rename to rust-core/src/openhuman/observability/verbose.rs diff --git a/src-tauri/src/openhuman/onboard/mod.rs b/rust-core/src/openhuman/onboard/mod.rs similarity index 100% rename from src-tauri/src/openhuman/onboard/mod.rs rename to rust-core/src/openhuman/onboard/mod.rs diff --git a/src-tauri/src/openhuman/onboard/models.rs b/rust-core/src/openhuman/onboard/models.rs similarity index 100% rename from src-tauri/src/openhuman/onboard/models.rs rename to rust-core/src/openhuman/onboard/models.rs diff --git a/src-tauri/src/openhuman/peripherals/arduino_flash.rs b/rust-core/src/openhuman/peripherals/arduino_flash.rs similarity index 74% rename from src-tauri/src/openhuman/peripherals/arduino_flash.rs rename to rust-core/src/openhuman/peripherals/arduino_flash.rs index 756281c28..6c3769a78 100644 --- a/src-tauri/src/openhuman/peripherals/arduino_flash.rs +++ b/rust-core/src/openhuman/peripherals/arduino_flash.rs @@ -27,39 +27,35 @@ pub fn ensure_arduino_cli() -> Result<()> { return Ok(()); } - #[cfg(target_os = "macos")] - { - println!("arduino-cli not found. Installing via Homebrew..."); - let status = Command::new("brew") - .args(["install", "arduino-cli"]) - .status() - .context("Failed to run brew install")?; - if !status.success() { - anyhow::bail!("brew install arduino-cli failed. Install manually: https://arduino.github.io/arduino-cli/"); + match std::env::consts::OS { + "macos" => { + println!("arduino-cli not found. Installing via Homebrew..."); + let status = Command::new("brew") + .args(["install", "arduino-cli"]) + .status() + .context("Failed to run brew install")?; + if !status.success() { + anyhow::bail!("brew install arduino-cli failed. Install manually: https://arduino.github.io/arduino-cli/"); + } + println!("arduino-cli installed."); + if !arduino_cli_available() { + anyhow::bail!("arduino-cli still not found after install. Ensure it's in PATH."); + } } - println!("arduino-cli installed."); - if !arduino_cli_available() { - anyhow::bail!("arduino-cli still not found after install. Ensure it's in PATH."); + "linux" => { + println!("arduino-cli not found. Run the install script:"); + println!(" curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | sh"); + println!(); + println!( + "Or install via package manager (e.g. apt install arduino-cli on Debian/Ubuntu)." + ); + anyhow::bail!("arduino-cli not installed. Install it and try again."); + } + _ => { + println!("arduino-cli not found. Install it: https://arduino.github.io/arduino-cli/"); + anyhow::bail!("arduino-cli not installed."); } } - - #[cfg(target_os = "linux")] - { - println!("arduino-cli not found. Run the install script:"); - println!(" curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | sh"); - println!(); - println!("Or install via package manager (e.g. apt install arduino-cli on Debian/Ubuntu)."); - anyhow::bail!("arduino-cli not installed. Install it and try again."); - } - - #[cfg(not(any(target_os = "macos", target_os = "linux")))] - { - println!("arduino-cli not found. Install it: https://arduino.github.io/arduino-cli/"); - anyhow::bail!("arduino-cli not installed."); - } - - #[allow(unreachable_code)] - Ok(()) } /// Ensure arduino:avr core is installed. diff --git a/src-tauri/src/openhuman/peripherals/arduino_upload.rs b/rust-core/src/openhuman/peripherals/arduino_upload.rs similarity index 100% rename from src-tauri/src/openhuman/peripherals/arduino_upload.rs rename to rust-core/src/openhuman/peripherals/arduino_upload.rs diff --git a/src-tauri/src/openhuman/peripherals/capabilities_tool.rs b/rust-core/src/openhuman/peripherals/capabilities_tool.rs similarity index 100% rename from src-tauri/src/openhuman/peripherals/capabilities_tool.rs rename to rust-core/src/openhuman/peripherals/capabilities_tool.rs diff --git a/src-tauri/src/openhuman/peripherals/mod.rs b/rust-core/src/openhuman/peripherals/mod.rs similarity index 85% rename from src-tauri/src/openhuman/peripherals/mod.rs rename to rust-core/src/openhuman/peripherals/mod.rs index 4085b3c29..7f1761005 100644 --- a/src-tauri/src/openhuman/peripherals/mod.rs +++ b/rust-core/src/openhuman/peripherals/mod.rs @@ -21,7 +21,7 @@ pub mod uno_q_bridge; #[cfg(feature = "hardware")] pub mod uno_q_setup; -#[cfg(all(feature = "peripheral-rpi", target_os = "linux"))] +#[cfg(feature = "peripheral-rpi")] pub mod rpi; pub use traits::Peripheral; @@ -62,18 +62,25 @@ pub async fn create_peripheral_tools(config: &PeripheralsConfig) -> Result { - tools.extend(peripheral.tools()); - tracing::info!(board = %board.board, "RPi GPIO peripheral connected"); - } - Err(e) => { - tracing::warn!("Failed to connect RPi GPIO {}: {}", board.board, e); + if std::env::consts::OS == "linux" { + match rpi::RpiGpioPeripheral::connect_from_config(board).await { + Ok(peripheral) => { + tools.extend(peripheral.tools()); + tracing::info!(board = %board.board, "RPi GPIO peripheral connected"); + } + Err(e) => { + tracing::warn!("Failed to connect RPi GPIO {}: {}", board.board, e); + } } + } else { + tracing::warn!( + "Skipping RPi GPIO peripheral {} on non-Linux host", + board.board + ); } continue; } diff --git a/src-tauri/src/openhuman/peripherals/nucleo_flash.rs b/rust-core/src/openhuman/peripherals/nucleo_flash.rs similarity index 100% rename from src-tauri/src/openhuman/peripherals/nucleo_flash.rs rename to rust-core/src/openhuman/peripherals/nucleo_flash.rs diff --git a/src-tauri/src/openhuman/peripherals/rpi.rs b/rust-core/src/openhuman/peripherals/rpi.rs similarity index 100% rename from src-tauri/src/openhuman/peripherals/rpi.rs rename to rust-core/src/openhuman/peripherals/rpi.rs diff --git a/src-tauri/src/openhuman/peripherals/serial.rs b/rust-core/src/openhuman/peripherals/serial.rs similarity index 100% rename from src-tauri/src/openhuman/peripherals/serial.rs rename to rust-core/src/openhuman/peripherals/serial.rs diff --git a/src-tauri/src/openhuman/peripherals/traits.rs b/rust-core/src/openhuman/peripherals/traits.rs similarity index 100% rename from src-tauri/src/openhuman/peripherals/traits.rs rename to rust-core/src/openhuman/peripherals/traits.rs diff --git a/src-tauri/src/openhuman/peripherals/uno_q_bridge.rs b/rust-core/src/openhuman/peripherals/uno_q_bridge.rs similarity index 100% rename from src-tauri/src/openhuman/peripherals/uno_q_bridge.rs rename to rust-core/src/openhuman/peripherals/uno_q_bridge.rs diff --git a/src-tauri/src/openhuman/peripherals/uno_q_setup.rs b/rust-core/src/openhuman/peripherals/uno_q_setup.rs similarity index 100% rename from src-tauri/src/openhuman/peripherals/uno_q_setup.rs rename to rust-core/src/openhuman/peripherals/uno_q_setup.rs diff --git a/src-tauri/src/openhuman/providers/anthropic.rs b/rust-core/src/openhuman/providers/anthropic.rs similarity index 100% rename from src-tauri/src/openhuman/providers/anthropic.rs rename to rust-core/src/openhuman/providers/anthropic.rs diff --git a/src-tauri/src/openhuman/providers/bedrock.rs b/rust-core/src/openhuman/providers/bedrock.rs similarity index 100% rename from src-tauri/src/openhuman/providers/bedrock.rs rename to rust-core/src/openhuman/providers/bedrock.rs diff --git a/src-tauri/src/openhuman/providers/compatible.rs b/rust-core/src/openhuman/providers/compatible.rs similarity index 100% rename from src-tauri/src/openhuman/providers/compatible.rs rename to rust-core/src/openhuman/providers/compatible.rs diff --git a/src-tauri/src/openhuman/providers/copilot.rs b/rust-core/src/openhuman/providers/copilot.rs similarity index 100% rename from src-tauri/src/openhuman/providers/copilot.rs rename to rust-core/src/openhuman/providers/copilot.rs diff --git a/src-tauri/src/openhuman/providers/gemini.rs b/rust-core/src/openhuman/providers/gemini.rs similarity index 100% rename from src-tauri/src/openhuman/providers/gemini.rs rename to rust-core/src/openhuman/providers/gemini.rs diff --git a/src-tauri/src/openhuman/providers/glm.rs b/rust-core/src/openhuman/providers/glm.rs similarity index 100% rename from src-tauri/src/openhuman/providers/glm.rs rename to rust-core/src/openhuman/providers/glm.rs diff --git a/src-tauri/src/openhuman/providers/mod.rs b/rust-core/src/openhuman/providers/mod.rs similarity index 100% rename from src-tauri/src/openhuman/providers/mod.rs rename to rust-core/src/openhuman/providers/mod.rs diff --git a/src-tauri/src/openhuman/providers/ollama.rs b/rust-core/src/openhuman/providers/ollama.rs similarity index 100% rename from src-tauri/src/openhuman/providers/ollama.rs rename to rust-core/src/openhuman/providers/ollama.rs diff --git a/src-tauri/src/openhuman/providers/openai.rs b/rust-core/src/openhuman/providers/openai.rs similarity index 100% rename from src-tauri/src/openhuman/providers/openai.rs rename to rust-core/src/openhuman/providers/openai.rs diff --git a/src-tauri/src/openhuman/providers/openai_codex.rs b/rust-core/src/openhuman/providers/openai_codex.rs similarity index 100% rename from src-tauri/src/openhuman/providers/openai_codex.rs rename to rust-core/src/openhuman/providers/openai_codex.rs diff --git a/src-tauri/src/openhuman/providers/openrouter.rs b/rust-core/src/openhuman/providers/openrouter.rs similarity index 100% rename from src-tauri/src/openhuman/providers/openrouter.rs rename to rust-core/src/openhuman/providers/openrouter.rs diff --git a/src-tauri/src/openhuman/providers/reliable.rs b/rust-core/src/openhuman/providers/reliable.rs similarity index 100% rename from src-tauri/src/openhuman/providers/reliable.rs rename to rust-core/src/openhuman/providers/reliable.rs diff --git a/src-tauri/src/openhuman/providers/router.rs b/rust-core/src/openhuman/providers/router.rs similarity index 100% rename from src-tauri/src/openhuman/providers/router.rs rename to rust-core/src/openhuman/providers/router.rs diff --git a/src-tauri/src/openhuman/providers/traits.rs b/rust-core/src/openhuman/providers/traits.rs similarity index 100% rename from src-tauri/src/openhuman/providers/traits.rs rename to rust-core/src/openhuman/providers/traits.rs diff --git a/src-tauri/src/openhuman/rag/mod.rs b/rust-core/src/openhuman/rag/mod.rs similarity index 100% rename from src-tauri/src/openhuman/rag/mod.rs rename to rust-core/src/openhuman/rag/mod.rs diff --git a/src-tauri/src/openhuman/runtime/docker.rs b/rust-core/src/openhuman/runtime/docker.rs similarity index 100% rename from src-tauri/src/openhuman/runtime/docker.rs rename to rust-core/src/openhuman/runtime/docker.rs diff --git a/src-tauri/src/openhuman/runtime/mod.rs b/rust-core/src/openhuman/runtime/mod.rs similarity index 100% rename from src-tauri/src/openhuman/runtime/mod.rs rename to rust-core/src/openhuman/runtime/mod.rs diff --git a/src-tauri/src/openhuman/runtime/native.rs b/rust-core/src/openhuman/runtime/native.rs similarity index 100% rename from src-tauri/src/openhuman/runtime/native.rs rename to rust-core/src/openhuman/runtime/native.rs diff --git a/src-tauri/src/openhuman/runtime/traits.rs b/rust-core/src/openhuman/runtime/traits.rs similarity index 100% rename from src-tauri/src/openhuman/runtime/traits.rs rename to rust-core/src/openhuman/runtime/traits.rs diff --git a/src-tauri/src/openhuman/runtime/wasm.rs b/rust-core/src/openhuman/runtime/wasm.rs similarity index 100% rename from src-tauri/src/openhuman/runtime/wasm.rs rename to rust-core/src/openhuman/runtime/wasm.rs diff --git a/src-tauri/src/openhuman/security/audit.rs b/rust-core/src/openhuman/security/audit.rs similarity index 100% rename from src-tauri/src/openhuman/security/audit.rs rename to rust-core/src/openhuman/security/audit.rs diff --git a/src-tauri/src/openhuman/security/bubblewrap.rs b/rust-core/src/openhuman/security/bubblewrap.rs similarity index 100% rename from src-tauri/src/openhuman/security/bubblewrap.rs rename to rust-core/src/openhuman/security/bubblewrap.rs diff --git a/src-tauri/src/openhuman/security/detect.rs b/rust-core/src/openhuman/security/detect.rs similarity index 94% rename from src-tauri/src/openhuman/security/detect.rs rename to rust-core/src/openhuman/security/detect.rs index bf290693d..568f65cc2 100644 --- a/src-tauri/src/openhuman/security/detect.rs +++ b/rust-core/src/openhuman/security/detect.rs @@ -18,8 +18,7 @@ pub fn create_sandbox(config: &SecurityConfig) -> Arc { SandboxBackend::Landlock => { #[cfg(feature = "sandbox-landlock")] { - #[cfg(target_os = "linux")] - { + if std::env::consts::OS == "linux" { if let Ok(sandbox) = super::landlock::LandlockSandbox::new() { return Arc::new(sandbox); } @@ -29,8 +28,7 @@ pub fn create_sandbox(config: &SecurityConfig) -> Arc { Arc::new(super::traits::NoopSandbox) } SandboxBackend::Firejail => { - #[cfg(target_os = "linux")] - { + if std::env::consts::OS == "linux" { if let Ok(sandbox) = super::firejail::FirejailSandbox::new() { return Arc::new(sandbox); } @@ -41,8 +39,7 @@ pub fn create_sandbox(config: &SecurityConfig) -> Arc { SandboxBackend::Bubblewrap => { #[cfg(feature = "sandbox-bubblewrap")] { - #[cfg(any(target_os = "linux", target_os = "macos"))] - { + if matches!(std::env::consts::OS, "linux" | "macos") { if let Ok(sandbox) = super::bubblewrap::BubblewrapSandbox::new() { return Arc::new(sandbox); } @@ -67,8 +64,7 @@ pub fn create_sandbox(config: &SecurityConfig) -> Arc { /// Auto-detect the best available sandbox fn detect_best_sandbox() -> Arc { - #[cfg(target_os = "linux")] - { + if std::env::consts::OS == "linux" { // Try Landlock first (native, no dependencies) #[cfg(feature = "sandbox-landlock")] { @@ -85,8 +81,7 @@ fn detect_best_sandbox() -> Arc { } } - #[cfg(target_os = "macos")] - { + if std::env::consts::OS == "macos" { // Try Bubblewrap on macOS #[cfg(feature = "sandbox-bubblewrap")] { diff --git a/src-tauri/src/openhuman/security/docker.rs b/rust-core/src/openhuman/security/docker.rs similarity index 100% rename from src-tauri/src/openhuman/security/docker.rs rename to rust-core/src/openhuman/security/docker.rs diff --git a/src-tauri/src/openhuman/security/firejail.rs b/rust-core/src/openhuman/security/firejail.rs similarity index 100% rename from src-tauri/src/openhuman/security/firejail.rs rename to rust-core/src/openhuman/security/firejail.rs diff --git a/src-tauri/src/openhuman/security/landlock.rs b/rust-core/src/openhuman/security/landlock.rs similarity index 90% rename from src-tauri/src/openhuman/security/landlock.rs rename to rust-core/src/openhuman/security/landlock.rs index 06641c091..163de4477 100644 --- a/src-tauri/src/openhuman/security/landlock.rs +++ b/rust-core/src/openhuman/security/landlock.rs @@ -3,20 +3,20 @@ //! Landlock provides unprivileged sandboxing through the Linux kernel. //! This module uses the pure-Rust `landlock` crate for filesystem access control. -#[cfg(all(feature = "sandbox-landlock", target_os = "linux"))] +#[cfg(feature = "sandbox-landlock")] use landlock::{AccessFs, PathBeneath, PathFd, Ruleset, RulesetAttr, RulesetCreatedAttr}; use crate::openhuman::security::traits::Sandbox; use std::path::Path; /// Landlock sandbox backend for Linux -#[cfg(all(feature = "sandbox-landlock", target_os = "linux"))] +#[cfg(feature = "sandbox-landlock")] #[derive(Debug)] pub struct LandlockSandbox { workspace_dir: Option, } -#[cfg(all(feature = "sandbox-landlock", target_os = "linux"))] +#[cfg(feature = "sandbox-landlock")] impl LandlockSandbox { /// Create a new Landlock sandbox with the given workspace directory pub fn new() -> std::io::Result { @@ -123,7 +123,7 @@ impl LandlockSandbox { } } -#[cfg(all(feature = "sandbox-landlock", target_os = "linux"))] +#[cfg(feature = "sandbox-landlock")] impl Sandbox for LandlockSandbox { fn wrap_command(&self, _cmd: &mut std::process::Command) -> std::io::Result<()> { // Apply Landlock restrictions before executing the command @@ -150,10 +150,10 @@ impl Sandbox for LandlockSandbox { } // Stub implementations for non-Linux or when feature is disabled -#[cfg(not(all(feature = "sandbox-landlock", target_os = "linux")))] +#[cfg(not(feature = "sandbox-landlock"))] pub struct LandlockSandbox; -#[cfg(not(all(feature = "sandbox-landlock", target_os = "linux")))] +#[cfg(not(feature = "sandbox-landlock"))] impl LandlockSandbox { pub fn new() -> std::io::Result { Err(std::io::Error::new( @@ -177,7 +177,7 @@ impl LandlockSandbox { } } -#[cfg(not(all(feature = "sandbox-landlock", target_os = "linux")))] +#[cfg(not(feature = "sandbox-landlock"))] impl Sandbox for LandlockSandbox { fn wrap_command(&self, _cmd: &mut std::process::Command) -> std::io::Result<()> { Err(std::io::Error::new( @@ -203,7 +203,7 @@ impl Sandbox for LandlockSandbox { mod tests { use super::*; - #[cfg(all(feature = "sandbox-landlock", target_os = "linux"))] + #[cfg(feature = "sandbox-landlock")] #[test] fn landlock_sandbox_name() { if let Ok(sandbox) = LandlockSandbox::new() { @@ -211,7 +211,7 @@ mod tests { } } - #[cfg(not(all(feature = "sandbox-landlock", target_os = "linux")))] + #[cfg(not(feature = "sandbox-landlock"))] #[test] fn landlock_not_available_on_non_linux() { assert!(!LandlockSandbox.is_available()); @@ -225,16 +225,15 @@ mod tests { // Result depends on platform and feature flag match result { Ok(sandbox) => assert!(sandbox.is_available()), - Err(_) => assert!(!cfg!(all( - feature = "sandbox-landlock", - target_os = "linux" - ))), + Err(_) => { + assert!(!cfg!(feature = "sandbox-landlock") && std::env::consts::OS == "linux") + } } } // ── §1.1 Landlock stub tests ────────────────────────────── - #[cfg(not(all(feature = "sandbox-landlock", target_os = "linux")))] + #[cfg(not(feature = "sandbox-landlock"))] #[test] fn landlock_stub_wrap_command_returns_unsupported() { let sandbox = LandlockSandbox; diff --git a/src-tauri/src/openhuman/security/mod.rs b/rust-core/src/openhuman/security/mod.rs similarity index 100% rename from src-tauri/src/openhuman/security/mod.rs rename to rust-core/src/openhuman/security/mod.rs diff --git a/src-tauri/src/openhuman/security/pairing.rs b/rust-core/src/openhuman/security/pairing.rs similarity index 100% rename from src-tauri/src/openhuman/security/pairing.rs rename to rust-core/src/openhuman/security/pairing.rs diff --git a/src-tauri/src/openhuman/security/policy.rs b/rust-core/src/openhuman/security/policy.rs similarity index 100% rename from src-tauri/src/openhuman/security/policy.rs rename to rust-core/src/openhuman/security/policy.rs diff --git a/src-tauri/src/openhuman/security/secrets.rs b/rust-core/src/openhuman/security/secrets.rs similarity index 100% rename from src-tauri/src/openhuman/security/secrets.rs rename to rust-core/src/openhuman/security/secrets.rs diff --git a/src-tauri/src/openhuman/security/traits.rs b/rust-core/src/openhuman/security/traits.rs similarity index 100% rename from src-tauri/src/openhuman/security/traits.rs rename to rust-core/src/openhuman/security/traits.rs diff --git a/src-tauri/src/openhuman/service/mod.rs b/rust-core/src/openhuman/service/mod.rs similarity index 96% rename from src-tauri/src/openhuman/service/mod.rs rename to rust-core/src/openhuman/service/mod.rs index e6db33281..6d1cdbd44 100644 --- a/src-tauri/src/openhuman/service/mod.rs +++ b/rust-core/src/openhuman/service/mod.rs @@ -56,13 +56,13 @@ pub struct ServiceStatus { } pub fn install(config: &Config) -> Result { - if cfg!(target_os = "macos") { + if std::env::consts::OS == "macos" { install_macos(config)?; status(config) - } else if cfg!(target_os = "linux") { + } else if std::env::consts::OS == "linux" { install_linux(config)?; status(config) - } else if cfg!(target_os = "windows") { + } else if std::env::consts::OS == "windows" { install_windows(config)?; status(config) } else { @@ -71,7 +71,7 @@ pub fn install(config: &Config) -> Result { } pub fn start(config: &Config) -> Result { - if cfg!(target_os = "macos") { + if std::env::consts::OS == "macos" { let plist = macos_service_file()?; let domain = macos_gui_domain()?; let primary_target = macos_target(SERVICE_LABEL)?; @@ -115,7 +115,7 @@ pub fn start(config: &Config) -> Result { return status(config); } - if cfg!(target_os = "linux") { + if std::env::consts::OS == "linux" { // Check if service is enabled before trying to start if !is_service_enabled_linux()? { log::info!("[service] Enabling systemd service"); @@ -146,7 +146,7 @@ pub fn start(config: &Config) -> Result { return status(config); } - if cfg!(target_os = "windows") { + if std::env::consts::OS == "windows" { let task_name = windows_task_name(); // Check if task exists before trying to run @@ -179,7 +179,7 @@ pub fn start(config: &Config) -> Result { } pub fn stop(config: &Config) -> Result { - if cfg!(target_os = "macos") { + if std::env::consts::OS == "macos" { let plist = macos_service_file()?; let domain = macos_gui_domain()?; let primary_target = macos_target(SERVICE_LABEL)?; @@ -223,13 +223,13 @@ pub fn stop(config: &Config) -> Result { return status(config); } - if cfg!(target_os = "linux") { + if std::env::consts::OS == "linux" { let _ = run_checked(Command::new("systemctl").args(["--user", "stop", "openhuman.service"])); return status(config); } - if cfg!(target_os = "windows") { + if std::env::consts::OS == "windows" { let _ = config; let task_name = windows_task_name(); let _ = run_checked(Command::new("schtasks").args(["/End", "/TN", task_name])); @@ -240,7 +240,7 @@ pub fn stop(config: &Config) -> Result { } pub fn status(config: &Config) -> Result { - if cfg!(target_os = "macos") { + if std::env::consts::OS == "macos" { let out = run_capture(Command::new("launchctl").arg("list"))?; let running = out .lines() @@ -257,7 +257,7 @@ pub fn status(config: &Config) -> Result { }); } - if cfg!(target_os = "linux") { + if std::env::consts::OS == "linux" { let out = run_capture(Command::new("systemctl").args([ "--user", "is-active", @@ -277,7 +277,7 @@ pub fn status(config: &Config) -> Result { }); } - if cfg!(target_os = "windows") { + if std::env::consts::OS == "windows" { let _ = config; let task_name = windows_task_name(); let out = @@ -313,7 +313,7 @@ pub fn status(config: &Config) -> Result { pub fn uninstall(config: &Config) -> Result { let _ = stop(config); - if cfg!(target_os = "macos") { + if std::env::consts::OS == "macos" { let file = macos_service_file()?; if file.exists() { fs::remove_file(&file) @@ -331,7 +331,7 @@ pub fn uninstall(config: &Config) -> Result { }); } - if cfg!(target_os = "linux") { + if std::env::consts::OS == "linux" { let file = linux_service_file(config)?; if file.exists() { fs::remove_file(&file) @@ -346,7 +346,7 @@ pub fn uninstall(config: &Config) -> Result { }); } - if cfg!(target_os = "windows") { + if std::env::consts::OS == "windows" { let task_name = windows_task_name(); let _ = run_checked(Command::new("schtasks").args(["/Delete", "/TN", task_name, "/F"])); // Remove the wrapper script diff --git a/src-tauri/src/openhuman/skillforge/evaluate.rs b/rust-core/src/openhuman/skillforge/evaluate.rs similarity index 100% rename from src-tauri/src/openhuman/skillforge/evaluate.rs rename to rust-core/src/openhuman/skillforge/evaluate.rs diff --git a/src-tauri/src/openhuman/skillforge/integrate.rs b/rust-core/src/openhuman/skillforge/integrate.rs similarity index 100% rename from src-tauri/src/openhuman/skillforge/integrate.rs rename to rust-core/src/openhuman/skillforge/integrate.rs diff --git a/src-tauri/src/openhuman/skillforge/mod.rs b/rust-core/src/openhuman/skillforge/mod.rs similarity index 100% rename from src-tauri/src/openhuman/skillforge/mod.rs rename to rust-core/src/openhuman/skillforge/mod.rs diff --git a/src-tauri/src/openhuman/skillforge/scout.rs b/rust-core/src/openhuman/skillforge/scout.rs similarity index 100% rename from src-tauri/src/openhuman/skillforge/scout.rs rename to rust-core/src/openhuman/skillforge/scout.rs diff --git a/src-tauri/src/openhuman/skills/mod.rs b/rust-core/src/openhuman/skills/mod.rs similarity index 100% rename from src-tauri/src/openhuman/skills/mod.rs rename to rust-core/src/openhuman/skills/mod.rs diff --git a/src-tauri/src/openhuman/skills/symlink_tests.rs b/rust-core/src/openhuman/skills/symlink_tests.rs similarity index 100% rename from src-tauri/src/openhuman/skills/symlink_tests.rs rename to rust-core/src/openhuman/skills/symlink_tests.rs diff --git a/src-tauri/src/openhuman/tools/browser.rs b/rust-core/src/openhuman/tools/browser.rs similarity index 99% rename from src-tauri/src/openhuman/tools/browser.rs rename to rust-core/src/openhuman/tools/browser.rs index 03acd875a..a1a107087 100644 --- a/src-tauri/src/openhuman/tools/browser.rs +++ b/rust-core/src/openhuman/tools/browser.rs @@ -2101,6 +2101,8 @@ fn host_matches_allowlist(host: &str, allowed: &[String]) -> bool { mod tests { use super::*; + static BROWSER_ENV_LOCK: std::sync::Mutex<()> = std::sync::Mutex::new(()); + #[test] fn normalize_domains_works() { let domains = vec![ @@ -2393,6 +2395,7 @@ mod tests { #[test] fn browser_tool_empty_allowlist_blocks() { + let _guard = BROWSER_ENV_LOCK.lock().expect("env lock poisoned"); let security = Arc::new(SecurityPolicy::default()); let tool = BrowserTool::new(security, vec![], None); std::env::remove_var("OPENHUMAN_BROWSER_ALLOW_ALL"); @@ -2401,6 +2404,7 @@ mod tests { #[test] fn browser_tool_empty_allowlist_allows_with_env_flag() { + let _guard = BROWSER_ENV_LOCK.lock().expect("env lock poisoned"); let security = Arc::new(SecurityPolicy::default()); let tool = BrowserTool::new(security, vec![], None); std::env::set_var("OPENHUMAN_BROWSER_ALLOW_ALL", "1"); diff --git a/src-tauri/src/openhuman/tools/browser_open.rs b/rust-core/src/openhuman/tools/browser_open.rs similarity index 88% rename from src-tauri/src/openhuman/tools/browser_open.rs rename to rust-core/src/openhuman/tools/browser_open.rs index c6a2c7271..e7d7f154c 100644 --- a/src-tauri/src/openhuman/tools/browser_open.rs +++ b/rust-core/src/openhuman/tools/browser_open.rs @@ -125,62 +125,54 @@ impl Tool for BrowserOpenTool { } async fn open_in_brave(url: &str) -> anyhow::Result<()> { - #[cfg(target_os = "macos")] - { - for app in ["Brave Browser", "Brave"] { - let status = tokio::process::Command::new("open") - .arg("-a") - .arg(app) - .arg(url) + match std::env::consts::OS { + "macos" => { + for app in ["Brave Browser", "Brave"] { + let status = tokio::process::Command::new("open") + .arg("-a") + .arg(app) + .arg(url) + .status() + .await; + + if let Ok(s) = status { + if s.success() { + return Ok(()); + } + } + } + anyhow::bail!( + "Brave Browser was not found (tried macOS app names 'Brave Browser' and 'Brave')" + ); + } + "linux" => { + let mut last_error = String::new(); + for cmd in ["brave-browser", "brave"] { + match tokio::process::Command::new(cmd).arg(url).status().await { + Ok(status) if status.success() => return Ok(()), + Ok(status) => { + last_error = format!("{cmd} exited with status {status}"); + } + Err(e) => { + last_error = format!("{cmd} not runnable: {e}"); + } + } + } + anyhow::bail!("{last_error}"); + } + "windows" => { + let status = tokio::process::Command::new("cmd") + .args(["/C", "start", "", "brave", url]) .status() - .await; + .await?; - if let Ok(s) = status { - if s.success() { - return Ok(()); - } + if status.success() { + return Ok(()); } + + anyhow::bail!("cmd start brave exited with status {status}"); } - anyhow::bail!( - "Brave Browser was not found (tried macOS app names 'Brave Browser' and 'Brave')" - ); - } - - #[cfg(target_os = "linux")] - { - let mut last_error = String::new(); - for cmd in ["brave-browser", "brave"] { - match tokio::process::Command::new(cmd).arg(url).status().await { - Ok(status) if status.success() => return Ok(()), - Ok(status) => { - last_error = format!("{cmd} exited with status {status}"); - } - Err(e) => { - last_error = format!("{cmd} not runnable: {e}"); - } - } - } - anyhow::bail!("{last_error}"); - } - - #[cfg(target_os = "windows")] - { - let status = tokio::process::Command::new("cmd") - .args(["/C", "start", "", "brave", url]) - .status() - .await?; - - if status.success() { - return Ok(()); - } - - anyhow::bail!("cmd start brave exited with status {status}"); - } - - #[cfg(not(any(target_os = "macos", target_os = "linux", target_os = "windows")))] - { - let _ = url; - anyhow::bail!("browser_open is not supported on this OS"); + _ => anyhow::bail!("browser_open is not supported on this OS"), } } diff --git a/src-tauri/src/openhuman/tools/composio.rs b/rust-core/src/openhuman/tools/composio.rs similarity index 100% rename from src-tauri/src/openhuman/tools/composio.rs rename to rust-core/src/openhuman/tools/composio.rs diff --git a/src-tauri/src/openhuman/tools/cron_add.rs b/rust-core/src/openhuman/tools/cron_add.rs similarity index 100% rename from src-tauri/src/openhuman/tools/cron_add.rs rename to rust-core/src/openhuman/tools/cron_add.rs diff --git a/src-tauri/src/openhuman/tools/cron_list.rs b/rust-core/src/openhuman/tools/cron_list.rs similarity index 100% rename from src-tauri/src/openhuman/tools/cron_list.rs rename to rust-core/src/openhuman/tools/cron_list.rs diff --git a/src-tauri/src/openhuman/tools/cron_remove.rs b/rust-core/src/openhuman/tools/cron_remove.rs similarity index 100% rename from src-tauri/src/openhuman/tools/cron_remove.rs rename to rust-core/src/openhuman/tools/cron_remove.rs diff --git a/src-tauri/src/openhuman/tools/cron_run.rs b/rust-core/src/openhuman/tools/cron_run.rs similarity index 100% rename from src-tauri/src/openhuman/tools/cron_run.rs rename to rust-core/src/openhuman/tools/cron_run.rs diff --git a/src-tauri/src/openhuman/tools/cron_runs.rs b/rust-core/src/openhuman/tools/cron_runs.rs similarity index 100% rename from src-tauri/src/openhuman/tools/cron_runs.rs rename to rust-core/src/openhuman/tools/cron_runs.rs diff --git a/src-tauri/src/openhuman/tools/cron_update.rs b/rust-core/src/openhuman/tools/cron_update.rs similarity index 100% rename from src-tauri/src/openhuman/tools/cron_update.rs rename to rust-core/src/openhuman/tools/cron_update.rs diff --git a/src-tauri/src/openhuman/tools/delegate.rs b/rust-core/src/openhuman/tools/delegate.rs similarity index 100% rename from src-tauri/src/openhuman/tools/delegate.rs rename to rust-core/src/openhuman/tools/delegate.rs diff --git a/src-tauri/src/openhuman/tools/file_read.rs b/rust-core/src/openhuman/tools/file_read.rs similarity index 100% rename from src-tauri/src/openhuman/tools/file_read.rs rename to rust-core/src/openhuman/tools/file_read.rs diff --git a/src-tauri/src/openhuman/tools/file_write.rs b/rust-core/src/openhuman/tools/file_write.rs similarity index 100% rename from src-tauri/src/openhuman/tools/file_write.rs rename to rust-core/src/openhuman/tools/file_write.rs diff --git a/src-tauri/src/openhuman/tools/git_operations.rs b/rust-core/src/openhuman/tools/git_operations.rs similarity index 100% rename from src-tauri/src/openhuman/tools/git_operations.rs rename to rust-core/src/openhuman/tools/git_operations.rs diff --git a/src-tauri/src/openhuman/tools/hardware_board_info.rs b/rust-core/src/openhuman/tools/hardware_board_info.rs similarity index 100% rename from src-tauri/src/openhuman/tools/hardware_board_info.rs rename to rust-core/src/openhuman/tools/hardware_board_info.rs diff --git a/src-tauri/src/openhuman/tools/hardware_memory_map.rs b/rust-core/src/openhuman/tools/hardware_memory_map.rs similarity index 100% rename from src-tauri/src/openhuman/tools/hardware_memory_map.rs rename to rust-core/src/openhuman/tools/hardware_memory_map.rs diff --git a/src-tauri/src/openhuman/tools/hardware_memory_read.rs b/rust-core/src/openhuman/tools/hardware_memory_read.rs similarity index 100% rename from src-tauri/src/openhuman/tools/hardware_memory_read.rs rename to rust-core/src/openhuman/tools/hardware_memory_read.rs diff --git a/src-tauri/src/openhuman/tools/http_request.rs b/rust-core/src/openhuman/tools/http_request.rs similarity index 100% rename from src-tauri/src/openhuman/tools/http_request.rs rename to rust-core/src/openhuman/tools/http_request.rs diff --git a/src-tauri/src/openhuman/tools/image_info.rs b/rust-core/src/openhuman/tools/image_info.rs similarity index 100% rename from src-tauri/src/openhuman/tools/image_info.rs rename to rust-core/src/openhuman/tools/image_info.rs diff --git a/src-tauri/src/openhuman/tools/memory_forget.rs b/rust-core/src/openhuman/tools/memory_forget.rs similarity index 100% rename from src-tauri/src/openhuman/tools/memory_forget.rs rename to rust-core/src/openhuman/tools/memory_forget.rs diff --git a/src-tauri/src/openhuman/tools/memory_recall.rs b/rust-core/src/openhuman/tools/memory_recall.rs similarity index 100% rename from src-tauri/src/openhuman/tools/memory_recall.rs rename to rust-core/src/openhuman/tools/memory_recall.rs diff --git a/src-tauri/src/openhuman/tools/memory_store.rs b/rust-core/src/openhuman/tools/memory_store.rs similarity index 100% rename from src-tauri/src/openhuman/tools/memory_store.rs rename to rust-core/src/openhuman/tools/memory_store.rs diff --git a/src-tauri/src/openhuman/tools/mod.rs b/rust-core/src/openhuman/tools/mod.rs similarity index 100% rename from src-tauri/src/openhuman/tools/mod.rs rename to rust-core/src/openhuman/tools/mod.rs diff --git a/src-tauri/src/openhuman/tools/proxy_config.rs b/rust-core/src/openhuman/tools/proxy_config.rs similarity index 100% rename from src-tauri/src/openhuman/tools/proxy_config.rs rename to rust-core/src/openhuman/tools/proxy_config.rs diff --git a/src-tauri/src/openhuman/tools/pushover.rs b/rust-core/src/openhuman/tools/pushover.rs similarity index 100% rename from src-tauri/src/openhuman/tools/pushover.rs rename to rust-core/src/openhuman/tools/pushover.rs diff --git a/src-tauri/src/openhuman/tools/schedule.rs b/rust-core/src/openhuman/tools/schedule.rs similarity index 100% rename from src-tauri/src/openhuman/tools/schedule.rs rename to rust-core/src/openhuman/tools/schedule.rs diff --git a/src-tauri/src/openhuman/tools/schema.rs b/rust-core/src/openhuman/tools/schema.rs similarity index 100% rename from src-tauri/src/openhuman/tools/schema.rs rename to rust-core/src/openhuman/tools/schema.rs diff --git a/src-tauri/src/openhuman/tools/screenshot.rs b/rust-core/src/openhuman/tools/screenshot.rs similarity index 97% rename from src-tauri/src/openhuman/tools/screenshot.rs rename to rust-core/src/openhuman/tools/screenshot.rs index d43e2fd1d..2a1aeb217 100644 --- a/src-tauri/src/openhuman/tools/screenshot.rs +++ b/rust-core/src/openhuman/tools/screenshot.rs @@ -27,13 +27,13 @@ impl ScreenshotTool { /// Determine the screenshot command for the current platform. fn screenshot_command(output_path: &str) -> Option> { - if cfg!(target_os = "macos") { + if std::env::consts::OS == "macos" { Some(vec![ "screencapture".into(), "-x".into(), // no sound output_path.into(), ]) - } else if cfg!(target_os = "linux") { + } else if std::env::consts::OS == "linux" { Some(vec![ "sh".into(), "-c".into(), @@ -92,7 +92,7 @@ impl ScreenshotTool { }; // macOS region flags - if cfg!(target_os = "macos") { + if std::env::consts::OS == "macos" { if let Some(region) = args.get("region").and_then(|v| v.as_str()) { match region { "selection" => cmd_args.insert(1, "-s".into()), @@ -292,8 +292,10 @@ mod tests { } #[test] - #[cfg(any(target_os = "macos", target_os = "linux"))] fn screenshot_command_exists() { + if !matches!(std::env::consts::OS, "macos" | "linux") { + return; + } let cmd = ScreenshotTool::screenshot_command("/tmp/test.png"); assert!(cmd.is_some()); let args = cmd.unwrap(); diff --git a/src-tauri/src/openhuman/tools/shell.rs b/rust-core/src/openhuman/tools/shell.rs similarity index 100% rename from src-tauri/src/openhuman/tools/shell.rs rename to rust-core/src/openhuman/tools/shell.rs diff --git a/src-tauri/src/openhuman/tools/traits.rs b/rust-core/src/openhuman/tools/traits.rs similarity index 100% rename from src-tauri/src/openhuman/tools/traits.rs rename to rust-core/src/openhuman/tools/traits.rs diff --git a/src-tauri/src/openhuman/tools/web_search_tool.rs b/rust-core/src/openhuman/tools/web_search_tool.rs similarity index 100% rename from src-tauri/src/openhuman/tools/web_search_tool.rs rename to rust-core/src/openhuman/tools/web_search_tool.rs diff --git a/src-tauri/src/openhuman/tunnel/cloudflare.rs b/rust-core/src/openhuman/tunnel/cloudflare.rs similarity index 100% rename from src-tauri/src/openhuman/tunnel/cloudflare.rs rename to rust-core/src/openhuman/tunnel/cloudflare.rs diff --git a/src-tauri/src/openhuman/tunnel/custom.rs b/rust-core/src/openhuman/tunnel/custom.rs similarity index 100% rename from src-tauri/src/openhuman/tunnel/custom.rs rename to rust-core/src/openhuman/tunnel/custom.rs diff --git a/src-tauri/src/openhuman/tunnel/mod.rs b/rust-core/src/openhuman/tunnel/mod.rs similarity index 100% rename from src-tauri/src/openhuman/tunnel/mod.rs rename to rust-core/src/openhuman/tunnel/mod.rs diff --git a/src-tauri/src/openhuman/tunnel/ngrok.rs b/rust-core/src/openhuman/tunnel/ngrok.rs similarity index 100% rename from src-tauri/src/openhuman/tunnel/ngrok.rs rename to rust-core/src/openhuman/tunnel/ngrok.rs diff --git a/src-tauri/src/openhuman/tunnel/none.rs b/rust-core/src/openhuman/tunnel/none.rs similarity index 100% rename from src-tauri/src/openhuman/tunnel/none.rs rename to rust-core/src/openhuman/tunnel/none.rs diff --git a/src-tauri/src/openhuman/tunnel/tailscale.rs b/rust-core/src/openhuman/tunnel/tailscale.rs similarity index 100% rename from src-tauri/src/openhuman/tunnel/tailscale.rs rename to rust-core/src/openhuman/tunnel/tailscale.rs diff --git a/src-tauri/src/openhuman/util.rs b/rust-core/src/openhuman/util.rs similarity index 100% rename from src-tauri/src/openhuman/util.rs rename to rust-core/src/openhuman/util.rs diff --git a/src-tauri/src/runtime/bridge/cron_bridge.rs b/rust-core/src/runtime/bridge/cron_bridge.rs similarity index 100% rename from src-tauri/src/runtime/bridge/cron_bridge.rs rename to rust-core/src/runtime/bridge/cron_bridge.rs diff --git a/src-tauri/src/runtime/bridge/db.rs b/rust-core/src/runtime/bridge/db.rs similarity index 100% rename from src-tauri/src/runtime/bridge/db.rs rename to rust-core/src/runtime/bridge/db.rs diff --git a/src-tauri/src/runtime/bridge/log_bridge.rs b/rust-core/src/runtime/bridge/log_bridge.rs similarity index 100% rename from src-tauri/src/runtime/bridge/log_bridge.rs rename to rust-core/src/runtime/bridge/log_bridge.rs diff --git a/src-tauri/src/runtime/bridge/mod.rs b/rust-core/src/runtime/bridge/mod.rs similarity index 100% rename from src-tauri/src/runtime/bridge/mod.rs rename to rust-core/src/runtime/bridge/mod.rs diff --git a/src-tauri/src/runtime/bridge/net.rs b/rust-core/src/runtime/bridge/net.rs similarity index 100% rename from src-tauri/src/runtime/bridge/net.rs rename to rust-core/src/runtime/bridge/net.rs diff --git a/src-tauri/src/runtime/bridge/skills_bridge.rs b/rust-core/src/runtime/bridge/skills_bridge.rs similarity index 100% rename from src-tauri/src/runtime/bridge/skills_bridge.rs rename to rust-core/src/runtime/bridge/skills_bridge.rs diff --git a/src-tauri/src/runtime/bridge/store.rs b/rust-core/src/runtime/bridge/store.rs similarity index 100% rename from src-tauri/src/runtime/bridge/store.rs rename to rust-core/src/runtime/bridge/store.rs diff --git a/rust-core/src/runtime/bridge/tauri_bridge.rs b/rust-core/src/runtime/bridge/tauri_bridge.rs new file mode 100644 index 000000000..6e4f5163f --- /dev/null +++ b/rust-core/src/runtime/bridge/tauri_bridge.rs @@ -0,0 +1,43 @@ +//! Platform and Tauri bridge for skills. +//! +//! Provides platform detection and native OS features like notifications. + +/// Get the current platform name. +pub fn get_platform() -> &'static str { + match std::env::consts::OS { + "macos" => "macos", + "windows" => "windows", + "linux" => "linux", + "android" => "android", + "ios" => "ios", + _ => "unknown", + } +} + +/// Send a native OS notification (desktop only). +pub fn send_notification( + _app_handle: &tauri::AppHandle, + title: &str, + body: &str, +) -> Result<(), String> { + if matches!(get_platform(), "android" | "ios") { + return Err("Notifications not available on this platform".to_string()); + } + log::info!("[runtime] notification requested: {title} - {body}"); + Ok(()) +} + +/// Whitelisted environment values exposed to skills via `platform.env(key)`. +/// Skills should never hardcode host-specific URLs or secrets; use this instead. +pub fn get_skill_env(key: &str) -> Option { + match key { + "BACKEND_URL" => Some( + std::env::var("VITE_BACKEND_URL") + .ok() + .filter(|url| !url.trim().is_empty()) + .unwrap_or_else(|| "http://localhost:5005".to_string()), + ), + "PLATFORM" => Some(get_platform().to_string()), + _ => None, + } +} diff --git a/src-tauri/src/runtime/cron_scheduler.rs b/rust-core/src/runtime/cron_scheduler.rs similarity index 100% rename from src-tauri/src/runtime/cron_scheduler.rs rename to rust-core/src/runtime/cron_scheduler.rs diff --git a/src-tauri/src/runtime/loader.rs b/rust-core/src/runtime/loader.rs similarity index 100% rename from src-tauri/src/runtime/loader.rs rename to rust-core/src/runtime/loader.rs diff --git a/src-tauri/src/runtime/manifest.rs b/rust-core/src/runtime/manifest.rs similarity index 92% rename from src-tauri/src/runtime/manifest.rs rename to rust-core/src/runtime/manifest.rs index 4624b7e2f..01f11e6fa 100644 --- a/src-tauri/src/runtime/manifest.rs +++ b/rust-core/src/runtime/manifest.rs @@ -71,18 +71,13 @@ fn default_entry_point() -> String { /// Returns the current platform as a manifest-compatible string. fn current_platform() -> &'static str { - if cfg!(target_os = "windows") { - "windows" - } else if cfg!(target_os = "macos") { - "macos" - } else if cfg!(target_os = "linux") { - "linux" - } else if cfg!(target_os = "android") { - "android" - } else if cfg!(target_os = "ios") { - "ios" - } else { - "unknown" + match std::env::consts::OS { + "windows" => "windows", + "macos" => "macos", + "linux" => "linux", + "android" => "android", + "ios" => "ios", + _ => "unknown", } } diff --git a/rust-core/src/runtime/mod.rs b/rust-core/src/runtime/mod.rs new file mode 100644 index 000000000..65f60e69c --- /dev/null +++ b/rust-core/src/runtime/mod.rs @@ -0,0 +1,22 @@ +pub mod loader; +pub mod manifest; +pub mod preferences; +pub mod types; +pub mod utils; + +#[cfg(all(feature = "tauri-host"))] +pub mod bridge; +#[cfg(all(feature = "tauri-host"))] +pub mod cron_scheduler; +#[cfg(all(feature = "tauri-host"))] +pub mod ping_scheduler; +#[cfg(all(feature = "tauri-host"))] +pub mod qjs_engine; +#[cfg(all(feature = "tauri-host"))] +pub mod qjs_skill_instance; +#[cfg(all(feature = "tauri-host"))] +pub mod quickjs_libs; +#[cfg(all(feature = "tauri-host"))] +pub mod skill_registry; +#[cfg(all(feature = "tauri-host"))] +pub mod socket_manager; diff --git a/src-tauri/src/runtime/ping_scheduler.rs b/rust-core/src/runtime/ping_scheduler.rs similarity index 100% rename from src-tauri/src/runtime/ping_scheduler.rs rename to rust-core/src/runtime/ping_scheduler.rs diff --git a/src-tauri/src/runtime/preferences.rs b/rust-core/src/runtime/preferences.rs similarity index 100% rename from src-tauri/src/runtime/preferences.rs rename to rust-core/src/runtime/preferences.rs diff --git a/src-tauri/src/runtime/qjs_engine.rs b/rust-core/src/runtime/qjs_engine.rs similarity index 100% rename from src-tauri/src/runtime/qjs_engine.rs rename to rust-core/src/runtime/qjs_engine.rs diff --git a/src-tauri/src/runtime/qjs_skill_instance.rs b/rust-core/src/runtime/qjs_skill_instance.rs similarity index 99% rename from src-tauri/src/runtime/qjs_skill_instance.rs rename to rust-core/src/runtime/qjs_skill_instance.rs index aa6d3cd71..db3bf837b 100644 --- a/src-tauri/src/runtime/qjs_skill_instance.rs +++ b/rust-core/src/runtime/qjs_skill_instance.rs @@ -17,11 +17,11 @@ use parking_lot::RwLock; use tokio::sync::mpsc; use crate::runtime::cron_scheduler::CronScheduler; +use crate::runtime::quickjs_libs::{qjs_ops, IdbStorage}; use crate::runtime::skill_registry::SkillRegistry; use crate::runtime::types::{ SkillConfig, SkillMessage, SkillSnapshot, SkillStatus, ToolContent, ToolDefinition, ToolResult, }; -use crate::services::quickjs_libs::{qjs_ops, IdbStorage}; use tauri::Manager; /// Dependencies passed to a skill instance for bridge installation. @@ -200,7 +200,7 @@ impl QjsSkillInstance { } // Load bootstrap - let bootstrap_code = include_str!("../services/quickjs_libs/bootstrap.js"); + let bootstrap_code = include_str!("quickjs_libs/bootstrap.js"); if let Err(e) = js_ctx.eval::(bootstrap_code) { let detail = format_js_exception(&js_ctx, &e); return Err(format!("Bootstrap failed: {detail}")); @@ -618,7 +618,7 @@ async fn handle_message( // State is registered as MemoryState(Mutex>), not // Option directly, so we must use the newtype wrapper. let memory_client_opt = app_handle.and_then(|ah| { - ah.try_state::() + ah.try_state::() .and_then(|s| s.0.lock().ok().and_then(|g| g.clone())) }); diff --git a/src-tauri/src/services/quickjs_libs/bootstrap.js b/rust-core/src/runtime/quickjs_libs/bootstrap.js similarity index 97% rename from src-tauri/src/services/quickjs_libs/bootstrap.js rename to rust-core/src/runtime/quickjs_libs/bootstrap.js index 23ca2de4e..25e816ad8 100644 --- a/src-tauri/src/services/quickjs_libs/bootstrap.js +++ b/rust-core/src/runtime/quickjs_libs/bootstrap.js @@ -147,11 +147,14 @@ globalThis.fetch = async function (url, options = {}) { } // __ops.fetch expects a JSON string for options (not a JS object) - const resultJson = await __ops.fetch(url.toString(), JSON.stringify({ - method, - headers: headersObj, - body: typeof body === 'string' ? body : body ? JSON.stringify(body) : null, - })); + const resultJson = await __ops.fetch( + url.toString(), + JSON.stringify({ + method, + headers: headersObj, + body: typeof body === 'string' ? body : body ? JSON.stringify(body) : null, + }) + ); // __ops.fetch returns a JSON string — parse it to access status/headers/body const parsed = JSON.parse(resultJson); @@ -310,13 +313,7 @@ class WebSocket { WebSocket._instances.delete(this._id); if (this.onclose) { - this.onclose({ - type: 'close', - code, - reason, - wasClean: code === 1000, - target: this, - }); + this.onclose({ type: 'close', code, reason, wasClean: code === 1000, target: this }); } } @@ -693,7 +690,6 @@ globalThis.__db = { }, }; - globalThis.__platform = { os: function () { return __ops.platform_os(); @@ -849,7 +845,8 @@ globalThis.data = { var backendUrl = __platform.env('BACKEND_URL') || 'https://api.tinyhumans.ai'; var jwtToken = __ops.get_session_token() || ''; var cleanPath = path.charAt(0) === '/' ? path.slice(1) : path; - var proxyUrl = backendUrl + '/proxy/by-id/' + globalThis.__oauthCredential.credentialId + '/' + cleanPath; + var proxyUrl = + backendUrl + '/proxy/by-id/' + globalThis.__oauthCredential.credentialId + '/' + cleanPath; var method = (options && options.method) || 'GET'; var headers = { 'Content-Type': 'application/json' }; if (jwtToken) { @@ -879,10 +876,7 @@ globalThis.data = { var jwtToken = __ops.get_session_token() || ''; var revokeOpts = JSON.stringify({ method: 'DELETE', - headers: { - 'Content-Type': 'application/json', - Authorization: 'Bearer ' + jwtToken, - }, + headers: { 'Content-Type': 'application/json', Authorization: 'Bearer ' + jwtToken }, }); await net.fetch( backendUrl + '/auth/integrations/' + __oauthCredential.credentialId, @@ -961,10 +955,7 @@ globalThis.model = { if (options && options.temperature) body.temperature = options.temperature; var result = await net.fetch(backendUrl + '/api/ai/generate', { method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer ' + jwtToken, - }, + headers: { 'Content-Type': 'application/json', Authorization: 'Bearer ' + jwtToken }, body: JSON.stringify(body), timeout: 30000, }); @@ -990,10 +981,7 @@ globalThis.model = { if (options && options.maxTokens) body.maxTokens = options.maxTokens; var result = await net.fetch(backendUrl + '/api/ai/summarize', { method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer ' + jwtToken, - }, + headers: { 'Content-Type': 'application/json', Authorization: 'Bearer ' + jwtToken }, body: JSON.stringify(body), timeout: 30000, }); diff --git a/src-tauri/src/services/quickjs_libs/mod.rs b/rust-core/src/runtime/quickjs_libs/mod.rs similarity index 100% rename from src-tauri/src/services/quickjs_libs/mod.rs rename to rust-core/src/runtime/quickjs_libs/mod.rs diff --git a/src-tauri/src/services/quickjs_libs/qjs_ops/mod.rs b/rust-core/src/runtime/quickjs_libs/qjs_ops/mod.rs similarity index 96% rename from src-tauri/src/services/quickjs_libs/qjs_ops/mod.rs rename to rust-core/src/runtime/quickjs_libs/qjs_ops/mod.rs index 3c54fccec..f8ee33bde 100644 --- a/src-tauri/src/services/quickjs_libs/qjs_ops/mod.rs +++ b/rust-core/src/runtime/quickjs_libs/qjs_ops/mod.rs @@ -20,7 +20,7 @@ use parking_lot::RwLock; use rquickjs::{Ctx, Object, Result as JsResult}; use std::sync::Arc; -use crate::services::quickjs_libs::storage::IdbStorage; +use crate::runtime::quickjs_libs::storage::IdbStorage; use types::SkillContext as SC; /// Register all ops on `globalThis.__ops`. diff --git a/src-tauri/src/services/quickjs_libs/qjs_ops/ops_core.rs b/rust-core/src/runtime/quickjs_libs/qjs_ops/ops_core.rs similarity index 88% rename from src-tauri/src/services/quickjs_libs/qjs_ops/ops_core.rs rename to rust-core/src/runtime/quickjs_libs/qjs_ops/ops_core.rs index e92c2a2eb..f99e54807 100644 --- a/src-tauri/src/services/quickjs_libs/qjs_ops/ops_core.rs +++ b/rust-core/src/runtime/quickjs_libs/qjs_ops/ops_core.rs @@ -92,18 +92,13 @@ pub fn register<'js>( ops.set( "platform_os", Function::new(ctx.clone(), || -> &'static str { - if cfg!(target_os = "windows") { - "windows" - } else if cfg!(target_os = "macos") { - "macos" - } else if cfg!(target_os = "linux") { - "linux" - } else if cfg!(target_os = "android") { - "android" - } else if cfg!(target_os = "ios") { - "ios" - } else { - "unknown" + match std::env::consts::OS { + "windows" => "windows", + "macos" => "macos", + "linux" => "linux", + "android" => "android", + "ios" => "ios", + _ => "unknown", } }), )?; @@ -122,10 +117,7 @@ pub fn register<'js>( ops.set( "get_session_token", Function::new(ctx.clone(), || -> String { - let token = crate::commands::auth::SESSION_SERVICE - .get_token() - .unwrap_or_default(); - return token; + std::env::var("JWT_TOKEN").unwrap_or_default() }), )?; diff --git a/src-tauri/src/services/quickjs_libs/qjs_ops/ops_net.rs b/rust-core/src/runtime/quickjs_libs/qjs_ops/ops_net.rs similarity index 100% rename from src-tauri/src/services/quickjs_libs/qjs_ops/ops_net.rs rename to rust-core/src/runtime/quickjs_libs/qjs_ops/ops_net.rs diff --git a/src-tauri/src/services/quickjs_libs/qjs_ops/ops_state.rs b/rust-core/src/runtime/quickjs_libs/qjs_ops/ops_state.rs similarity index 99% rename from src-tauri/src/services/quickjs_libs/qjs_ops/ops_state.rs rename to rust-core/src/runtime/quickjs_libs/qjs_ops/ops_state.rs index ae87e37c9..dcdc95cff 100644 --- a/src-tauri/src/services/quickjs_libs/qjs_ops/ops_state.rs +++ b/rust-core/src/runtime/quickjs_libs/qjs_ops/ops_state.rs @@ -147,7 +147,7 @@ pub fn register<'js>( .ok_or_else(|| js_err("App handle not available for memory insert"))?; let memory_state = app_handle - .try_state::() + .try_state::() .ok_or_else(|| js_err("Memory state not available"))?; let client_opt = memory_state diff --git a/src-tauri/src/services/quickjs_libs/qjs_ops/ops_storage.rs b/rust-core/src/runtime/quickjs_libs/qjs_ops/ops_storage.rs similarity index 99% rename from src-tauri/src/services/quickjs_libs/qjs_ops/ops_storage.rs rename to rust-core/src/runtime/quickjs_libs/qjs_ops/ops_storage.rs index 2317d8428..a486993f3 100644 --- a/src-tauri/src/services/quickjs_libs/qjs_ops/ops_storage.rs +++ b/rust-core/src/runtime/quickjs_libs/qjs_ops/ops_storage.rs @@ -3,7 +3,7 @@ use rquickjs::{Ctx, Function, Object}; use super::types::{js_err, SkillContext}; -use crate::services::quickjs_libs::storage::IdbStorage; +use crate::runtime::quickjs_libs::storage::IdbStorage; pub fn register<'js>( ctx: &Ctx<'js>, diff --git a/src-tauri/src/services/quickjs_libs/qjs_ops/types.rs b/rust-core/src/runtime/quickjs_libs/qjs_ops/types.rs similarity index 100% rename from src-tauri/src/services/quickjs_libs/qjs_ops/types.rs rename to rust-core/src/runtime/quickjs_libs/qjs_ops/types.rs diff --git a/src-tauri/src/services/quickjs_libs/storage.rs b/rust-core/src/runtime/quickjs_libs/storage.rs similarity index 100% rename from src-tauri/src/services/quickjs_libs/storage.rs rename to rust-core/src/runtime/quickjs_libs/storage.rs diff --git a/src-tauri/src/runtime/skill_registry.rs b/rust-core/src/runtime/skill_registry.rs similarity index 100% rename from src-tauri/src/runtime/skill_registry.rs rename to rust-core/src/runtime/skill_registry.rs diff --git a/src-tauri/src/runtime/socket_manager.rs b/rust-core/src/runtime/socket_manager.rs similarity index 91% rename from src-tauri/src/runtime/socket_manager.rs rename to rust-core/src/runtime/socket_manager.rs index 43507ce81..d411aee7f 100644 --- a/src-tauri/src/runtime/socket_manager.rs +++ b/rust-core/src/runtime/socket_manager.rs @@ -21,7 +21,6 @@ use tauri::{AppHandle, Emitter}; use crate::models::socket::{ConnectionStatus, SocketState}; // WebSocket-based Socket.IO client (desktop + iOS) -#[cfg(not(target_os = "android"))] use { futures_util::{SinkExt, StreamExt}, tokio::sync::{mpsc, watch}, @@ -30,9 +29,7 @@ use { }; // SkillRegistry only available on desktop -#[cfg(not(any(target_os = "android", target_os = "ios")))] use crate::runtime::skill_registry::SkillRegistry; -#[cfg(not(any(target_os = "android", target_os = "ios")))] use crate::runtime::types::{SkillSnapshot, SkillStatus}; /// Events emitted to the frontend via Tauri. @@ -50,7 +47,6 @@ pub mod events { struct SharedState { app_handle: RwLock>, - #[cfg(not(any(target_os = "android", target_os = "ios")))] registry: RwLock>>, status: RwLock, socket_id: RwLock>, @@ -59,16 +55,12 @@ struct SharedState { // --------------------------------------------------------------------------- // WebSocket stream type alias (desktop + iOS) // --------------------------------------------------------------------------- - -#[cfg(not(target_os = "android"))] type WsStream = tokio_tungstenite::WebSocketStream>; // --------------------------------------------------------------------------- // Connection outcome (desktop + iOS) // --------------------------------------------------------------------------- - -#[cfg(not(target_os = "android"))] enum ConnectionOutcome { /// Clean shutdown requested. Shutdown, @@ -84,11 +76,8 @@ enum ConnectionOutcome { pub struct SocketManager { shared: Arc, - #[cfg(not(target_os = "android"))] emit_tx: tokio::sync::Mutex>>, - #[cfg(not(target_os = "android"))] shutdown_tx: tokio::sync::Mutex>>, - #[cfg(not(target_os = "android"))] loop_handle: tokio::sync::Mutex>>, } @@ -97,16 +86,12 @@ impl SocketManager { Self { shared: Arc::new(SharedState { app_handle: RwLock::new(None), - #[cfg(not(any(target_os = "android", target_os = "ios")))] registry: RwLock::new(None), status: RwLock::new(ConnectionStatus::Disconnected), socket_id: RwLock::new(None), }), - #[cfg(not(target_os = "android"))] emit_tx: tokio::sync::Mutex::new(None), - #[cfg(not(target_os = "android"))] shutdown_tx: tokio::sync::Mutex::new(None), - #[cfg(not(target_os = "android"))] loop_handle: tokio::sync::Mutex::new(None), } } @@ -117,7 +102,6 @@ impl SocketManager { } /// Set the skill registry for MCP tool handling (desktop only). - #[cfg(not(any(target_os = "android", target_os = "ios")))] pub fn set_registry(&self, registry: Arc) { *self.shared.registry.write() = Some(registry); } @@ -140,8 +124,6 @@ impl SocketManager { // ----------------------------------------------------------------------- // Connection lifecycle (desktop + iOS) // ----------------------------------------------------------------------- - - #[cfg(not(target_os = "android"))] pub async fn connect(&self, url: &str, token: &str) -> Result<(), String> { self.disconnect().await?; @@ -168,8 +150,6 @@ impl SocketManager { *self.loop_handle.lock().await = Some(handle); Ok(()) } - - #[cfg(not(target_os = "android"))] pub async fn disconnect(&self) -> Result<(), String> { if let Some(tx) = self.shutdown_tx.lock().await.take() { let _ = tx.send(true); @@ -183,8 +163,6 @@ impl SocketManager { Self::emit_state_change(&self.shared); Ok(()) } - - #[cfg(not(target_os = "android"))] pub async fn emit(&self, event: &str, data: serde_json::Value) -> Result<(), String> { if let Some(ref tx) = *self.emit_tx.lock().await { let payload = @@ -196,41 +174,12 @@ impl SocketManager { } } - // ----------------------------------------------------------------------- - // Android stubs - // ----------------------------------------------------------------------- - - #[cfg(target_os = "android")] - pub async fn connect(&self, url: &str, _token: &str) -> Result<(), String> { - log::info!( - "[socket-mgr] Android stub — frontend handles socket. URL: {}", - url - ); - *self.shared.status.write() = ConnectionStatus::Disconnected; - Self::emit_state_change(&self.shared); - Ok(()) - } - - #[cfg(target_os = "android")] - pub async fn disconnect(&self) -> Result<(), String> { - *self.shared.status.write() = ConnectionStatus::Disconnected; - *self.shared.socket_id.write() = None; - Self::emit_state_change(&self.shared); - Ok(()) - } - - #[cfg(target_os = "android")] - pub async fn emit(&self, _event: &str, _data: serde_json::Value) -> Result<(), String> { - Err("Rust Socket.io not available on Android".to_string()) - } - // ----------------------------------------------------------------------- // Tool sync — notify backend of current skill/tool state // ----------------------------------------------------------------------- /// Emit `tool:sync` with the current skill/tool state. /// Called on socket reconnect and after skill lifecycle changes. - #[cfg(not(any(target_os = "android", target_os = "ios")))] pub async fn sync_tools(&self) { let payload = build_tool_sync_payload(&self.shared); if let Some(payload) = payload { @@ -239,12 +188,6 @@ impl SocketManager { } } } - - #[cfg(any(target_os = "android", target_os = "ios"))] - pub async fn sync_tools(&self) { - // No-op on mobile — skill runtime not available - } - // ----------------------------------------------------------------------- // Tauri event helpers // ----------------------------------------------------------------------- @@ -279,8 +222,6 @@ impl Default for SocketManager { // =========================================================================== // WebSocket Engine.IO/Socket.IO implementation (desktop + iOS) // =========================================================================== - -#[cfg(not(target_os = "android"))] async fn ws_loop( url: String, token: String, @@ -351,7 +292,6 @@ async fn ws_loop( } /// Run a single WebSocket connection through handshake and event loop. -#[cfg(not(target_os = "android"))] async fn run_connection( url: &str, token: &str, @@ -494,7 +434,6 @@ async fn run_connection( /// Read the Engine.IO OPEN packet (type 0) from the WebSocket. /// Format: `0{"sid":"...","upgrades":[],"pingInterval":25000,"pingTimeout":20000}` -#[cfg(not(target_os = "android"))] async fn read_eio_open( ws_read: &mut futures_util::stream::SplitStream, ) -> Result { @@ -520,7 +459,6 @@ async fn read_eio_open( /// Read the Socket.IO CONNECT ACK (type 40) from the WebSocket. /// Format: `40{"sid":"..."}` or `44{"message":"error"}` for connect error. -#[cfg(not(target_os = "android"))] async fn read_sio_connect_ack( ws_read: &mut futures_util::stream::SplitStream, ) -> Result { @@ -568,7 +506,6 @@ async fn read_sio_connect_ack( // --------------------------------------------------------------------------- /// Handle an incoming Engine.IO text message. -#[cfg(not(target_os = "android"))] fn handle_eio_message( text: &str, emit_tx: &mpsc::UnboundedSender, @@ -608,7 +545,6 @@ fn handle_eio_message( } /// Handle a Socket.IO packet (after stripping the Engine.IO '4' prefix). -#[cfg(not(target_os = "android"))] fn handle_sio_packet( text: &str, emit_tx: &mpsc::UnboundedSender, @@ -669,7 +605,6 @@ fn handle_sio_packet( } /// Handle a Socket.IO event by name. -#[cfg(not(target_os = "android"))] fn handle_sio_event( event_name: &str, data: serde_json::Value, @@ -683,7 +618,6 @@ fn handle_sio_event( SocketManager::emit_state_change(shared); // Sync current tool state to backend on connect/reconnect - #[cfg(not(any(target_os = "android", target_os = "ios")))] sync_tools_via_channel(emit_tx, shared); } "error" => { @@ -692,7 +626,6 @@ fn handle_sio_event( SocketManager::emit_state_change(shared); } // MCP handlers — desktop only - #[cfg(not(any(target_os = "android", target_os = "ios")))] "mcp:listTools" => { let shared = Arc::clone(shared); let tx = emit_tx.clone(); @@ -700,7 +633,6 @@ fn handle_sio_event( handle_mcp_list_tools(&shared, data, &tx).await; }); } - #[cfg(not(any(target_os = "android", target_os = "ios")))] "mcp:toolCall" => { let shared = Arc::clone(shared); let tx = emit_tx.clone(); @@ -710,7 +642,6 @@ fn handle_sio_event( } _ => { // Forward to skills (desktop only) and frontend - #[cfg(not(any(target_os = "android", target_os = "ios")))] { let shared_clone = Arc::clone(shared); let event_owned = event_name.to_string(); @@ -731,8 +662,6 @@ fn handle_sio_event( // --------------------------------------------------------------------------- // MCP protocol handlers (desktop only) // --------------------------------------------------------------------------- - -#[cfg(not(any(target_os = "android", target_os = "ios")))] async fn handle_mcp_list_tools( shared: &SharedState, data: serde_json::Value, @@ -773,8 +702,6 @@ async fn handle_mcp_list_tools( json!({ "requestId": request_id, "tools": tools }), ); } - -#[cfg(not(any(target_os = "android", target_os = "ios")))] async fn handle_mcp_tool_call( shared: &SharedState, data: serde_json::Value, @@ -860,7 +787,6 @@ async fn handle_mcp_tool_call( // --------------------------------------------------------------------------- /// Convert an HTTP(S) URL to a WebSocket URL with Engine.IO parameters. -#[cfg(not(target_os = "android"))] fn build_ws_url(url: &str) -> String { let base = url.trim_end_matches('/'); let ws_base = if base.starts_with("https://") { @@ -875,7 +801,6 @@ fn build_ws_url(url: &str) -> String { /// Send a Socket.IO event through the emit channel. /// Formats: `42["eventName", data]` -#[cfg(not(target_os = "android"))] fn emit_via_channel(tx: &mpsc::UnboundedSender, event: &str, data: serde_json::Value) { let payload = serde_json::to_string(&json!([event, data])).unwrap_or_default(); let msg = format!("42{}", payload); @@ -890,7 +815,6 @@ fn emit_via_channel(tx: &mpsc::UnboundedSender, event: &str, data: serde /// Derive a unified connection status string from a Rust-side SkillSnapshot. /// Mirrors the frontend's `deriveConnectionStatus()` logic in `src/lib/skills/hooks.ts`. -#[cfg(not(any(target_os = "android", target_os = "ios")))] fn derive_connection_status(snap: &SkillSnapshot) -> &'static str { match snap.status { SkillStatus::Error => "error", @@ -916,7 +840,6 @@ fn derive_connection_status(snap: &SkillSnapshot) -> &'static str { } /// Build the `tool:sync` payload from the current registry state. -#[cfg(not(any(target_os = "android", target_os = "ios")))] fn build_tool_sync_payload(shared: &SharedState) -> Option { let registry = shared.registry.read().clone()?; let skills = registry.list_skills(); @@ -937,7 +860,6 @@ fn build_tool_sync_payload(shared: &SharedState) -> Option { } /// Emit `tool:sync` synchronously via the emit channel (for use from event handlers). -#[cfg(not(any(target_os = "android", target_os = "ios")))] fn sync_tools_via_channel(emit_tx: &mpsc::UnboundedSender, shared: &SharedState) { if let Some(payload) = build_tool_sync_payload(shared) { emit_via_channel(emit_tx, "tool:sync", payload); @@ -949,7 +871,6 @@ fn sync_tools_via_channel(emit_tx: &mpsc::UnboundedSender, shared: &Shar // --------------------------------------------------------------------------- /// Parse a Socket.IO EVENT payload: `["eventName", data]` or `["eventName", data]`. -#[cfg(not(target_os = "android"))] fn parse_sio_event(text: &str) -> Option<(String, serde_json::Value)> { // Find the start of the JSON array (skip optional ACK id digits) let json_start = text.find('[')?; diff --git a/src-tauri/src/runtime/types.rs b/rust-core/src/runtime/types.rs similarity index 100% rename from src-tauri/src/runtime/types.rs rename to rust-core/src/runtime/types.rs diff --git a/src-tauri/src/runtime/utils.rs b/rust-core/src/runtime/utils.rs similarity index 100% rename from src-tauri/src/runtime/utils.rs rename to rust-core/src/runtime/utils.rs diff --git a/skills b/skills index e856b8e75..4ef9e9b36 160000 --- a/skills +++ b/skills @@ -1 +1 @@ -Subproject commit e856b8e756ad7ea86f36dbd1697542e76a8d3571 +Subproject commit 4ef9e9b3688e483ab3e088525063e71eb9cb24d5 diff --git a/src-tauri/.gitignore b/src-tauri/.gitignore index b21bd681d..2949449ef 100644 --- a/src-tauri/.gitignore +++ b/src-tauri/.gitignore @@ -1,6 +1,7 @@ # Generated by Cargo # will have compiled files and executables /target/ +/binaries/ # Generated by Tauri # will have schema files for capabilities auto-completion diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 202416d22..a02edf674 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -4,7 +4,7 @@ version = 4 [[package]] name = "OpenHuman" -version = "0.49.15" +version = "0.49.16" dependencies = [ "aes-gcm", "android_logger", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index e129314aa..679bf48d7 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -20,26 +20,19 @@ crate-type = ["staticlib", "cdylib", "rlib"] name = "OpenHuman" path = "src/main.rs" -# NOTE: openhuman-core and openhuman-cli bin entries are NOT declared here. -# Tauri's bundler and Cargo auto-discover src/bin/*.rs as binary targets, -# so the standalone sources live in src/standalone/ to avoid bundling. -# The standalone bins are built separately in release.yml by temporarily -# injecting [[bin]] entries before `cargo build --features standalone-bins`. -# Source files: src/standalone/openhuman-core.rs, src/standalone/openhuman-cli.rs - [build-dependencies] tauri-build = { version = "2", features = [] } serde = { version = "1", features = ["derive"] } serde_json = "1" [dependencies] +openhuman-core = { path = "../rust-core", features = ["tauri-host"] } # Tauri core and plugins tauri = { version = "2.10", features = ["tray-icon", "macos-private-api"] } tauri-plugin-opener = "2" tauri-plugin-deep-link = "2.0.0" tauri-plugin-os = "2" -# tauri-plugin-autostart moved to desktop-only target section -# tauri-plugin-notification moved to desktop-only target section +# Desktop host plugins # Serialization serde = { version = "1", features = ["derive"] } serde_json = "1" @@ -152,26 +145,16 @@ wa-rs-binary = { version = "0.2", optional = true, default-features = false } wa-rs-proto = { version = "0.2", optional = true, default-features = false } wa-rs-ureq-http = { version = "0.2", optional = true } wa-rs-tokio-transport = { version = "0.2", optional = true, default-features = false } +keyring = "3" +tauri-plugin-autostart = "2" +tauri-plugin-notification = "2" +# QuickJS JavaScript runtime (desktop-only host) +rquickjs = { version = "0.11", features = ["futures", "macro", "loader", "parallel"] } [target.'cfg(target_os = "linux")'.dependencies] rppal = { version = "0.22", optional = true } -[target.'cfg(target_os = "android")'.dependencies] -# Android logging (routes Rust `log` crate to logcat) -android_logger = "0.14" - -[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies] -keyring = "3" -tauri-plugin-autostart = "2" -tauri-plugin-notification = "2" - -# QuickJS JavaScript runtime (via quickjs-rs) -# Only available on desktop - prebuilt binaries don't exist for Android/iOS -rquickjs = { version = "0.11", features = ["futures", "macro", "loader", "parallel"] } - - - [dev-dependencies] tempfile = "3" @@ -191,4 +174,3 @@ landlock = ["sandbox-landlock"] probe = ["dep:probe-rs"] rag-pdf = ["dep:pdf-extract"] whatsapp-web = ["dep:wa-rs", "dep:wa-rs-core", "dep:wa-rs-binary", "dep:wa-rs-proto", "dep:wa-rs-ureq-http", "dep:wa-rs-tokio-transport", "serde-big-array"] -standalone-bins = [] diff --git a/src-tauri/build.rs b/src-tauri/build.rs index 6c8e332d4..51833e64b 100644 --- a/src-tauri/build.rs +++ b/src-tauri/build.rs @@ -7,7 +7,7 @@ fn main() { fn maybe_override_tauri_config_for_local_builds() { let profile = env::var("PROFILE").unwrap_or_default(); - let skip_resources = env::var("TAURI_SKIP_RESOURCES").is_ok() || profile == "test"; + let skip_resources = env::var("TAURI_SKIP_RESOURCES").is_ok() || profile != "release"; if !skip_resources { return; @@ -16,6 +16,7 @@ fn maybe_override_tauri_config_for_local_builds() { let mut merge_config = serde_json::json!({}); if skip_resources { merge_config["bundle"]["resources"] = serde_json::json!([]); + merge_config["bundle"]["externalBin"] = serde_json::json!([]); } match serde_json::to_string(&merge_config) { diff --git a/src-tauri/capabilities/mobile.json b/src-tauri/capabilities/mobile.json deleted file mode 100644 index da66d9084..000000000 --- a/src-tauri/capabilities/mobile.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "identifier": "mobile", - "description": "Mobile-specific permissions (Android and iOS)", - "platforms": ["android", "iOS"], - "windows": ["main"], - "permissions": [ - "core:default", - "opener:default", - "deep-link:default", - "os:default" - ] -} diff --git a/src-tauri/src/commands/chat.rs b/src-tauri/src/commands/chat.rs index 37d9740e1..7a9ce005a 100644 --- a/src-tauri/src/commands/chat.rs +++ b/src-tauri/src/commands/chat.rs @@ -24,7 +24,7 @@ use std::sync::Arc; use tauri::{Emitter, Manager}; use tokio_util::sync::CancellationToken; -use crate::commands::memory::MemoryState; +use crate::memory::MemoryState; // ─── Constants ─────────────────────────────────────────────────────────────── @@ -218,9 +218,10 @@ pub fn clear_openclaw_context_cache() { /// /// Tries these locations in order: /// 1. Tauri resource directory (production builds — files bundled via `tauri.conf.json` resources) -/// 2. `{cwd}/src-tauri/ai/` (dev mode when cwd is project root) -/// 3. `{cwd}/ai/` (dev mode when cwd is `src-tauri/`) -/// 4. `{cwd}/../ai/` (legacy fallback) +/// 2. `{cwd}/rust-core/ai/` (dev mode when cwd is project root) +/// 3. `{cwd}/../rust-core/ai/` (dev mode when cwd is `src-tauri/`) +/// 4. `{cwd}/ai/` (legacy fallback) +/// 5. `{cwd}/src-tauri/ai/` (legacy fallback) /// /// Returns an empty string if no files are found (non-fatal). fn load_openclaw_context(app: &tauri::AppHandle) -> String { @@ -274,9 +275,9 @@ fn find_ai_directory(app: &tauri::AppHandle) -> Option { } } - // 2. Try cwd/src-tauri/ai/ (dev mode; cwd is project root) + // 2. Try cwd/rust-core/ai/ (dev mode; cwd is project root) if let Ok(cwd) = std::env::current_dir() { - let root_dev_dir = cwd.join("src-tauri").join("ai"); + let root_dev_dir = cwd.join("rust-core").join("ai"); if root_dev_dir.is_dir() { log::info!( "[chat] Using AI config from root dev dir: {}", @@ -285,7 +286,18 @@ fn find_ai_directory(app: &tauri::AppHandle) -> Option { return Some(root_dev_dir); } - // 3. Try cwd/ai/ (dev mode; cwd is src-tauri/) + // 3. Try cwd/../rust-core/ai/ (dev mode; cwd is src-tauri/) + if let Some(src_tauri_dev) = cwd.parent().map(|p| p.join("rust-core").join("ai")) { + if src_tauri_dev.is_dir() { + log::info!( + "[chat] Using AI config from src-tauri dev dir: {}", + src_tauri_dev.display() + ); + return Some(src_tauri_dev); + } + } + + // 4. Try cwd/ai/ (legacy fallback) let fallback = cwd.join("ai"); if fallback.is_dir() { log::info!( @@ -295,7 +307,17 @@ fn find_ai_directory(app: &tauri::AppHandle) -> Option { return Some(fallback); } - // 4. Legacy fallback: cwd/../ai/ + // 5. Legacy fallback: cwd/src-tauri/ai/ + let src_tauri_legacy = cwd.join("src-tauri").join("ai"); + if src_tauri_legacy.is_dir() { + log::info!( + "[chat] Using AI config from src-tauri legacy dir: {}", + src_tauri_legacy.display() + ); + return Some(src_tauri_legacy); + } + + // 6. Legacy fallback: cwd/../ai/ if let Some(legacy_dir) = cwd.parent().map(|p| p.join("ai")) { if legacy_dir.is_dir() { log::info!( @@ -340,7 +362,6 @@ fn is_read_tool(name: &str) -> bool { /// Build OpenAI-format tool definitions from the Rust skill registry. /// Tool names are namespaced as `{skill_id}__{tool_name}`. /// Read-only tools are excluded — their data comes from the memory layer (Step 2 context recall). -#[cfg(not(any(target_os = "android", target_os = "ios")))] fn discover_tools(engine: &crate::runtime::qjs_engine::RuntimeEngine) -> Vec { engine .all_tools() @@ -379,7 +400,6 @@ fn parse_tool_name(full_name: &str) -> (String, String) { /// /// Returns `Ok(())` immediately after spawning; the result is delivered via /// `chat:done` or `chat:error` Tauri events. -#[cfg(not(any(target_os = "android", target_os = "ios")))] #[tauri::command] pub async fn chat_send( app: tauri::AppHandle, @@ -443,65 +463,6 @@ pub async fn chat_send( Ok(()) } -/// Mobile stub — tool execution is not supported on Android/iOS. -#[cfg(any(target_os = "android", target_os = "ios"))] -#[tauri::command] -pub async fn chat_send( - app: tauri::AppHandle, - thread_id: String, - message: String, - model: String, - auth_token: String, - backend_url: String, - messages: Vec, - notion_context: Option, - memory_state: tauri::State<'_, MemoryState>, - chat_state: tauri::State<'_, Arc>, -) -> Result<(), String> { - // Register cancellation token for this thread - let cancel = chat_state.register(&thread_id); - - let app_clone = app.clone(); - let thread_id_clone = thread_id.clone(); - let chat_state_arc = chat_state.inner().clone(); - - let memory_client: Option = { - match memory_state.0.lock() { - Ok(guard) => guard.clone(), - Err(e) => { - log::warn!("[chat] Failed to lock memory state: {e}"); - None - } - } - }; - - tauri::async_runtime::spawn(async move { - let result = chat_send_mobile( - &app_clone, - &thread_id_clone, - &message, - &model, - &auth_token, - &backend_url, - messages, - notion_context, - memory_client, - &cancel, - ) - .await; - - chat_state_arc.remove(&thread_id_clone); - - if let Err(e) = result { - // chat_send_mobile already emits chat:error for known error paths. - // Only log here to avoid duplicate error events. - log::error!("[chat] chat_send_mobile failed: {e}"); - } - }); - - Ok(()) -} - /// Cancel an in-flight `chat_send` request by thread ID. /// Returns `true` if a request was found and cancelled, `false` otherwise. #[tauri::command] @@ -513,7 +474,6 @@ pub fn chat_cancel(thread_id: String, chat_state: tauri::State<'_, Arc, - notion_context: Option, - memory_client: Option, - cancel: &CancellationToken, -) -> Result<(), String> { - let client = reqwest::Client::builder() - .use_rustls_tls() - .build() - .map_err(|e| { - let msg = format!("Failed to build HTTP client: {}", e); - let _ = app.emit( - "chat:error", - ChatErrorEvent { - thread_id: thread_id.to_string(), - message: msg.clone(), - error_type: "network".to_string(), - round: None, - }, - ); - msg - })?; - - // ── Step 1: Load AI context ───────────────────────────────────────── - let openclaw_context = load_openclaw_context(app); - - // ── Step 2: Recall memory context ─────────────────────────────────── - let memory_context: Option = if let Some(ref mem) = memory_client { - match mem - .recall_skill_context("conversations", thread_id, 10) - .await - { - Ok(ctx) => ctx, - Err(e) => { - log::warn!("[chat] Memory recall failed: {}", e); - None - } - } - } else { - None - }; - - // ── Step 3: Build processed user message ──────────────────────────── - let mut processed = user_message.to_string(); - - if !openclaw_context.is_empty() { - processed = format!("{}\n\nUser message: {}", openclaw_context, processed); - } - - if let Some(ref mem) = memory_context { - processed = format!( - "[MEMORY_CONTEXT]\n{}\n[/MEMORY_CONTEXT]\n\n{}", - mem, processed - ); - } - - if let Some(ref notion) = notion_context { - processed = format!("{}\n\n{}", notion, processed); - } - - // ── Step 4: Build messages array ───────────────────────────────────── - let mut messages: Vec = history - .iter() - .map(|m| { - let mut obj = serde_json::json!({ - "role": m.role, - "content": m.content, - }); - if let Some(ref tc) = m.tool_calls { - obj["tool_calls"] = serde_json::to_value(tc).unwrap_or_default(); - } - if let Some(ref id) = m.tool_call_id { - obj["tool_call_id"] = serde_json::Value::String(id.clone()); - } - obj - }) - .collect(); - - messages.push(serde_json::json!({ - "role": "user", - "content": processed, - })); - - if cancel.is_cancelled() { - return Err("Request cancelled".to_string()); - } - - let request_body = serde_json::json!({ - "model": model, - "messages": messages, - }); - - log::info!( - "[chat] Mobile inference: model={}, msgs={}", - model, - messages.len() - ); - log::info!( - "[chat] Request body: {}", - serde_json::to_string_pretty(&request_body).unwrap_or_default() - ); - - let response = tokio::select! { - _ = cancel.cancelled() => { - let _ = app.emit("chat:error", ChatErrorEvent { - thread_id: thread_id.to_string(), - message: "Request cancelled".to_string(), - error_type: "cancelled".to_string(), - round: Some(0), - }); - return Err("Request cancelled".to_string()); - } - result = tokio::time::timeout( - std::time::Duration::from_secs(INFERENCE_TIMEOUT_SECS), - client - .post(format!("{}/openai/v1/chat/completions", backend_url)) - .header("Authorization", format!("Bearer {}", auth_token)) - .header("Content-Type", "application/json") - .json(&request_body) - .send() - ) => { - match result { - Ok(Ok(resp)) => resp, - Ok(Err(e)) => { - let msg = format!("Network error: {}", e); - let _ = app.emit("chat:error", ChatErrorEvent { - thread_id: thread_id.to_string(), - message: msg.clone(), - error_type: "network".to_string(), - round: Some(0), - }); - return Err(msg); - } - Err(_) => { - let msg = format!( - "Inference request timed out after {}s", - INFERENCE_TIMEOUT_SECS - ); - let _ = app.emit("chat:error", ChatErrorEvent { - thread_id: thread_id.to_string(), - message: msg.clone(), - error_type: "timeout".to_string(), - round: Some(0), - }); - return Err(msg); - } - } - } - }; - - let status = response.status(); - if !status.is_success() { - let body = response.text().await.unwrap_or_default(); - let msg = format!("Backend returned HTTP {}: {}", status, body); - let _ = app.emit( - "chat:error", - ChatErrorEvent { - thread_id: thread_id.to_string(), - message: msg.clone(), - error_type: "inference".to_string(), - round: Some(0), - }, - ); - return Err(msg); - } - - let completion: ChatCompletionResponse = response.json().await.map_err(|e| { - let msg = format!("Failed to parse inference response: {}", e); - let _ = app.emit( - "chat:error", - ChatErrorEvent { - thread_id: thread_id.to_string(), - message: msg.clone(), - error_type: "inference".to_string(), - round: None, - }, - ); - msg - })?; - - let (total_input_tokens, total_output_tokens) = completion - .usage - .map(|u| (u.prompt_tokens, u.completion_tokens)) - .unwrap_or((0, 0)); - - let choice = completion.choices.first().ok_or_else(|| { - let msg = "No choices in inference response".to_string(); - let _ = app.emit( - "chat:error", - ChatErrorEvent { - thread_id: thread_id.to_string(), - message: msg.clone(), - error_type: "inference".to_string(), - round: None, - }, - ); - msg - })?; - - let full_response = choice.message.content.clone().unwrap_or_default(); - - let _ = app.emit( - "chat:done", - ChatDoneEvent { - thread_id: thread_id.to_string(), - full_response, - rounds_used: 1, - total_input_tokens, - total_output_tokens, - }, - ); - - Ok(()) -} diff --git a/src-tauri/src/commands/conscious_loop.rs b/src-tauri/src/commands/conscious_loop.rs index c8aedcc51..886ecc544 100644 --- a/src-tauri/src/commands/conscious_loop.rs +++ b/src-tauri/src/commands/conscious_loop.rs @@ -17,7 +17,7 @@ use sha2::{Digest, Sha256}; use std::sync::Arc; use tauri::{Emitter, Manager}; -use crate::commands::memory::MemoryState; +use crate::memory::MemoryState; // ─── Event types (Rust → frontend) ────────────────────────────────────────── @@ -103,14 +103,23 @@ fn find_ai_directory(app: &tauri::AppHandle) -> Option { } } if let Ok(cwd) = std::env::current_dir() { - let root_dev = cwd.join("src-tauri").join("ai"); + let root_dev = cwd.join("rust-core").join("ai"); if root_dev.is_dir() { return Some(root_dev); } + if let Some(src_tauri_dev) = cwd.parent().map(|p| p.join("rust-core").join("ai")) { + if src_tauri_dev.is_dir() { + return Some(src_tauri_dev); + } + } let fallback = cwd.join("ai"); if fallback.is_dir() { return Some(fallback); } + let src_tauri_legacy = cwd.join("src-tauri").join("ai"); + if src_tauri_legacy.is_dir() { + return Some(src_tauri_legacy); + } if let Some(legacy) = cwd.parent().map(|p| p.join("ai")) { if legacy.is_dir() { return Some(legacy); @@ -142,7 +151,6 @@ fn load_conscious_prompt(app: &tauri::AppHandle) -> String { // ─── Core logic ─────────────────────────────────────────────────────────────── /// Inner implementation — runs one conscious loop pass. -#[cfg(not(any(target_os = "android", target_os = "ios")))] pub async fn conscious_loop_run_inner( app: tauri::AppHandle, auth_token: String, @@ -464,7 +472,6 @@ pub async fn conscious_loop_run_inner( // ─── Tauri command ──────────────────────────────────────────────────────────── /// Manually trigger a conscious loop run from the frontend. -#[cfg(not(any(target_os = "android", target_os = "ios")))] #[tauri::command] pub async fn conscious_loop_run( app: tauri::AppHandle, @@ -496,19 +503,6 @@ pub async fn conscious_loop_run( Ok(()) } -/// Mobile stub — conscious loop is desktop-only (requires V8 runtime for skill IDs). -#[cfg(any(target_os = "android", target_os = "ios"))] -#[tauri::command] -pub async fn conscious_loop_run( - _app: tauri::AppHandle, - _auth_token: String, - _backend_url: String, - _model: Option, - _memory_state: tauri::State<'_, MemoryState>, -) -> Result<(), String> { - Err("Conscious loop is not supported on mobile".to_string()) -} - // ─── Periodic timer ─────────────────────────────────────────────────────────── /// Periodic timer spawned from `lib.rs` setup. Runs every 5 minutes. @@ -569,16 +563,7 @@ pub async fn conscious_loop_timer(app: tauri::AppHandle) { let model = std::env::var("OPENHUMAN_CONSCIOUS_MODEL") .unwrap_or_else(|_| DEFAULT_MODEL.to_string()); - #[cfg(not(any(target_os = "android", target_os = "ios")))] - { - log::info!("[conscious_loop] Timer: firing periodic run"); - conscious_loop_run_inner(app.clone(), auth_token, backend_url, model, memory_client) - .await; - } - - #[cfg(any(target_os = "android", target_os = "ios"))] - { - log::info!("[conscious_loop] Timer: skipping on mobile platform"); - } + log::info!("[conscious_loop] Timer: firing periodic run"); + conscious_loop_run_inner(app.clone(), auth_token, backend_url, model, memory_client).await; } } diff --git a/src-tauri/src/commands/memory.rs b/src-tauri/src/commands/memory.rs index 794de0f70..7c7a63dd8 100644 --- a/src-tauri/src/commands/memory.rs +++ b/src-tauri/src/commands/memory.rs @@ -1,14 +1,9 @@ //! Tauri commands for the TinyHumans memory layer. use std::collections::BTreeSet; -use std::sync::{Arc, Mutex}; +use std::sync::Arc; -use crate::memory::{MemoryClient, MemoryClientRef}; - -/// App-state slot for the memory client. -/// Starts as `None`; populated by `init_memory_client` when the frontend -/// provides the user's JWT token from `authSlice.token`. -pub struct MemoryState(pub Mutex>); +use crate::memory::{MemoryClient, MemoryState}; fn extract_namespaces_from_documents(payload: &serde_json::Value) -> Vec { fn collect_from_value(value: &serde_json::Value, out: &mut BTreeSet) { diff --git a/src-tauri/src/commands/openhuman.rs b/src-tauri/src/commands/openhuman.rs index edfce9ba3..bb3c6b3b9 100644 --- a/src-tauri/src/commands/openhuman.rs +++ b/src-tauri/src/commands/openhuman.rs @@ -1,10 +1,10 @@ //! Tauri command proxies for the standalone openhuman core process. -use crate::core_server::{ +use openhuman_core::core_server::{ BrowserSettingsUpdate, CommandResponse, ConfigSnapshot, GatewaySettingsUpdate, MemorySettingsUpdate, ModelSettingsUpdate, RuntimeFlags, RuntimeSettingsUpdate, }; -use crate::openhuman::{doctor, hardware, integrations, migration, onboard, service}; +use openhuman_core::openhuman::{doctor, hardware, integrations, migration, onboard, service}; use serde::de::DeserializeOwned; use serde::{Deserialize, Serialize}; use tauri::Manager; @@ -32,11 +32,11 @@ async fn call_core( crate::core_rpc::call(method, params).await } -async fn load_config_local() -> Result { +async fn load_config_local() -> Result { let timeout_duration = std::time::Duration::from_secs(30); match tokio::time::timeout( timeout_duration, - crate::openhuman::config::Config::load_or_init(), + openhuman_core::openhuman::config::Config::load_or_init(), ) .await { @@ -150,7 +150,7 @@ pub async fn openhuman_update_gateway_settings( #[tauri::command] pub async fn openhuman_update_tunnel_settings( app: tauri::AppHandle, - tunnel: crate::openhuman::config::TunnelConfig, + tunnel: openhuman_core::openhuman::config::TunnelConfig, ) -> Result, String> { call_core( &app, diff --git a/src-tauri/src/commands/runtime.rs b/src-tauri/src/commands/runtime.rs index de680ac22..0fc3c7b58 100644 --- a/src-tauri/src/commands/runtime.rs +++ b/src-tauri/src/commands/runtime.rs @@ -3,8 +3,7 @@ //! These commands expose the RuntimeEngine to the frontend WebView //! and serve as the bridge between the ephemeral UI and the persistent runtime. //! -//! Note: V8 runtime is only available on desktop platforms. -//! On mobile, these commands return appropriate errors or empty results. +//! Note: V8 runtime is desktop-only in this host. use crate::models::socket::SocketState; use crate::runtime::socket_manager::SocketManager; @@ -14,34 +13,9 @@ use std::collections::HashMap; use std::sync::Arc; use tauri::State; -// Desktop-only imports -#[cfg(not(any(target_os = "android", target_os = "ios")))] use crate::runtime::qjs_engine::RuntimeEngine; -#[cfg(not(any(target_os = "android", target_os = "ios")))] use crate::runtime::types::{SkillSnapshot, ToolResult}; -// Mobile stub types -#[cfg(any(target_os = "android", target_os = "ios"))] -use serde::{Deserialize, Serialize}; - -#[cfg(any(target_os = "android", target_os = "ios"))] -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct SkillSnapshot { - pub id: String, - pub name: String, - pub state: String, - pub tools: Vec, - pub error: Option, -} - -#[cfg(any(target_os = "android", target_os = "ios"))] -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct ToolResult { - pub content: Vec, - #[serde(rename = "isError")] - pub is_error: bool, -} - // ============================================================================= // ZeroClaw Format Compatibility Types // ============================================================================= @@ -69,10 +43,9 @@ pub struct ZeroClawToolResult { } // ============================================================================= -// Desktop implementations (V8 available) +// Runtime command implementations // ============================================================================= -#[cfg(not(any(target_os = "android", target_os = "ios")))] mod desktop { use super::*; @@ -494,6 +467,10 @@ mod desktop { // Helper function to parse tool_id format: "skill_id_tool_name" pub fn parse_tool_id(tool_id: &str) -> Result<(String, String), String> { + if tool_id.is_empty() || tool_id.starts_with('_') || tool_id.ends_with('_') { + return Err("Tool ID must be in format 'skill_id_tool_name'".to_string()); + } + // Find the first underscore to separate skill_id from tool_name if let Some(underscore_pos) = tool_id.find('_') { let skill_id = tool_id[..underscore_pos].to_string(); @@ -527,149 +504,6 @@ mod desktop { } } -// ============================================================================= -// Mobile stub implementations (V8 not available) -// ============================================================================= - -#[cfg(any(target_os = "android", target_os = "ios"))] -mod mobile { - use super::*; - - const MOBILE_ERROR: &str = "V8 skill runtime is not available on mobile platforms"; - - #[tauri::command] - pub async fn runtime_discover_skills() -> Result, String> { - // Return empty list on mobile - Ok(vec![]) - } - - #[tauri::command] - pub async fn runtime_list_skills() -> Result, String> { - Ok(vec![]) - } - - #[tauri::command] - pub async fn runtime_start_skill(_skill_id: String) -> Result { - Err(MOBILE_ERROR.to_string()) - } - - #[tauri::command] - pub async fn runtime_stop_skill(_skill_id: String) -> Result<(), String> { - Err(MOBILE_ERROR.to_string()) - } - - #[tauri::command] - pub async fn runtime_get_skill_state( - _skill_id: String, - ) -> Result, String> { - Ok(None) - } - - #[tauri::command] - pub async fn runtime_call_tool( - _skill_id: String, - _tool_name: String, - _arguments: serde_json::Value, - ) -> Result { - Err(MOBILE_ERROR.to_string()) - } - - #[tauri::command] - pub async fn runtime_all_tools() -> Result, String> { - Ok(vec![]) - } - - #[tauri::command] - pub async fn runtime_broadcast_event( - _event: String, - _data: serde_json::Value, - ) -> Result<(), String> { - // Silent no-op on mobile - Ok(()) - } - - #[tauri::command] - pub async fn runtime_enable_skill(_skill_id: String) -> Result<(), String> { - Err(MOBILE_ERROR.to_string()) - } - - #[tauri::command] - pub async fn runtime_disable_skill(_skill_id: String) -> Result<(), String> { - Err(MOBILE_ERROR.to_string()) - } - - #[tauri::command] - pub async fn runtime_is_skill_enabled(_skill_id: String) -> Result { - Ok(false) - } - - #[tauri::command] - pub async fn runtime_get_skill_preferences() -> Result { - Ok(serde_json::json!({})) - } - - #[tauri::command] - pub async fn runtime_skill_kv_get( - _skill_id: String, - _key: String, - ) -> Result { - Err(MOBILE_ERROR.to_string()) - } - - #[tauri::command] - pub async fn runtime_skill_kv_set( - _skill_id: String, - _key: String, - _value: serde_json::Value, - ) -> Result<(), String> { - Err(MOBILE_ERROR.to_string()) - } - - #[tauri::command] - pub async fn runtime_rpc( - _skill_id: String, - _method: String, - _params: serde_json::Value, - ) -> Result { - Err(MOBILE_ERROR.to_string()) - } - - #[tauri::command] - pub async fn runtime_skill_data_read( - _skill_id: String, - _filename: String, - ) -> Result { - Err(MOBILE_ERROR.to_string()) - } - - #[tauri::command] - pub async fn runtime_skill_data_write( - _skill_id: String, - _filename: String, - _content: String, - ) -> Result<(), String> { - Err(MOBILE_ERROR.to_string()) - } - - #[tauri::command] - pub async fn runtime_skill_data_dir(_skill_id: String) -> Result { - Err(MOBILE_ERROR.to_string()) - } - - #[tauri::command] - pub async fn runtime_get_tool_schemas() -> Result, String> { - Ok(vec![]) - } - - #[tauri::command] - pub async fn runtime_execute_tool( - _tool_id: String, - _args: serde_json::Value, - ) -> Result { - Err(MOBILE_ERROR.to_string()) - } -} - // ============================================================================= // Socket.io commands (available on all platforms) // ============================================================================= @@ -713,15 +547,11 @@ pub async fn runtime_socket_emit( } // ============================================================================= -// Re-exports based on platform +// Re-exports // ============================================================================= -#[cfg(not(any(target_os = "android", target_os = "ios")))] pub use desktop::*; -#[cfg(any(target_os = "android", target_os = "ios"))] -pub use mobile::*; - // ============================================================================= // Tests // ============================================================================= @@ -731,7 +561,6 @@ mod tests { use super::*; use std::sync::Arc; - #[cfg(not(any(target_os = "android", target_os = "ios")))] mod desktop_tests { use super::*; use crate::runtime::qjs_engine::RuntimeEngine; @@ -910,30 +739,6 @@ mod tests { } } - #[cfg(any(target_os = "android", target_os = "ios"))] - mod mobile_tests { - use super::*; - - #[tokio::test] - async fn test_mobile_stub_runtime_get_tool_schemas() { - let result = mobile::runtime_get_tool_schemas().await; - - // Mobile should return empty list with helpful error - assert!(result.is_err()); - assert!(result.unwrap_err().contains("not available on mobile")); - } - - #[tokio::test] - async fn test_mobile_stub_runtime_execute_tool() { - let result = - mobile::runtime_execute_tool("test_tool".to_string(), "{}".to_string()).await; - - // Mobile should return error - assert!(result.is_err()); - assert!(result.unwrap_err().contains("not available on mobile")); - } - } - #[test] fn test_zeroclaw_struct_defaults() { // Test that ZeroClaw structs can be created with serde_json diff --git a/src-tauri/src/commands/unified_skills.rs b/src-tauri/src/commands/unified_skills.rs index 48106d68c..e6cd06125 100644 --- a/src-tauri/src/commands/unified_skills.rs +++ b/src-tauri/src/commands/unified_skills.rs @@ -4,146 +4,83 @@ //! Internally they dispatch to the QuickJS runtime (openhuman skills) or the //! file-based executor (openclaw skills) based on `skill_type`. //! -//! Commands are desktop-only — mobile stubs return empty/error results. +//! Commands are desktop-only in this host. use crate::runtime::types::{UnifiedSkillEntry, UnifiedSkillResult}; use crate::unified_skills::self_evolve::{SelfEvolveRequest, SelfEvolveResult}; use crate::unified_skills::GenerateSkillSpec; +use crate::{runtime::qjs_engine::RuntimeEngine, unified_skills::UnifiedSkillRegistry}; use std::sync::Arc; use tauri::State; -#[cfg(not(any(target_os = "android", target_os = "ios")))] -use crate::runtime::qjs_engine::RuntimeEngine; - -// ============================================================================= -// Desktop implementations -// ============================================================================= - -#[cfg(not(any(target_os = "android", target_os = "ios")))] -mod desktop { - use super::*; - use crate::unified_skills::UnifiedSkillRegistry; - - /// List all skills from the unified registry (both openhuman and openclaw types). - #[tauri::command] - pub async fn unified_list_skills( - engine: State<'_, Arc>, - ) -> Result, String> { - let registry = UnifiedSkillRegistry::new(Arc::clone(&engine)); - Ok(registry.list_all().await) - } - - /// Execute a named tool on any registered skill. - /// - /// Dispatches based on skill_type: - /// - `openhuman` → QuickJS runtime - /// - `openclaw` → shell/http executor or returns prompt content - #[tauri::command] - pub async fn unified_execute_skill( - engine: State<'_, Arc>, - skill_id: String, - tool_name: String, - args: serde_json::Value, - ) -> Result { - let registry = UnifiedSkillRegistry::new(Arc::clone(&engine)); - registry.execute(&skill_id, &tool_name, args).await - } - - /// Programmatically generate a new skill, register it, and return its entry. - /// - /// For `skill_type = "openhuman"`: writes manifest.json + index.js to the skills dir. - /// For `skill_type = "openclaw"`: writes SKILL.md or SKILL.toml to workspace/skills/. - /// - /// The skill is immediately available in subsequent `unified_list_skills` calls. - #[tauri::command] - pub async fn unified_generate_skill( - engine: State<'_, Arc>, - spec: GenerateSkillSpec, - ) -> Result { - let registry = UnifiedSkillRegistry::new(Arc::clone(&engine)); - registry.generate(spec).await - } - - /// Self-evolving skill generation. - /// - /// Uses an LLM to generate QuickJS skill code, tests it in an isolated - /// QuickJS context, and iterates until the skill passes or the iteration - /// budget is exhausted. Emits `skill:evolve:progress` events after each - /// iteration. - #[tauri::command] - pub async fn unified_self_evolve_skill( - engine: State<'_, Arc>, - app: tauri::AppHandle, - request: SelfEvolveRequest, - ) -> Result { - use crate::unified_skills::self_evolve::SkillEvolver; - use tauri::Emitter; - - let registry = Arc::new(UnifiedSkillRegistry::new(Arc::clone(&engine))); - let evolver = SkillEvolver::new(registry); - let app_clone = app.clone(); - - evolver - .evolve(request, move |iteration, passed| { - let _ = app_clone.emit( - "skill:evolve:progress", - serde_json::json!({ - "iteration": iteration, - "passed": passed, - }), - ); - }) - .await - } +/// List all skills from the unified registry (both openhuman and openclaw types). +#[tauri::command] +pub async fn unified_list_skills( + engine: State<'_, Arc>, +) -> Result, String> { + let registry = UnifiedSkillRegistry::new(Arc::clone(&engine)); + Ok(registry.list_all().await) } -// ============================================================================= -// Mobile stubs (QuickJS not available on Android/iOS) -// ============================================================================= - -#[cfg(any(target_os = "android", target_os = "ios"))] -mod mobile { - use super::*; - - #[tauri::command] - pub async fn unified_list_skills() -> Result, String> { - Ok(vec![]) - } - - #[tauri::command] - pub async fn unified_execute_skill( - _skill_id: String, - _tool_name: String, - _args: serde_json::Value, - ) -> Result { - Err("Unified skill execution is not available on mobile platforms.".to_string()) - } - - #[tauri::command] - pub async fn unified_generate_skill( - _spec: GenerateSkillSpec, - ) -> Result { - Err("Skill generation is not available on mobile platforms.".to_string()) - } - - #[tauri::command] - pub async fn unified_self_evolve_skill( - _request: SelfEvolveRequest, - ) -> Result { - Err("Self-evolving skills are not available on mobile platforms.".to_string()) - } +/// Execute a named tool on any registered skill. +/// +/// Dispatches based on skill_type: +/// - `openhuman` → QuickJS runtime +/// - `openclaw` → shell/http executor or returns prompt content +#[tauri::command] +pub async fn unified_execute_skill( + engine: State<'_, Arc>, + skill_id: String, + tool_name: String, + args: serde_json::Value, +) -> Result { + let registry = UnifiedSkillRegistry::new(Arc::clone(&engine)); + registry.execute(&skill_id, &tool_name, args).await } -// ============================================================================= -// Re-export the right module based on platform -// ============================================================================= +/// Programmatically generate a new skill, register it, and return its entry. +/// +/// For `skill_type = "openhuman"`: writes manifest.json + index.js to the skills dir. +/// For `skill_type = "openclaw"`: writes SKILL.md or SKILL.toml to workspace/skills/. +/// +/// The skill is immediately available in subsequent `unified_list_skills` calls. +#[tauri::command] +pub async fn unified_generate_skill( + engine: State<'_, Arc>, + spec: GenerateSkillSpec, +) -> Result { + let registry = UnifiedSkillRegistry::new(Arc::clone(&engine)); + registry.generate(spec).await +} -#[cfg(not(any(target_os = "android", target_os = "ios")))] -pub use desktop::{ - unified_execute_skill, unified_generate_skill, unified_list_skills, unified_self_evolve_skill, -}; +/// Self-evolving skill generation. +/// +/// Uses an LLM to generate QuickJS skill code, tests it in an isolated +/// QuickJS context, and iterates until the skill passes or the iteration +/// budget is exhausted. Emits `skill:evolve:progress` events after each +/// iteration. +#[tauri::command] +pub async fn unified_self_evolve_skill( + engine: State<'_, Arc>, + app: tauri::AppHandle, + request: SelfEvolveRequest, +) -> Result { + use crate::unified_skills::self_evolve::SkillEvolver; + use tauri::Emitter; -#[cfg(any(target_os = "android", target_os = "ios"))] -pub use mobile::{ - unified_execute_skill, unified_generate_skill, unified_list_skills, unified_self_evolve_skill, -}; + let registry = Arc::new(UnifiedSkillRegistry::new(Arc::clone(&engine))); + let evolver = SkillEvolver::new(registry); + let app_clone = app.clone(); + + evolver + .evolve(request, move |iteration, passed| { + let _ = app_clone.emit( + "skill:evolve:progress", + serde_json::json!({ + "iteration": iteration, + "passed": passed, + }), + ); + }) + .await +} diff --git a/src-tauri/src/core_process.rs b/src-tauri/src/core_process.rs index f4974e092..f2851f5ea 100644 --- a/src-tauri/src/core_process.rs +++ b/src-tauri/src/core_process.rs @@ -1,3 +1,4 @@ +use std::path::PathBuf; use std::sync::Arc; use tokio::process::{Child, Command}; @@ -7,13 +8,15 @@ use tokio::sync::Mutex; pub struct CoreProcessHandle { child: Arc>>, port: u16, + core_bin: Option, } impl CoreProcessHandle { - pub fn new(port: u16) -> Self { + pub fn new(port: u16, core_bin: Option) -> Self { Self { child: Arc::new(Mutex::new(None)), port, + core_bin, } } @@ -32,20 +35,28 @@ impl CoreProcessHandle { let mut guard = self.child.lock().await; if guard.is_none() { - let exe = std::env::current_exe() - .map_err(|e| format!("failed to resolve current executable: {e}"))?; - - let mut cmd = Command::new(exe); - cmd.arg("core") - .arg("serve") - .arg("--port") - .arg(self.port.to_string()); - - log::info!( - "[core] spawning core process: {:?} core serve --port {}", - cmd.as_std().get_program(), - self.port - ); + let mut cmd = if let Some(core_bin) = &self.core_bin { + let mut cmd = Command::new(core_bin); + cmd.arg("serve").arg("--port").arg(self.port.to_string()); + log::info!( + "[core] spawning dedicated core binary: {:?} serve --port {}", + cmd.as_std().get_program(), + self.port + ); + cmd + } else { + let exe = std::env::current_exe() + .map_err(|e| format!("failed to resolve current executable: {e}"))?; + let mut cmd = Command::new(exe); + cmd.arg("core") + .arg("serve") + .arg("--port") + .arg(self.port.to_string()); + log::warn!( + "[core] dedicated core binary not found; falling back to self subcommand" + ); + cmd + }; let child = cmd .spawn() @@ -93,3 +104,60 @@ pub fn default_core_port() -> u16 { .and_then(|v| v.parse::().ok()) .unwrap_or(7788) } + +pub fn default_core_bin() -> Option { + if let Ok(path) = std::env::var("OPENHUMAN_CORE_BIN") { + let candidate = PathBuf::from(path); + if candidate.exists() { + return Some(candidate); + } + } + + let exe = std::env::current_exe().ok()?; + let exe_dir = exe.parent()?; + + #[cfg(windows)] + let standalone = exe_dir.join("openhuman-core.exe"); + #[cfg(not(windows))] + let standalone = exe_dir.join("openhuman-core"); + + if standalone.exists() { + return Some(standalone); + } + + // Sidecar layout: bundle.externalBin("binaries/openhuman-core") is emitted as + // openhuman-core-(.exe) under app resources. + let mut search_dirs = vec![exe_dir.to_path_buf()]; + #[cfg(target_os = "macos")] + { + if let Some(resources_dir) = exe_dir.parent().map(|p| p.join("Resources")) { + search_dirs.push(resources_dir); + } + } + + for dir in search_dirs { + let Ok(entries) = std::fs::read_dir(&dir) else { + continue; + }; + for entry in entries.flatten() { + let path = entry.path(); + if !path.is_file() { + continue; + } + let Some(file_name) = path.file_name().and_then(|n| n.to_str()) else { + continue; + }; + + #[cfg(windows)] + let matches = file_name.starts_with("openhuman-core-") && file_name.ends_with(".exe"); + #[cfg(not(windows))] + let matches = file_name.starts_with("openhuman-core-"); + + if matches { + return Some(path); + } + } + } + + None +} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index e809a5e5e..a098a70d3 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -8,26 +8,26 @@ //! - Secure session storage //! - Native notifications -mod ai; -mod auth; +#[cfg(any(target_os = "android", target_os = "ios"))] +compile_error!("src-tauri host is desktop-only. Android/iOS support has been removed."); + mod commands; mod core_process; mod core_rpc; -pub mod core_server; pub mod memory; mod models; -pub mod openhuman; +mod openhuman_daemon; mod runtime; mod services; mod unified_skills; mod utils; -use ai::*; use commands::chat::ChatState; use commands::unified_skills::{ unified_execute_skill, unified_generate_skill, unified_list_skills, unified_self_evolve_skill, }; use commands::*; +use openhuman_core::ai::*; use serde::Serialize; use services::socket_service::SOCKET_SERVICE; use std::collections::HashMap; @@ -213,11 +213,19 @@ fn resolve_ai_directory(app: &tauri::AppHandle) -> Option<(PathBuf, &'static str } if let Ok(cwd) = std::env::current_dir() { - let root_dev_dir = cwd.join("src-tauri").join("ai"); + let root_dev_dir = cwd.join("rust-core").join("ai"); if root_dev_dir.is_dir() { return Some((root_dev_dir, "bundled")); } + let src_tauri_dev_dir = cwd + .parent() + .map(|p| p.join("rust-core").join("ai")) + .filter(|p| p.is_dir()); + if let Some(path) = src_tauri_dev_dir { + return Some((path, "bundled")); + } + let fallback = cwd.join("ai"); if fallback.is_dir() { return Some((fallback, "bundled")); @@ -282,7 +290,7 @@ async fn ai_refresh_config(app: tauri::AppHandle) -> Result { Ok(build_ai_preview(&app)) } -/// Write AI configuration files to the src-tauri/ai/ directory +/// Write AI configuration files to the rust-core/ai/ directory #[tauri::command] async fn write_ai_config_file(filename: String, content: String) -> Result { use std::env; @@ -301,11 +309,21 @@ async fn write_ai_config_file(filename: String, content: String) -> Result {cwd}/src-tauri/ai - // 2) src-tauri dir -> {cwd}/ai - let ai_dir = if current_dir.join("src-tauri").is_dir() { - current_dir.join("src-tauri").join("ai") + // Resolve ai directory for common dev cwd variants: + // 1) repo root -> {cwd}/rust-core/ai + // 2) src-tauri dir -> {cwd}/../rust-core/ai + // 3) rust-core dir -> {cwd}/ai + let ai_dir = if current_dir.join("rust-core").is_dir() { + current_dir.join("rust-core").join("ai") + } else if current_dir + .file_name() + .and_then(|name| name.to_str()) + .is_some_and(|name| name == "src-tauri") + { + current_dir + .parent() + .map(|p| p.join("rust-core").join("ai")) + .unwrap_or_else(|| current_dir.join("ai")) } else { current_dir.join("ai") }; @@ -573,7 +591,6 @@ async fn watch_daemon_health_file(app_handle: AppHandle, data_dir: PathBuf) { } } -#[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { if let Err(err) = rustls::crypto::ring::default_provider().install_default() { log::warn!( @@ -586,16 +603,7 @@ pub fn run() { let daemon_mode = is_daemon_mode(); - // Initialize platform-appropriate logger - #[cfg(target_os = "android")] - { - android_logger::init_once( - android_logger::Config::default() - .with_max_level(log::LevelFilter::Debug) - .with_tag("OpenHuman"), - ); - } - #[cfg(not(target_os = "android"))] + // Initialize logger { use env_logger::fmt::style::{AnsiColor, Style}; use std::io::Write; @@ -747,8 +755,7 @@ pub fn run() { ); socket_mgr.set_app_handle(app.handle().clone()); - // Initialize QuickJS Runtime Engine (desktop only - not available on Android/iOS) - #[cfg(not(any(target_os = "android", target_os = "ios")))] + // Initialize QuickJS Runtime Engine { let data_dir = app .path() @@ -806,18 +813,7 @@ pub fn run() { } } - #[cfg(target_os = "android")] - { - log::info!("[runtime] QuickJS runtime disabled on Android"); - } - - #[cfg(target_os = "ios")] - { - log::info!("[runtime] QuickJS runtime disabled on iOS"); - } - - // Start the openhuman daemon supervisor (desktop only) - #[cfg(not(any(target_os = "android", target_os = "ios")))] + // Start the openhuman daemon supervisor { let data_dir = app .path() @@ -827,9 +823,11 @@ pub fn run() { .unwrap_or_else(|| std::path::PathBuf::from(".")) .join(".openhuman") }); - let daemon_config = openhuman::config::DaemonConfig::from_app_data_dir(&data_dir); + let daemon_config = openhuman_core::openhuman::config::DaemonConfig::from_app_data_dir( + &data_dir, + ); let cancel = tokio_util::sync::CancellationToken::new(); - let daemon_handle = openhuman::daemon::DaemonHandle { + let daemon_handle = openhuman_daemon::DaemonHandle { cancel: cancel.clone(), }; app.manage(daemon_handle); @@ -851,12 +849,9 @@ pub fn run() { let app_handle_for_daemon = app.handle().clone(); tauri::async_runtime::spawn(async move { log::info!("[openhuman] Starting daemon supervisor with health monitoring"); - if let Err(e) = openhuman::daemon::run( - daemon_config, - app_handle_for_daemon, - cancel, - ) - .await + if let Err(e) = + openhuman_daemon::run(daemon_config, app_handle_for_daemon, cancel) + .await { log::error!("[openhuman] Daemon supervisor error: {e}"); } @@ -876,13 +871,13 @@ pub fn run() { // Start the external platform service tauri::async_runtime::spawn(async move { - match openhuman::config::Config::load_or_init().await { + match openhuman_core::openhuman::config::Config::load_or_init().await { Ok(config) => { - match openhuman::service::install(&config) { + match openhuman_core::openhuman::service::install(&config) { Ok(status) => log::info!("[openhuman] External daemon service installed: {:?}", status), Err(e) => log::error!("[openhuman] Failed to install external daemon service: {e}"), } - match openhuman::service::start(&config) { + match openhuman_core::openhuman::service::start(&config) { Ok(status) => log::info!("[openhuman] External daemon service started: {:?}", status), Err(e) => log::error!("[openhuman] Failed to start external daemon service: {e}"), } @@ -898,9 +893,11 @@ pub fn run() { } // Start/ensure standalone core process for business logic RPC. - #[cfg(not(any(target_os = "android", target_os = "ios")))] { - let core_handle = core_process::CoreProcessHandle::new(core_process::default_core_port()); + let core_handle = core_process::CoreProcessHandle::new( + core_process::default_core_port(), + core_process::default_core_bin(), + ); std::env::set_var("OPENHUMAN_CORE_RPC_URL", core_handle.rpc_url()); app.manage(core_handle.clone()); tauri::async_runtime::spawn(async move { @@ -919,10 +916,10 @@ pub fn run() { } // Initialize TinyHumans memory state (empty until the frontend provides the JWT) - app.manage(commands::memory::MemoryState(std::sync::Mutex::new(None))); + app.manage(crate::memory::MemoryState(std::sync::Mutex::new(None))); log::info!("[memory] Memory state registered — awaiting JWT from frontend"); - // Spawn conscious loop periodic timer (desktop only; mobile skips inside the fn) + // Spawn conscious loop periodic timer let app_for_conscious = app.handle().clone(); tauri::async_runtime::spawn(async move { commands::conscious_loop::conscious_loop_timer(app_for_conscious).await; @@ -1098,139 +1095,6 @@ pub fn run() { conscious_loop_run, ] } - #[cfg(not(desktop))] - { - tauri::generate_handler![ - // Common handlers (expanded from common_handlers! macro) - greet, - // AI config file writing - write_ai_config_file, - ai_get_config, - ai_refresh_config, - get_auth_state, - get_session_token, - get_current_user, - is_authenticated, - logout, - store_session, - socket_connect, - socket_disconnect, - get_socket_state, - is_socket_connected, - report_socket_connected, - report_socket_disconnected, - report_socket_error, - update_socket_status, - // AI encryption commands - ai_init_encryption, - ai_encrypt, - ai_decrypt, - // AI memory filesystem commands - ai_memory_init, - ai_memory_upsert_file, - ai_memory_get_file, - ai_memory_upsert_chunk, - ai_memory_delete_chunks_by_path, - ai_memory_fts_search, - ai_memory_get_chunks, - ai_memory_get_all_embeddings, - ai_memory_cache_embedding, - ai_memory_get_cached_embedding, - ai_memory_set_meta, - ai_memory_get_meta, - // AI session commands - ai_sessions_init, - ai_sessions_load_index, - ai_sessions_update_index, - ai_sessions_append_transcript, - ai_sessions_read_transcript, - ai_sessions_delete, - ai_sessions_list, - ai_read_memory_file, - ai_write_memory_file, - ai_list_memory_files, - // Runtime commands - runtime_discover_skills, - runtime_list_skills, - runtime_start_skill, - runtime_stop_skill, - runtime_get_skill_state, - runtime_call_tool, - runtime_all_tools, - runtime_get_tool_schemas, - runtime_execute_tool, - runtime_broadcast_event, - // Runtime enable/disable + KV commands - runtime_enable_skill, - runtime_disable_skill, - runtime_is_skill_enabled, - runtime_get_skill_preferences, - runtime_skill_kv_get, - runtime_skill_kv_set, - // Runtime JSON-RPC + data commands - runtime_rpc, - runtime_skill_data_read, - runtime_skill_data_write, - runtime_skill_data_dir, - // Socket.io commands (Rust-native persistent connection) - runtime_socket_connect, - runtime_socket_disconnect, - runtime_socket_state, - runtime_socket_emit, - // Telegram commands removed (unified system eliminated as per user request) - // Model commands (backend API proxy) - model_summarize, - model_generate, - // OpenHuman commands - openhuman_health_snapshot, - openhuman_security_policy_info, - openhuman_encrypt_secret, - openhuman_decrypt_secret, - openhuman_get_config, - openhuman_update_model_settings, - openhuman_update_memory_settings, - openhuman_update_gateway_settings, - openhuman_update_tunnel_settings, - openhuman_update_runtime_settings, - openhuman_update_browser_settings, - openhuman_get_runtime_flags, - openhuman_set_browser_allow_all, - openhuman_agent_chat, - openhuman_doctor_report, - openhuman_doctor_models, - openhuman_list_integrations, - openhuman_get_integration_info, - openhuman_models_refresh, - openhuman_migrate_openclaw, - openhuman_hardware_discover, - openhuman_hardware_introspect, - openhuman_service_install, - openhuman_service_start, - openhuman_service_stop, - openhuman_service_status, - openhuman_service_uninstall, - openhuman_agent_server_status, - // Unified skill registry commands (mobile stubs) - unified_list_skills, - unified_execute_skill, - unified_generate_skill, - unified_self_evolve_skill, - // Memory commands (TinyHumans Neocortex) - init_memory_client, - memory_query, - recall_memory, - memory_list_documents, - memory_list_namespaces, - memory_delete_document, - memory_query_namespace, - memory_recall_namespace, - // Chat commands (agentic conversation loop) - chat_send, - chat_cancel, - // Conscious loop (mobile stub — returns error) - conscious_loop_run, - ] - } }) .build({ let mut context = tauri::generate_context!(); @@ -1251,12 +1115,12 @@ pub fn run() { } // Gracefully shut down background services before process exit. - #[cfg(not(any(target_os = "android", target_os = "ios")))] RunEvent::Exit => { log::info!("[app] Exit event received, shutting down"); // Cancel the openhuman daemon supervisor - if let Some(daemon) = app_handle.try_state::() { + if let Some(daemon) = app_handle.try_state::() + { daemon.cancel.cancel(); log::info!("[openhuman] Daemon shutdown signalled"); } @@ -1279,5 +1143,5 @@ pub fn run() { } pub fn run_core_from_args(args: &[String]) -> anyhow::Result<()> { - core_server::run_from_cli_args(args) + openhuman_core::run_core_from_args(args) } diff --git a/src-tauri/src/memory/mod.rs b/src-tauri/src/memory/mod.rs index beb6f02c6..f607acf38 100644 --- a/src-tauri/src/memory/mod.rs +++ b/src-tauri/src/memory/mod.rs @@ -1,447 +1 @@ -//! TinyHumans Neocortex persistent memory layer. -//! -//! Wraps `TinyHumanMemoryClient` with helpers for skill data-sync. -//! The client is initialised at runtime with the user's JWT token (from Redux -//! `authSlice.token`) via the `init_memory_client` Tauri command, not from env vars. - -use std::sync::Arc; -use tinyhumansai::{ - DeleteMemoryParams, InsertMemoryParams, Priority, QueryMemoryParams, RecallMemoryParams, - SourceType, TinyHumanConfig, TinyHumansMemoryClient, -}; -use uuid::Uuid; - -/// Shared, cloneable handle to the memory client. -pub type MemoryClientRef = Arc; - -pub struct MemoryClient { - inner: TinyHumansMemoryClient, -} - -impl MemoryClient { - /// Construct from a JWT token (sourced from `authSlice.token` in the Redux store). - /// Returns `None` if the token is empty or client construction fails. - pub fn from_token(jwt_token: String) -> Option { - log::info!( - "[memory] from_token: entry (token_len={})", - jwt_token.trim().len() - ); - if jwt_token.trim().is_empty() { - log::warn!("[memory] from_token: exit — token is empty, returning None"); - return None; - } - let config = if let Ok(base_url) = - std::env::var("OPENHUMAN_BASE_URL").or_else(|_| std::env::var("TINYHUMANS_BASE_URL")) - { - log::info!( - "[memory] from_token: constructing client (base_url={base_url}, source=memory_env)" - ); - TinyHumanConfig::new(jwt_token).with_base_url(base_url) - } else { - let backend_url = crate::utils::config::get_backend_url(); - log::info!( - "[memory] from_token: constructing client (base_url={backend_url}, source=app_backend_url)" - ); - TinyHumanConfig::new(jwt_token).with_base_url(backend_url) - }; - match TinyHumansMemoryClient::new(config) { - Ok(inner) => { - log::info!("[memory] from_token: exit — client created successfully"); - Some(Self { inner }) - } - Err(e) => { - log::warn!("[memory] from_token: exit — client construction failed: {e}"); - None - } - } - } - - /// Store a skill data-sync result. - /// - /// Inserts the document then polls `ingestion_job_status` every 30 s until - /// the job reaches `completed` (or `failed`/`error`). Returns only after the - /// ingestion job is confirmed complete. - pub async fn store_skill_sync( - &self, - skill_id: &str, - integration_id: &str, - title: &str, - content: &str, - source_type: Option, - metadata: Option, - priority: Option, - created_at: Option, - updated_at: Option, - document_id: Option, - ) -> Result<(), String> { - let namespace = skill_id.to_string(); - log::info!( - "[memory] store_skill_sync: entry (namespace={namespace}, title={title:?}, content_len={})", - content.len() - ); - - let document_id_final = document_id.unwrap_or_else(|| Uuid::new_v4().to_string()); - - log::info!( - "[memory] insert_memory: calling SDK (namespace={namespace}, title={title:?}), content_len={}", - content.len() - ); - - let insert_resp = self - .inner - .insert_memory(InsertMemoryParams { - document_id: document_id_final, - title: title.to_string(), - content: content.to_string(), - namespace: namespace.clone(), - source_type, - metadata, - priority, - created_at, - updated_at, - ..Default::default() - }) - .await - .map_err(|e| { - log::warn!( - "[memory] insert_memory: SDK error — kind={:?} msg={e}", - classify_insert_error(&e) - ); - format!("Memory insert failed: {e}") - })?; - - log::info!( - "[memory] insert_memory: accepted (namespace={namespace}, status={:?}, job_id={:?})", - insert_resp.data.status, - insert_resp.data.job_id - ); - - // If the API returned a job_id, poll until the job completes. - if let Some(job_id) = insert_resp.data.job_id { - log::info!("[memory] ingestion job queued (job_id={job_id}), polling every 30s..."); - - loop { - tokio::time::sleep(std::time::Duration::from_secs(30)).await; - - match self.inner.get_ingestion_job(&job_id).await { - Ok(status_resp) => { - let state = status_resp.data.state.as_deref().unwrap_or("unknown"); - - log::info!( - "[memory] ingestion job status: job_id={job_id}, state={state}, \ - attempts={:?}, completed_at={:?}", - status_resp.data.attempts, - status_resp.data.completed_at - ); - - match state { - "completed" => { - log::info!( - "[memory] ingestion job completed (job_id={job_id}, namespace={namespace})" - ); - break; - } - "failed" | "error" => { - let err_msg = status_resp - .data - .error - .unwrap_or_else(|| format!("job state={state}")); - log::warn!( - "[memory] ingestion job failed: job_id={job_id}, error={err_msg}" - ); - log::warn!( - "[memory] store_skill_sync: exit — ingestion failed (namespace={namespace})" - ); - return Err(format!("Ingestion job failed: {err_msg}")); - } - _ => { - // pending / processing / queued — keep waiting - log::info!( - "[memory] ingestion job still in progress (state={state}), waiting 30s..." - ); - } - } - } - Err(e) => { - log::warn!( - "[memory] ingestion job status poll error (job_id={job_id}): {e} — retrying in 30s" - ); - } - } - } - } else { - log::info!("[memory] no job_id returned — insert assumed synchronous, proceeding"); - } - - log::info!("[memory] store_skill_sync: exit — ok (namespace={namespace})"); - Ok(()) - } - - /// Query relevant context for a skill integration (RAG). - pub async fn query_skill_context( - &self, - skill_id: &str, - _integration_id: &str, - query: &str, - max_chunks: u32, - ) -> Result { - let namespace = skill_id.to_string(); - log::info!("[memory] query_skill_context: entry (namespace={namespace}, max_chunks={max_chunks}, query={query:?})"); - log::debug!( - "[memory] query_skill_context: payload → namespace={namespace} | max_chunks={max_chunks} | query={query}" - ); - let res = self - .inner - .query_memory(QueryMemoryParams { - query: query.to_string(), - namespace: Some(namespace.clone()), - max_chunks: Some(f64::from(max_chunks)), - ..Default::default() - }) - .await - .map_err(|e| { - log::warn!( - "[memory] query_skill_context: exit — error (namespace={namespace}): {e}" - ); - format!("Memory query failed: {e}") - })?; - let response = res.data.response.unwrap_or_default(); - log::info!( - "[memory] query_skill_context: exit — ok (namespace={namespace}, response_len={})", - response.len() - ); - Ok(response) - } - - /// Recall context from the Master memory node for a given namespace. - /// Returns the synthesised `response` string, or `None` if the server returned nothing. - pub async fn recall_skill_context( - &self, - skill_id: &str, - _integration_id: &str, - max_chunks: u32, - ) -> Result, String> { - let namespace = skill_id.to_string(); - log::info!( - "[memory] recall_skill_context: entry (namespace={namespace}, max_chunks={max_chunks})" - ); - let res = self - .inner - .recall_memory(RecallMemoryParams { - namespace: Some(namespace.clone()), - max_chunks: Some(f64::from(max_chunks)), - }) - .await - .map_err(|e| { - log::warn!( - "[memory] recall_skill_context: exit — error (namespace={namespace}): {e}" - ); - format!("Memory recall failed: {e}") - })?; - let response = res.data.context; - log::info!( - "[memory] recall_skill_context: exit — ok (namespace={namespace}, has_response={})", - response.is_some() - ); - Ok(response) - } - - /// List all ingested memory documents as returned by the API. - pub async fn list_documents(&self) -> Result { - self.inner - .list_documents(tinyhumansai::ListDocumentsParams::default()) - .await - .map_err(|e| format!("Memory list documents failed: {e}")) - } - - /// Delete a specific document from a namespace. - pub async fn delete_document( - &self, - document_id: &str, - namespace: &str, - ) -> Result { - self.inner - .delete_document(document_id, namespace) - .await - .map_err(|e| format!("Memory delete document failed: {e}")) - } - - /// Query memory context by namespace directly. - pub async fn query_namespace_context( - &self, - namespace: &str, - query: &str, - max_chunks: u32, - ) -> Result { - let res = self - .inner - .query_memory(QueryMemoryParams { - query: query.to_string(), - namespace: Some(namespace.to_string()), - max_chunks: Some(f64::from(max_chunks)), - ..Default::default() - }) - .await - .map_err(|e| format!("Memory query failed: {e}"))?; - Ok(res.data.response.unwrap_or_default()) - } - - /// Recall memory context by namespace directly. - pub async fn recall_namespace_context( - &self, - namespace: &str, - max_chunks: u32, - ) -> Result, String> { - let res = self - .inner - .recall_memory(RecallMemoryParams { - namespace: Some(namespace.to_string()), - max_chunks: Some(f64::from(max_chunks)), - }) - .await - .map_err(|e| format!("Memory recall failed: {e}"))?; - Ok(res.data.response) - } - - /// Delete all memories for a skill integration (e.g. on OAuth revoke). - pub async fn clear_skill_memory( - &self, - skill_id: &str, - _integration_id: &str, - ) -> Result<(), String> { - let namespace = skill_id.to_string(); - log::info!("[memory] clear_skill_memory: entry (namespace={namespace})"); - log::debug!("[memory] clear_skill_memory: payload → namespace={namespace}"); - let result = self - .inner - .delete_memory(DeleteMemoryParams { - namespace: Some(namespace.clone()), - }) - .await - .map(|_| ()) - .map_err(|e| format!("Memory delete failed: {e}")); - match &result { - Ok(()) => log::info!("[memory] clear_skill_memory: exit — ok (namespace={namespace})"), - Err(e) => { - log::warn!("[memory] clear_skill_memory: exit — error (namespace={namespace}): {e}") - } - } - result - } -} - -fn classify_insert_error(e: &tinyhumansai::TinyHumansError) -> &'static str { - let msg = e.to_string(); - if msg.contains("dns") || msg.contains("resolve") || msg.contains("lookup") { - "dns_failure" - } else if msg.contains("tls") || msg.contains("certificate") || msg.contains("ssl") { - "tls_failure" - } else if msg.contains("Connection refused") || msg.contains("connection refused") { - "connection_refused" - } else if msg.contains("timed out") || msg.contains("deadline") { - "timeout" - } else if msg.contains("error sending request") { - "transport_error" - } else { - "other" - } -} - -#[cfg(test)] -mod tests { - use super::*; - - /// Integration test against the real TinyHumans production API. - /// - /// Verifies: JWT is accepted, endpoint is reachable, and request shape is correct. - /// A `400 Insufficient ingestion budget` response is treated as a PASS because it proves: - /// - auth succeeded (not 401/403) - /// - the endpoint and payload are correctly formed (not 422) - /// - the account quota is the only limiting factor - /// - /// Run with: - /// JWT_TOKEN= \ - /// cargo test --manifest-path src-tauri/Cargo.toml test_memory_skill_sync_flow -- --ignored --nocapture - #[tokio::test] - #[ignore] - async fn test_memory_skill_sync_flow() { - let jwt_token = std::env::var("JWT_TOKEN").expect("JWT_TOKEN must be set"); - - let client = MemoryClient::from_token(jwt_token).expect("client creation failed"); - - let skill_id = "gmail"; - let integration_id = "test@openhuman.dev"; - - let dummy_content = serde_json::json!({ - "integrationId": integration_id, - "type": "gmail_sync", - "summary": "Synced 45 emails from inbox", - "labels": ["Work", "Personal", "Finance"], - "recentSenders": ["alice@example.com", "bob@example.com"], - "unreadCount": 12, - "syncedAt": "2026-03-17T12:00:00Z" - }); - - // ── 1. Insert ───────────────────────────────────────────────────────── - let insert_result = client - .store_skill_sync( - skill_id, - integration_id, - "Gmail OAuth sync — test@openhuman.dev", - &serde_json::to_string_pretty(&dummy_content).unwrap(), - None, - None, - None, - None, - None, - None, - ) - .await; - - println!("[test] insert result: {insert_result:?}"); - - match &insert_result { - Ok(()) => { - println!("[test] ✓ INSERT succeeded — quota available"); - - // ── 2. Query ───────────────────────────────────────────────── - let context = client - .query_skill_context( - skill_id, - integration_id, - "What emails were recently synced and who sent them?", - 10, - ) - .await; - println!("[test] query result: {context:?}"); - assert!(context.is_ok(), "query_memory failed: {context:?}"); - println!("[test] memory context:\n{}", context.unwrap()); - - // ── 3. Cleanup ──────────────────────────────────────────────── - let del = client.clear_skill_memory(skill_id, integration_id).await; - println!("[test] delete result: {del:?}"); - assert!(del.is_ok(), "delete_memory failed: {del:?}"); - } - Err(e) if e.contains("Insufficient ingestion budget") => { - // Account quota exhausted — auth + endpoint + payload all correct. - println!( - "[test] ✓ API REACHABLE — auth accepted, endpoint correct.\n\ - Quota limited: {e}\n\ - Integration is wired correctly; upgrade the TinyHumans account \ - to enable full insert/query/delete flow." - ); - // Not a code failure — pass the test. - } - Err(e) => { - panic!("Unexpected error (not a quota issue): {e}"); - } - } - } - - /// Smoke test: from_token() returns None for an empty token. - #[test] - fn test_from_token_returns_none_for_empty_token() { - assert!(MemoryClient::from_token(String::new()).is_none()); - assert!(MemoryClient::from_token(" ".to_string()).is_none()); - } -} +pub use openhuman_core::memory::*; diff --git a/src-tauri/src/models/mod.rs b/src-tauri/src/models/mod.rs index 321ecbfb7..0548effdd 100644 --- a/src-tauri/src/models/mod.rs +++ b/src-tauri/src/models/mod.rs @@ -1,2 +1,2 @@ -pub mod auth; -pub mod socket; +pub use openhuman_core::models::auth; +pub use openhuman_core::models::socket; diff --git a/src-tauri/src/openhuman/daemon/mod.rs b/src-tauri/src/openhuman_daemon/mod.rs similarity index 84% rename from src-tauri/src/openhuman/daemon/mod.rs rename to src-tauri/src/openhuman_daemon/mod.rs index 39ac020c6..bfdab86de 100644 --- a/src-tauri/src/openhuman/daemon/mod.rs +++ b/src-tauri/src/openhuman_daemon/mod.rs @@ -13,7 +13,7 @@ use tokio::task::JoinHandle; use tokio::time::Duration; use tokio_util::sync::CancellationToken; -use crate::openhuman::config::{Config, DaemonConfig}; +use openhuman_core::openhuman::config::{Config, DaemonConfig}; /// How often the state writer emits health snapshots (seconds). const STATUS_FLUSH_SECONDS: u64 = 5; @@ -45,7 +45,7 @@ pub async fn run( let _ = tokio::fs::create_dir_all(&config.data_dir).await; let _ = tokio::fs::create_dir_all(&config.workspace_dir).await; - crate::openhuman::health::mark_component_ok("daemon"); + openhuman_core::openhuman::health::mark_component_ok("daemon"); let mut handles: Vec> = vec![]; @@ -76,7 +76,7 @@ pub async fn run( // Wait for cancellation (Tauri exit) cancel.cancelled().await; - crate::openhuman::health::mark_component_error("daemon", "shutdown requested"); + openhuman_core::openhuman::health::mark_component_error("daemon", "shutdown requested"); log::info!("[openhuman] Daemon supervisor shutting down (health events will stop)"); for handle in &handles { @@ -104,13 +104,14 @@ pub async fn run_full( .channel_max_backoff_secs .max(initial_backoff); - crate::openhuman::health::mark_component_ok("daemon"); + openhuman_core::openhuman::health::mark_component_ok("daemon"); if config.heartbeat.enabled { - let _ = crate::openhuman::heartbeat::engine::HeartbeatEngine::ensure_heartbeat_file( - &config.workspace_dir, - ) - .await; + let _ = + openhuman_core::openhuman::heartbeat::engine::HeartbeatEngine::ensure_heartbeat_file( + &config.workspace_dir, + ) + .await; } let mut handles: Vec> = @@ -126,7 +127,7 @@ pub async fn run_full( move || { let cfg = gateway_cfg.clone(); let host = gateway_host.clone(); - async move { crate::openhuman::gateway::run_gateway(&host, port, cfg).await } + async move { openhuman_core::openhuman::gateway::run_gateway(&host, port, cfg).await } }, )); } @@ -140,11 +141,11 @@ pub async fn run_full( max_backoff, move || { let cfg = channels_cfg.clone(); - async move { crate::openhuman::channels::start_channels(cfg).await } + async move { openhuman_core::openhuman::channels::start_channels(cfg).await } }, )); } else { - crate::openhuman::health::mark_component_ok("channels"); + openhuman_core::openhuman::health::mark_component_ok("channels"); log::info!("No real-time channels configured; channel supervisor disabled"); } } @@ -170,11 +171,11 @@ pub async fn run_full( max_backoff, move || { let cfg = scheduler_cfg.clone(); - async move { crate::openhuman::cron::scheduler::run(cfg).await } + async move { openhuman_core::openhuman::cron::scheduler::run(cfg).await } }, )); } else { - crate::openhuman::health::mark_component_ok("scheduler"); + openhuman_core::openhuman::health::mark_component_ok("scheduler"); log::info!("Cron disabled; scheduler supervisor not started"); } @@ -183,7 +184,7 @@ pub async fn run_full( log::info!("[openhuman] Components: gateway, channels, heartbeat, scheduler"); cancel.cancelled().await; - crate::openhuman::health::mark_component_error("daemon", "shutdown requested"); + openhuman_core::openhuman::health::mark_component_error("daemon", "shutdown requested"); for handle in &handles { handle.abort(); @@ -217,7 +218,7 @@ fn spawn_state_writer_full(config: Config, cancel: CancellationToken) -> JoinHan _ = interval.tick() => {}, _ = cancel.cancelled() => break, } - let mut json = crate::openhuman::health::snapshot_json(); + let mut json = openhuman_core::openhuman::health::snapshot_json(); if let Some(obj) = json.as_object_mut() { obj.insert( "written_at".into(), @@ -231,11 +232,11 @@ fn spawn_state_writer_full(config: Config, cancel: CancellationToken) -> JoinHan } async fn run_heartbeat_worker(config: Config) -> Result<()> { - let observer: std::sync::Arc = - std::sync::Arc::from(crate::openhuman::observability::create_observer( + let observer: std::sync::Arc = + std::sync::Arc::from(openhuman_core::openhuman::observability::create_observer( &config.observability, )); - let engine = crate::openhuman::heartbeat::engine::HeartbeatEngine::new( + let engine = openhuman_core::openhuman::heartbeat::engine::HeartbeatEngine::new( config.heartbeat.clone(), config.workspace_dir.clone(), observer, @@ -255,21 +256,27 @@ async fn run_heartbeat_worker(config: Config) -> Result<()> { for task in tasks { let prompt = format!("[Heartbeat Task] {task}"); let temp = config.default_temperature; - if let Err(e) = - crate::openhuman::agent::run(config.clone(), Some(prompt), None, None, temp, vec![]) - .await + if let Err(e) = openhuman_core::openhuman::agent::run( + config.clone(), + Some(prompt), + None, + None, + temp, + vec![], + ) + .await { - crate::openhuman::health::mark_component_error("heartbeat", e.to_string()); + openhuman_core::openhuman::health::mark_component_error("heartbeat", e.to_string()); log::warn!("Heartbeat task failed: {e}"); } else { - crate::openhuman::health::mark_component_ok("heartbeat"); + openhuman_core::openhuman::health::mark_component_ok("heartbeat"); } } } } fn has_supervised_channels(config: &Config) -> bool { - let crate::openhuman::config::ChannelsConfig { + let openhuman_core::openhuman::config::ChannelsConfig { cli: _, // `cli` is not used in the web UI webhook: _, // Managed by the gateway telegram, @@ -339,7 +346,7 @@ async fn spawn_state_writer( } } - let mut json = crate::openhuman::health::snapshot_json(); + let mut json = openhuman_core::openhuman::health::snapshot_json(); if let Some(obj) = json.as_object_mut() { obj.insert( "written_at".into(), @@ -387,10 +394,10 @@ where let max_backoff = max_backoff_secs.max(backoff); loop { - crate::openhuman::health::mark_component_ok(name); + openhuman_core::openhuman::health::mark_component_ok(name); match run_component().await { Ok(()) => { - crate::openhuman::health::mark_component_error( + openhuman_core::openhuman::health::mark_component_error( name, "component exited unexpectedly", ); @@ -399,12 +406,12 @@ where backoff = initial_backoff_secs.max(1); } Err(e) => { - crate::openhuman::health::mark_component_error(name, e.to_string()); + openhuman_core::openhuman::health::mark_component_error(name, e.to_string()); log::error!("Daemon component '{name}' failed: {e}"); } } - crate::openhuman::health::bump_component_restart(name); + openhuman_core::openhuman::health::bump_component_restart(name); tokio::time::sleep(Duration::from_secs(backoff)).await; // Double backoff AFTER sleeping so first error uses initial_backoff backoff = backoff.saturating_mul(2).min(max_backoff); @@ -426,7 +433,7 @@ mod tests { handle.abort(); let _ = handle.await; - let snapshot = crate::openhuman::health::snapshot_json(); + let snapshot = openhuman_core::openhuman::health::snapshot_json(); let component = &snapshot["components"]["th-daemon-test-fail"]; assert_eq!(component["status"], "error"); assert!(component["restart_count"].as_u64().unwrap_or(0) >= 1); @@ -444,7 +451,7 @@ mod tests { handle.abort(); let _ = handle.await; - let snapshot = crate::openhuman::health::snapshot_json(); + let snapshot = openhuman_core::openhuman::health::snapshot_json(); let component = &snapshot["components"]["th-daemon-test-exit"]; assert_eq!(component["status"], "error"); assert!(component["restart_count"].as_u64().unwrap_or(0) >= 1); diff --git a/src-tauri/src/runtime/bridge/tauri_bridge.rs b/src-tauri/src/runtime/bridge/tauri_bridge.rs deleted file mode 100644 index ecf44e795..000000000 --- a/src-tauri/src/runtime/bridge/tauri_bridge.rs +++ /dev/null @@ -1,57 +0,0 @@ -//! Platform and Tauri bridge for skills. -//! -//! Provides platform detection and native OS features like notifications. - -/// Get the current platform name. -pub fn get_platform() -> &'static str { - if cfg!(target_os = "macos") { - "macos" - } else if cfg!(target_os = "windows") { - "windows" - } else if cfg!(target_os = "linux") { - "linux" - } else if cfg!(target_os = "android") { - "android" - } else if cfg!(target_os = "ios") { - "ios" - } else { - "unknown" - } -} - -/// Send a native OS notification (desktop only). -#[cfg(desktop)] -pub fn send_notification( - app_handle: &tauri::AppHandle, - title: &str, - body: &str, -) -> Result<(), String> { - use tauri_plugin_notification::NotificationExt; - app_handle - .notification() - .builder() - .title(title) - .body(body) - .show() - .map_err(|e| format!("Notification failed: {e}")) -} - -/// Stub for mobile platforms where desktop notifications aren't available. -#[cfg(not(desktop))] -pub fn send_notification( - _app_handle: &tauri::AppHandle, - _title: &str, - _body: &str, -) -> Result<(), String> { - Err("Notifications not available on this platform".to_string()) -} - -/// Whitelisted environment values exposed to skills via `platform.env(key)`. -/// Skills should never hardcode host-specific URLs or secrets; use this instead. -pub fn get_skill_env(key: &str) -> Option { - match key { - "BACKEND_URL" => Some(crate::utils::config::get_backend_url()), - "PLATFORM" => Some(get_platform().to_string()), - _ => None, - } -} diff --git a/src-tauri/src/runtime/mod.rs b/src-tauri/src/runtime/mod.rs index 332a7e272..5b373546a 100644 --- a/src-tauri/src/runtime/mod.rs +++ b/src-tauri/src/runtime/mod.rs @@ -3,27 +3,12 @@ //! Provides a persistent JavaScript execution environment for skills //! using the QuickJS engine via `rquickjs`. //! -//! Note: The skill runtime is only available on desktop platforms. -//! On mobile (Android/iOS), the skill runtime is disabled. +//! Note: The skill runtime is desktop-only in this host. -// Platform-agnostic modules -pub mod loader; -pub mod manifest; -pub mod preferences; -pub mod socket_manager; -pub mod types; -pub mod utils; +// Runtime implementation now lives fully in rust-core. +pub use openhuman_core::runtime::{loader, manifest, preferences, types, utils}; -// QuickJS modules - desktop only (not available on Android/iOS) -#[cfg(not(any(target_os = "android", target_os = "ios")))] -pub mod bridge; -#[cfg(not(any(target_os = "android", target_os = "ios")))] -pub mod cron_scheduler; -#[cfg(not(any(target_os = "android", target_os = "ios")))] -pub mod ping_scheduler; -#[cfg(not(any(target_os = "android", target_os = "ios")))] -pub mod qjs_engine; -#[cfg(not(any(target_os = "android", target_os = "ios")))] -pub mod qjs_skill_instance; -#[cfg(not(any(target_os = "android", target_os = "ios")))] -pub mod skill_registry; +pub use openhuman_core::runtime::{ + bridge, cron_scheduler, ping_scheduler, qjs_engine, qjs_skill_instance, skill_registry, + socket_manager, +}; diff --git a/src-tauri/src/services/mod.rs b/src-tauri/src/services/mod.rs index 655f8a4a6..13b01790c 100644 --- a/src-tauri/src/services/mod.rs +++ b/src-tauri/src/services/mod.rs @@ -1,8 +1,5 @@ pub mod session_service; pub mod socket_service; -#[cfg(not(any(target_os = "android", target_os = "ios")))] -pub mod quickjs_libs; - #[cfg(desktop)] pub mod notification_service; diff --git a/src-tauri/src/services/session_service.rs b/src-tauri/src/services/session_service.rs index bd7f36ff4..f2aa44196 100644 --- a/src-tauri/src/services/session_service.rs +++ b/src-tauri/src/services/session_service.rs @@ -113,7 +113,6 @@ impl SessionService { } /// Save session to OS keychain - #[cfg(not(any(target_os = "ios", target_os = "android")))] fn save_to_keychain(&self, session: &StoredSession) -> Result<(), String> { let entry = keyring::Entry::new(KEYCHAIN_SERVICE, APP_IDENTIFIER) .map_err(|e| format!("Failed to create keyring entry: {}", e))?; @@ -129,7 +128,6 @@ impl SessionService { } /// Load session from OS keychain - #[cfg(not(any(target_os = "ios", target_os = "android")))] fn load_from_keychain(&self) -> Result { let entry = keyring::Entry::new(KEYCHAIN_SERVICE, APP_IDENTIFIER) .map_err(|e| format!("Failed to create keyring entry: {}", e))?; @@ -145,7 +143,6 @@ impl SessionService { } /// Delete session from OS keychain - #[cfg(not(any(target_os = "ios", target_os = "android")))] fn delete_from_keychain(&self) -> Result<(), String> { let entry = keyring::Entry::new(KEYCHAIN_SERVICE, APP_IDENTIFIER) .map_err(|e| format!("Failed to create keyring entry: {}", e))?; @@ -155,40 +152,6 @@ impl SessionService { Ok(()) } - - // iOS fallback implementations (keyring not supported) - #[cfg(target_os = "ios")] - fn save_to_keychain(&self, _session: &StoredSession) -> Result<(), String> { - // iOS uses different secure storage, handled by frontend - Ok(()) - } - - #[cfg(target_os = "ios")] - fn load_from_keychain(&self) -> Result { - Err("Not implemented for iOS".to_string()) - } - - #[cfg(target_os = "ios")] - fn delete_from_keychain(&self) -> Result<(), String> { - Ok(()) - } - - // Android fallback implementations (keyring not supported) - #[cfg(target_os = "android")] - fn save_to_keychain(&self, _session: &StoredSession) -> Result<(), String> { - // Android uses EncryptedSharedPreferences, handled by frontend - Ok(()) - } - - #[cfg(target_os = "android")] - fn load_from_keychain(&self) -> Result { - Err("Not implemented for Android".to_string()) - } - - #[cfg(target_os = "android")] - fn delete_from_keychain(&self) -> Result<(), String> { - Ok(()) - } } impl Default for SessionService { diff --git a/src-tauri/src/unified_skills/mod.rs b/src-tauri/src/unified_skills/mod.rs index a4d37ff69..bbea04c9f 100644 --- a/src-tauri/src/unified_skills/mod.rs +++ b/src-tauri/src/unified_skills/mod.rs @@ -14,11 +14,11 @@ pub mod openclaw_executor; pub mod self_evolve; pub mod skill_tester; -use crate::openhuman::skills::{load_skills, Skill}; use crate::runtime::qjs_engine::RuntimeEngine; use crate::runtime::types::{ToolDefinition, UnifiedSkillEntry, UnifiedSkillResult}; use chrono::Utc; use directories::UserDirs; +use openhuman_core::openhuman::skills::{load_skills, Skill}; use serde::{Deserialize, Serialize}; use std::path::PathBuf; use std::sync::Arc; diff --git a/src-tauri/src/unified_skills/openclaw_executor.rs b/src-tauri/src/unified_skills/openclaw_executor.rs index 55090804b..a4659429e 100644 --- a/src-tauri/src/unified_skills/openclaw_executor.rs +++ b/src-tauri/src/unified_skills/openclaw_executor.rs @@ -4,9 +4,9 @@ //! - SKILL.toml → structured tool definitions (shell/http commands) //! - SKILL.md → markdown prompt content (returned as text) -use crate::openhuman::skills::{Skill, SkillTool}; use crate::runtime::types::{ToolContent, UnifiedSkillResult}; use chrono::Utc; +use openhuman_core::openhuman::skills::{Skill, SkillTool}; use std::collections::HashMap; use std::net::IpAddr; diff --git a/src-tauri/src/utils/config.rs b/src-tauri/src/utils/config.rs index 23a2ee17d..1bc35f51a 100644 --- a/src-tauri/src/utils/config.rs +++ b/src-tauri/src/utils/config.rs @@ -8,7 +8,7 @@ use std::env; pub const DEFAULT_BACKEND_URL: &str = "https://api.tinyhumans.ai"; /// Application identifier for keychain storage -pub const APP_IDENTIFIER: &str = "com.openhuman.app"; +pub const APP_IDENTIFIER: &str = "com.tinyhumansai.openhuman"; /// Service name for keychain pub const KEYCHAIN_SERVICE: &str = "OpenHuman"; diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 708b7b952..395288640 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -39,7 +39,10 @@ ], "resources": [ "../skills/skills", - "ai" + "../rust-core/ai" + ], + "externalBin": [ + "binaries/openhuman-core" ], "createUpdaterArtifacts": true, "macOS": { diff --git a/src/lib/ai/soul/loader.ts b/src/lib/ai/soul/loader.ts index b49660b08..5b79c4344 100644 --- a/src/lib/ai/soul/loader.ts +++ b/src/lib/ai/soul/loader.ts @@ -1,4 +1,6 @@ -import soulMd from '../../../../src-tauri/ai/SOUL.md?raw'; +import { isTauri as coreIsTauri, invoke } from '@tauri-apps/api/core'; + +import soulMd from '../../../../rust-core/ai/SOUL.md?raw'; import type { BehaviorPattern, EmergencyResponse, @@ -12,7 +14,7 @@ import type { } from './types'; const SOUL_GITHUB_URL = - 'https://raw.githubusercontent.com/openhumanxyz/openhuman/refs/heads/main/src-tauri/ai/SOUL.md'; + 'https://raw.githubusercontent.com/openhumanxyz/openhuman/refs/heads/main/rust-core/ai/SOUL.md'; const SOUL_CACHE_KEY = 'openhuman.soul.cache'; const SOUL_CACHE_TTL = 1000 * 60 * 30; // 30 minutes @@ -49,10 +51,16 @@ export async function loadSoul(): Promise { let isDefault = false; try { - // 3. GitHub remote - const response = await fetch(SOUL_GITHUB_URL); - if (!response.ok) throw new Error(`HTTP ${response.status}`); - raw = await response.text(); + if (coreIsTauri()) { + // 3a. Tauri command is the source of truth in desktop app mode. + const aiConfig = await invoke<{ soul: { raw: string } }>('ai_get_config'); + raw = aiConfig.soul.raw; + } else { + // 3b. Web fallback (non-Tauri contexts) + const response = await fetch(SOUL_GITHUB_URL); + if (!response.ok) throw new Error(`HTTP ${response.status}`); + raw = await response.text(); + } } catch { // 4. Fallback to bundled raw = soulMd; diff --git a/src/lib/ai/tools/__tests__/loader.test.ts b/src/lib/ai/tools/__tests__/loader.test.ts index a9c773178..71ea839f3 100644 --- a/src/lib/ai/tools/__tests__/loader.test.ts +++ b/src/lib/ai/tools/__tests__/loader.test.ts @@ -8,7 +8,7 @@ import { clearToolsCache, loadTools, parseTools } from '../loader'; import type { ToolsConfig } from '../types'; // Mock the bundled tools markdown -vi.mock('../../../../../src-tauri/ai/TOOLS.md?raw', () => ({ +vi.mock('../../../../../rust-core/ai/TOOLS.md?raw', () => ({ default: `# OpenHuman Tools ## Overview diff --git a/src/lib/ai/tools/loader.ts b/src/lib/ai/tools/loader.ts index 1c1fd83bc..ae11ec9d0 100644 --- a/src/lib/ai/tools/loader.ts +++ b/src/lib/ai/tools/loader.ts @@ -1,4 +1,6 @@ -import toolsMd from '../../../../src-tauri/ai/TOOLS.md?raw'; +import { isTauri as coreIsTauri, invoke } from '@tauri-apps/api/core'; + +import toolsMd from '../../../../rust-core/ai/TOOLS.md?raw'; import type { SkillGroup, ToolCategory, @@ -43,8 +45,16 @@ export async function loadTools(): Promise { // Ignore cache errors } - // 3. Always use bundled TOOLS.md (updated by auto-update system) - const raw = toolsMd; + // 3. Prefer Tauri command in desktop mode; fallback to bundled for web/test. + let raw = toolsMd; + if (coreIsTauri()) { + try { + const aiConfig = await invoke<{ tools: { raw: string } }>('ai_get_config'); + raw = aiConfig.tools.raw; + } catch { + // Keep bundled fallback. + } + } const isDefault = false; // Not a fallback since it's the auto-generated file const config = parseTools(raw, isDefault); diff --git a/src/test/setup.ts b/src/test/setup.ts index 1929dad5a..92ce06c22 100644 --- a/src/test/setup.ts +++ b/src/test/setup.ts @@ -20,7 +20,7 @@ vi.stubEnv('DEV', true); vi.stubEnv('MODE', 'test'); // Mock Tauri APIs (not available in test env) -vi.mock('@tauri-apps/api/core', () => ({ invoke: vi.fn() })); +vi.mock('@tauri-apps/api/core', () => ({ invoke: vi.fn(), isTauri: vi.fn(() => false) })); vi.mock('@tauri-apps/api/event', () => ({ listen: vi.fn(), emit: vi.fn() })); diff --git a/src/utils/__tests__/tauriCoreBridge.e2e.test.ts b/src/utils/__tests__/tauriCoreBridge.e2e.test.ts new file mode 100644 index 000000000..33cc9965e --- /dev/null +++ b/src/utils/__tests__/tauriCoreBridge.e2e.test.ts @@ -0,0 +1,56 @@ +import { invoke, isTauri } from '@tauri-apps/api/core'; +import { beforeEach, describe, expect, type Mock, test, vi } from 'vitest'; + +import type { ServiceState } from '../tauriCommands'; + +vi.mock('@tauri-apps/api/core', () => ({ invoke: vi.fn(), isTauri: vi.fn() })); + +describe('Web → Tauri → Core bridge', () => { + const mockInvoke = invoke as Mock; + const mockIsTauri = isTauri as Mock; + let openhumanServiceStatus: typeof import('../tauriCommands').openhumanServiceStatus; + let openhumanAgentServerStatus: typeof import('../tauriCommands').openhumanAgentServerStatus; + + beforeEach(async () => { + vi.clearAllMocks(); + mockIsTauri.mockReturnValue(true); + const actual = await vi.importActual('../tauriCommands'); + openhumanServiceStatus = actual.openhumanServiceStatus; + openhumanAgentServerStatus = actual.openhumanAgentServerStatus; + }); + + test('routes service status request through Tauri command and returns core payload', async () => { + const expectedState: ServiceState = 'Running'; + const tauriResponse = { result: { state: expectedState }, logs: ['service status fetched'] }; + + mockInvoke.mockResolvedValueOnce(tauriResponse); + + const response = await openhumanServiceStatus(); + + expect(mockInvoke).toHaveBeenCalledWith('openhuman_service_status'); + expect(response).toEqual(tauriResponse); + expect(response.result.state).toBe(expectedState); + }); + + test('routes agent server status through Tauri command and returns core_rpc status', async () => { + const tauriResponse = { + result: { running: true, url: 'http://127.0.0.1:8421/rpc' }, + logs: ['agent server status checked'], + }; + + mockInvoke.mockResolvedValueOnce(tauriResponse); + + const response = await openhumanAgentServerStatus(); + + expect(mockInvoke).toHaveBeenCalledWith('openhuman_agent_server_status'); + expect(response.result.running).toBe(true); + expect(response.result.url).toContain('127.0.0.1'); + }); + + test('fails fast in web-only mode without Tauri runtime', async () => { + mockIsTauri.mockReturnValue(false); + + await expect(openhumanServiceStatus()).rejects.toThrow('Not running in Tauri'); + expect(mockInvoke).not.toHaveBeenCalled(); + }); +});