From caf6a2f82eda02cdb8978f333caad216b0c917e9 Mon Sep 17 00:00:00 2001 From: karl Date: Mon, 12 Oct 2026 17:44:56 +0200 Subject: [PATCH] feat: integrate Google semantic search and branded desktop launcher --- .cargo/config.toml | 6 + .gitea/workflows/ci.yml | 5 +- .github/workflows/ci.yml | 5 +- .gitignore | 5 + Cargo.lock | 1215 +++++- Cargo.toml | 2 +- apps/desktop/README.md | 33 +- apps/desktop/index.html | 2 +- apps/desktop/package-lock.json | 17 + apps/desktop/package.json | 3 + apps/desktop/public/licenses/Fluent-MIT.txt | 21 + apps/desktop/public/licenses/Inter-OFL.txt | 93 + apps/desktop/public/searchi-symbol.png | Bin 0 -> 616923 bytes apps/desktop/src-tauri/Cargo.lock | 633 ++- apps/desktop/src-tauri/Cargo.toml | 8 +- .../src-tauri/resources/LLAMA-LICENSE.txt | 21 + apps/desktop/src-tauri/resources/README.txt | 3 + .../resources/licenses/Fluent-MIT.txt | 21 + .../resources/licenses/Inter-OFL.txt | 93 + apps/desktop/src-tauri/src/main.rs | 162 +- apps/desktop/src-tauri/src/model_download.rs | 7 + .../src-tauri/src/semantic_commands.rs | 285 ++ apps/desktop/src-tauri/src/settings.rs | 201 + apps/desktop/src-tauri/tauri.conf.json | 16 +- apps/desktop/src/icons.ts | 64 + apps/desktop/src/main.ts | 671 ++- apps/desktop/src/search-state.ts | 133 + apps/desktop/src/style.css | 853 +++- apps/desktop/src/vite-env.d.ts | 1 + apps/desktop/tests/search-state.test.mjs | 69 + apps/desktop/vite.config.ts | 6 +- assets/design/search-reference.jpg | Bin 0 -> 197950 bytes crates/searchi-assets/Cargo.toml | 15 + crates/searchi-assets/README.md | 52 + crates/searchi-assets/src/lib.rs | 520 +++ crates/searchi-cli/Cargo.toml | 2 + crates/searchi-cli/src/main.rs | 112 +- crates/searchi-core/README.md | 34 +- crates/searchi-core/benchmarks/README.md | 124 + ...indows-cpu-full-candidate-first-final.json | 179 + .../windows-cpu-full-density-anchor.json | 177 + .../windows-cpu-full-density-prepared.json | 179 + .../results/windows-cpu-full-prepared-v8.json | 169 + .../results/windows-cpu-full-prepared-v9.json | 177 + .../windows-cpu-full-suffix-anchor.json | 177 + crates/searchi-core/examples/performance.rs | 139 +- crates/searchi-core/src/lib.rs | 184 +- crates/searchi-core/tests/retrieval_lanes.rs | 103 + crates/searchi-semantic/Cargo.toml | 12 +- crates/searchi-semantic/native/CMakeLists.txt | 51 + crates/searchi-semantic/native/worker.cpp | 221 + crates/searchi-semantic/src/gemma.rs | 398 ++ crates/searchi-semantic/src/lib.rs | 305 +- crates/searchi-semantic/src/minilm.rs | 347 ++ crates/searchi-semantic/tests/cpu_model.rs | 1 + .../tests/fixtures/LICENSE-DigUp.txt | 21 + .../tests/fixtures/digup-text-reference.json | 3858 +++++++++++++++++ crates/searchi-semantic/tests/gemma_cpu.rs | 102 + crates/searchi-service/Cargo.toml | 20 + .../benchmarks/windows-cpu-ann-100k.json | 16 + crates/searchi-service/examples/evaluate.rs | 111 + crates/searchi-service/src/ann_benchmark.rs | 163 + crates/searchi-service/src/lib.rs | 531 +++ crates/searchi-service/src/store.rs | 855 ++++ crates/searchi-service/tests/google_cpu.rs | 80 + design-qa.md | 12 +- docs/BRAND.md | 1 + docs/BUILDING.md | 124 +- docs/ROADMAP.md | 18 + docs/SEMANTIC.md | 292 +- docs/VALIDATION.md | 11 +- fixtures/relevance/README.md | 14 + fixtures/relevance/fixture.json | 51 + fixtures/relevance/windows-cpu-google.json | 852 ++++ tools/embeddinggemma2/build_runtime.py | 58 + tools/embeddinggemma2/download.py | 54 + tools/embeddinggemma2/model-manifest.json | 15 + tools/embeddinggemma2/no-logits.patch | 12 + tools/embeddinggemma2/stage_runtime.py | 45 + tools/semantic-proof/HISTORICAL.md | 160 + 80 files changed, 14971 insertions(+), 837 deletions(-) create mode 100644 .cargo/config.toml create mode 100644 apps/desktop/public/licenses/Fluent-MIT.txt create mode 100644 apps/desktop/public/licenses/Inter-OFL.txt create mode 100644 apps/desktop/public/searchi-symbol.png create mode 100644 apps/desktop/src-tauri/resources/LLAMA-LICENSE.txt create mode 100644 apps/desktop/src-tauri/resources/README.txt create mode 100644 apps/desktop/src-tauri/resources/licenses/Fluent-MIT.txt create mode 100644 apps/desktop/src-tauri/resources/licenses/Inter-OFL.txt create mode 100644 apps/desktop/src-tauri/src/model_download.rs create mode 100644 apps/desktop/src-tauri/src/semantic_commands.rs create mode 100644 apps/desktop/src-tauri/src/settings.rs create mode 100644 apps/desktop/src/icons.ts create mode 100644 apps/desktop/src/search-state.ts create mode 100644 apps/desktop/src/vite-env.d.ts create mode 100644 apps/desktop/tests/search-state.test.mjs create mode 100644 assets/design/search-reference.jpg create mode 100644 crates/searchi-assets/Cargo.toml create mode 100644 crates/searchi-assets/README.md create mode 100644 crates/searchi-assets/src/lib.rs create mode 100644 crates/searchi-core/benchmarks/results/windows-cpu-full-candidate-first-final.json create mode 100644 crates/searchi-core/benchmarks/results/windows-cpu-full-density-anchor.json create mode 100644 crates/searchi-core/benchmarks/results/windows-cpu-full-density-prepared.json create mode 100644 crates/searchi-core/benchmarks/results/windows-cpu-full-prepared-v8.json create mode 100644 crates/searchi-core/benchmarks/results/windows-cpu-full-prepared-v9.json create mode 100644 crates/searchi-core/benchmarks/results/windows-cpu-full-suffix-anchor.json create mode 100644 crates/searchi-semantic/native/CMakeLists.txt create mode 100644 crates/searchi-semantic/native/worker.cpp create mode 100644 crates/searchi-semantic/src/gemma.rs create mode 100644 crates/searchi-semantic/src/minilm.rs create mode 100644 crates/searchi-semantic/tests/fixtures/LICENSE-DigUp.txt create mode 100644 crates/searchi-semantic/tests/fixtures/digup-text-reference.json create mode 100644 crates/searchi-semantic/tests/gemma_cpu.rs create mode 100644 crates/searchi-service/Cargo.toml create mode 100644 crates/searchi-service/benchmarks/windows-cpu-ann-100k.json create mode 100644 crates/searchi-service/examples/evaluate.rs create mode 100644 crates/searchi-service/src/ann_benchmark.rs create mode 100644 crates/searchi-service/src/lib.rs create mode 100644 crates/searchi-service/src/store.rs create mode 100644 crates/searchi-service/tests/google_cpu.rs create mode 100644 fixtures/relevance/README.md create mode 100644 fixtures/relevance/fixture.json create mode 100644 fixtures/relevance/windows-cpu-google.json create mode 100644 tools/embeddinggemma2/build_runtime.py create mode 100644 tools/embeddinggemma2/download.py create mode 100644 tools/embeddinggemma2/model-manifest.json create mode 100644 tools/embeddinggemma2/no-logits.patch create mode 100644 tools/embeddinggemma2/stage_runtime.py create mode 100644 tools/semantic-proof/HISTORICAL.md diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..22ecc40 --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,6 @@ +# USearch's NumKong feature links its kernels statically. On MSVC, the upstream +# header otherwise marks declarations as DLL imports. Keep plain extern symbols. +# Existing developer CXXFLAGS are respected; include this define in overrides. +[env] +CXXFLAGS_x86_64_pc_windows_msvc = { value = "/DNK_DYNAMIC=", force = false } +CXXFLAGS_aarch64_pc_windows_msvc = { value = "/DNK_DYNAMIC=", force = false } diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 22d01e7..07be345 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -1,5 +1,7 @@ name: Core CI on: [push, pull_request] +env: + SEARCHI_FORCE_CPU: "1" jobs: core: strategy: @@ -31,11 +33,12 @@ jobs: components: rustfmt, clippy - uses: actions/setup-node@v4 with: - node-version: 22 + node-version: 24 - if: runner.os == 'Linux' run: sudo apt-get update && sudo apt-get install -y libwebkit2gtk-4.1-dev build-essential libssl-dev librsvg2-dev libayatana-appindicator3-dev - run: npm ci - run: npm run format:check + - run: npm test - run: npm run build - run: cargo fmt --manifest-path src-tauri/Cargo.toml -- --check - run: cargo clippy --manifest-path src-tauri/Cargo.toml --all-targets --locked -- -D warnings diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 22d01e7..07be345 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,5 +1,7 @@ name: Core CI on: [push, pull_request] +env: + SEARCHI_FORCE_CPU: "1" jobs: core: strategy: @@ -31,11 +33,12 @@ jobs: components: rustfmt, clippy - uses: actions/setup-node@v4 with: - node-version: 22 + node-version: 24 - if: runner.os == 'Linux' run: sudo apt-get update && sudo apt-get install -y libwebkit2gtk-4.1-dev build-essential libssl-dev librsvg2-dev libayatana-appindicator3-dev - run: npm ci - run: npm run format:check + - run: npm test - run: npm run build - run: cargo fmt --manifest-path src-tauri/Cargo.toml -- --check - run: cargo clippy --manifest-path src-tauri/Cargo.toml --all-targets --locked -- -D warnings diff --git a/.gitignore b/.gitignore index b31a95b..2483ea8 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,9 @@ dist/ *.db-shm *.db-wal .searchi/ +__pycache__/ /apps/desktop/src-tauri/gen/ +/apps/desktop/src-tauri/resources/searchi-gemma-worker* +/apps/desktop/src-tauri/resources/embeddinggemma2/ +/apps/desktop/src-tauri/icons/android/ +/apps/desktop/src-tauri/icons/ios/ diff --git a/Cargo.lock b/Cargo.lock index adee525..21f4b7f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -93,7 +93,7 @@ version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys", + "windows-sys 0.61.2", ] [[package]] @@ -104,7 +104,7 @@ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] @@ -113,6 +113,12 @@ version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.5.1" @@ -125,6 +131,18 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" + [[package]] name = "bit-set" version = "0.8.0" @@ -189,6 +207,12 @@ version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + [[package]] name = "castaway" version = "0.2.4" @@ -223,6 +247,12 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" +[[package]] +name = "cfg_aliases" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" + [[package]] name = "chacha20" version = "0.10.2" @@ -284,6 +314,17 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c133bc6a41be0d194c306b5506d15e6feeea7b1d6604bd3f8310dfb2ca96486" +[[package]] +name = "codespan-reporting" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681" +dependencies = [ + "serde", + "termcolor", + "unicode-width", +] + [[package]] name = "colorchoice" version = "1.0.5" @@ -394,6 +435,68 @@ dependencies = [ "hybrid-array", ] +[[package]] +name = "cxx" +version = "1.0.205" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8a02bfeba9074b2bbb39492c9b0908ec854f455a3cccdcde7a1de55e2315e40" +dependencies = [ + "cc", + "cxx-build", + "cxxbridge-cmd", + "cxxbridge-flags", + "cxxbridge-macro", + "foldhash", + "link-cplusplus", +] + +[[package]] +name = "cxx-build" +version = "1.0.205" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbc2ac76997619d2d888b58ad79488f1c835de41ca4dd3dd7082acf4ecb0a50f" +dependencies = [ + "cc", + "codespan-reporting", + "indexmap", + "proc-macro2", + "quote", + "scratch", + "syn 3.0.8", +] + +[[package]] +name = "cxxbridge-cmd" +version = "1.0.205" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54a486ed16a3f2a053fe7f5b98db4c1a59846a23e8cb9e49f9d1bd48830d51a2" +dependencies = [ + "clap", + "codespan-reporting", + "indexmap", + "proc-macro2", + "quote", + "syn 3.0.8", +] + +[[package]] +name = "cxxbridge-flags" +version = "1.0.205" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c72569be94e2283764d334cd285980b747dbe221e27e315484eb6bcd93fa808a" + +[[package]] +name = "cxxbridge-macro" +version = "1.0.205" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "423e795284a7f7b3f843c956a5322c4bc497b60c2dd1a6339da10313cb18d575" +dependencies = [ + "indexmap", + "proc-macro2", + "quote", + "syn 3.0.8", +] + [[package]] name = "darling" version = "0.20.11" @@ -490,6 +593,38 @@ dependencies = [ "crypto-common 0.2.2", ] +[[package]] +name = "directories" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16f5094c54661b38d03bd7e50df373292118db60b585c08a411c6d840017fe7d" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "displaydoc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.8", +] + [[package]] name = "ecb" version = "0.2.1" @@ -532,7 +667,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] @@ -593,6 +728,80 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[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 = "fs2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "futures-channel" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + +[[package]] +name = "futures-io" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" + +[[package]] +name = "futures-sink" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" + +[[package]] +name = "futures-task" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + +[[package]] +name = "futures-util" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +dependencies = [ + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -603,6 +812,19 @@ dependencies = [ "version_check", ] +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + [[package]] name = "getrandom" version = "0.3.4" @@ -622,9 +844,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" dependencies = [ "cfg-if", + "js-sys", "libc", "r-efi 6.0.0", "rand_core 0.10.1", + "wasm-bindgen", ] [[package]] @@ -657,6 +881,45 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "http" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + [[package]] name = "hybrid-array" version = "0.4.15" @@ -666,12 +929,175 @@ dependencies = [ "typenum", ] +[[package]] +name = "hyper" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c3e324da4c95177d6291d4c8730197c0d1822f8a9766814a4a44fa5ab797c9c" +dependencies = [ + "atomic-waker", + "bytes", + "futures-core", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa8e654703247911e29c23fbeaa261834bd9bb74efba2f9acddc37bfb127f53" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots", +] + +[[package]] +name = "hyper-util" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddc03d96684f9226b8a787cdb71488417b53ab5ea8fdb1dac946cb9431cc8bff" +dependencies = [ + "base64 0.23.1", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "httparse", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "icu_collections" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f9cf5f235641ed274641dd81c3f28d870e276763d0797aeeab72317b1c646f" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0" + +[[package]] +name = "icu_properties" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e7ca276ad3145661a65914e6daf131ca5120cd3dcee8f8f3214b8875184a148" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa" + +[[package]] +name = "icu_provider" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d27bbb9d3abbefac45d55f647c9de1d44aafcd1186eb91879afef17c396c3e73" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + [[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + [[package]] name = "indexmap" version = "2.14.2" @@ -692,6 +1118,12 @@ dependencies = [ "hybrid-array", ] +[[package]] +name = "ipnet" +version = "2.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791930b43c0d5973160d90a8f3894509f2b273430f5c5c73b668636d0287c5c0" + [[package]] name = "is_terminal_polyfill" version = "1.70.2" @@ -713,6 +1145,17 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" +[[package]] +name = "js-sys" +version = "0.3.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7883d941dae510fb2d978fc3fe018c71c9e2892fd38854de3e8b92c2e5ad9cc5" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + [[package]] name = "libc" version = "0.2.190" @@ -729,6 +1172,15 @@ dependencies = [ "windows-link", ] +[[package]] +name = "libredox" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61ff90caf6077a803a240f62fdbe88645a890bbca49ef8174c3cb0404362171d" +dependencies = [ + "libc", +] + [[package]] name = "libsqlite3-sys" version = "0.30.1" @@ -740,12 +1192,27 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "link-cplusplus" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f78c730aaa7d0b9336a299029ea49f9ee53b0ed06e9202e8cb7db9bae7b8c82" +dependencies = [ + "cc", +] + [[package]] name = "linux-raw-sys" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" +[[package]] +name = "litemap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" + [[package]] name = "log" version = "0.4.34" @@ -779,6 +1246,12 @@ dependencies = [ "weezl", ] +[[package]] +name = "lru-slab" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4050469837a6ff301cd14c1f8f24f88549e6d548f24f64e2148eb0f72cebc51f" + [[package]] name = "macro_rules_attribute" version = "0.2.3" @@ -837,6 +1310,17 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "mio" +version = "1.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1788edb87fdc09c7e26304471e2f5be8cdefb1b6930d6e3985fc02ff53bf86ee" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + [[package]] name = "monostate" version = "0.1.18" @@ -926,6 +1410,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "numkong" +version = "7.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53bcc7469814b82ddffa194dbf3418fc28fa49015392261926f85c5f1cae0625" +dependencies = [ + "cc", +] + [[package]] name = "once_cell" version = "1.21.4" @@ -938,6 +1431,12 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + [[package]] name = "ort" version = "2.0.0-rc.13" @@ -969,6 +1468,12 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ee67f1008b1ba2321834326597b8e186293b049a023cdef258527550b9935b4" +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + [[package]] name = "pin-project-lite" version = "0.2.17" @@ -996,6 +1501,15 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "potential_utf" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" +dependencies = [ + "zerovec", +] + [[package]] name = "ppv-lite86" version = "0.2.21" @@ -1023,6 +1537,62 @@ dependencies = [ "memchr", ] +[[package]] +name = "quinn" +version = "0.11.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4051e23e9185c255a7e33ef59cdbca87a22d359052eecd22fc6b901fb37d9d11" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e750cca55fe4f0439a15d0bb529da9651e79993e8e72c61a899a36d462befbe" +dependencies = [ + "bytes", + "getrandom 0.4.3", + "lru-slab", + "rand 0.10.3", + "rand_pcg", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af66907df18639dcf4db56ca65490cabc4b27a97dbadd96f2926cca73298f016" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.61.2", +] + [[package]] name = "quote" version = "1.0.47" @@ -1090,6 +1660,15 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" +[[package]] +name = "rand_pcg" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" +dependencies = [ + "rand_core 0.10.1", +] + [[package]] name = "rangemap" version = "1.8.0" @@ -1133,6 +1712,16 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "redox_users" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60dc65c0ff1a7ae1294b0c67b9f14baf70b644404010370171787bfac1038fc0" +dependencies = [ + "libredox", + "thiserror", +] + [[package]] name = "regex" version = "1.13.1" @@ -1162,6 +1751,60 @@ version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" +[[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", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + [[package]] name = "rusqlite" version = "0.32.1" @@ -1176,6 +1819,12 @@ dependencies = [ "smallvec", ] +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + [[package]] name = "rustix" version = "1.1.5" @@ -1186,7 +1835,42 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.23.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d41d731c7d2f962d1ccc364cec258de3c0e93b38c2fb3ba97ac74513048d634" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c3cf1d8b1e7d4927e2d154c3fcb02979afb9939629c62cd9048d4f07b60ac2" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", ] [[package]] @@ -1216,13 +1900,34 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "scratch" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d68f2ec51b097e4c1a75b681a8bec621909b5e91f15bb7b840c4f2f7b01148b2" + +[[package]] +name = "searchi-assets" +version = "0.1.0" +dependencies = [ + "anyhow", + "directories", + "reqwest", + "serde", + "serde_json", + "sha2 0.10.9", + "tempfile", +] + [[package]] name = "searchi-cli" version = "0.1.0" dependencies = [ "anyhow", "clap", + "searchi-assets", "searchi-core", + "searchi-service", "serde_json", ] @@ -1247,11 +1952,28 @@ version = "0.1.0" dependencies = [ "anyhow", "ort", + "serde", "serde_json", "sha2 0.10.9", "tokenizers", ] +[[package]] +name = "searchi-service" +version = "0.1.0" +dependencies = [ + "anyhow", + "fs2", + "rusqlite", + "searchi-core", + "searchi-semantic", + "serde", + "serde_json", + "sha2 0.10.9", + "tempfile", + "usearch", +] + [[package]] name = "serde" version = "1.0.229" @@ -1295,6 +2017,18 @@ dependencies = [ "zmij", ] +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + [[package]] name = "sha2" version = "0.10.9" @@ -1335,24 +2069,46 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + [[package]] name = "smallvec" version = "1.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b3dc8af474f516a851ff4bd12db780f948b9250ad37211e4eec0bccea54e01b" +[[package]] +name = "socket2" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + [[package]] name = "spm_precompiled" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5851699c4033c63636f7ea4cf7b7c1f1bf06d0cc03cfb42e711de5a5c46cf326" dependencies = [ - "base64", + "base64 0.13.1", "nom 7.1.3", "serde", "unicode-segmentation", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + [[package]] name = "static_assertions" version = "1.1.0" @@ -1376,6 +2132,12 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + [[package]] name = "syn" version = "2.0.119" @@ -1398,6 +2160,26 @@ dependencies = [ "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.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "901704edd0dfe137f1987838ee4f259e4e063c31371bdb423f7ae38ec6f77f02" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.8", +] + [[package]] name = "tempfile" version = "3.27.0" @@ -1408,7 +2190,16 @@ dependencies = [ "getrandom 0.4.3", "once_cell", "rustix", - "windows-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", ] [[package]] @@ -1431,6 +2222,16 @@ dependencies = [ "syn 3.0.8", ] +[[package]] +name = "tinystr" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinyvec" version = "1.13.3" @@ -1470,6 +2271,75 @@ dependencies = [ "unicode_categories", ] +[[package]] +name = "tokio" +version = "1.53.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e95f91fcc7a621e8b030f6aa23c71fe9838ae2fb4d8118b75602a328f5144044" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9cc2678c2cdd569ef8215e2afd7954ada2ae20b4fdd2c5fe6139a3b02d105db" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[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" @@ -1489,6 +2359,12 @@ dependencies = [ "once_cell", ] +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + [[package]] name = "typed-path" version = "0.12.3" @@ -1543,12 +2419,53 @@ version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + [[package]] name = "unicode_categories" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "usearch" +version = "2.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1086fc5e6b4ee87a5bac4fd80fcf66670526ca21b77d5f95b68de01b15329c67" +dependencies = [ + "cxx", + "cxx-build", + "numkong", +] + +[[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" @@ -1577,6 +2494,21 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "want" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec4cdd0dd910afe868b7ef477227d8d538b46b3075031afee8a9f2acb0a2ed0b" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + [[package]] name = "wasip2" version = "1.0.4+wasi-0.2.12" @@ -1586,27 +2518,143 @@ dependencies = [ "wit-bindgen", ] +[[package]] +name = "wasm-bindgen" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb54f33acc68fd454578d9820b0bde1a1a3d17aa17bb7b6595806d02886d409" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cbab34de2d982e9b48e18d216d04c4a6f641066ff19ffb699980f591ee3610e" +dependencies = [ + "js-sys", + "tokio", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e29d0c35b16e224a7eeb5cd2d25e3e1968fbd65604117b44d3b789d00ee8535" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f501a8bc3719dba86ef8ae4728879c08001bea749eb1333ac5b91e040e2a6b7" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 3.0.8", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23f0c9c52aa7cd7d77769a4cfe2a9adb1b331f489a41d912ce14513d5ab995c6" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88261b9deccee56594c11a3460c462c41f58d148598fe70ad77070126a68aba4" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "weezl" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4ca08e5ef825b65b056d9efbd95c8750683f0a6d0466d02e96dc2e4e360f3d2" +[[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", + "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 = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + [[package]] name = "windows-sys" version = "0.61.2" @@ -1616,12 +2664,105 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[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_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[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_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[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_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + [[package]] name = "wit-bindgen" version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" +[[package]] +name = "writeable" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" + +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec8ebde2db3681e8c9980cc27822030e68752690ddfa9473e739aeb4dbde6d71" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.8", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.8.62" @@ -1642,6 +2783,66 @@ dependencies = [ "syn 2.0.119", ] +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.8", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13084392c5e4bc371903e2935a5eaeed24905a7511356b883835e18a78f6879" + +[[package]] +name = "zerotrie" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0464e17806c1d976d5cba29399c7f08e516e279e2ba493f63123b5fca67dd8" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.8", +] + [[package]] name = "zip" version = "8.6.0" diff --git a/Cargo.toml b/Cargo.toml index 7b85c68..664184f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["crates/searchi-core", "crates/searchi-cli", "crates/searchi-semantic"] +members = ["crates/searchi-core", "crates/searchi-cli", "crates/searchi-semantic", "crates/searchi-service", "crates/searchi-assets"] resolver = "2" [workspace.package] diff --git a/apps/desktop/README.md b/apps/desktop/README.md index 307d142..774c6b5 100644 --- a/apps/desktop/README.md +++ b/apps/desktop/README.md @@ -1,6 +1,6 @@ # Searchi desktop -This Tauri 2 shell calls the same Rust core as the CLI. It provides real folder indexing, native folder selection, filename/content search, folder/extension/size/date filters, keyboard navigation, escaped text previews, and native open/reveal actions. There are no mocked results or embeddings. Semantic retrieval, a global shortcut, watchers, and release installers remain roadmap work. +This Tauri 2 shell calls the same Rust core as the CLI and the real Google EmbeddingGemma 2 service. It provides folder indexing, native folder selection, progressive filename/content/semantic search, folder/extension/size/date filters, keyboard navigation, escaped text previews, native open/reveal actions, persisted selected folders/resource settings, and a global shortcut. There are no mocked results or embeddings. Watchers and release installers remain roadmap work. ## Develop @@ -15,15 +15,44 @@ npm run tauri dev `npm run dev` previews layout in a browser but cannot index or search files. The app reports this limitation explicitly. Press Ctrl+K (Cmd+K on macOS) to focus search; arrow keys navigate results. Choose a folder through the native dialog or enter an absolute path. Open/reveal commands canonicalize the path, verify it is a current file, and require exact membership in the index. The webview has no general opener or filesystem capability. Page/paragraph source locations are displayed when supplied by the core; opening at that exact location is future work. -The desktop index is stored in the platform app-data directory under `dev.searchi.desktop`. Search opens independent core connections while indexing runs on a blocking worker; a guard limits this shell to one indexing job at a time. All model testing on the Windows VM must remain CPU only. This shell configures no GPU provider. +Ctrl+Shift+Space shows and focuses the running app on Windows/Linux; Shift+Cmd+Space does so on macOS. Registration failures appear under Folders & resources rather than preventing startup. Wayland sessions explicitly report the shortcut as unsupported; launcher access remains available. Registration uses the [official Tauri global shortcut plugin](https://v2.tauri.app/plugin/global-shortcut/). Closing the app exits it; background tray lifecycle is not implemented. + +Selected roots and the CPU thread budget are stored in versioned `settings.json` beside the index. Writes use an atomic temporary-file replacement; invalid values never overwrite previous settings. Missing files use defaults, while corrupted/unsupported settings fail explicitly. Selected roots may remain listed while disconnected and are reindexed only on user request. The CPU budget defaults to one and is limited to eight. Indexing uses one worker; CPU inference respects the saved budget. + +The desktop index is stored in the platform app-data directory under `dev.searchi.desktop`. Search uses a cached core reader while indexing runs on a separate blocking worker; a guard limits this shell to one indexing job at a time. Production inference automatically selects supported acceleration with CPU fallback. All model testing on the Windows VM must remain CPU only. + +## Automatic local semantic search + +On first launch, the native app downloads and verifies the pinned Google model artifacts (310 MB text model plus 555 MB media projector, approximately 865 MB total) into app-managed storage and prepares the packaged embedding worker. No model paths, runtime paths, or terminal setup are required. The UI shows native download bytes, verification/warming states, the actual worker device, and explicit errors with a retry control. The first download requires network access; file extraction, embeddings, and queries stay local. + +After a folder is indexed, semantic indexing starts automatically when the model is ready. Existing keyword results stay searchable during setup/indexing. Progress is indeterminate during embedding because the native command does not expose a chunk completion count. Failed automatic builds retry only after a changed index/status revision or an explicit rebuild, avoiding repeated failure loops. Status polls run once per second while setup/indexing/warming is active and stop when idle. + +Each query captures one immutable filter snapshot. Keyword results appear first; real hybrid results follow after the query settles. `src/search-state.ts` bounds each lane to one active native request and one latest pending request, discards old revisions, and retries a busy request at most once. Escape clears both pending lanes and their timers; already-running native work finishes without changing cleared results. Hybrid updates preserve the selected file and keyboard focus where possible. + +Run the async-state tests with Node.js 24 or newer: + +```sh +node --test tests/search-state.test.mjs +``` For Windows VM UI testing, disable WebView2 GPU rendering as well, before starting Tauri in PowerShell: ```powershell $env:WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS = '--disable-gpu' +$env:SEARCHI_FORCE_CPU = '1' npm.cmd run tauri dev ``` +## Desktop design + +The compact launcher follows the selected first visual direction with the searchi brand palette: blue `#2563FF`, dark `#0B0F14`, light `#F8FAFC`, lowercase wordmark, and “Find what matters. Locally.” Native operating-system window chrome remains native. The right pane shows real extracted passages and source locations, without invented PDF pagination or confidence scores. + +Inter Variable is bundled locally with system font fallbacks. All interface icons come from Microsoft Fluent UI System Icons; no runtime CDN requests are made. Light/dark themes follow the operating system. Brief 120–160 ms opacity/transform motion respects reduced-motion settings, and forced-colors mode retains borders and focus visibility. Keyed result rows preserve selected files, keyboard focus, and scroll position during hybrid updates. Settings, filters, and model details use compact disclosures; errors open model details so recovery controls stay accessible. + +Distributed notices are included in `public/licenses/` and `src-tauri/resources/licenses/`: [Inter SIL Open Font License](public/licenses/Inter-OFL.txt), [Microsoft Fluent icons MIT license](public/licenses/Fluent-MIT.txt). These are the actual upstream notices, not summaries. + +Visual fidelity remains subject to native screenshot QA. Compilation and state tests alone do not verify visual appearance. + ## Verification and packaging `npm run build` checks strict TypeScript and creates production frontend assets. `npm run tauri build -- --no-bundle` compiles the native shell when platform prerequisites are installed. Installer bundling is intentionally disabled until release icons, signing and native platform checks are complete. Native Windows, macOS, and Linux checks must be recorded separately; a frontend build does not prove the native shell works. diff --git a/apps/desktop/index.html b/apps/desktop/index.html index b37b0b2..1c178ad 100644 --- a/apps/desktop/index.html +++ b/apps/desktop/index.html @@ -3,7 +3,7 @@ - Searchi + searchi
diff --git a/apps/desktop/package-lock.json b/apps/desktop/package-lock.json index e025efa..0e50b67 100644 --- a/apps/desktop/package-lock.json +++ b/apps/desktop/package-lock.json @@ -8,6 +8,8 @@ "name": "searchi-desktop", "version": "0.1.0", "dependencies": { + "@fluentui/svg-icons": "1.1.344", + "@fontsource-variable/inter": "5.3.0", "@tauri-apps/api": "^2.0.0" }, "devDependencies": { @@ -459,6 +461,21 @@ "node": ">=18" } }, + "node_modules/@fluentui/svg-icons": { + "version": "1.1.344", + "resolved": "https://registry.npmjs.org/@fluentui/svg-icons/-/svg-icons-1.1.344.tgz", + "integrity": "sha512-rasjaq4hBXzRS25pSY9gaqwY7NdvZJCz7G/rtpwF6mCmg2R+9TnySLhHbR+sOpkMP/IDDG28XvxRcNEQ/lJYoQ==", + "license": "MIT" + }, + "node_modules/@fontsource-variable/inter": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@fontsource-variable/inter/-/inter-5.3.0.tgz", + "integrity": "sha512-OupL48va4JNofb97w6NYeF9S7W/kHNKM0Er8Dem5nqi4jeOLrVJDoE8tZEpnMJmtkvNbB1EIPPwHcdkF6b1oUA==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, "node_modules/@napi-rs/lzma-linux-x64-gnu": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 16e2526..6a4d78c 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -6,11 +6,14 @@ "scripts": { "dev": "vite --host 127.0.0.1", "build": "tsc --noEmit && vite build", + "test": "node --test tests/*.test.mjs", "tauri": "tauri", "format": "prettier --write src index.html vite.config.ts tsconfig.json src-tauri/tauri.conf.json src-tauri/capabilities/default.json", "format:check": "prettier --check src index.html vite.config.ts tsconfig.json src-tauri/tauri.conf.json src-tauri/capabilities/default.json" }, "dependencies": { + "@fluentui/svg-icons": "1.1.344", + "@fontsource-variable/inter": "5.3.0", "@tauri-apps/api": "^2.0.0" }, "devDependencies": { diff --git a/apps/desktop/public/licenses/Fluent-MIT.txt b/apps/desktop/public/licenses/Fluent-MIT.txt new file mode 100644 index 0000000..bc9c36b --- /dev/null +++ b/apps/desktop/public/licenses/Fluent-MIT.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Microsoft Corporation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/apps/desktop/public/licenses/Inter-OFL.txt b/apps/desktop/public/licenses/Inter-OFL.txt new file mode 100644 index 0000000..40589da --- /dev/null +++ b/apps/desktop/public/licenses/Inter-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2016 The Inter Project Authors (https://github.com/rsms/inter) Inter-Italic[opsz,wght].ttf: Copyright 2016 The Inter Project Authors (https://github.com/rsms/inter) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/apps/desktop/public/searchi-symbol.png b/apps/desktop/public/searchi-symbol.png new file mode 100644 index 0000000000000000000000000000000000000000..a92cf40f054e8cd471a590e367fb1daf40f729d5 GIT binary patch literal 616923 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 z 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
    (|13Af0kg@D-Z8mxv~VduG!Q~a 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