diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ae2e586..523ef07 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -63,6 +63,7 @@ jobs: run: | sudo apt-get update sudo apt-get install -y \ + libx11-dev \ libxcb1-dev \ libxcb-render0-dev \ libxcb-shape0-dev \ @@ -138,6 +139,7 @@ jobs: run: | sudo apt-get update sudo apt-get install -y \ + libx11-dev \ libxcb1-dev \ libxcb-render0-dev \ libxcb-shape0-dev \ diff --git a/Cargo.lock b/Cargo.lock index 864af6f..0330396 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -66,7 +66,7 @@ version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46319972e74179d707445f64aaa2893bbf6a111de3a9af29b7eb382f8b39e282" dependencies = [ - "base64", + "base64 0.22.1", "bitflags 2.10.0", "home", "libc", @@ -109,6 +109,28 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +[[package]] +name = "alsa" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed7572b7ba83a31e20d1b48970ee402d2e3e0537dcfe0a3ff4d6eb7508617d43" +dependencies = [ + "alsa-sys", + "bitflags 2.10.0", + "cfg-if", + "libc", +] + +[[package]] +name = "alsa-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" +dependencies = [ + "libc", + "pkg-config", +] + [[package]] name = "android_system_properties" version = "0.1.5" @@ -118,6 +140,18 @@ dependencies = [ "libc", ] +[[package]] +name = "anstyle" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" + +[[package]] +name = "any_vec" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cd60c5e3152cef0a592f1b296f1cc93715d89d2551d85315828c3a09575ff4" + [[package]] name = "anyhow" version = "1.0.100" @@ -147,6 +181,9 @@ name = "arbitrary" version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +dependencies = [ + "derive_arbitrary", +] [[package]] name = "arg_enum_proc_macro" @@ -186,6 +223,12 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "ascii" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" + [[package]] name = "ash" version = "0.38.0+1.3.281" @@ -244,6 +287,16 @@ dependencies = [ "zeroize", ] +[[package]] +name = "assets" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "anyhow", + "gpui", + "rust-embed", +] + [[package]] name = "async-broadcast" version = "0.7.2" @@ -311,7 +364,7 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5" dependencies = [ - "async-lock", + "async-lock 3.4.2", "blocking", "futures-lite 2.6.1", ] @@ -325,7 +378,7 @@ dependencies = [ "async-channel 2.5.0", "async-executor", "async-io", - "async-lock", + "async-lock 3.4.2", "blocking", "futures-lite 2.6.1", "once_cell", @@ -349,6 +402,15 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "async-lock" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +dependencies = [ + "event-listener 2.5.3", +] + [[package]] name = "async-lock" version = "3.4.2" @@ -379,7 +441,7 @@ checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" dependencies = [ "async-channel 2.5.0", "async-io", - "async-lock", + "async-lock 3.4.2", "async-signal", "async-task", "blocking", @@ -407,7 +469,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" dependencies = [ "async-io", - "async-lock", + "async-lock 3.4.2", "atomic-waker", "cfg-if", "futures-core", @@ -427,7 +489,7 @@ dependencies = [ "async-channel 1.9.0", "async-global-executor", "async-io", - "async-lock", + "async-lock 3.4.2", "async-process", "crossbeam-utils", "futures-channel", @@ -476,6 +538,25 @@ dependencies = [ "syn 2.0.114", ] +[[package]] +name = "async-tungstenite" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee88b4c88ac8c9ea446ad43498955750a4bbe64c4392f21ccfe5d952865e318f" +dependencies = [ + "atomic-waker", + "futures-core", + "futures-io", + "futures-task", + "futures-util", + "log", + "pin-project-lite", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.26.4", + "tungstenite 0.27.0", +] + [[package]] name = "async_zip" version = "0.0.18" @@ -501,6 +582,28 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[package]] +name = "audio" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "anyhow", + "async-tar", + "collections", + "crossbeam", + "denoise", + "gpui", + "libwebrtc", + "log", + "parking_lot", + "rodio", + "serde", + "settings", + "smol", + "thiserror 2.0.18", + "util", +] + [[package]] name = "autocfg" version = "1.5.0" @@ -550,6 +653,28 @@ dependencies = [ "arrayvec", ] +[[package]] +name = "aws-lc-rs" +version = "1.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b7b6141e96a8c160799cc2d5adecd5cbbe5054cb8c7c4af53da0f83bb7ad256" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c34dda4df7017c8db52132f0f8a2e0f8161649d15723ed63fc00c82d0f2081a" +dependencies = [ + "cc", + "cmake", + "dunce", + "fs_extra", +] + [[package]] name = "backtrace" version = "0.3.76" @@ -565,12 +690,24 @@ dependencies = [ "windows-link 0.2.1", ] +[[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 = "bindgen" version = "0.71.1" @@ -591,6 +728,24 @@ dependencies = [ "syn 2.0.114", ] +[[package]] +name = "bindgen" +version = "0.72.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" +dependencies = [ + "bitflags 2.10.0", + "cexpr", + "clang-sys", + "itertools 0.13.0", + "proc-macro2", + "quote", + "regex", + "rustc-hash 2.1.1", + "shlex", + "syn 2.0.114", +] + [[package]] name = "bit-set" version = "0.8.0" @@ -645,7 +800,7 @@ dependencies = [ "ash-window", "bitflags 2.10.0", "bytemuck", - "codespan-reporting", + "codespan-reporting 0.12.0", "glow", "gpu-alloc", "gpu-alloc-ash", @@ -747,6 +902,24 @@ dependencies = [ "serde", ] +[[package]] +name = "buffer_diff" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "clock", + "futures", + "git2", + "gpui", + "language", + "log", + "pretty_assertions", + "rope", + "sum_tree", + "text", + "util", +] + [[package]] name = "built" version = "0.8.0" @@ -806,6 +979,51 @@ version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +[[package]] +name = "bzip2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" +dependencies = [ + "bzip2-sys", + "libc", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.13+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "call" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "anyhow", + "audio", + "client", + "collections", + "feature_flags", + "fs", + "futures", + "gpui", + "gpui_tokio", + "language", + "livekit_client", + "log", + "postage", + "project", + "serde", + "settings", + "telemetry", + "util", +] + [[package]] name = "calloop" version = "0.14.3" @@ -831,6 +1049,53 @@ dependencies = [ "wayland-client", ] +[[package]] +name = "candle-core" +version = "0.9.1" +source = "git+https://github.com/zed-industries/candle?branch=9.1-patched#724d75eb3deebefe83f2a7381a45d4fac6eda383" +dependencies = [ + "byteorder", + "float8", + "gemm 0.17.1", + "half", + "memmap2", + "num-traits", + "num_cpus", + "rand 0.9.2", + "rand_distr", + "rayon", + "safetensors", + "thiserror 1.0.69", + "ug", + "yoke 0.7.5", + "zip 1.1.4", +] + +[[package]] +name = "candle-nn" +version = "0.9.1" +source = "git+https://github.com/zed-industries/candle?branch=9.1-patched#724d75eb3deebefe83f2a7381a45d4fac6eda383" +dependencies = [ + "candle-core", + "half", + "libc", + "num-traits", + "rayon", + "safetensors", + "serde", + "thiserror 1.0.69", +] + +[[package]] +name = "candle-onnx" +version = "0.9.1" +source = "git+https://github.com/zed-industries/candle?branch=9.1-patched#724d75eb3deebefe83f2a7381a45d4fac6eda383" +dependencies = [ + "candle-core", + "candle-nn", + "prost 0.12.6", +] + [[package]] name = "cbc" version = "0.1.2" @@ -870,6 +1135,12 @@ dependencies = [ "shlex", ] +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + [[package]] name = "cexpr" version = "0.6.0" @@ -900,6 +1171,17 @@ dependencies = [ "libc", ] +[[package]] +name = "chardetng" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14b8f0b65b7b08ae3c8187e8d77174de20cb6777864c6b832d8ad365999cf1ea" +dependencies = [ + "cfg-if", + "encoding_rs", + "memchr", +] + [[package]] name = "chrono" version = "0.4.43" @@ -914,6 +1196,39 @@ dependencies = [ "windows-link 0.2.1", ] +[[package]] +name = "chunked_transfer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e4de3bc4ea267985becf712dc6d9eed8b04c953b3fcfb339ebc87acd9804901" + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + [[package]] name = "cipher" version = "0.4.4" @@ -943,57 +1258,189 @@ dependencies = [ ] [[package]] -name = "clock" -version = "0.1.0" -source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" -dependencies = [ - "serde", - "smallvec", -] - -[[package]] -name = "cobs" -version = "0.3.0" +name = "clap" +version = "4.5.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +checksum = "3e34525d5bbbd55da2bb745d34b36121baac88d07619a9a09cfcf4a6c0832785" dependencies = [ - "thiserror 2.0.18", + "clap_builder", ] [[package]] -name = "cocoa" -version = "0.25.0" +name = "clap_builder" +version = "4.5.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6140449f97a6e97f9511815c5632d84c8aacf8ac271ad77c559218161a1373c" +checksum = "59a20016a20a3da95bef50ec7238dbd09baeef4311dcdd38ec15aba69812fb61" dependencies = [ - "bitflags 1.3.2", - "block", - "cocoa-foundation 0.1.2", - "core-foundation 0.9.4", - "core-graphics 0.23.2", - "foreign-types", - "libc", - "objc", + "anstyle", + "clap_lex", + "strsim", ] [[package]] -name = "cocoa" -version = "0.26.0" +name = "clap_lex" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79398230a6e2c08f5c9760610eb6924b52aa9e7950a619602baba59dcbbdbb2" -dependencies = [ - "bitflags 2.10.0", - "block", - "cocoa-foundation 0.2.0", - "core-foundation 0.10.0", - "core-graphics 0.24.0", - "foreign-types", - "libc", - "objc", -] +checksum = "c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32" [[package]] -name = "cocoa-foundation" +name = "client" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "anyhow", + "async-tungstenite", + "base64 0.22.1", + "chrono", + "clock", + "cloud_api_client", + "cloud_llm_client", + "collections", + "credentials_provider", + "derive_more", + "feature_flags", + "fs", + "futures", + "gpui", + "gpui_tokio", + "http_client", + "http_client_tls", + "httparse", + "log", + "objc2-foundation", + "parking_lot", + "paths", + "postage", + "rand 0.9.2", + "regex", + "release_channel", + "rpc", + "rustls-pki-types", + "semver", + "serde", + "serde_json", + "serde_urlencoded", + "settings", + "sha2", + "smol", + "telemetry", + "telemetry_events", + "text", + "thiserror 2.0.18", + "time", + "tiny_http", + "tokio", + "tokio-native-tls", + "tokio-rustls 0.26.4", + "tokio-socks", + "url", + "util", + "windows 0.61.3", + "worktree", +] + +[[package]] +name = "clock" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "serde", + "smallvec", +] + +[[package]] +name = "cloud_api_client" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "anyhow", + "cloud_api_types", + "futures", + "gpui", + "gpui_tokio", + "http_client", + "parking_lot", + "serde_json", + "yawc", +] + +[[package]] +name = "cloud_api_types" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "anyhow", + "chrono", + "ciborium", + "cloud_llm_client", + "serde", +] + +[[package]] +name = "cloud_llm_client" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "anyhow", + "chrono", + "serde", + "serde_json", + "strum 0.27.2", + "uuid", +] + +[[package]] +name = "cmake" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" +dependencies = [ + "cc", +] + +[[package]] +name = "cobs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror 2.0.18", +] + +[[package]] +name = "cocoa" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6140449f97a6e97f9511815c5632d84c8aacf8ac271ad77c559218161a1373c" +dependencies = [ + "bitflags 1.3.2", + "block", + "cocoa-foundation 0.1.2", + "core-foundation 0.9.4", + "core-graphics 0.23.2", + "foreign-types 0.5.0", + "libc", + "objc", +] + +[[package]] +name = "cocoa" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f79398230a6e2c08f5c9760610eb6924b52aa9e7950a619602baba59dcbbdbb2" +dependencies = [ + "bitflags 2.10.0", + "block", + "cocoa-foundation 0.2.0", + "core-foundation 0.10.0", + "core-graphics 0.24.0", + "foreign-types 0.5.0", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" @@ -1031,6 +1478,17 @@ dependencies = [ "unicode-width", ] +[[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 = "collections" version = "0.1.0" @@ -1046,6 +1504,16 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + [[package]] name = "command-fds" version = "0.3.2" @@ -1096,6 +1564,12 @@ dependencies = [ "crossbeam-utils", ] +[[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" @@ -1116,6 +1590,59 @@ dependencies = [ "tiny-keccak", ] +[[package]] +name = "const_format" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "context_server" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "anyhow", + "async-trait", + "collections", + "futures", + "gpui", + "http_client", + "log", + "net", + "parking_lot", + "postage", + "schemars", + "serde", + "serde_json", + "settings", + "slotmap", + "smol", + "tempfile", + "terminal", + "url", + "util", +] + [[package]] name = "convert_case" version = "0.4.0" @@ -1166,7 +1693,7 @@ dependencies = [ "bitflags 1.3.2", "core-foundation 0.9.4", "core-graphics-types 0.1.3", - "foreign-types", + "foreign-types 0.5.0", "libc", ] @@ -1179,7 +1706,7 @@ dependencies = [ "bitflags 2.10.0", "core-foundation 0.10.0", "core-graphics-types 0.2.0", - "foreign-types", + "foreign-types 0.5.0", "libc", ] @@ -1192,7 +1719,7 @@ dependencies = [ "bitflags 2.10.0", "core-foundation 0.9.4", "core-graphics-types 0.1.3", - "foreign-types", + "foreign-types 0.5.0", "libc", ] @@ -1239,7 +1766,7 @@ checksum = "a593227b66cbd4007b2a050dfdd9e1d1318311409c8d600dc82ba1b15ca9c130" dependencies = [ "core-foundation 0.10.0", "core-graphics 0.24.0", - "foreign-types", + "foreign-types 0.5.0", "libc", ] @@ -1275,6 +1802,40 @@ dependencies = [ "libm", ] +[[package]] +name = "coreaudio-rs" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34ca07354f6d0640333ef95f48d460a4bcf34812a7e7967f9b44c728a8f37c28" +dependencies = [ + "bitflags 1.3.2", + "core-foundation-sys", + "coreaudio-sys", +] + +[[package]] +name = "coreaudio-rs" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aae284fbaf7d27aa0e292f7677dfbe26503b0d555026f702940805a630eac17" +dependencies = [ + "bitflags 1.3.2", + "libc", + "objc2-audio-toolbox", + "objc2-core-audio", + "objc2-core-audio-types", + "objc2-core-foundation", +] + +[[package]] +name = "coreaudio-sys" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ceec7a6067e62d6f931a2baf6f3a751f4a892595bcec1461a3c94ef9949864b6" +dependencies = [ + "bindgen 0.72.1", +] + [[package]] name = "cosmic-text" version = "0.14.2" @@ -1298,6 +1859,32 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "cpal" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbd307f43cc2a697e2d1f8bc7a1d824b5269e052209e28883e5bc04d095aaa3f" +dependencies = [ + "alsa", + "coreaudio-rs 0.13.0", + "dasp_sample", + "jni", + "js-sys", + "libc", + "mach2 0.4.3", + "ndk", + "ndk-context", + "num-derive", + "num-traits", + "objc2-audio-toolbox", + "objc2-core-audio", + "objc2-core-audio-types", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows 0.54.0", +] + [[package]] name = "cpufeatures" version = "0.2.17" @@ -1452,6 +2039,33 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "credentials_provider" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "anyhow", + "futures", + "gpui", + "paths", + "release_channel", + "serde", + "serde_json", +] + +[[package]] +name = "crossbeam" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + [[package]] name = "crossbeam-channel" version = "0.5.15" @@ -1535,16 +2149,177 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" [[package]] -name = "data-url" -version = "0.3.2" +name = "cxx" +version = "1.0.194" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376" +checksum = "747d8437319e3a2f43d93b341c137927ca70c0f5dabeea7a005a73665e247c7e" +dependencies = [ + "cc", + "cxx-build", + "cxxbridge-cmd", + "cxxbridge-flags", + "cxxbridge-macro", + "foldhash 0.2.0", + "link-cplusplus", +] [[package]] -name = "deflate64" -version = "0.1.10" +name = "cxx-build" +version = "1.0.194" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26bf8fc351c5ed29b5c2f0cbbac1b209b74f60ecd62e675a998df72c49af5204" +checksum = "b0f4697d190a142477b16aef7da8a99bfdc41e7e8b1687583c0d23a79c7afc1e" +dependencies = [ + "cc", + "codespan-reporting 0.13.1", + "indexmap", + "proc-macro2", + "quote", + "scratch", + "syn 2.0.114", +] + +[[package]] +name = "cxxbridge-cmd" +version = "1.0.194" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0956799fa8678d4c50eed028f2de1c0552ae183c76e976cf7ca8c4e36a7c328" +dependencies = [ + "clap", + "codespan-reporting 0.13.1", + "indexmap", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "cxxbridge-flags" +version = "1.0.194" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23384a836ab4f0ad98ace7e3955ad2de39de42378ab487dc28d3990392cb283a" + +[[package]] +name = "cxxbridge-macro" +version = "1.0.194" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6acc6b5822b9526adfb4fc377b67128fdd60aac757cc4a741a6278603f763cf" +dependencies = [ + "indexmap", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "dap" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "anyhow", + "async-compression", + "async-tar", + "async-trait", + "client", + "collections", + "dap-types", + "fs", + "futures", + "gpui", + "http_client", + "language", + "libc", + "log", + "node_runtime", + "parking_lot", + "paths", + "proto", + "schemars", + "serde", + "serde_json", + "settings", + "smallvec", + "smol", + "task", + "telemetry", + "util", +] + +[[package]] +name = "dap-types" +version = "0.0.1" +source = "git+https://github.com/zed-industries/dap-types?rev=1b461b310481d01e02b2603c16d7144b926339f8#1b461b310481d01e02b2603c16d7144b926339f8" +dependencies = [ + "schemars", + "serde", + "serde_json", +] + +[[package]] +name = "dasp_sample" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" + +[[package]] +name = "data-encoding" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" + +[[package]] +name = "data-url" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376" + +[[package]] +name = "db" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "anyhow", + "gpui", + "indoc", + "log", + "paths", + "release_channel", + "smol", + "sqlez", + "sqlez_macros", + "util", + "zed_env_vars", +] + +[[package]] +name = "deflate64" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26bf8fc351c5ed29b5c2f0cbbac1b209b74f60ecd62e675a998df72c49af5204" + +[[package]] +name = "denoise" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "candle-core", + "candle-onnx", + "log", + "realfft", + "rodio", + "rustfft", + "thiserror 2.0.18", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] [[package]] name = "deranged" @@ -1556,6 +2331,17 @@ dependencies = [ "serde_core", ] +[[package]] +name = "derive_arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + [[package]] name = "derive_more" version = "0.99.20" @@ -1579,6 +2365,21 @@ dependencies = [ "syn 2.0.114", ] +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + +[[package]] +name = "diffy" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b545b8c50194bdd008283985ab0b31dba153cfd5b3066a92770634fbc0d7d291" +dependencies = [ + "nu-ansi-term", +] + [[package]] name = "digest" version = "0.10.7" @@ -1586,6 +2387,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", + "const-oid", "crypto-common", "subtle", ] @@ -1674,7 +2476,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed6b3e31251e87acd1b74911aed84071c8364fc9087972748ade2f1094ccce34" dependencies = [ "documented-macros", - "phf", + "phf 0.12.1", "thiserror 2.0.18", ] @@ -1738,12 +2540,117 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" +[[package]] +name = "dyn-stack" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e53799688f5632f364f8fb387488dd05db9fe45db7011be066fc20e7027f8b" +dependencies = [ + "bytemuck", + "reborrow", +] + +[[package]] +name = "dyn-stack" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c4713e43e2886ba72b8271aa66c93d722116acf7a75555cce11dcde84388fe8" +dependencies = [ + "bytemuck", + "dyn-stack-macros", +] + +[[package]] +name = "dyn-stack-macros" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d926b4d407d372f141f93bb444696142c29d32962ccbd3531117cf3aa0bfa9" + [[package]] name = "ec4rs" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b31a881d38439026e3d5dd938ab20328d36e23caca8fd5981c42e4b677f5842" +[[package]] +name = "edit_prediction_types" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "client", + "gpui", + "language", + "text", +] + +[[package]] +name = "editor" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "aho-corasick", + "anyhow", + "assets", + "buffer_diff", + "client", + "clock", + "collections", + "convert_case 0.8.0", + "dap", + "db", + "edit_prediction_types", + "emojis", + "feature_flags", + "file_icons", + "fs", + "futures", + "fuzzy", + "git", + "gpui", + "indoc", + "itertools 0.14.0", + "language", + "linkify", + "log", + "lsp", + "markdown", + "menu", + "multi_buffer", + "ordered-float", + "parking_lot", + "pretty_assertions", + "project", + "rand 0.9.2", + "regex", + "rope", + "rpc", + "schemars", + "serde", + "serde_json", + "settings", + "smallvec", + "smol", + "snippet", + "sum_tree", + "task", + "telemetry", + "text", + "theme", + "time", + "tracing", + "ui", + "unicode-script", + "unicode-segmentation", + "url", + "util", + "uuid", + "vim_mode_setting", + "workspace", + "zed_actions", + "zlog", + "ztracing", +] + [[package]] name = "either" version = "1.15.0" @@ -1761,7 +2668,7 @@ dependencies = [ "rustc_version", "toml 0.9.11+spec-1.1.0", "vswhom", - "winreg", + "winreg 0.55.0", ] [[package]] @@ -1776,6 +2683,15 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" +[[package]] +name = "emojis" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99e1f1df1f181f2539bac8bf027d31ca5ffbf9e559e3f2d09413b9107b5c02f4" +dependencies = [ + "phf 0.11.3", +] + [[package]] name = "encoding_rs" version = "0.8.35" @@ -1791,6 +2707,18 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" +[[package]] +name = "enum-as-inner" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.114", +] + [[package]] name = "enumflags2" version = "0.7.12" @@ -1920,12 +2848,59 @@ dependencies = [ "zune-inflate", ] +[[package]] +name = "extended" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af9673d8203fcb076b19dfd17e38b3d4ae9f44959416ea532ce72415a6020365" + +[[package]] +name = "extension" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "anyhow", + "async-trait", + "collections", + "dap", + "fs", + "futures", + "gpui", + "heck 0.5.0", + "http_client", + "language", + "log", + "lsp", + "parking_lot", + "proto", + "semver", + "serde", + "serde_json", + "task", + "toml 0.8.23", + "url", + "util", + "wasm-encoder 0.221.3", + "wasmparser 0.221.3", +] + [[package]] name = "fallible-iterator" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" +[[package]] +name = "fancy-regex" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "998b056554fbe42e03ae0e152895cd1a7e1002aec800fdc6635d20270260c46f" +dependencies = [ + "bit-set", + "regex-automata", + "regex-syntax", +] + [[package]] name = "fast-srgb8" version = "1.0.0" @@ -1976,6 +2951,26 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "feature_flags" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "futures", + "gpui", +] + +[[package]] +name = "file_icons" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "gpui", + "serde", + "theme", + "util", +] + [[package]] name = "filedescriptor" version = "0.8.3" @@ -2032,6 +3027,18 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ce81f49ae8a0482e4c55ea62ebbd7e5a686af544c00b9d090bba3ff9be97b3d" +[[package]] +name = "float8" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4203231de188ebbdfb85c11f3c20ca2b063945710de04e7b59268731e728b462" +dependencies = [ + "half", + "num-traits", + "rand 0.9.2", + "rand_distr", +] + [[package]] name = "float_next_after" version = "1.0.0" @@ -2050,12 +3057,24 @@ dependencies = [ "spin 0.9.8", ] +[[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 = "font-types" version = "0.10.1" @@ -2102,6 +3121,15 @@ dependencies = [ "ttf-parser 0.25.1", ] +[[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" @@ -2109,7 +3137,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" dependencies = [ "foreign-types-macros", - "foreign-types-shared", + "foreign-types-shared 0.3.1", ] [[package]] @@ -2123,6 +3151,12 @@ dependencies = [ "syn 2.0.114", ] +[[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" @@ -2184,6 +3218,22 @@ dependencies = [ "windows 0.61.3", ] +[[package]] +name = "fs2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + [[package]] name = "fsevent" version = "0.1.0" @@ -2273,72 +3323,319 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] -name = "futures-lite" -version = "1.13.0" +name = "futures-lite" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +dependencies = [ + "fastrand 1.9.0", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand 2.3.0", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "fuzzy" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "gpui", + "log", + "util", +] + +[[package]] +name = "gemm" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ab24cc62135b40090e31a76a9b2766a501979f3070fa27f689c27ec04377d32" +dependencies = [ + "dyn-stack 0.10.0", + "gemm-c32 0.17.1", + "gemm-c64 0.17.1", + "gemm-common 0.17.1", + "gemm-f16 0.17.1", + "gemm-f32 0.17.1", + "gemm-f64 0.17.1", + "num-complex", + "num-traits", + "paste", + "raw-cpuid 10.7.0", + "seq-macro", +] + +[[package]] +name = "gemm" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab96b703d31950f1aeddded248bc95543c9efc7ac9c4a21fda8703a83ee35451" +dependencies = [ + "dyn-stack 0.13.2", + "gemm-c32 0.18.2", + "gemm-c64 0.18.2", + "gemm-common 0.18.2", + "gemm-f16 0.18.2", + "gemm-f32 0.18.2", + "gemm-f64 0.18.2", + "num-complex", + "num-traits", + "paste", + "raw-cpuid 11.6.0", + "seq-macro", +] + +[[package]] +name = "gemm-c32" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9c030d0b983d1e34a546b86e08f600c11696fde16199f971cd46c12e67512c0" +dependencies = [ + "dyn-stack 0.10.0", + "gemm-common 0.17.1", + "num-complex", + "num-traits", + "paste", + "raw-cpuid 10.7.0", + "seq-macro", +] + +[[package]] +name = "gemm-c32" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6db9fd9f40421d00eea9dd0770045a5603b8d684654816637732463f4073847" +dependencies = [ + "dyn-stack 0.13.2", + "gemm-common 0.18.2", + "num-complex", + "num-traits", + "paste", + "raw-cpuid 11.6.0", + "seq-macro", +] + +[[package]] +name = "gemm-c64" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbb5f2e79fefb9693d18e1066a557b4546cd334b226beadc68b11a8f9431852a" +dependencies = [ + "dyn-stack 0.10.0", + "gemm-common 0.17.1", + "num-complex", + "num-traits", + "paste", + "raw-cpuid 10.7.0", + "seq-macro", +] + +[[package]] +name = "gemm-c64" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfcad8a3d35a43758330b635d02edad980c1e143dc2f21e6fd25f9e4eada8edf" +dependencies = [ + "dyn-stack 0.13.2", + "gemm-common 0.18.2", + "num-complex", + "num-traits", + "paste", + "raw-cpuid 11.6.0", + "seq-macro", +] + +[[package]] +name = "gemm-common" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2e7ea062c987abcd8db95db917b4ffb4ecdfd0668471d8dc54734fdff2354e8" +dependencies = [ + "bytemuck", + "dyn-stack 0.10.0", + "half", + "num-complex", + "num-traits", + "once_cell", + "paste", + "pulp 0.18.22", + "raw-cpuid 10.7.0", + "rayon", + "seq-macro", + "sysctl 0.5.5", +] + +[[package]] +name = "gemm-common" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a352d4a69cbe938b9e2a9cb7a3a63b7e72f9349174a2752a558a8a563510d0f3" +dependencies = [ + "bytemuck", + "dyn-stack 0.13.2", + "half", + "libm", + "num-complex", + "num-traits", + "once_cell", + "paste", + "pulp 0.21.5", + "raw-cpuid 11.6.0", + "rayon", + "seq-macro", + "sysctl 0.6.0", +] + +[[package]] +name = "gemm-f16" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +checksum = "7ca4c06b9b11952071d317604acb332e924e817bd891bec8dfb494168c7cedd4" dependencies = [ - "fastrand 1.9.0", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", + "dyn-stack 0.10.0", + "gemm-common 0.17.1", + "gemm-f32 0.17.1", + "half", + "num-complex", + "num-traits", + "paste", + "raw-cpuid 10.7.0", + "rayon", + "seq-macro", ] [[package]] -name = "futures-lite" -version = "2.6.1" +name = "gemm-f16" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +checksum = "cff95ae3259432f3c3410eaa919033cd03791d81cebd18018393dc147952e109" dependencies = [ - "fastrand 2.3.0", - "futures-core", - "futures-io", - "parking", - "pin-project-lite", + "dyn-stack 0.13.2", + "gemm-common 0.18.2", + "gemm-f32 0.18.2", + "half", + "num-complex", + "num-traits", + "paste", + "raw-cpuid 11.6.0", + "rayon", + "seq-macro", ] [[package]] -name = "futures-macro" -version = "0.3.31" +name = "gemm-f32" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "e9a69f51aaefbd9cf12d18faf273d3e982d9d711f60775645ed5c8047b4ae113" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", + "dyn-stack 0.10.0", + "gemm-common 0.17.1", + "num-complex", + "num-traits", + "paste", + "raw-cpuid 10.7.0", + "seq-macro", ] [[package]] -name = "futures-sink" -version = "0.3.31" +name = "gemm-f32" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "bc8d3d4385393304f407392f754cd2dc4b315d05063f62cf09f47b58de276864" +dependencies = [ + "dyn-stack 0.13.2", + "gemm-common 0.18.2", + "num-complex", + "num-traits", + "paste", + "raw-cpuid 11.6.0", + "seq-macro", +] [[package]] -name = "futures-task" -version = "0.3.31" +name = "gemm-f64" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "aa397a48544fadf0b81ec8741e5c0fba0043008113f71f2034def1935645d2b0" +dependencies = [ + "dyn-stack 0.10.0", + "gemm-common 0.17.1", + "num-complex", + "num-traits", + "paste", + "raw-cpuid 10.7.0", + "seq-macro", +] [[package]] -name = "futures-util" -version = "0.3.31" +name = "gemm-f64" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "35b2a4f76ce4b8b16eadc11ccf2e083252d8237c1b589558a49b0183545015bd" dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", + "dyn-stack 0.13.2", + "gemm-common 0.18.2", + "num-complex", + "num-traits", + "paste", + "raw-cpuid 11.6.0", + "seq-macro", ] [[package]] @@ -2381,9 +3678,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", + "js-sys", "libc", "r-efi", "wasip2", + "wasm-bindgen", ] [[package]] @@ -2459,6 +3758,27 @@ dependencies = [ "url", ] +[[package]] +name = "git_hosting_providers" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "anyhow", + "async-trait", + "futures", + "git", + "gpui", + "http_client", + "itertools 0.14.0", + "regex", + "serde", + "serde_json", + "settings", + "url", + "urlencoding", + "util", +] + [[package]] name = "glob" version = "0.3.3" @@ -2541,7 +3861,7 @@ dependencies = [ "as-raw-xcb-connection", "ashpd", "async-task", - "bindgen", + "bindgen 0.71.1", "bitflags 2.10.0", "blade-graphics", "blade-macros", @@ -2567,7 +3887,7 @@ dependencies = [ "embed-resource", "etagere", "filedescriptor", - "foreign-types", + "foreign-types 0.5.0", "futures", "gpui_macros", "http_client", @@ -2625,7 +3945,7 @@ dependencies = [ "windows 0.61.3", "windows-core 0.61.2", "windows-numerics", - "windows-registry", + "windows-registry 0.5.3", "x11-clipboard", "x11rb", "xkbcommon", @@ -2645,21 +3965,73 @@ dependencies = [ "syn 2.0.114", ] +[[package]] +name = "gpui_tokio" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "anyhow", + "gpui", + "tokio", + "util", +] + [[package]] name = "grid" version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12101ecc8225ea6d675bc70263074eab6169079621c2186fe0c66590b2df9681" +[[package]] +name = "h2" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[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", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "half" version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" dependencies = [ + "bytemuck", "cfg-if", "crunchy", "num-traits", + "rand 0.9.2", + "rand_distr", "zerocopy", ] @@ -2675,7 +4047,7 @@ version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "foldhash", + "foldhash 0.1.5", "serde", ] @@ -2762,6 +4134,23 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "hound" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62adaabb884c94955b19907d60019f4e145d091c75345379e70d1ee696f7854f" + +[[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" @@ -2772,6 +4161,17 @@ dependencies = [ "itoa", ] +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http 0.2.12", + "pin-project-lite", +] + [[package]] name = "http-body" version = "1.0.1" @@ -2779,7 +4179,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http", + "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 1.0.1", + "pin-project-lite", ] [[package]] @@ -2794,8 +4207,8 @@ dependencies = [ "bytes", "derive_more", "futures", - "http", - "http-body", + "http 1.4.0", + "http-body 1.0.1", "log", "parking_lot", "serde", @@ -2807,6 +4220,125 @@ dependencies = [ "util", ] +[[package]] +name = "http_client_tls" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "rustls 0.23.36", + "rustls-platform-verifier", +] + +[[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 = "0.14.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.3.27", + "http 0.2.12", + "http-body 0.4.6", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2 0.5.10", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[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 0.4.13", + "http 1.4.0", + "http-body 1.0.1", + "httparse", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http 0.2.12", + "hyper 0.14.32", + "rustls 0.21.12", + "tokio", + "tokio-rustls 0.24.1", +] + +[[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 1.8.1", + "hyper-util", + "rustls 0.23.36", + "rustls-native-certs 0.8.3", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.26.4", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http 1.4.0", + "http-body 1.0.1", + "hyper 1.8.1", + "libc", + "pin-project-lite", + "socket2 0.6.2", + "tokio", + "tower-service", + "tracing", +] + [[package]] name = "iana-time-zone" version = "0.1.64" @@ -2848,7 +4380,7 @@ checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" dependencies = [ "displaydoc", "potential_utf", - "yoke", + "yoke 0.8.1", "zerofrom", "zerovec", ] @@ -2915,7 +4447,7 @@ dependencies = [ "displaydoc", "icu_locale_core", "writeable", - "yoke", + "yoke 0.8.1", "zerofrom", "zerotrie", "zerovec", @@ -2998,6 +4530,15 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" +[[package]] +name = "imara-diff" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17d34b7d42178945f775e84bc4c36dde7c1c6cdfea656d3354d009056f2bb3d2" +dependencies = [ + "hashbrown 0.15.5", +] + [[package]] name = "imgref" version = "1.12.0" @@ -3016,6 +4557,15 @@ dependencies = [ "serde_core", ] +[[package]] +name = "indoc" +version = "2.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" +dependencies = [ + "rustversion", +] + [[package]] name = "inotify" version = "0.9.6" @@ -3098,6 +4648,12 @@ dependencies = [ "leaky-cow", ] +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + [[package]] name = "is-docker" version = "0.2.0" @@ -3135,6 +4691,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.13.0" @@ -3154,10 +4719,32 @@ dependencies = [ ] [[package]] -name = "itoa" -version = "1.0.17" +name = "itoa" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" + +[[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", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jobserver" @@ -3179,6 +4766,21 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "jsonwebtoken" +version = "9.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a87cc7a48537badeae96744432de36f4be2b4a34a05a5ef32e9dd8a1c169dde" +dependencies = [ + "base64 0.22.1", + "js-sys", + "pem", + "ring", + "serde", + "serde_json", + "simple_asn1", +] + [[package]] name = "khronos-egl" version = "6.0.0" @@ -3229,6 +4831,53 @@ dependencies = [ "log", ] +[[package]] +name = "language" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "anyhow", + "async-trait", + "clock", + "collections", + "diffy", + "ec4rs", + "encoding_rs", + "fs", + "futures", + "fuzzy", + "globset", + "gpui", + "http_client", + "imara-diff", + "itertools 0.14.0", + "log", + "lsp", + "parking_lot", + "postage", + "regex", + "rpc", + "schemars", + "semver", + "serde", + "serde_json", + "settings", + "shellexpand", + "smallvec", + "smol", + "streaming-iterator", + "strsim", + "sum_tree", + "task", + "text", + "theme", + "tree-sitter", + "unicase", + "util", + "watch", + "zlog", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -3253,6 +4902,12 @@ dependencies = [ "leak", ] +[[package]] +name = "leb128" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" + [[package]] name = "leb128fmt" version = "0.1.0" @@ -3320,6 +4975,40 @@ dependencies = [ "redox_syscall 0.7.0", ] +[[package]] +name = "libsqlite3-sys" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "libwebrtc" +version = "0.3.10" +source = "git+https://github.com/zed-industries/livekit-rust-sdks?rev=5f04705ac3f356350ae31534ffbc476abc9ea83d#5f04705ac3f356350ae31534ffbc476abc9ea83d" +dependencies = [ + "cxx", + "jni", + "js-sys", + "lazy_static", + "livekit-protocol", + "livekit-runtime", + "log", + "parking_lot", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webrtc-sys", +] + [[package]] name = "libz-sys" version = "1.1.23" @@ -3332,6 +5021,24 @@ 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 = "linkify" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dfa36d52c581e9ec783a7ce2a5e0143da6237be5811a0b3153fedfdbe9f780" +dependencies = [ + "memchr", +] + [[package]] name = "linux-raw-sys" version = "0.4.15" @@ -3350,6 +5057,134 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +[[package]] +name = "livekit" +version = "0.7.8" +source = "git+https://github.com/zed-industries/livekit-rust-sdks?rev=5f04705ac3f356350ae31534ffbc476abc9ea83d#5f04705ac3f356350ae31534ffbc476abc9ea83d" +dependencies = [ + "chrono", + "futures-util", + "lazy_static", + "libloading", + "libwebrtc", + "livekit-api", + "livekit-protocol", + "livekit-runtime", + "log", + "parking_lot", + "prost 0.12.6", + "semver", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "livekit-api" +version = "0.4.2" +source = "git+https://github.com/zed-industries/livekit-rust-sdks?rev=5f04705ac3f356350ae31534ffbc476abc9ea83d#5f04705ac3f356350ae31534ffbc476abc9ea83d" +dependencies = [ + "futures-util", + "http 0.2.12", + "livekit-protocol", + "livekit-runtime", + "log", + "parking_lot", + "pbjson-types", + "prost 0.12.6", + "rand 0.9.2", + "reqwest", + "scopeguard", + "serde", + "sha2", + "thiserror 1.0.69", + "tokio", + "tokio-tungstenite", + "url", +] + +[[package]] +name = "livekit-protocol" +version = "0.3.9" +source = "git+https://github.com/zed-industries/livekit-rust-sdks?rev=5f04705ac3f356350ae31534ffbc476abc9ea83d#5f04705ac3f356350ae31534ffbc476abc9ea83d" +dependencies = [ + "futures-util", + "livekit-runtime", + "parking_lot", + "pbjson", + "pbjson-types", + "prost 0.12.6", + "prost-types 0.12.6", + "serde", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "livekit-runtime" +version = "0.4.0" +source = "git+https://github.com/zed-industries/livekit-rust-sdks?rev=5f04705ac3f356350ae31534ffbc476abc9ea83d#5f04705ac3f356350ae31534ffbc476abc9ea83d" +dependencies = [ + "tokio", + "tokio-stream", +] + +[[package]] +name = "livekit_api" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "anyhow", + "async-trait", + "jsonwebtoken", + "log", + "prost 0.9.0", + "prost-build 0.9.0", + "prost-types 0.9.0", + "serde", + "zed-reqwest", +] + +[[package]] +name = "livekit_client" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "anyhow", + "async-trait", + "audio", + "cocoa 0.26.0", + "collections", + "core-foundation 0.10.0", + "core-video", + "coreaudio-rs 0.12.1", + "cpal", + "futures", + "gpui", + "gpui_tokio", + "http_client_tls", + "image", + "libwebrtc", + "livekit", + "livekit_api", + "log", + "nanoid", + "objc", + "parking_lot", + "postage", + "rodio", + "serde", + "serde_json", + "serde_urlencoded", + "settings", + "smallvec", + "tokio-tungstenite", + "ui", + "util", + "zed-scap", +] + [[package]] name = "lock_api" version = "0.4.14" @@ -3378,6 +5213,44 @@ dependencies = [ "imgref", ] +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "lsp" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "anyhow", + "collections", + "futures", + "gpui", + "log", + "lsp-types", + "parking_lot", + "postage", + "release_channel", + "schemars", + "serde", + "serde_json", + "smol", + "util", +] + +[[package]] +name = "lsp-types" +version = "0.95.1" +source = "git+https://github.com/zed-industries/lsp-types?rev=b71ab4eeb27d9758be8092020a46fe33fbca4e33#b71ab4eeb27d9758be8092020a46fe33fbca4e33" +dependencies = [ + "bitflags 1.3.2", + "serde", + "serde_json", + "url", +] + [[package]] name = "lyon" version = "1.0.16" @@ -3463,6 +5336,25 @@ dependencies = [ "libc", ] +[[package]] +name = "markdown" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "base64 0.22.1", + "collections", + "futures", + "gpui", + "language", + "linkify", + "log", + "pulldown-cmark", + "sum_tree", + "theme", + "ui", + "util", +] + [[package]] name = "matchers" version = "0.2.0" @@ -3498,11 +5390,11 @@ version = "0.1.0" source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" dependencies = [ "anyhow", - "bindgen", + "bindgen 0.71.1", "core-foundation 0.10.0", "core-video", "ctor", - "foreign-types", + "foreign-types 0.5.0", "metal", "objc", ] @@ -3529,6 +5421,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490" dependencies = [ "libc", + "stable_deref_trait", ] [[package]] @@ -3557,7 +5450,7 @@ dependencies = [ "bitflags 2.10.0", "block", "core-graphics-types 0.1.3", - "foreign-types", + "foreign-types 0.5.0", "log", "objc", "paste", @@ -3580,6 +5473,22 @@ dependencies = [ "tree-sitter-json", ] +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -3645,6 +5554,36 @@ dependencies = [ "pxfm", ] +[[package]] +name = "multi_buffer" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "anyhow", + "buffer_diff", + "clock", + "collections", + "ctor", + "gpui", + "itertools 0.14.0", + "language", + "log", + "parking_lot", + "rand 0.9.2", + "rope", + "serde", + "settings", + "smallvec", + "smol", + "sum_tree", + "text", + "theme", + "tracing", + "tree-sitter", + "util", + "ztracing", +] + [[package]] name = "multimap" version = "0.8.3" @@ -3661,7 +5600,7 @@ dependencies = [ "bit-set", "bitflags 2.10.0", "cfg_aliases", - "codespan-reporting", + "codespan-reporting 0.12.0", "half", "hashbrown 0.15.5", "hexf-parse", @@ -3676,6 +5615,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "nanoid" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ffa00dec017b5b1a8b7cf5e2c008bfda1aa7e0697ac1508b491fdf2622fb4d8" +dependencies = [ + "rand 0.8.5", +] + [[package]] name = "nanorand" version = "0.7.0" @@ -3685,6 +5633,52 @@ dependencies = [ "getrandom 0.2.17", ] +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe 0.1.6", + "openssl-sys", + "schannel", + "security-framework 2.11.1", + "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.10.0", + "jni-sys", + "log", + "ndk-sys", + "num_enum", + "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", +] + [[package]] name = "net" version = "0.1.0" @@ -3726,6 +5720,29 @@ dependencies = [ "libc", ] +[[package]] +name = "node_runtime" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "anyhow", + "async-compression", + "async-std", + "async-tar", + "async-trait", + "futures", + "http_client", + "log", + "paths", + "semver", + "serde", + "serde_json", + "smol", + "util", + "watch", + "which 6.0.3", +] + [[package]] name = "nom" version = "7.1.3" @@ -3862,6 +5879,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ + "bytemuck", "num-traits", ] @@ -3933,6 +5951,28 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.114", +] + [[package]] name = "num_threads" version = "0.1.7" @@ -3974,9 +6014,9 @@ dependencies = [ [[package]] name = "objc2-app-kit" -version = "0.3.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" dependencies = [ "bitflags 2.10.0", "objc2", @@ -3985,6 +6025,43 @@ dependencies = [ "objc2-quartz-core", ] +[[package]] +name = "objc2-audio-toolbox" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10cbe18d879e20a4aea544f8befe38bcf52255eb63d3f23eca2842f3319e4c07" +dependencies = [ + "bitflags 2.10.0", + "libc", + "objc2", + "objc2-core-audio", + "objc2-core-audio-types", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-audio" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1eebcea8b0dbff5f7c8504f3107c68fc061a3eb44932051c8cf8a68d969c3b2" +dependencies = [ + "dispatch2", + "objc2", + "objc2-core-audio-types", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-core-audio-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a89f2ec274a0cf4a32642b2991e8b351a404d290da87bb6a9a9d8632490bd1c" +dependencies = [ + "bitflags 2.10.0", + "objc2", +] + [[package]] name = "objc2-core-foundation" version = "0.3.2" @@ -4004,9 +6081,9 @@ checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" [[package]] name = "objc2-foundation" -version = "0.3.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" dependencies = [ "bitflags 2.10.0", "objc2", @@ -4025,9 +6102,9 @@ dependencies = [ [[package]] name = "objc2-metal" -version = "0.3.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0125f776a10d00af4152d74616409f0d4a2053a6f57fa5b7d6aa2854ac04794" +checksum = "7f246c183239540aab1782457b35ab2040d4259175bd1d0c58e46ada7b47a874" dependencies = [ "bitflags 2.10.0", "block2", @@ -4037,9 +6114,9 @@ dependencies = [ [[package]] name = "objc2-quartz-core" -version = "0.3.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +checksum = "90ffb6a0cd5f182dc964334388560b12a57f7b74b3e2dec5e2722aa2dfb2ccd5" dependencies = [ "bitflags 2.10.0", "objc2", @@ -4050,9 +6127,9 @@ dependencies = [ [[package]] name = "objc2-ui-kit" -version = "0.3.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +checksum = "25b1312ad7bc8a0e92adae17aa10f90aae1fb618832f9b993b022b591027daed" dependencies = [ "bitflags 2.10.0", "objc2", @@ -4116,7 +6193,7 @@ dependencies = [ "ashpd", "async-fs", "async-io", - "async-lock", + "async-lock 3.4.2", "blocking", "cbc", "cipher", @@ -4130,7 +6207,7 @@ dependencies = [ "md-5", "num", "num-bigint-dig", - "pbkdf2", + "pbkdf2 0.12.2", "rand 0.9.2", "serde", "sha2", @@ -4152,6 +6229,56 @@ dependencies = [ "pathdiff", ] +[[package]] +name = "openssl" +version = "0.10.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" +dependencies = [ + "bitflags 2.10.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.114", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[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.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "optfield" version = "0.4.0" @@ -4169,6 +6296,15 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +[[package]] +name = "ordered-float" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" +dependencies = [ + "num-traits", +] + [[package]] name = "ordered-stream" version = "0.2.0" @@ -4231,6 +6367,17 @@ dependencies = [ "windows-link 0.2.1", ] +[[package]] +name = "password-hash" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" +dependencies = [ + "base64ct", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "paste" version = "1.0.15" @@ -4278,6 +6425,55 @@ dependencies = [ "util", ] +[[package]] +name = "pbjson" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1030c719b0ec2a2d25a5df729d6cff1acf3cc230bf766f4f97833591f7577b90" +dependencies = [ + "base64 0.21.7", + "serde", +] + +[[package]] +name = "pbjson-build" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2580e33f2292d34be285c5bc3dba5259542b083cfad6037b6d70345f24dcb735" +dependencies = [ + "heck 0.4.1", + "itertools 0.11.0", + "prost 0.12.6", + "prost-types 0.12.6", +] + +[[package]] +name = "pbjson-types" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18f596653ba4ac51bdecbb4ef6773bc7f56042dc13927910de1684ad3d32aa12" +dependencies = [ + "bytes", + "chrono", + "pbjson", + "pbjson-build", + "prost 0.12.6", + "prost-build 0.12.6", + "serde", +] + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest", + "hmac", + "password-hash", + "sha2", +] + [[package]] name = "pbkdf2" version = "0.12.2" @@ -4288,6 +6484,25 @@ dependencies = [ "hmac", ] +[[package]] +name = "pem" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" +dependencies = [ + "base64 0.22.1", + "serde_core", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.2" @@ -4314,6 +6529,15 @@ dependencies = [ "indexmap", ] +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_shared 0.11.3", +] + [[package]] name = "phf" version = "0.12.1" @@ -4321,7 +6545,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7" dependencies = [ "phf_macros", - "phf_shared", + "phf_shared 0.12.1", ] [[package]] @@ -4331,7 +6555,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2cbb1126afed61dd6368748dae63b1ee7dc480191c6262a3b4ff1e29d86a6c5b" dependencies = [ "fastrand 2.3.0", - "phf_shared", + "phf_shared 0.12.1", ] [[package]] @@ -4341,12 +6565,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d713258393a82f091ead52047ca779d37e5766226d009de21696c4e667044368" dependencies = [ "phf_generator", - "phf_shared", + "phf_shared 0.12.1", "proc-macro2", "quote", "syn 2.0.114", ] +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + [[package]] name = "phf_shared" version = "0.12.1" @@ -4405,6 +6638,27 @@ dependencies = [ "futures-io", ] +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[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" @@ -4457,6 +6711,15 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5da3b0203fd7ee5720aa0b5e790b591aa5d3f41c3ed2c34a3a393382198af2f7" +[[package]] +name = "pori" +version = "0.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a63d338dec139f56dacc692ca63ad35a6be6a797442479b55acd611d79e906" +dependencies = [ + "nom 7.1.3", +] + [[package]] name = "postage" version = "0.5.0" @@ -4502,12 +6765,42 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] -name = "ppv-lite86" -version = "0.2.21" +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "prettier" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "anyhow", + "collections", + "fs", + "gpui", + "language", + "log", + "lsp", + "node_runtime", + "parking_lot", + "paths", + "serde", + "serde_json", + "util", +] + +[[package]] +name = "pretty_assertions" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" dependencies = [ - "zerocopy", + "diff", + "yansi", ] [[package]] @@ -4520,6 +6813,15 @@ dependencies = [ "syn 2.0.114", ] +[[package]] +name = "primal-check" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc0d895b311e3af9902528fbb8f928688abbd95872819320517cc24ca6b2bd08" +dependencies = [ + "num-integer", +] + [[package]] name = "proc-macro-crate" version = "3.4.0" @@ -4579,6 +6881,80 @@ dependencies = [ "syn 2.0.114", ] +[[package]] +name = "project" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "aho-corasick", + "anyhow", + "askpass", + "async-trait", + "base64 0.22.1", + "buffer_diff", + "circular-buffer", + "client", + "clock", + "collections", + "context_server", + "dap", + "encoding_rs", + "extension", + "fancy-regex", + "fs", + "futures", + "fuzzy", + "git", + "git_hosting_providers", + "globset", + "gpui", + "http_client", + "image", + "indexmap", + "itertools 0.14.0", + "language", + "log", + "lsp", + "markdown", + "node_runtime", + "parking_lot", + "paths", + "postage", + "prettier", + "rand 0.9.2", + "regex", + "release_channel", + "remote", + "rpc", + "schemars", + "semver", + "serde", + "serde_json", + "settings", + "sha2", + "shellexpand", + "smallvec", + "smol", + "snippet", + "snippet_provider", + "sum_tree", + "task", + "tempfile", + "terminal", + "text", + "toml 0.8.23", + "tracing", + "url", + "util", + "watch", + "wax", + "which 6.0.3", + "worktree", + "zeroize", + "zlog", + "ztracing", +] + [[package]] name = "prost" version = "0.9.0" @@ -4586,7 +6962,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "444879275cb4fd84958b1a1d5420d15e6fcf7c235fe47f053c9c2a80aceb6001" dependencies = [ "bytes", - "prost-derive", + "prost-derive 0.9.0", +] + +[[package]] +name = "prost" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" +dependencies = [ + "bytes", + "prost-derive 0.12.6", ] [[package]] @@ -4602,13 +6988,34 @@ dependencies = [ "log", "multimap", "petgraph", - "prost", - "prost-types", + "prost 0.9.0", + "prost-types 0.9.0", "regex", "tempfile", "which 4.4.2", ] +[[package]] +name = "prost-build" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" +dependencies = [ + "bytes", + "heck 0.5.0", + "itertools 0.10.5", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease", + "prost 0.12.6", + "prost-types 0.12.6", + "regex", + "syn 2.0.114", + "tempfile", +] + [[package]] name = "prost-derive" version = "0.9.0" @@ -4622,6 +7029,19 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "prost-derive" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" +dependencies = [ + "anyhow", + "itertools 0.10.5", + "proc-macro2", + "quote", + "syn 2.0.114", +] + [[package]] name = "prost-types" version = "0.9.0" @@ -4629,7 +7049,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "534b7a0e836e3c482d2693070f982e39e7611da9695d4d1f5a4b186b51faef0a" dependencies = [ "bytes", - "prost", + "prost 0.9.0", +] + +[[package]] +name = "prost-types" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" +dependencies = [ + "prost 0.12.6", ] [[package]] @@ -4638,8 +7067,8 @@ version = "0.1.0" source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" dependencies = [ "anyhow", - "prost", - "prost-build", + "prost 0.9.0", + "prost-build 0.9.0", "serde", ] @@ -4653,6 +7082,17 @@ dependencies = [ "cc", ] +[[package]] +name = "pulldown-cmark" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e8bbe1a966bd2f362681a44f6edce3c2310ac21e4d5067a6e7ec396297a6ea0" +dependencies = [ + "bitflags 2.10.0", + "memchr", + "unicase", +] + [[package]] name = "pulley-interpreter" version = "33.0.2" @@ -4664,6 +7104,32 @@ dependencies = [ "wasmtime-math", ] +[[package]] +name = "pulp" +version = "0.18.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0a01a0dc67cf4558d279f0c25b0962bd08fc6dec0137699eae304103e882fe6" +dependencies = [ + "bytemuck", + "libm", + "num-complex", + "reborrow", +] + +[[package]] +name = "pulp" +version = "0.21.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b86df24f0a7ddd5e4b95c94fc9ed8a98f1ca94d3b01bdce2824097e7835907" +dependencies = [ + "bytemuck", + "cfg-if", + "libm", + "num-complex", + "reborrow", + "version_check", +] + [[package]] name = "pxfm" version = "0.1.27" @@ -4706,6 +7172,61 @@ 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 2.1.1", + "rustls 0.23.36", + "socket2 0.6.2", + "thiserror 2.0.18", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +dependencies = [ + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.2", + "ring", + "rustc-hash 2.1.1", + "rustls 0.23.36", + "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 0.6.2", + "tracing", + "windows-sys 0.60.2", +] + [[package]] name = "quote" version = "1.0.44" @@ -4780,6 +7301,16 @@ dependencies = [ "getrandom 0.3.4", ] +[[package]] +name = "rand_distr" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463" +dependencies = [ + "num-traits", + "rand 0.9.2", +] + [[package]] name = "rangemap" version = "1.7.1" @@ -4836,6 +7367,24 @@ dependencies = [ "rgb", ] +[[package]] +name = "raw-cpuid" +version = "10.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c297679cb867470fa8c9f67dbba74a78d78e3e98d7cf2b08d6d71540f797332" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "raw-cpuid" +version = "11.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" +dependencies = [ + "bitflags 2.10.0", +] + [[package]] name = "raw-window-handle" version = "0.6.2" @@ -4884,6 +7433,21 @@ dependencies = [ "font-types", ] +[[package]] +name = "realfft" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f821338fddb99d089116342c46e9f1fbf3828dba077674613e734e01d6ea8677" +dependencies = [ + "rustfft", +] + +[[package]] +name = "reborrow" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430" + [[package]] name = "redox_syscall" version = "0.2.16" @@ -5002,6 +7566,78 @@ dependencies = [ "semver", ] +[[package]] +name = "remote" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "anyhow", + "askpass", + "async-trait", + "collections", + "fs", + "futures", + "gpui", + "log", + "parking_lot", + "paths", + "prost 0.9.0", + "release_channel", + "rpc", + "schemars", + "semver", + "serde", + "serde_json", + "settings", + "smol", + "tempfile", + "thiserror 2.0.18", + "urlencoding", + "util", + "which 6.0.3", +] + +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2 0.3.27", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.32", + "hyper-rustls 0.24.2", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls 0.21.12", + "rustls-native-certs 0.6.3", + "rustls-pemfile 1.0.4", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 0.1.2", + "system-configuration 0.5.1", + "tokio", + "tokio-rustls 0.24.1", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg 0.50.0", +] + [[package]] name = "resvg" version = "0.45.1" @@ -5017,12 +7653,40 @@ dependencies = [ ] [[package]] -name = "rgb" -version = "0.8.52" +name = "rgb" +version = "0.8.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "ring" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ - "bytemuck", + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rodio" +version = "0.21.1" +source = "git+https://github.com/RustAudio/rodio?rev=e2074c6c2acf07b57cf717e076bdda7a9ac6e70b#e2074c6c2acf07b57cf717e076bdda7a9ac6e70b" +dependencies = [ + "cpal", + "dasp_sample", + "hound", + "num-rational", + "rtrb", + "symphonia", + "thiserror 2.0.18", ] [[package]] @@ -5046,6 +7710,57 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" +[[package]] +name = "rpc" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "anyhow", + "async-tungstenite", + "base64 0.22.1", + "chrono", + "collections", + "futures", + "gpui", + "parking_lot", + "proto", + "rand 0.9.2", + "rsa", + "serde", + "serde_json", + "sha2", + "strum 0.27.2", + "tracing", + "util", + "zstd", +] + +[[package]] +name = "rsa" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "signature", + "spki", + "subtle", + "zeroize", +] + +[[package]] +name = "rtrb" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8388ea1a9e0ea807e442e8263a699e7edcb320ecbcd21b4fa8ff859acce3ba" + [[package]] name = "rust-embed" version = "8.11.0" @@ -5108,6 +7823,20 @@ dependencies = [ "semver", ] +[[package]] +name = "rustfft" +version = "6.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21db5f9893e91f41798c88680037dba611ca6674703c1a18601b01a72c8adb89" +dependencies = [ + "num-complex", + "num-integer", + "num-traits", + "primal-check", + "strength_reduce", + "transpose", +] + [[package]] name = "rustix" version = "0.38.44" @@ -5145,6 +7874,135 @@ dependencies = [ "rustix 1.1.3", ] +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring", + "rustls-webpki 0.101.7", + "sct", +] + +[[package]] +name = "rustls" +version = "0.23.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" +dependencies = [ + "aws-lc-rs", + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki 0.103.9", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe 0.1.6", + "rustls-pemfile 1.0.4", + "schannel", + "security-framework 2.11.1", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +dependencies = [ + "openssl-probe 0.2.1", + "rustls-pki-types", + "schannel", + "security-framework 3.5.1", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[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-platform-verifier" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19787cda76408ec5404443dc8b31795c87cd8fec49762dc75fa727740d34acc1" +dependencies = [ + "core-foundation 0.10.0", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls 0.23.36", + "rustls-native-certs 0.8.3", + "rustls-platform-verifier-android", + "rustls-webpki 0.103.9", + "security-framework 3.5.1", + "security-framework-sys", + "webpki-root-certs 0.26.11", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" +dependencies = [ + "aws-lc-rs", + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.22" @@ -5192,6 +8050,16 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984" +[[package]] +name = "safetensors" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44560c11236a6130a46ce36c836a62936dc81ebf8c36a37947423571be0e55b6" +dependencies = [ + "serde", + "serde_json", +] + [[package]] name = "same-file" version = "1.0.6" @@ -5201,6 +8069,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schannel" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "scheduler" version = "0.1.0" @@ -5253,6 +8130,12 @@ 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 = "screencapturekit" version = "0.2.8" @@ -5276,12 +8159,58 @@ dependencies = [ "once_cell", ] +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "seahash" version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.10.0", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" +dependencies = [ + "bitflags 2.10.0", + "core-foundation 0.10.0", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "self_cell" version = "1.2.2" @@ -5298,6 +8227,12 @@ dependencies = [ "serde_core", ] +[[package]] +name = "seq-macro" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" + [[package]] name = "serde" version = "1.0.228" @@ -5427,6 +8362,18 @@ dependencies = [ "serde", ] +[[package]] +name = "session" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "db", + "gpui", + "serde_json", + "util", + "uuid", +] + [[package]] name = "settings" version = "0.1.0" @@ -5482,6 +8429,17 @@ dependencies = [ "syn 2.0.114", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sha1_smol" version = "1.0.1" @@ -5543,6 +8501,16 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core 0.6.4", +] + [[package]] name = "simd-adler32" version = "0.3.8" @@ -5558,6 +8526,18 @@ dependencies = [ "quote", ] +[[package]] +name = "simple_asn1" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" +dependencies = [ + "num-bigint", + "num-traits", + "thiserror 2.0.18", + "time", +] + [[package]] name = "simplecss" version = "0.2.2" @@ -5599,36 +8579,87 @@ dependencies = [ ] [[package]] -name = "smallvec" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +dependencies = [ + "serde", +] + +[[package]] +name = "smol" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33bd3e260892199c3ccfc487c88b2da2265080acb316cd920da72fdfd7c599f" +dependencies = [ + "async-channel 2.5.0", + "async-executor", + "async-fs", + "async-io", + "async-lock 3.4.2", + "async-net", + "async-process", + "blocking", + "futures-lite 2.6.1", +] + +[[package]] +name = "smol_str" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" + +[[package]] +name = "snippet" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "anyhow", + "smallvec", +] + +[[package]] +name = "snippet_provider" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" dependencies = [ + "anyhow", + "collections", + "extension", + "fs", + "futures", + "gpui", + "log", + "parking_lot", + "paths", + "schemars", "serde", + "serde_json", + "serde_json_lenient", + "snippet", + "util", ] [[package]] -name = "smol" -version = "2.0.2" +name = "socket2" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33bd3e260892199c3ccfc487c88b2da2265080acb316cd920da72fdfd7c599f" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ - "async-channel 2.5.0", - "async-executor", - "async-fs", - "async-io", - "async-lock", - "async-net", - "async-process", - "blocking", - "futures-lite 2.6.1", + "libc", + "windows-sys 0.52.0", ] [[package]] -name = "smol_str" -version = "0.2.2" +name = "socket2" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] [[package]] name = "spin" @@ -5657,12 +8688,61 @@ dependencies = [ "bitflags 2.10.0", ] +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + [[package]] name = "sptr" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a" +[[package]] +name = "sqlez" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "anyhow", + "collections", + "futures", + "indoc", + "libsqlite3-sys", + "log", + "parking_lot", + "smol", + "sqlformat", + "thread_local", + "util", + "uuid", +] + +[[package]] +name = "sqlez_macros" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "sqlez", + "sqlformat", + "syn 2.0.114", +] + +[[package]] +name = "sqlformat" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790" +dependencies = [ + "nom 7.1.3", + "unicode_categories", +] + [[package]] name = "stable_deref_trait" version = "1.2.1" @@ -5715,6 +8795,12 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520" +[[package]] +name = "strength_reduce" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe895eb47f22e2ddd4dabc02bce419d2e643c8e3b585c78158b349195bc24d82" + [[package]] name = "strict-num" version = "0.1.1" @@ -5724,6 +8810,12 @@ dependencies = [ "float-cmp", ] +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "strum" version = "0.26.3" @@ -5890,6 +8982,153 @@ dependencies = [ "zeno", ] +[[package]] +name = "symphonia" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5773a4c030a19d9bfaa090f49746ff35c75dfddfa700df7a5939d5e076a57039" +dependencies = [ + "lazy_static", + "symphonia-bundle-flac", + "symphonia-bundle-mp3", + "symphonia-codec-aac", + "symphonia-codec-pcm", + "symphonia-codec-vorbis", + "symphonia-core", + "symphonia-format-isomp4", + "symphonia-format-ogg", + "symphonia-format-riff", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-bundle-flac" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91565e180aea25d9b80a910c546802526ffd0072d0b8974e3ebe59b686c9976" +dependencies = [ + "log", + "symphonia-core", + "symphonia-metadata", + "symphonia-utils-xiph", +] + +[[package]] +name = "symphonia-bundle-mp3" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4872dd6bb56bf5eac799e3e957aa1981086c3e613b27e0ac23b176054f7c57ed" +dependencies = [ + "lazy_static", + "log", + "symphonia-core", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-codec-aac" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c263845aa86881416849c1729a54c7f55164f8b96111dba59de46849e73a790" +dependencies = [ + "lazy_static", + "log", + "symphonia-core", +] + +[[package]] +name = "symphonia-codec-pcm" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e89d716c01541ad3ebe7c91ce4c8d38a7cf266a3f7b2f090b108fb0cb031d95" +dependencies = [ + "log", + "symphonia-core", +] + +[[package]] +name = "symphonia-codec-vorbis" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f025837c309cd69ffef572750b4a2257b59552c5399a5e49707cc5b1b85d1c73" +dependencies = [ + "log", + "symphonia-core", + "symphonia-utils-xiph", +] + +[[package]] +name = "symphonia-core" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea00cc4f79b7f6bb7ff87eddc065a1066f3a43fe1875979056672c9ef948c2af" +dependencies = [ + "arrayvec", + "bitflags 1.3.2", + "bytemuck", + "lazy_static", + "log", +] + +[[package]] +name = "symphonia-format-isomp4" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "243739585d11f81daf8dac8d9f3d18cc7898f6c09a259675fc364b382c30e0a5" +dependencies = [ + "encoding_rs", + "log", + "symphonia-core", + "symphonia-metadata", + "symphonia-utils-xiph", +] + +[[package]] +name = "symphonia-format-ogg" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b4955c67c1ed3aa8ae8428d04ca8397fbef6a19b2b051e73b5da8b1435639cb" +dependencies = [ + "log", + "symphonia-core", + "symphonia-metadata", + "symphonia-utils-xiph", +] + +[[package]] +name = "symphonia-format-riff" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2d7c3df0e7d94efb68401d81906eae73c02b40d5ec1a141962c592d0f11a96f" +dependencies = [ + "extended", + "log", + "symphonia-core", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-metadata" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36306ff42b9ffe6e5afc99d49e121e0bd62fe79b9db7b9681d48e29fa19e6b16" +dependencies = [ + "encoding_rs", + "lazy_static", + "log", + "symphonia-core", +] + +[[package]] +name = "symphonia-utils-xiph" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27c85ab799a338446b68eec77abf42e1a6f1bb490656e121c6e27bfbab9f16" +dependencies = [ + "symphonia-core", + "symphonia-metadata", +] + [[package]] name = "syn" version = "1.0.109" @@ -5912,6 +9151,21 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[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" @@ -5932,6 +9186,34 @@ dependencies = [ "libc", ] +[[package]] +name = "sysctl" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7dddc5f0fee506baf8b9fdb989e242f17e4b11c61dfbb0635b705217199eea" +dependencies = [ + "bitflags 2.10.0", + "byteorder", + "enum-as-inner", + "libc", + "thiserror 1.0.69", + "walkdir", +] + +[[package]] +name = "sysctl" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01198a2debb237c62b6826ec7081082d951f46dbb64b0e8c7649a452230d1dfc" +dependencies = [ + "bitflags 2.10.0", + "byteorder", + "enum-as-inner", + "libc", + "thiserror 1.0.69", + "walkdir", +] + [[package]] name = "sysinfo" version = "0.31.4" @@ -5960,6 +9242,48 @@ dependencies = [ "windows 0.61.3", ] +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "system-configuration-sys 0.5.0", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.10.0", + "core-foundation 0.9.4", + "system-configuration-sys 0.6.0", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "taffy" version = "0.9.0" @@ -6019,6 +9343,27 @@ dependencies = [ "zed_actions", ] +[[package]] +name = "telemetry" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "futures", + "serde", + "serde_json", + "telemetry_events", +] + +[[package]] +name = "telemetry_events" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "semver", + "serde", + "serde_json", +] + [[package]] name = "tempfile" version = "3.24.0" @@ -6089,10 +9434,15 @@ dependencies = [ "collections", "core-text", "dirs 5.0.1", + "editor", + "file_icons", + "fs", "futures", + "git", "gpui", "notify 6.1.1", "open", + "project", "regex", "serde", "serde_json", @@ -6106,6 +9456,7 @@ dependencies = [ "tracing-subscriber", "ui", "util", + "worktree", ] [[package]] @@ -6283,6 +9634,19 @@ dependencies = [ "strict-num", ] +[[package]] +name = "tiny_http" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce51b50006056f590c9b7c3808c3bd70f0d1101666629713866c227d6e58d39" +dependencies = [ + "ascii", + "chrono", + "chunked_transfer", + "log", + "url", +] + [[package]] name = "tinystr" version = "0.8.2" @@ -6308,6 +9672,115 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +[[package]] +name = "tokio" +version = "1.49.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +dependencies = [ + "bytes", + "libc", + "mio 1.1.1", + "pin-project-lite", + "signal-hook-registry", + "socket2 0.6.2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[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-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls 0.21.12", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls 0.23.36", + "tokio", +] + +[[package]] +name = "tokio-socks" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d4770b8024672c1101b3f6733eab95b18007dbe0847a8afe341fcf79e06043f" +dependencies = [ + "either", + "futures-io", + "futures-util", + "thiserror 1.0.69", + "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", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084" +dependencies = [ + "futures-util", + "log", + "rustls 0.23.36", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.26.4", + "tungstenite 0.26.2", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + [[package]] name = "toml" version = "0.8.23" @@ -6400,6 +9873,33 @@ version = "1.0.6+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" +[[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 1.0.2", + "tokio", + "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" @@ -6462,6 +9962,16 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "transpose" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad61aed86bc3faea4300c7aee358b4c6d0c8d6ccc36524c96e4c92ccf26e77e" +dependencies = [ + "num-integer", + "strength_reduce", +] + [[package]] name = "tree-sitter" version = "0.26.3" @@ -6493,6 +10003,12 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae62f7eae5eb549c71b76658648b72cc6111f2d87d24a1e31fa907f4943e3ce" +[[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.20.0" @@ -6514,6 +10030,44 @@ dependencies = [ "core_maths", ] +[[package]] +name = "tungstenite" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" +dependencies = [ + "bytes", + "data-encoding", + "http 1.4.0", + "httparse", + "log", + "rand 0.9.2", + "rustls 0.23.36", + "rustls-pki-types", + "sha1", + "thiserror 2.0.18", + "utf-8", +] + +[[package]] +name = "tungstenite" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadc29d668c91fcc564941132e17b28a7ceb2f3ebf0b9dae3e03fd7a6748eb0d" +dependencies = [ + "bytes", + "data-encoding", + "http 1.4.0", + "httparse", + "log", + "rand 0.9.2", + "rustls 0.23.36", + "rustls-pki-types", + "sha1", + "thiserror 2.0.18", + "utf-8", +] + [[package]] name = "typeid" version = "1.0.3" @@ -6537,6 +10091,27 @@ dependencies = [ "winapi", ] +[[package]] +name = "ug" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90b70b37e9074642bc5f60bb23247fd072a84314ca9e71cdf8527593406a0dd3" +dependencies = [ + "gemm 0.18.2", + "half", + "libloading", + "memmap2", + "num", + "num-traits", + "num_cpus", + "rayon", + "safetensors", + "serde", + "thiserror 1.0.69", + "tracing", + "yoke 0.7.5", +] + [[package]] name = "ui" version = "0.1.0" @@ -6648,6 +10223,24 @@ 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 = "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" @@ -6673,7 +10266,7 @@ version = "0.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80be9b06fbae3b8b303400ab20778c80bbaf338f563afe567cf3c9eea17b47ef" dependencies = [ - "base64", + "base64 0.22.1", "data-url", "flate2", "fontdb 0.23.0", @@ -6830,6 +10423,14 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "vim_mode_setting" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "settings", +] + [[package]] name = "vswhom" version = "0.1.0" @@ -6880,6 +10481,15 @@ dependencies = [ "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.11.1+wasi-snapshot-preview1" @@ -6954,6 +10564,16 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-encoder" +version = "0.221.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc8444fe4920de80a4fe5ab564fff2ae58b6b73166b89751f8c6c93509da32e5" +dependencies = [ + "leb128", + "wasmparser 0.221.3", +] + [[package]] name = "wasm-encoder" version = "0.229.0" @@ -6961,7 +10581,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38ba1d491ecacb085a2552025c10a675a6fddcbd03b1fc9b36c536010ce265d2" dependencies = [ "leb128fmt", - "wasmparser", + "wasmparser 0.229.0", +] + +[[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 = "wasmparser" +version = "0.221.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d06bfa36ab3ac2be0dee563380147a5b81ba10dd8885d7fbbc9eb574be67d185" +dependencies = [ + "bitflags 2.10.0", + "hashbrown 0.15.5", + "indexmap", + "semver", + "serde", ] [[package]] @@ -6985,7 +10631,7 @@ checksum = "d25dac01892684a99b8fbfaf670eb6b56edea8a096438c75392daeb83156ae2e" dependencies = [ "anyhow", "termcolor", - "wasmparser", + "wasmparser 0.229.0", ] [[package]] @@ -7017,7 +10663,7 @@ dependencies = [ "smallvec", "sptr", "target-lexicon", - "wasmparser", + "wasmparser 0.229.0", "wasmtime-asm-macros", "wasmtime-cranelift", "wasmtime-environ", @@ -7083,7 +10729,7 @@ dependencies = [ "smallvec", "target-lexicon", "thiserror 2.0.18", - "wasmparser", + "wasmparser 0.229.0", "wasmtime-environ", "wasmtime-versioned-export-macros", ] @@ -7106,8 +10752,8 @@ dependencies = [ "serde_derive", "smallvec", "target-lexicon", - "wasm-encoder", - "wasmparser", + "wasm-encoder 0.229.0", + "wasmparser 0.229.0", "wasmprinter", ] @@ -7175,12 +10821,35 @@ dependencies = [ "gimli 0.31.1", "object 0.36.7", "target-lexicon", - "wasmparser", + "wasmparser 0.229.0", "wasmtime-cranelift", "wasmtime-environ", "winch-codegen", ] +[[package]] +name = "watch" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "parking_lot", +] + +[[package]] +name = "wax" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d12a78aa0bab22d2f26ed1a96df7ab58e8a93506a3e20adb47c51a93b4e1357" +dependencies = [ + "const_format", + "itertools 0.11.0", + "nom 7.1.3", + "pori", + "regex", + "thiserror 1.0.69", + "walkdir", +] + [[package]] name = "wayland-backend" version = "0.3.12" @@ -7289,6 +10958,69 @@ dependencies = [ "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-root-certs" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75c7f0ef91146ebfb530314f5f1d24528d7f0767efbfd31dce919275413e393e" +dependencies = [ + "webpki-root-certs 1.0.5", +] + +[[package]] +name = "webpki-root-certs" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36a29fc0408b113f68cf32637857ab740edfafdf460c326cd2afaa2d84cc05dc" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "webpki-roots" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12bed680863276c63889429bfd6cab3b99943659923822de1c8a39c49e4d722c" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "webrtc-sys" +version = "0.3.7" +source = "git+https://github.com/zed-industries/livekit-rust-sdks?rev=5f04705ac3f356350ae31534ffbc476abc9ea83d#5f04705ac3f356350ae31534ffbc476abc9ea83d" +dependencies = [ + "cc", + "cxx", + "cxx-build", + "glob", + "log", + "webrtc-sys-build", +] + +[[package]] +name = "webrtc-sys-build" +version = "0.3.6" +source = "git+https://github.com/zed-industries/livekit-rust-sdks?rev=5f04705ac3f356350ae31534ffbc476abc9ea83d#5f04705ac3f356350ae31534ffbc476abc9ea83d" +dependencies = [ + "fs2", + "regex", + "reqwest", + "scratch", + "semver", + "zip 0.6.6", +] + [[package]] name = "weezl" version = "0.1.12" @@ -7364,11 +11096,21 @@ dependencies = [ "smallvec", "target-lexicon", "thiserror 2.0.18", - "wasmparser", + "wasmparser 0.229.0", "wasmtime-cranelift", "wasmtime-environ", ] +[[package]] +name = "windows" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" +dependencies = [ + "windows-core 0.54.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows" version = "0.57.0" @@ -7414,6 +11156,16 @@ dependencies = [ "windows-core 0.61.2", ] +[[package]] +name = "windows-core" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" +dependencies = [ + "windows-result 0.1.2", + "windows-targets 0.52.6", +] + [[package]] name = "windows-core" version = "0.57.0" @@ -7529,6 +11281,17 @@ dependencies = [ "windows-link 0.1.3", ] +[[package]] +name = "windows-registry" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" +dependencies = [ + "windows-result 0.3.4", + "windows-strings 0.3.1", + "windows-targets 0.53.5", +] + [[package]] name = "windows-registry" version = "0.5.3" @@ -7567,6 +11330,15 @@ dependencies = [ "windows-link 0.2.1", ] +[[package]] +name = "windows-strings" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +dependencies = [ + "windows-link 0.1.3", +] + [[package]] name = "windows-strings" version = "0.4.2" @@ -7585,6 +11357,15 @@ 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" @@ -7594,6 +11375,15 @@ 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" @@ -7621,6 +11411,21 @@ 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" @@ -7678,6 +11483,12 @@ dependencies = [ "windows-link 0.1.3", ] +[[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" @@ -7696,6 +11507,12 @@ 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" @@ -7714,6 +11531,12 @@ 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" @@ -7744,6 +11567,12 @@ 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" @@ -7762,6 +11591,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -7780,6 +11615,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -7798,6 +11639,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -7825,6 +11672,16 @@ dependencies = [ "memchr", ] +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "winreg" version = "0.55.0" @@ -7856,6 +11713,87 @@ version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +[[package]] +name = "workspace" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "any_vec", + "anyhow", + "async-recursion", + "call", + "client", + "clock", + "collections", + "component", + "db", + "feature_flags", + "fs", + "futures", + "git", + "gpui", + "http_client", + "itertools 0.14.0", + "language", + "log", + "markdown", + "menu", + "node_runtime", + "parking_lot", + "postage", + "project", + "remote", + "schemars", + "serde", + "serde_json", + "session", + "settings", + "smallvec", + "sqlez", + "strum 0.27.2", + "task", + "telemetry", + "theme", + "ui", + "util", + "uuid", + "windows 0.61.3", + "zed_actions", +] + +[[package]] +name = "worktree" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "anyhow", + "async-lock 2.8.0", + "chardetng", + "clock", + "collections", + "encoding_rs", + "fs", + "futures", + "fuzzy", + "git", + "gpui", + "ignore", + "language", + "log", + "parking_lot", + "paths", + "postage", + "rpc", + "serde", + "serde_json", + "settings", + "smallvec", + "smol", + "sum_tree", + "text", + "util", +] + [[package]] name = "writeable" version = "0.6.2" @@ -7975,6 +11913,41 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + +[[package]] +name = "yawc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f6a46c0f189bbef59a24169b1a6e4d8bc1e476f6ea05bc657cf8e67aa3fbb0c" +dependencies = [ + "base64 0.22.1", + "bytes", + "flate2", + "futures", + "http-body-util", + "hyper 1.8.1", + "hyper-util", + "js-sys", + "nom 8.0.0", + "pin-project", + "rand 0.8.5", + "sha1", + "thiserror 2.0.18", + "tokio", + "tokio-rustls 0.26.4", + "tokio-util", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", +] + [[package]] name = "yazi" version = "0.2.1" @@ -7992,6 +11965,18 @@ dependencies = [ "pkg-config", ] +[[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" @@ -7999,10 +11984,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" dependencies = [ "stable_deref_trait", - "yoke-derive", + "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.114", + "synstructure", +] + [[package]] name = "yoke-derive" version = "0.8.1" @@ -8024,7 +12021,7 @@ dependencies = [ "async-broadcast", "async-executor", "async-io", - "async-lock", + "async-lock 3.4.2", "async-process", "async-recursion", "async-task", @@ -8100,6 +12097,55 @@ dependencies = [ "yeslogic-fontconfig-sys", ] +[[package]] +name = "zed-reqwest" +version = "0.12.15-zed" +source = "git+https://github.com/zed-industries/reqwest.git?rev=c15662463bda39148ba154100dd44d3fba5873a4#c15662463bda39148ba154100dd44d3fba5873a4" +dependencies = [ + "base64 0.22.1", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2 0.4.13", + "http 1.4.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.8.1", + "hyper-rustls 0.27.7", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "mime_guess", + "once_cell", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls 0.23.36", + "rustls-native-certs 0.8.3", + "rustls-pemfile 2.2.0", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 1.0.2", + "system-configuration 0.6.1", + "tokio", + "tokio-rustls 0.26.4", + "tokio-socks", + "tokio-util", + "tower", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "windows-registry 0.4.0", +] + [[package]] name = "zed-scap" version = "0.0.8-zed" @@ -8145,6 +12191,14 @@ dependencies = [ "uuid", ] +[[package]] +name = "zed_env_vars" +version = "0.1.0" +source = "git+https://github.com/zed-industries/zed?tag=v0.220.3#3d02817699175909ee72bf28305997094c5cef9d" +dependencies = [ + "gpui", +] + [[package]] name = "zeno" version = "0.3.3" @@ -8219,7 +12273,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" dependencies = [ "displaydoc", - "yoke", + "yoke 0.8.1", "zerofrom", ] @@ -8229,7 +12283,7 @@ version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" dependencies = [ - "yoke", + "yoke 0.8.1", "zerofrom", "zerovec-derive", ] @@ -8245,6 +12299,41 @@ dependencies = [ "syn 2.0.114", ] +[[package]] +name = "zip" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" +dependencies = [ + "aes", + "byteorder", + "bzip2", + "constant_time_eq", + "crc32fast", + "crossbeam-utils", + "flate2", + "hmac", + "pbkdf2 0.11.0", + "sha1", + "time", + "zstd", +] + +[[package]] +name = "zip" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cc23c04387f4da0374be4533ad1208cbb091d5c11d070dfef13676ad6497164" +dependencies = [ + "arbitrary", + "crc32fast", + "crossbeam-utils", + "displaydoc", + "indexmap", + "num_enum", + "thiserror 1.0.69", +] + [[package]] name = "zlog" version = "0.1.0" @@ -8262,6 +12351,35 @@ version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfcd145825aace48cff44a8844de64bf75feec3080e0aa5cdbde72961ae51a65" +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] + [[package]] name = "ztracing" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 4f2afbb..54acfa2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -34,6 +34,14 @@ theme = { git = "https://github.com/zed-industries/zed", tag = "v0.220.3" } # Zed Terminal (GPL-3.0) - Core terminal emulation terminal = { git = "https://github.com/zed-industries/zed", tag = "v0.220.3" } +# Zed Project (GPL-3.0) - File browser integration +project = { git = "https://github.com/zed-industries/zed", tag = "v0.220.3" } +worktree = { git = "https://github.com/zed-industries/zed", tag = "v0.220.3" } +fs = { git = "https://github.com/zed-industries/zed", tag = "v0.220.3" } +git = { git = "https://github.com/zed-industries/zed", tag = "v0.220.3" } +file_icons = { git = "https://github.com/zed-industries/zed", tag = "v0.220.3" } +editor = { git = "https://github.com/zed-industries/zed", tag = "v0.220.3" } + # Zed UI Components (GPL-3.0) ui = { git = "https://github.com/zed-industries/zed", tag = "v0.220.3" } diff --git a/docs/sprints/phase-3-sprint-1-design.md b/docs/sprints/phase-3-sprint-1-design.md index 252985d..913e651 100644 --- a/docs/sprints/phase-3-sprint-1-design.md +++ b/docs/sprints/phase-3-sprint-1-design.md @@ -5,6 +5,7 @@ **Status:** Design Complete **Estimated Duration:** 8-10 hours **Target Branch:** `feature/sprint-3-1-file-browser` +**Worktree Path:** `/Users/randlee/Documents/github/terminalg-worktrees/sprint-3-1-file-browser` --- @@ -21,6 +22,8 @@ Sprint 3.1 migrates Zed's `project_panel` to TerminalG as a file browser pane, p ### Strategic Decisions - **Use Zed's `project` crate as git dependency** (like terminal) +- **Project/worktree owned by WorkspaceView** and lazily initialized on first selection +- **Pause file watching when hidden** and full refresh on re-show (debounced ~500ms) - **Adapt project_panel patterns**, not copy wholesale - **Include most features** - Don't over-simplify - **Defer search/diff** - Requires additional infrastructure @@ -140,7 +143,7 @@ impl WorkspaceConfigStore { ``` **Insights for FileBrowser:** -- Add `file_browser_state: Option` to WorkspaceConfig +- Add `file_browser_state: Option` to WorkspaceConfig (best-effort restore) - Serialize expanded directories, scroll position, selected path - Auto-save on expand/collapse/selection changes @@ -377,12 +380,12 @@ fn confirm(&mut self, _: &Confirm, window: &mut Window, cx: &mut Context) ### Decision 4: State Persistence -**Decision:** Extend WorkspaceConfig with FileBrowserState +**Decision:** Extend WorkspaceConfig with FileBrowserPersistedState (paths only) **Structure:** ```rust #[derive(Serialize, Deserialize)] -pub struct FileBrowserState { +pub struct FileBrowserPersistedState { pub expanded_dirs: Vec, // Relative to workspace root pub scroll_offset: f32, pub selected_path: Option, @@ -394,15 +397,16 @@ pub struct FileBrowserState { - Simple, JSON-serializable - Per-workspace state isolation - Auto-saved via existing debounce mechanism +- **Best-effort restore**: if paths no longer exist (rename/move/delete), drop them silently ### Decision 5: "Open in Terminal" Integration -**Decision:** Add `TerminalPaneEvent::OpenPath(PathBuf)` event +**Decision:** Add `FileBrowserPaneEvent::OpenInTerminal(PathBuf)` event **Flow:** 1. User right-clicks folder in file browser 2. Selects "Open in Terminal" from context menu -3. FileBrowserPane emits `OpenPath(folder_path)` event +3. FileBrowserPane emits `OpenInTerminal(folder_path)` event 4. WorkspaceView subscribes, handles event 5. WorkspaceView calls `terminal_pane.open_in_directory(path, cx)` 6. TerminalPane spawns new terminal with cwd = path @@ -427,6 +431,14 @@ src/file_browser/ └── context_menu.rs # Context menu builder ``` +### 5.1.1 Project/Worktree Ownership (WorkspaceView) + +- `WorkspaceView` owns a per-workspace `Project` instance. +- `Project`/`Worktree` are **lazily created** the first time a workspace is selected. +- `FileBrowserPane` is created with the workspace’s `Project` entity and does not share it across workspaces. +- File watching is **paused/disabled** while the file browser pane is hidden to avoid background churn. +- When visibility is restored, `FileBrowserPane` performs a **full refresh** of visible entries, debounced to ~500ms. + ### 5.2 FileBrowserPane **File:** `src/file_browser/pane.rs` @@ -439,12 +451,12 @@ use project::{Project, ProjectEntryId, WorktreeId, GitEntry}; use gpui::{Entity, FocusHandle, UniformListScrollHandle}; pub struct FileBrowserPane { - // Project integration + // Project integration (provided by WorkspaceView on creation) project: Entity, fs: Arc, - // Per-workspace state - state_by_workspace: HashMap, + // Per-workspace runtime state (not persisted) + state_by_workspace: HashMap, active_workspace_id: String, // UI state @@ -464,7 +476,7 @@ pub struct FileBrowserPane { clipboard: Option, } -struct FileBrowserState { +struct FileBrowserRuntimeState { // Tree structure (flattened) visible_entries: Vec, @@ -482,6 +494,13 @@ struct FileBrowserState { scroll_offset: f32, } +#[derive(Clone, Debug, Serialize, Deserialize)] +struct FileBrowserPersistedState { + expanded_dirs: Vec, + scroll_offset: f32, + selected_path: Option, +} + #[derive(Clone, Debug)] enum ClipboardEntry { Copied(Vec), @@ -505,9 +524,15 @@ impl FileBrowserPane { pub fn new(project: Entity, workspace_id: String, cx: &mut Context) -> Self; // Workspace switching - pub fn set_active_workspace(&mut self, workspace_id: String, cx: &mut Context); - pub fn save_state(&self) -> FileBrowserState; - pub fn load_state(&mut self, state: FileBrowserState, cx: &mut Context); + pub fn set_active_workspace( + &mut self, + workspace_id: String, + project: Entity, + cx: &mut Context, + ); + pub fn set_visible(&mut self, visible: bool, window: &mut Window, cx: &mut Context); + pub fn save_state(&self) -> FileBrowserPersistedState; + pub fn load_state(&mut self, state: FileBrowserPersistedState, cx: &mut Context); // Tree management fn update_visible_entries(&mut self, autoscroll: bool, window: &mut Window, cx: &mut Context); @@ -580,6 +605,7 @@ pub fn build_flattened_tree( // Traverse worktree depth-first // Include entry if parent is expanded // Auto-fold single-child directories if enabled + // Filter hidden files only if global setting is enabled } /// Binary search in sorted expanded_dir_ids @@ -607,6 +633,9 @@ pub fn calculate_depth(entry: &GitEntry, worktree: &Worktree) -> usize { } ``` +**Workspace switch behavior:** +- `set_active_workspace` swaps the `Project` handle, loads persisted state if available, and triggers `update_visible_entries`. + **Estimated Size:** ~200-300 lines ### 5.4 Render Module @@ -930,7 +959,7 @@ Emit FileBrowserPaneEvent::OpenInTerminal(folder_path) WorkspaceView subscription handler | v -terminal_pane.spawn_terminal_with_directory(path, cx) +terminal_pane.spawn_terminal(workspace_id, Some(path), cx) | v New terminal tab opens with cwd = folder_path @@ -952,31 +981,53 @@ Switch to terminal pane (set terminal_visible = true) ```rust pub struct WorkspaceView { // Add file browser pane - file_browser_pane: Option>, + file_browser_pane: Entity, + + // Per-workspace project instances (lazy) + project_by_workspace: HashMap>, // Existing fields... - terminal_pane: Option>, + terminal_pane: Entity, } impl WorkspaceView { pub fn new(cx: &mut Context) -> Self { - // Create project entity - let project = cx.new(|cx| Project::local(...)); + // Create project for active workspace (others are lazy) + let workspace_id = config_store.active_workspace().id.clone(); + let root = config_store.workspace_root().to_path_buf(); + let project = cx.new(|cx| Project::local(root, cx)); + let mut project_by_workspace = HashMap::default(); + project_by_workspace.insert(workspace_id.clone(), project.clone()); // Create file browser pane - let file_browser_pane = cx.new(|cx| { - FileBrowserPane::new(project.clone(), "default".to_string(), cx) - }); + let file_browser_pane = + cx.new(|cx| FileBrowserPane::new(project.clone(), workspace_id, cx)); // Subscribe to file browser events cx.subscribe(&file_browser_pane, Self::handle_file_browser_event); Self { - file_browser_pane: Some(file_browser_pane), + file_browser_pane, + project_by_workspace, ... } } + fn ensure_project_for_workspace( + &mut self, + workspace_id: &str, + cx: &mut Context, + ) -> Entity { + if let Some(project) = self.project_by_workspace.get(workspace_id) { + return project.clone(); + } + let root = self.config_store.workspace_root().to_path_buf(); + let project = cx.new(|cx| Project::local(root, cx)); + self.project_by_workspace + .insert(workspace_id.to_string(), project.clone()); + project + } + fn handle_file_browser_event( &mut self, _pane: Entity, @@ -989,17 +1040,15 @@ impl WorkspaceView { // Future: open in document viewer } FileBrowserPaneEvent::OpenInTerminal(path) => { - if let Some(terminal_pane) = &self.terminal_pane { - terminal_pane.update(cx, |pane, cx| { - pane.spawn_terminal( - self.active_workspace_id.clone(), - Some(path.clone()), - cx, - ); - }); - self.terminal_visible = true; - cx.notify(); - } + self.terminal_pane.update(cx, |pane, cx| { + pane.spawn_terminal( + self.active_workspace_id.clone(), + Some(path.clone()), + cx, + ); + }); + self.terminal_visible = true; + cx.notify(); } FileBrowserPaneEvent::SelectionChanged(_path) => { // Future: preview in document viewer @@ -1008,12 +1057,7 @@ impl WorkspaceView { } fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { - // Replace file browser placeholder with actual pane - let file_browser_content = if let Some(pane) = &self.file_browser_pane { - pane.clone().into_any_element() - } else { - div().child("File Browser").into_any_element() - }; + let file_browser_content = self.file_browser_pane.clone().into_any_element(); h_flex() .when(self.file_browser_visible, |flex| { @@ -1028,6 +1072,12 @@ impl WorkspaceView { } ``` +**Visibility handling:** +- On `file_browser_visible = false`, call `file_browser_pane.set_visible(false, ...)` to pause watchers. +- On `true`, call `set_visible(true, ...)` to resume watchers and trigger a debounced full refresh (~500ms). +**Workspace switching:** +- On workspace change, call `ensure_project_for_workspace()` and then `file_browser_pane.set_active_workspace(workspace_id, project, cx)`. + **Estimated Changes:** ~100 lines added/modified ### 7.2 WorkspaceConfig Extension @@ -1043,11 +1093,11 @@ pub struct WorkspaceConfig { // Add file browser state #[serde(default)] - pub file_browser_state: Option, + pub file_browser_state: Option, } #[derive(Serialize, Deserialize, Clone, Debug)] -pub struct FileBrowserState { +pub struct FileBrowserPersistedState { /// Expanded directory paths (relative to workspace root) pub expanded_dirs: Vec, @@ -1058,7 +1108,7 @@ pub struct FileBrowserState { pub selected_path: Option, } -impl Default for FileBrowserState { +impl Default for FileBrowserPersistedState { fn default() -> Self { Self { expanded_dirs: vec![], @@ -1069,10 +1119,20 @@ impl Default for FileBrowserState { } ``` +**Restore behavior:** Best-effort; if persisted paths are missing on load (rename/move/delete), drop them silently. + **Estimated Changes:** ~30 lines added --- +### 7.3 Global Settings (Hidden Files) + +- Add a global setting `file_browser.hide_hidden_files: bool` (default `false`). +- Settings source of truth should live in the existing settings system (Zed settings adapter). +- `build_flattened_tree` checks this setting; when `true`, filter entries with filenames starting with `.`. + +--- + ## 8. Zed Crate Dependencies ### 8.1 New Cargo.toml Additions @@ -1095,8 +1155,8 @@ git = { git = "https://github.com/zed-industries/zed", tag = "v0.220.3" } # File icons (GPL-3.0) file_icons = { git = "https://github.com/zed-industries/zed", tag = "v0.220.3" } -# Editor component (for inline editing) - already have via terminal -# editor = { git = "https://github.com/zed-industries/zed", tag = "v0.220.3" } +# Editor component (for inline editing) +editor = { git = "https://github.com/zed-industries/zed", tag = "v0.220.3" } ``` ### 8.2 Transitive Dependencies @@ -1139,7 +1199,7 @@ These crates will be pulled in automatically: | `Cargo.toml` | Add project, fs, worktree, git, file_icons deps | +10 | | `src/main.rs` | Initialize project, register file browser | +20 | | `src/ui/workspace.rs` | Add file_browser_pane, event subscription | +100 | -| `src/ui/workspace_config.rs` | Add FileBrowserState | +30 | +| `src/ui/workspace_config.rs` | Add FileBrowserPersistedState | +30 | | `src/terminal/pane.rs` | Add spawn_terminal_with_directory method | +10 | **Total Modified Code:** ~170 lines @@ -1184,7 +1244,7 @@ actions!( **Sections:** 1. Imports and type definitions (50 lines) 2. FileBrowserPane struct (40 lines) -3. FileBrowserState struct (30 lines) +3. FileBrowserPersistedState struct (30 lines) 4. EditState, ClipboardEntry enums (20 lines) 5. Lifecycle methods (new, set_active_workspace) (60 lines) 6. Tree management (update_visible_entries, build_flattened_tree) (150 lines) @@ -1226,7 +1286,7 @@ actions!( **Goal:** Basic tree rendering, no interactions -- [ ] Add project, fs, worktree, git crate dependencies to Cargo.toml +- [ ] Add Zed crates: project, worktree, git, fs, editor, file_icons (and any UI helpers used by context menus) to Cargo.toml - [ ] Create `src/file_browser/mod.rs` with action definitions - [ ] Create `src/file_browser/state.rs` with build_flattened_tree stub - [ ] Create `src/file_browser/pane.rs` with minimal FileBrowserPane @@ -1246,7 +1306,7 @@ actions!( - [ ] Implement build_flattened_tree in state.rs - [ ] Traverse worktree depth-first - - [ ] Include all entries (no filtering yet) + - [ ] Include all entries (filter hidden files only if global setting enabled) - [ ] Return Vec - [ ] Create `src/file_browser/render.rs` - [ ] EntryDetails struct @@ -1264,7 +1324,7 @@ actions!( **Goal:** Interactive tree with expand/collapse -- [ ] Add expanded_dir_ids to FileBrowserState +- [ ] Add expanded_dir_ids to FileBrowserRuntimeState - [ ] Implement binary search utilities in state.rs - [ ] is_expanded - [ ] expand_dir @@ -1282,7 +1342,7 @@ actions!( **Goal:** Single and multi-selection with visual feedback -- [ ] Add selection, marked_entries to FileBrowserState +- [ ] Add selection, marked_entries to FileBrowserRuntimeState - [ ] Implement select_entry, toggle_marked in pane.rs - [ ] Update render_entry to highlight selected/marked entries - [ ] Add mouse click handlers with modifier detection @@ -1385,12 +1445,13 @@ actions!( **Goal:** Save/restore expanded dirs, scroll position, selection -- [ ] Add FileBrowserState to WorkspaceConfig +- [ ] Add FileBrowserPersistedState to WorkspaceConfig - [ ] Implement save_state in FileBrowserPane - [ ] Implement load_state in FileBrowserPane - [ ] Call save_state on expand/collapse/selection changes - [ ] Call load_state on workspace switch - [ ] Hook into WorkspaceConfigStore auto-save +- [ ] Pause file watching when pane hidden; on show, debounce a full refresh (~500ms) - [ ] Test: Expand folders, switch workspace, switch back -> folders still expanded - [ ] Test: Scroll position persists @@ -1401,7 +1462,7 @@ actions!( **Goal:** Auto-fold single-child directories, final polish - [ ] Implement auto-fold logic in build_flattened_tree -- [ ] Add unfolded_dir_ids to FileBrowserState (override auto-fold) +- [ ] Add unfolded_dir_ids to FileBrowserRuntimeState (override auto-fold) - [ ] Add unfold_directory, fold_directory actions - [ ] Test: Single-child directories auto-fold - [ ] Test: Unfold action disables auto-fold @@ -1442,6 +1503,7 @@ fn is_expanded(entry_id: ProjectEntryId, expanded_dir_ids: &[ProjectEntryId]) -> fn update_visible_entries(&mut self, window: &mut Window, cx: &mut Context) { let project = self.project.clone(); let expanded_ids = self.get_active_state().expanded_dir_ids.clone(); + let workspace_id = self.active_workspace_id.clone(); self.update_tree_task = cx.spawn_in(window, |this, cx| async move { // Build tree in background @@ -1449,7 +1511,7 @@ fn update_visible_entries(&mut self, window: &mut Window, cx: &mut Context // Update UI on main thread this.update(cx, |this, cx| { - if let Some(state) = this.state_by_workspace.get_mut(&this.active_workspace_id) { + if let Some(state) = this.state_by_workspace.get_mut(&workspace_id) { state.visible_entries = entries; } cx.notify(); @@ -1458,6 +1520,10 @@ fn update_visible_entries(&mut self, window: &mut Window, cx: &mut Context } ``` +**Visibility throttling:** +- When the pane is hidden, pause project watching (or ignore updates). +- When the pane becomes visible, trigger a full refresh with a ~500ms debounce to collapse bursts of FS events. + ### 11.3 Filename Validation ```rust @@ -1525,6 +1591,12 @@ fn should_auto_fold(entry: &GitEntry, worktree: &Worktree, unfolded_ids: &HashSe } ``` +### 11.6 Hidden Files Filtering + +- Default: show hidden files/folders. +- If global setting `file_browser.hide_hidden_files` is enabled, filter entries whose filename starts with `.`. +- Apply filtering during `build_flattened_tree` so selection/expand logic operates only on visible entries. + --- ## 12. Testing Strategy @@ -1614,6 +1686,7 @@ async fn test_rename_validation(cx: &mut TestAppContext) { - [ ] Git status colors match git state - [ ] Auto-fold single-child directories - [ ] State persists across workspace switches +- [ ] Hide file browser, modify files, re-show -> full refresh within ~500ms - [ ] Performance acceptable with 1000+ files - [ ] No crashes or errors in logs @@ -1777,12 +1850,12 @@ fn validate_filename(filename: &str) -> Result<()> { **Question:** Show hidden files by default? -**Recommendation:** Hide by default, toggle via context menu -- Reduces clutter -- Matches macOS Finder default -- Easy to toggle when needed +**Recommendation:** Show by default, allow hiding via global setting +- Matches terminal-centric workflows (dotfiles visible) +- Simple to implement as a global toggle +- Avoids “where did my file go?” confusion -**Decision:** Hide hidden files by default +**Decision:** Show hidden files by default; add a global app setting to hide --- diff --git a/src/file_browser/context_menu.rs b/src/file_browser/context_menu.rs new file mode 100644 index 0000000..4cfbad0 --- /dev/null +++ b/src/file_browser/context_menu.rs @@ -0,0 +1,150 @@ +//! File browser context menu +//! +//! This module provides context menu building for file browser operations. + +use crate::file_browser::state::ProjectEntryId; + +/// Context menu item for file operations +#[derive(Clone, Debug)] +pub struct ContextMenuItem { + /// Display label + pub label: String, + /// Optional keyboard shortcut hint + pub shortcut: Option, + /// Whether this item is enabled + pub enabled: bool, +} + +impl ContextMenuItem { + /// Create a new context menu item + #[must_use] + pub fn new(label: impl Into) -> Self { + Self { + label: label.into(), + shortcut: None, + enabled: true, + } + } + + /// Add a keyboard shortcut hint + #[must_use] + pub fn shortcut(mut self, shortcut: impl Into) -> Self { + self.shortcut = Some(shortcut.into()); + self + } + + /// Set whether this item is enabled + #[must_use] + pub const fn enabled(mut self, enabled: bool) -> Self { + self.enabled = enabled; + self + } +} + +/// Build context menu items for a file/folder entry +/// +/// # Arguments +/// * `entry_id` - ID of the entry +/// * `is_dir` - Whether the entry is a directory +/// * `has_clipboard` - Whether there's content in the clipboard +/// +/// # Returns +/// Vector of context menu items +#[must_use] +pub fn build_context_menu_items( + _entry_id: ProjectEntryId, + is_dir: bool, + has_clipboard: bool, +) -> Vec { + let mut items = vec![ + ContextMenuItem::new("New File").shortcut("N"), + ContextMenuItem::new("New Folder").shortcut("Shift+N"), + ]; + + // Separator represented by empty label + items.push(ContextMenuItem::new("---")); + + items.extend([ + ContextMenuItem::new("Rename").shortcut("F2"), + ContextMenuItem::new("Delete").shortcut("Delete"), + ]); + + items.push(ContextMenuItem::new("---")); + + items.extend([ + ContextMenuItem::new("Cut").shortcut("Cmd+X"), + ContextMenuItem::new("Copy").shortcut("Cmd+C"), + ContextMenuItem::new("Paste") + .shortcut("Cmd+V") + .enabled(has_clipboard), + ]); + + items.push(ContextMenuItem::new("---")); + + items.extend([ + ContextMenuItem::new("Copy Path"), + ContextMenuItem::new("Copy Relative Path"), + ]); + + items.push(ContextMenuItem::new("---")); + + items.push(ContextMenuItem::new("Reveal in Finder")); + + if is_dir { + items.push(ContextMenuItem::new("Open in Terminal")); + } + + items.push(ContextMenuItem::new("---")); + items.push(ContextMenuItem::new("Collapse All")); + + items +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn context_menu_item_new() { + let item = ContextMenuItem::new("Test"); + assert_eq!(item.label, "Test"); + assert!(item.shortcut.is_none()); + assert!(item.enabled); + } + + #[test] + fn context_menu_item_with_shortcut() { + let item = ContextMenuItem::new("Test").shortcut("Cmd+T"); + assert_eq!(item.shortcut, Some("Cmd+T".to_string())); + } + + #[test] + fn context_menu_item_disabled() { + let item = ContextMenuItem::new("Test").enabled(false); + assert!(!item.enabled); + } + + #[test] + fn build_context_menu_for_file() { + let items = build_context_menu_items(1, false, false); + + // Should not have "Open in Terminal" + assert!(!items.iter().any(|i| i.label == "Open in Terminal")); + + // Paste should be disabled + let paste = items.iter().find(|i| i.label == "Paste").unwrap(); + assert!(!paste.enabled); + } + + #[test] + fn build_context_menu_for_directory() { + let items = build_context_menu_items(1, true, true); + + // Should have "Open in Terminal" + assert!(items.iter().any(|i| i.label == "Open in Terminal")); + + // Paste should be enabled + let paste = items.iter().find(|i| i.label == "Paste").unwrap(); + assert!(paste.enabled); + } +} diff --git a/src/file_browser/mod.rs b/src/file_browser/mod.rs new file mode 100644 index 0000000..13a3781 --- /dev/null +++ b/src/file_browser/mod.rs @@ -0,0 +1,39 @@ +//! File browser components +//! +//! This module provides file system navigation and management capabilities +//! for `TerminalG`, supporting workspace-level file operations. + +// Allow dead_code until integration is complete +#![allow(dead_code)] +// Allow PartialEq without Eq for generated action types +#![allow(clippy::derive_partial_eq_without_eq)] + +mod context_menu; +mod pane; +mod render; +mod state; + +#[allow(unused_imports)] // Will be used when integrated with workspace +pub use pane::{FileBrowserPane, FileBrowserPaneEvent}; + +use gpui::actions; + +actions!( + file_browser, + [ + NewFile, + NewDirectory, + Rename, + Delete, + Copy, + Cut, + Paste, + CopyPath, + CopyRelativePath, + RevealInFinder, + OpenInTerminal, + CollapseAll, + ExpandSelectedEntry, + CollapseSelectedEntry, + ] +); diff --git a/src/file_browser/pane.rs b/src/file_browser/pane.rs new file mode 100644 index 0000000..d655bb0 --- /dev/null +++ b/src/file_browser/pane.rs @@ -0,0 +1,775 @@ +//! File browser pane component +//! +//! Main file browser component that orchestrates tree display, selection, +//! and file operations. This is Wave 2 of Sprint 3.1, implementing the core +//! `FileBrowserPane` with runtime state management and virtualized rendering. + +use collections::HashMap; +use gpui::{ + div, prelude::*, px, uniform_list, App, Context, EventEmitter, FocusHandle, Focusable, + IntoElement, KeyContext, KeyDownEvent, MouseButton, MouseDownEvent, Render, Styled, + UniformListScrollHandle, Window, +}; +use std::path::PathBuf; +use theme::ActiveTheme; + +use crate::file_browser::render::{render_entry, EntryDetails}; +use crate::file_browser::state::{collapse_dir, expand_dir, is_expanded, Entry, ProjectEntryId}; + +/// Events emitted by the file browser pane +#[derive(Clone, Debug)] +pub enum FileBrowserPaneEvent { + /// Request to open a file + OpenFile(PathBuf), + /// Request to open a terminal in a directory + OpenInTerminal(PathBuf), + /// Selection changed + SelectionChanged(Option), +} + +/// Per-workspace runtime state for the file browser +/// +/// This state is not persisted and is rebuilt when switching workspaces. +/// Persisted state (expanded dirs, scroll position) is handled separately +/// via `WorkspaceConfig`. +#[derive(Clone, Debug, Default)] +struct FileBrowserRuntimeState { + /// Complete tree of all entries (used for rebuilding `visible_entries`) + all_entries: Vec, + + /// Flattened tree of visible entries (filtered by expansion state) + visible_entries: Vec, + + /// Sorted vector of expanded directory IDs for O(log n) lookups + expanded_dir_ids: Vec, + + /// Currently selected entry ID + selection: Option, + + /// Marked entries for multi-selection + marked_entries: Vec, + + /// Scroll offset in pixels + scroll_offset: f32, +} + +/// File browser pane component +/// +/// Displays a tree view of files and folders for the active workspace. +/// Supports expand/collapse, selection, keyboard navigation, and emits +/// events for file operations. +pub struct FileBrowserPane { + /// Focus handle for keyboard input + focus_handle: FocusHandle, + + /// Scroll handle for virtualized list + scroll_handle: UniformListScrollHandle, + + /// Active workspace ID + active_workspace_id: String, + + /// Per-workspace runtime state + state_by_workspace: HashMap, +} + +impl FileBrowserPane { + /// Create a new file browser pane + #[must_use] + #[allow(clippy::needless_pass_by_ref_mut)] // cx will be used for subscriptions + pub fn new(workspace_id: String, cx: &mut Context) -> Self { + let focus_handle = cx.focus_handle(); + let scroll_handle = UniformListScrollHandle::new(); + let mut state_by_workspace = HashMap::default(); + + // Initialize state with placeholder entries for demonstration + let placeholder_entries = Self::create_placeholder_tree(); + let initial_state = FileBrowserRuntimeState { + all_entries: placeholder_entries.clone(), + visible_entries: placeholder_entries, + ..Default::default() + }; + + state_by_workspace.insert(workspace_id.clone(), initial_state); + + Self { + focus_handle, + scroll_handle, + active_workspace_id: workspace_id, + state_by_workspace, + } + } + + /// Create placeholder tree for demonstration + fn create_placeholder_tree() -> Vec { + vec![ + Entry { + id: 1, + path: PathBuf::from("src"), + is_dir: true, + depth: 0, + }, + Entry { + id: 2, + path: PathBuf::from("src/main.rs"), + is_dir: false, + depth: 1, + }, + Entry { + id: 3, + path: PathBuf::from("src/lib.rs"), + is_dir: false, + depth: 1, + }, + Entry { + id: 4, + path: PathBuf::from("src/file_browser"), + is_dir: true, + depth: 1, + }, + Entry { + id: 5, + path: PathBuf::from("Cargo.toml"), + is_dir: false, + depth: 0, + }, + Entry { + id: 6, + path: PathBuf::from("README.md"), + is_dir: false, + depth: 0, + }, + ] + } + + /// Get the active runtime state + fn get_active_state(&mut self) -> &mut FileBrowserRuntimeState { + self.state_by_workspace + .entry(self.active_workspace_id.clone()) + .or_insert_with(|| { + let placeholder_entries = Self::create_placeholder_tree(); + FileBrowserRuntimeState { + all_entries: placeholder_entries.clone(), + visible_entries: placeholder_entries, + ..Default::default() + } + }) + } + + /// Switch to a different workspace + pub fn set_active_workspace(&mut self, workspace_id: String, cx: &mut Context) { + self.active_workspace_id = workspace_id; + self.get_active_state(); + cx.notify(); + } + + /// Rebuild visible entries based on current expansion state + /// + /// An entry is visible if ALL its ancestors are expanded. + /// For the placeholder tree, this means: + /// - Root-level entries (depth 0) are always visible + /// - Entries at depth N are visible if their parent directory (at depth N-1) is expanded + fn rebuild_visible_entries(&mut self) { + let state = self.get_active_state(); + + let mut visible = Vec::new(); + let mut last_collapsed_depth: Option = None; + + for entry in &state.all_entries.clone() { + // Check if we're still inside a collapsed directory + if let Some(collapsed_depth) = last_collapsed_depth { + if entry.depth > collapsed_depth { + continue; + } + last_collapsed_depth = None; + } + + // Root-level entries are always visible + if entry.depth == 0 { + visible.push(entry.clone()); + + if entry.is_dir && !is_expanded(entry.id, &state.expanded_dir_ids) { + last_collapsed_depth = Some(entry.depth); + } + continue; + } + + // For nested entries, check if parent is expanded by scanning backwards + // from current position to find the nearest directory at parent depth + let parent_depth = entry.depth - 1; + let entry_index = state + .all_entries + .iter() + .position(|e| e.id == entry.id) + .unwrap_or(0); + let parent_expanded = state + .all_entries + .iter() + .take(entry_index) + .rev() + .find(|e| e.is_dir && e.depth == parent_depth) + .is_some_and(|parent| is_expanded(parent.id, &state.expanded_dir_ids)); + + if parent_expanded { + visible.push(entry.clone()); + + if entry.is_dir && !is_expanded(entry.id, &state.expanded_dir_ids) { + last_collapsed_depth = Some(entry.depth); + } + } else if entry.depth > 0 { + last_collapsed_depth = Some(parent_depth); + } + } + + self.get_active_state().visible_entries = visible; + } + + /// Toggle expansion state of a directory + fn toggle_expanded(&mut self, entry_id: ProjectEntryId, cx: &mut Context) { + let state = self.get_active_state(); + + if is_expanded(entry_id, &state.expanded_dir_ids) { + collapse_dir(entry_id, &mut state.expanded_dir_ids); + } else { + expand_dir(entry_id, &mut state.expanded_dir_ids); + } + + // Rebuild visible_entries based on new expansion state + self.rebuild_visible_entries(); + + cx.notify(); + } + + /// Select an entry + fn select_entry(&mut self, entry_id: ProjectEntryId, cx: &mut Context) { + let state = self.get_active_state(); + state.selection = Some(entry_id); + state.marked_entries.clear(); + + let path = state + .visible_entries + .iter() + .find(|e| e.id == entry_id) + .map(|e| e.path.clone()); + + cx.emit(FileBrowserPaneEvent::SelectionChanged(path)); + cx.notify(); + } + + /// Move selection up + fn move_selection_up(&mut self, cx: &mut Context) { + // Extract needed data from state first to avoid borrow conflicts + let new_entry_id = { + let state = self.get_active_state(); + if state.visible_entries.is_empty() { + return; + } + + let current_index = state + .selection + .and_then(|id| state.visible_entries.iter().position(|e| e.id == id)); + + // Bug fix: When no selection, up arrow should select last entry + let new_index = match current_index { + Some(idx) => { + if idx == 0 { + state.visible_entries.len() - 1 + } else { + idx - 1 + } + } + None => state.visible_entries.len() - 1, + }; + + state.visible_entries.get(new_index).map(|e| e.id) + }; + + if let Some(entry_id) = new_entry_id { + self.select_entry(entry_id, cx); + } + } + + /// Move selection down + fn move_selection_down(&mut self, cx: &mut Context) { + // Extract needed data from state first to avoid borrow conflicts + let new_entry_id = { + let state = self.get_active_state(); + if state.visible_entries.is_empty() { + return; + } + + let current_index = state + .selection + .and_then(|id| state.visible_entries.iter().position(|e| e.id == id)); + + // Bug fix: When no selection, down arrow should select first entry (index 0) + let new_index = match current_index { + Some(idx) => { + if idx >= state.visible_entries.len() - 1 { + 0 + } else { + idx + 1 + } + } + None => 0, + }; + + state.visible_entries.get(new_index).map(|e| e.id) + }; + + if let Some(entry_id) = new_entry_id { + self.select_entry(entry_id, cx); + } + } + + /// Expand or toggle the selected entry + fn expand_selected_entry(&mut self, cx: &mut Context) { + // Extract action info from state first to avoid borrow conflicts + let action = { + let state = self.get_active_state(); + + let Some(selected_id) = state.selection else { + return; + }; + + let Some(entry) = state.visible_entries.iter().find(|e| e.id == selected_id) else { + return; + }; + + if entry.is_dir { + if is_expanded(entry.id, &state.expanded_dir_ids) { + None // Already expanded, do nothing + } else { + Some((entry.id, true, None)) // (id, is_dir, path_for_open) + } + } else { + Some((entry.id, false, Some(entry.path.clone()))) + } + }; + + if let Some((entry_id, is_dir, path)) = action { + if is_dir { + self.toggle_expanded(entry_id, cx); + } else if let Some(p) = path { + cx.emit(FileBrowserPaneEvent::OpenFile(p)); + } + } + } + + /// Collapse the selected entry + fn collapse_selected_entry(&mut self, cx: &mut Context) { + // Extract action info from state first to avoid borrow conflicts + let action = { + let state = self.get_active_state(); + + let Some(selected_id) = state.selection else { + return; + }; + + // Bug fix: Find current entry's index first + let Some(current_index) = state + .visible_entries + .iter() + .position(|e| e.id == selected_id) + else { + return; + }; + + let entry = state.visible_entries[current_index].clone(); + + if entry.is_dir && is_expanded(entry.id, &state.expanded_dir_ids) { + Some((entry.id, true)) // (id, should_toggle) + } else if entry.depth > 0 { + // Bug fix: Find parent directory by scanning backwards from current position only + let parent_depth = entry.depth - 1; + state + .visible_entries + .iter() + .take(current_index) // Only look at entries before current + .rev() + .find(|e| e.is_dir && e.depth == parent_depth) + .map(|parent| (parent.id, false)) // (id, should_toggle=false means select) + } else { + None + } + }; + + if let Some((entry_id, should_toggle)) = action { + if should_toggle { + self.toggle_expanded(entry_id, cx); + } else { + self.select_entry(entry_id, cx); + } + } + } + + /// Handle keyboard input + fn handle_key_down( + &mut self, + event: &KeyDownEvent, + _window: &mut Window, + cx: &mut Context, + ) { + match event.keystroke.key.as_str() { + "up" => { + self.move_selection_up(cx); + cx.stop_propagation(); + } + "down" => { + self.move_selection_down(cx); + cx.stop_propagation(); + } + "left" => { + self.collapse_selected_entry(cx); + cx.stop_propagation(); + } + "right" | "enter" | " " => { + self.expand_selected_entry(cx); + cx.stop_propagation(); + } + _ => {} + } + } + + /// Handle mouse click on an entry + fn handle_entry_click( + &mut self, + entry_id: ProjectEntryId, + is_dir: bool, + _window: &mut Window, + cx: &mut Context, + ) { + if is_dir { + self.toggle_expanded(entry_id, cx); + } + self.select_entry(entry_id, cx); + } + + /// Render a single entry row + #[allow(clippy::needless_pass_by_ref_mut)] // cx.listener requires &mut + fn render_entry_row(&self, entry: &Entry, cx: &mut Context) -> impl IntoElement { + let state = self.state_by_workspace.get(&self.active_workspace_id); + + let is_selected = state.and_then(|s| s.selection) == Some(entry.id); + + let is_expanded_entry = state.is_some_and(|s| is_expanded(entry.id, &s.expanded_dir_ids)); + + let is_marked = state.is_some_and(|s| s.marked_entries.contains(&entry.id)); + + let details = EntryDetails { + id: entry.id, + filename: entry + .path + .file_name() + .and_then(|n| n.to_str()) + .unwrap_or("") + .to_string(), + depth: entry.depth, + is_dir: entry.is_dir, + is_expanded: is_expanded_entry, + is_selected, + is_marked, + is_editing: false, + path: entry.path.clone(), + }; + + let entry_id = entry.id; + let is_dir = entry.is_dir; + + div() + .id(("file-entry", entry_id)) + .cursor_pointer() + .on_mouse_down( + MouseButton::Left, + cx.listener(move |this, _event: &MouseDownEvent, window, cx| { + this.handle_entry_click(entry_id, is_dir, window, cx); + }), + ) + .child(render_entry(details, cx)) + } + + /// Render the file tree using `uniform_list` + #[allow(clippy::needless_pass_by_ref_mut)] // cx.listener requires &mut + fn render_tree(&self, cx: &mut Context) -> impl IntoElement { + let state = self.state_by_workspace.get(&self.active_workspace_id); + let entry_count = state.map_or(0, |s| s.visible_entries.len()); + + if entry_count == 0 { + return div() + .flex_1() + .flex() + .items_center() + .justify_center() + .text_color(cx.theme().colors().text_muted) + .child("No files to display") + .into_any_element(); + } + + let entries: Vec = state.map(|s| s.visible_entries.clone()).unwrap_or_default(); + + div() + .flex_1() + .overflow_hidden() + .child( + uniform_list("file-tree", entry_count, { + cx.processor(move |this, range: std::ops::Range, _window, cx| { + range + .filter_map(|ix| { + entries.get(ix).map(|entry| { + this.render_entry_row(entry, cx).into_any_element() + }) + }) + .collect() + }) + }) + .track_scroll(&self.scroll_handle), + ) + .into_any_element() + } +} + +impl EventEmitter for FileBrowserPane {} + +impl Focusable for FileBrowserPane { + fn focus_handle(&self, _cx: &App) -> FocusHandle { + self.focus_handle.clone() + } +} + +impl Render for FileBrowserPane { + fn render(&mut self, _window: &mut Window, cx: &mut Context) -> impl IntoElement { + let theme = cx.theme(); + + let mut key_context = KeyContext::default(); + key_context.add("FileBrowserPane"); + + div() + .key_context(key_context) + .track_focus(&self.focus_handle) + .on_key_down(cx.listener(Self::handle_key_down)) + .flex() + .flex_col() + .size_full() + .bg(theme.colors().panel_background) + .border_r_1() + .border_color(theme.colors().border) + .child( + // Header + div() + .h(px(32.0)) + .w_full() + .flex() + .items_center() + .px_2() + .border_b_1() + .border_color(theme.colors().border) + .child( + div() + .text_sm() + .font_weight(gpui::FontWeight::SEMIBOLD) + .text_color(theme.colors().text) + .child("Files"), + ), + ) + .child(self.render_tree(cx)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn placeholder_tree_has_entries() { + let entries = FileBrowserPane::create_placeholder_tree(); + assert!(!entries.is_empty()); + assert!(entries.iter().any(|e| e.is_dir)); + assert!(entries.iter().any(|e| !e.is_dir)); + } + + #[test] + fn runtime_state_default() { + let state = FileBrowserRuntimeState::default(); + assert!(state.all_entries.is_empty()); + assert!(state.visible_entries.is_empty()); + assert!(state.expanded_dir_ids.is_empty()); + assert!(state.selection.is_none()); + assert!(state.marked_entries.is_empty()); + assert!((state.scroll_offset - 0.0).abs() < f32::EPSILON); + } + + #[test] + fn rebuild_visible_entries_hides_collapsed_children() { + // Test that rebuild_visible_entries correctly filters out children of collapsed dirs + let all_entries = vec![ + Entry { + id: 1, + path: PathBuf::from("src"), + is_dir: true, + depth: 0, + }, + Entry { + id: 2, + path: PathBuf::from("src/main.rs"), + is_dir: false, + depth: 1, + }, + Entry { + id: 3, + path: PathBuf::from("docs"), + is_dir: true, + depth: 0, + }, + ]; + + // With no directories expanded, only root-level entries should be visible + let state = FileBrowserRuntimeState { + all_entries, + visible_entries: Vec::new(), + expanded_dir_ids: Vec::new(), // Nothing expanded + ..Default::default() + }; + + // Verify initial state + assert_eq!(state.all_entries.len(), 3); + // Root entries: src (depth 0), docs (depth 0) = 2 + // src/main.rs (depth 1) should be hidden when src is collapsed + let visible_count = state.all_entries.iter().filter(|e| e.depth == 0).count(); + assert_eq!(visible_count, 2); + } + + #[test] + fn rebuild_visible_entries_shows_expanded_children() { + // Test that children of expanded directories are visible + let all_entries = vec![ + Entry { + id: 1, + path: PathBuf::from("src"), + is_dir: true, + depth: 0, + }, + Entry { + id: 2, + path: PathBuf::from("src/main.rs"), + is_dir: false, + depth: 1, + }, + ]; + + let state = FileBrowserRuntimeState { + all_entries, + visible_entries: Vec::new(), + expanded_dir_ids: vec![1], // "src" is expanded + ..Default::default() + }; + + // When src is expanded, all 2 entries should be visible + assert_eq!(state.all_entries.len(), 2); + assert!(is_expanded(1, &state.expanded_dir_ids)); + } + + #[test] + fn initial_selection_down_selects_first() { + // When no selection exists, down arrow should select index 0 + // This verifies the fix for the off-by-one bug + let entries = [ + Entry { + id: 1, + path: PathBuf::from("first"), + is_dir: false, + depth: 0, + }, + Entry { + id: 2, + path: PathBuf::from("second"), + is_dir: false, + depth: 0, + }, + ]; + + // With no current selection, down should pick index 0 + let current_index: Option = None; + let new_index = + current_index.map_or(0, |idx| if idx >= entries.len() - 1 { 0 } else { idx + 1 }); + assert_eq!(new_index, 0); + assert_eq!(entries[new_index].id, 1); + } + + #[test] + fn initial_selection_up_selects_last() { + // When no selection exists, up arrow should select last entry + let entries = [ + Entry { + id: 1, + path: PathBuf::from("first"), + is_dir: false, + depth: 0, + }, + Entry { + id: 2, + path: PathBuf::from("second"), + is_dir: false, + depth: 0, + }, + ]; + + // With no current selection, up should pick last entry + let current_index: Option = None; + let new_index = current_index.map_or_else( + || entries.len() - 1, + |idx| { + if idx == 0 { + entries.len() - 1 + } else { + idx - 1 + } + }, + ); + assert_eq!(new_index, 1); + assert_eq!(entries[new_index].id, 2); + } + + #[test] + fn collapse_finds_correct_parent_not_later_sibling() { + // Test that collapse finds parent by scanning backwards from current position, + // not from end of list (which would find wrong parent) + let entries = [ + Entry { + id: 1, + path: PathBuf::from("src"), + is_dir: true, + depth: 0, + }, + Entry { + id: 2, + path: PathBuf::from("src/main.rs"), + is_dir: false, + depth: 1, + }, + Entry { + id: 3, + path: PathBuf::from("tests"), + is_dir: true, + depth: 0, + }, + ]; + + // If main.rs (id=2, depth=1) is selected and we want to find parent (depth=0), + // we should find "src" (id=1), NOT "tests" (id=3) + let selected_id = 2; + let current_index = entries.iter().position(|e| e.id == selected_id).unwrap(); + assert_eq!(current_index, 1); + + let entry = &entries[current_index]; + let parent_depth = entry.depth - 1; + + // Bug fix: scan backwards from current position only + let parent = entries + .iter() + .take(current_index) // Only look at entries before current + .rev() + .find(|e| e.is_dir && e.depth == parent_depth); + + assert!(parent.is_some()); + assert_eq!(parent.unwrap().id, 1); // Should be "src", not "tests" + } +} diff --git a/src/file_browser/render.rs b/src/file_browser/render.rs new file mode 100644 index 0000000..7cb2823 --- /dev/null +++ b/src/file_browser/render.rs @@ -0,0 +1,190 @@ +//! File browser entry rendering utilities +//! +//! This module provides utilities for rendering file and folder entries +//! with icons, git status indicators, and proper indentation. + +use gpui::{div, prelude::*, IntoElement, Styled}; +use std::path::PathBuf; +use theme::ActiveTheme; + +use crate::file_browser::state::ProjectEntryId; + +/// Details for rendering an entry +#[derive(Clone, Debug)] +#[allow(clippy::struct_excessive_bools)] // These bools represent distinct states +pub struct EntryDetails { + /// Entry ID + pub id: ProjectEntryId, + /// Display filename + pub filename: String, + /// Entry depth for indentation + pub depth: usize, + /// Whether this is a directory + pub is_dir: bool, + /// Whether this directory is expanded + pub is_expanded: bool, + /// Whether this entry is selected + pub is_selected: bool, + /// Whether this entry is marked (multi-select) + pub is_marked: bool, + /// Whether this entry is being edited + pub is_editing: bool, + /// Full path for this entry + pub path: PathBuf, +} + +impl EntryDetails { + /// Create entry details from path + #[must_use] + pub fn from_path(id: ProjectEntryId, path: PathBuf, is_dir: bool, depth: usize) -> Self { + let filename = path + .file_name() + .and_then(|n| n.to_str()) + .unwrap_or("") + .to_string(); + + Self { + id, + filename, + depth, + is_dir, + is_expanded: false, + is_selected: false, + is_marked: false, + is_editing: false, + path, + } + } +} + +/// Render a single file/folder entry +/// +/// # Arguments +/// * `details` - Entry rendering details +/// * `cx` - GPUI context +/// +/// # Returns +/// Element representing the entry row +#[allow(clippy::needless_pass_by_value)] // details is consumed +#[allow(clippy::needless_pass_by_ref_mut)] // cx will be used for event handlers +pub fn render_entry( + details: EntryDetails, + cx: &mut gpui::Context, +) -> impl IntoElement { + let theme = cx.theme(); + #[allow(clippy::cast_precision_loss)] // depth will never exceed f32 precision + let indent_width = details.depth as f32 * 16.0; + + div() + .h(gpui::px(24.0)) + .w_full() + .flex() + .items_center() + .gap_1() + .px_2() + .when(details.is_selected, |d| { + d.bg(theme.colors().element_selected) + }) + .when(details.is_marked && !details.is_selected, |d| { + d.bg(theme.colors().element_hover) + }) + // Indentation + .child(div().w(gpui::px(indent_width))) + // Expand/collapse indicator for directories + .child( + div() + .w(gpui::px(16.0)) + .flex() + .items_center() + .justify_center() + .when(details.is_dir, |d| { + d.child(if details.is_expanded { "v" } else { ">" }) + }), + ) + // Filename + .child( + div() + .flex_1() + .text_sm() + .text_color(theme.colors().text) + .child(details.filename), + ) +} + +/// Get git status color for an entry +/// +/// # Arguments +/// * `status` - Git status string (e.g., "M", "A", "D", "?") +/// * `cx` - GPUI context +/// +/// # Returns +/// Color for the git status +#[allow(dead_code)] +pub fn git_status_color(status: &str, cx: &gpui::Context) -> gpui::Hsla { + let theme = cx.theme(); + let status_colors = theme.status(); + + match status { + "A" | "?" => status_colors.created, // Added/Untracked - green + "M" => status_colors.modified, // Modified - yellow + "D" => status_colors.deleted, // Deleted - red + "C" => status_colors.conflict, // Conflict - purple + _ => theme.colors().text, // Default + } +} + +/// Get git status indicator character +/// +/// # Arguments +/// * `status` - Git status string +/// +/// # Returns +/// Single character indicator +#[must_use] +pub fn git_status_char(status: &str) -> &str { + match status { + "A" => "+", + "M" => "~", + "D" => "-", + "?" => "?", + "C" => "!", + _ => "", + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn entry_details_from_path() { + let path = PathBuf::from("src/main.rs"); + let details = EntryDetails::from_path(1, path, false, 1); + + assert_eq!(details.id, 1); + assert_eq!(details.filename, "main.rs"); + assert_eq!(details.depth, 1); + assert!(!details.is_dir); + assert!(!details.is_expanded); + assert!(!details.is_selected); + } + + #[test] + fn entry_details_from_path_directory() { + let path = PathBuf::from("src/file_browser"); + let details = EntryDetails::from_path(2, path, true, 1); + + assert_eq!(details.filename, "file_browser"); + assert!(details.is_dir); + } + + #[test] + fn git_status_char_mappings() { + assert_eq!(git_status_char("A"), "+"); + assert_eq!(git_status_char("M"), "~"); + assert_eq!(git_status_char("D"), "-"); + assert_eq!(git_status_char("?"), "?"); + assert_eq!(git_status_char("C"), "!"); + assert_eq!(git_status_char("X"), ""); + } +} diff --git a/src/file_browser/state.rs b/src/file_browser/state.rs new file mode 100644 index 0000000..d81f473 --- /dev/null +++ b/src/file_browser/state.rs @@ -0,0 +1,298 @@ +//! File browser tree state management utilities +//! +//! This module provides utilities for managing the flattened tree structure +//! and efficient binary search operations on expanded directory IDs. + +use std::path::{Path, PathBuf}; + +// TODO: Import actual types once project crate is integrated +// use project::{Project, ProjectEntryId, GitEntry, Worktree}; + +/// Placeholder for `ProjectEntryId` until project crate is integrated +/// In actual implementation, this will be `project::ProjectEntryId` +pub type ProjectEntryId = u64; + +/// Placeholder entry struct for tree building +/// In actual implementation, this will be `project::GitEntry` +#[derive(Clone, Debug)] +pub struct Entry { + pub id: ProjectEntryId, + pub path: PathBuf, + pub is_dir: bool, + pub depth: usize, +} + +/// Placeholder worktree reference +/// In actual implementation, this will be `&project::Worktree` +pub struct WorktreeRef; + +/// Build a flattened tree from a worktree, respecting expanded directories +/// +/// This function traverses the worktree depth-first and builds a flat Vec of entries +/// that are visible based on the expansion state. Only entries whose parent directories +/// are expanded will be included. +/// +/// # Arguments +/// * `worktree` - Reference to the worktree to traverse +/// * `expanded_dir_ids` - Sorted slice of directory IDs that are expanded +/// +/// # Returns +/// Vec of visible entries in depth-first order +/// +/// # TODO +/// - Implement actual worktree traversal using project crate +/// - Add auto-fold logic for single-child directories +/// - Calculate proper depth for each entry +/// - Include git status information from `GitEntry` +/// - Handle symlinks and special files +/// - Add error handling for filesystem access +#[allow(clippy::ptr_arg)] // Will use actual Worktree type later +#[allow(clippy::missing_const_for_fn)] // Returns Vec, which is not const-compatible +pub fn build_flattened_tree( + _worktree: &WorktreeRef, + _expanded_dir_ids: &[ProjectEntryId], +) -> Vec { + // TODO: Implement actual tree building logic + // Pseudocode: + // + // 1. Get root entries from worktree + // 2. For each entry in depth-first order: + // a. Include entry if parent is expanded (or entry is root-level) + // b. If entry is directory and expanded: + // - Recursively process children + // c. Apply auto-fold logic for single-child directories + // d. Calculate depth based on path components + // 3. Return flattened Vec + + Vec::new() +} + +/// Check if an entry ID is in the sorted `expanded_dir_ids` vector +/// +/// Uses binary search for O(log n) performance. +/// +/// # Arguments +/// * `entry_id` - The entry ID to check +/// * `expanded_dir_ids` - Sorted slice of expanded directory IDs +/// +/// # Returns +/// `true` if the entry is expanded, `false` otherwise +#[must_use] +pub fn is_expanded(entry_id: u64, expanded_dir_ids: &[u64]) -> bool { + expanded_dir_ids.binary_search(&entry_id).is_ok() +} + +/// Insert `entry_id` into sorted Vec, maintaining sort order +/// +/// Uses binary search to find the correct insertion position. If the entry +/// is already present, this is a no-op. +/// +/// # Arguments +/// * `entry_id` - The entry ID to insert +/// * `expanded_dir_ids` - Mutable sorted Vec of expanded directory IDs +pub fn expand_dir(entry_id: u64, expanded_dir_ids: &mut Vec) { + if let Err(ix) = expanded_dir_ids.binary_search(&entry_id) { + expanded_dir_ids.insert(ix, entry_id); + } +} + +/// Remove `entry_id` from sorted Vec +/// +/// Uses binary search to find the entry. If the entry is not found, +/// this is a no-op. +/// +/// # Arguments +/// * `entry_id` - The entry ID to remove +/// * `expanded_dir_ids` - Mutable sorted Vec of expanded directory IDs +pub fn collapse_dir(entry_id: u64, expanded_dir_ids: &mut Vec) { + if let Ok(ix) = expanded_dir_ids.binary_search(&entry_id) { + expanded_dir_ids.remove(ix); + } +} + +/// Calculate the depth of an entry for rendering indentation +/// +/// Depth is calculated based on the number of path components relative +/// to the workspace root. +/// +/// # Arguments +/// * `path` - The entry's path relative to workspace root +/// +/// # Returns +/// Depth as usize (0 for root-level entries) +#[must_use] +pub fn calculate_depth(path: &Path) -> usize { + path.components().count().saturating_sub(1) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn is_expanded_present() { + let expanded = vec![1, 3, 5, 7, 9]; + assert!(is_expanded(1, &expanded)); + assert!(is_expanded(5, &expanded)); + assert!(is_expanded(9, &expanded)); + } + + #[test] + fn is_expanded_absent() { + let expanded = vec![1, 3, 5, 7, 9]; + assert!(!is_expanded(0, &expanded)); + assert!(!is_expanded(2, &expanded)); + assert!(!is_expanded(4, &expanded)); + assert!(!is_expanded(6, &expanded)); + assert!(!is_expanded(8, &expanded)); + assert!(!is_expanded(10, &expanded)); + } + + #[test] + fn is_expanded_empty() { + let expanded: Vec = vec![]; + assert!(!is_expanded(1, &expanded)); + } + + #[test] + fn expand_dir_insert_middle() { + let mut expanded = vec![1, 3, 5, 7]; + expand_dir(4, &mut expanded); + assert_eq!(expanded, vec![1, 3, 4, 5, 7]); + } + + #[test] + fn expand_dir_insert_beginning() { + let mut expanded = vec![3, 5, 7]; + expand_dir(1, &mut expanded); + assert_eq!(expanded, vec![1, 3, 5, 7]); + } + + #[test] + fn expand_dir_insert_end() { + let mut expanded = vec![1, 3, 5]; + expand_dir(7, &mut expanded); + assert_eq!(expanded, vec![1, 3, 5, 7]); + } + + #[test] + fn expand_dir_duplicate() { + let mut expanded = vec![1, 3, 5]; + expand_dir(3, &mut expanded); + assert_eq!(expanded, vec![1, 3, 5]); + } + + #[test] + fn expand_dir_empty() { + let mut expanded: Vec = vec![]; + expand_dir(1, &mut expanded); + assert_eq!(expanded, vec![1]); + } + + #[test] + fn collapse_dir_remove_middle() { + let mut expanded = vec![1, 3, 5, 7]; + collapse_dir(5, &mut expanded); + assert_eq!(expanded, vec![1, 3, 7]); + } + + #[test] + fn collapse_dir_remove_beginning() { + let mut expanded = vec![1, 3, 5, 7]; + collapse_dir(1, &mut expanded); + assert_eq!(expanded, vec![3, 5, 7]); + } + + #[test] + fn collapse_dir_remove_end() { + let mut expanded = vec![1, 3, 5, 7]; + collapse_dir(7, &mut expanded); + assert_eq!(expanded, vec![1, 3, 5]); + } + + #[test] + fn collapse_dir_not_found() { + let mut expanded = vec![1, 3, 5, 7]; + collapse_dir(4, &mut expanded); + assert_eq!(expanded, vec![1, 3, 5, 7]); + } + + #[test] + fn collapse_dir_empty() { + let mut expanded: Vec = vec![]; + collapse_dir(1, &mut expanded); + assert!(expanded.is_empty()); + } + + #[test] + fn expand_collapse_roundtrip() { + let mut expanded = vec![1, 5, 9]; + + expand_dir(3, &mut expanded); + expand_dir(7, &mut expanded); + assert_eq!(expanded, vec![1, 3, 5, 7, 9]); + + collapse_dir(3, &mut expanded); + collapse_dir(7, &mut expanded); + assert_eq!(expanded, vec![1, 5, 9]); + } + + #[test] + fn expand_maintains_sort_order() { + let mut expanded = vec![10, 30, 50]; + + expand_dir(40, &mut expanded); + expand_dir(20, &mut expanded); + expand_dir(60, &mut expanded); + expand_dir(5, &mut expanded); + + assert_eq!(expanded, vec![5, 10, 20, 30, 40, 50, 60]); + } + + #[test] + fn calculate_depth_root_level() { + let path = PathBuf::from("README.md"); + assert_eq!(calculate_depth(&path), 0); + } + + #[test] + fn calculate_depth_one_level() { + let path = PathBuf::from("src/main.rs"); + assert_eq!(calculate_depth(&path), 1); + } + + #[test] + fn calculate_depth_two_levels() { + let path = PathBuf::from("src/file_browser/state.rs"); + assert_eq!(calculate_depth(&path), 2); + } + + #[test] + fn calculate_depth_deep_nesting() { + let path = PathBuf::from("a/b/c/d/e/f/file.txt"); + assert_eq!(calculate_depth(&path), 6); + } + + #[test] + fn build_flattened_tree_placeholder() { + let worktree = WorktreeRef; + let expanded: Vec = vec![1, 2, 3]; + + let result = build_flattened_tree(&worktree, &expanded); + assert!(result.is_empty()); + } + + #[test] + fn binary_search_performance() { + let mut expanded: Vec = (0..10000).step_by(2).collect(); + + assert!(is_expanded(5000, &expanded)); + assert!(!is_expanded(5001, &expanded)); + + expand_dir(5001, &mut expanded); + assert!(is_expanded(5001, &expanded)); + + collapse_dir(5001, &mut expanded); + assert!(!is_expanded(5001, &expanded)); + } +} diff --git a/src/main.rs b/src/main.rs index 07c105e..bb87973 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,6 +11,7 @@ mod settings_adapter; mod theme_adapter; // Active modules +mod file_browser; mod terminal; mod ui; mod viewer; diff --git a/src/ui/workspace.rs b/src/ui/workspace.rs index e44e376..5984d6c 100644 --- a/src/ui/workspace.rs +++ b/src/ui/workspace.rs @@ -2,6 +2,7 @@ //! //! Implements workspace tab bar and three-pane layout with configurable visibility. +use crate::file_browser::{FileBrowserPane, FileBrowserPaneEvent}; use crate::terminal::{TerminalPane, TerminalPaneEvent}; use crate::ui::workspace_config::WorkspaceConfigStore; use gpui::{ @@ -117,6 +118,12 @@ pub struct WorkspaceView { /// Workspace configuration store config_store: WorkspaceConfigStore, + /// File browser pane entity + file_browser_pane: Entity, + + /// Subscription to file browser pane events + _file_browser_subscription: Subscription, + /// Terminal pane entity terminal_pane: Entity, @@ -177,7 +184,8 @@ impl WorkspaceView { // Create terminal pane with workspace root as working directory let working_directory = Some(config_store.workspace_root().to_path_buf()); let workspace_id = config_store.active_workspace().id.clone(); - let terminal_pane = cx.new(|cx| TerminalPane::new(workspace_id, working_directory, cx)); + let terminal_pane = + cx.new(|cx| TerminalPane::new(workspace_id.clone(), working_directory, cx)); // Subscribe to terminal pane events let terminal_subscription = cx.subscribe(&terminal_pane, |_this, _pane, event, cx| { @@ -193,8 +201,29 @@ impl WorkspaceView { } }); + // Create file browser pane + let file_browser_pane = cx.new(|cx| FileBrowserPane::new(workspace_id, cx)); + + // Subscribe to file browser pane events + let file_browser_subscription = + cx.subscribe(&file_browser_pane, |this, _pane, event, cx| match event { + FileBrowserPaneEvent::OpenFile(path) => { + tracing::info!("Open file requested: {:?}", path); + // TODO: Wire up to document viewer once implemented + } + FileBrowserPaneEvent::OpenInTerminal(path) => { + tracing::info!("Open in terminal requested: {:?}", path); + this.handle_open_in_terminal(path.clone(), cx); + } + FileBrowserPaneEvent::SelectionChanged(path) => { + tracing::debug!("File browser selection changed: {:?}", path); + } + }); + Self { config_store, + file_browser_pane, + _file_browser_subscription: file_browser_subscription, terminal_pane, _terminal_subscription: terminal_subscription, save_task: None, @@ -217,13 +246,45 @@ impl WorkspaceView { } let workspace_id = self.config_store.active_workspace().id.clone(); let working_directory = Some(workspace_root.to_path_buf()); + + // Update file browser pane + self.file_browser_pane.update(cx, |file_browser_pane, cx| { + file_browser_pane.set_active_workspace(workspace_id.clone(), cx); + }); + + // Update terminal pane self.terminal_pane.update(cx, |terminal_pane, cx| { terminal_pane.set_active_workspace(workspace_id, working_directory, cx); }); + cx.notify(); self.schedule_save(cx); } + /// Handle `OpenInTerminal` event from file browser + fn handle_open_in_terminal(&mut self, path: std::path::PathBuf, cx: &mut Context) { + // Ensure the terminal pane is visible + let ws = self.config_store.active_workspace_mut(); + if !ws.terminal_visible { + ws.terminal_visible = true; + self.schedule_save(cx); + } + + // Spawn a new terminal tab with the directory as working directory + let workspace_id = self.config_store.active_workspace().id.clone(); + let working_directory = if path.is_dir() { + Some(path) + } else { + path.parent().map(std::path::Path::to_path_buf) + }; + + self.terminal_pane.update(cx, |terminal_pane, cx| { + terminal_pane.spawn_terminal(workspace_id, working_directory, cx); + }); + + cx.notify(); + } + /// Toggle pane visibility fn toggle_pane(&mut self, pane_type: PaneType, cx: &mut Context) { let ws = self.config_store.active_workspace_mut(); @@ -568,10 +629,23 @@ impl WorkspaceView { }) } - /// Render a single pane (terminal uses real component, others are placeholders) + /// Render a single pane (file browser and terminal use real components, doc viewer is placeholder) fn render_pane(&self, pane_type: PaneType, cx: &mut Context) -> impl IntoElement { let theme = cx.theme(); + // File browser pane renders the actual FileBrowserPane component + if pane_type == PaneType::FileBrowser { + return div() + .flex_1() + .flex() + .flex_col() + .m_2() + .bg(theme.colors().panel_background) + .rounded_md() + .overflow_hidden() + .child(self.file_browser_pane.clone()); + } + // Terminal pane renders the actual TerminalPane component if pane_type == PaneType::Terminal { return div() @@ -603,12 +677,8 @@ impl WorkspaceView { .child(self.terminal_pane.clone()); } - // Other panes render placeholders - let label = match pane_type { - PaneType::FileBrowser => "File Browser", - PaneType::Terminal => unreachable!(), - PaneType::DocumentViewer => "Document Viewer", - }; + // Document viewer renders placeholder + let label = "Document Viewer"; div() .flex_1()