diff --git a/.github/workflows/bump_collab_staging.yml b/.github/workflows/bump_collab_staging.yml
new file mode 100644
index 0000000000..224325d53f
--- /dev/null
+++ b/.github/workflows/bump_collab_staging.yml
@@ -0,0 +1,23 @@
+name: Bump collab-staging Tag
+
+on:
+ schedule:
+ # Fire every day at 16:00 UTC (At the start of the US workday)
+ - cron: "0 16 * * *"
+
+jobs:
+ update-collab-staging-tag:
+ if: github.repository_owner == 'zed-industries'
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
+ with:
+ fetch-depth: 0
+
+ - name: Update collab-staging tag
+ run: |
+ git config user.name github-actions
+ git config user.email github-actions@github.com
+ git tag -f collab-staging
+ git push origin collab-staging --force
diff --git a/.github/workflows/bump_patch_version.yml b/.github/workflows/bump_patch_version.yml
index e2789a7da7..d05da31e6a 100644
--- a/.github/workflows/bump_patch_version.yml
+++ b/.github/workflows/bump_patch_version.yml
@@ -15,8 +15,7 @@ concurrency:
jobs:
bump_patch_version:
runs-on:
- - self-hosted
- - test
+ - buildjet-16vcpu-ubuntu-2204
steps:
- name: Checkout code
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 37e80e5a8d..f059b47004 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -39,16 +39,7 @@ jobs:
run: git clean -df
- name: Check spelling
- run: |
- if ! cargo install --list | grep "typos-cli v$TYPOS_CLI_VERSION" > /dev/null; then
- echo "Installing typos-cli@$TYPOS_CLI_VERSION..."
- cargo install "typos-cli@$TYPOS_CLI_VERSION"
- else
- echo "typos-cli@$TYPOS_CLI_VERSION is already installed."
- fi
- typos
- env:
- TYPOS_CLI_VERSION: "1.23.3"
+ run: script/check-spelling
- name: Run style checks
uses: ./.github/actions/check_style
@@ -110,8 +101,7 @@ jobs:
timeout-minutes: 60
name: (Linux) Run Clippy and tests
runs-on:
- - self-hosted
- - deploy
+ - buildjet-16vcpu-ubuntu-2204
steps:
- name: Add Rust to the PATH
run: echo "$HOME/.cargo/bin" >> $GITHUB_PATH
@@ -121,6 +111,15 @@ jobs:
with:
clean: false
+ - name: Cache dependencies
+ uses: swatinem/rust-cache@23bce251a8cd2ffc3c1075eaa2367cf899916d84 # v2
+ with:
+ save-if: ${{ github.ref == 'refs/heads/main' }}
+ cache-provider: "buildjet"
+
+ - name: Install Linux dependencies
+ run: ./script/linux
+
- name: cargo clippy
run: ./script/clippy
@@ -145,6 +144,7 @@ jobs:
uses: swatinem/rust-cache@23bce251a8cd2ffc3c1075eaa2367cf899916d84 # v2
with:
save-if: ${{ github.ref == 'refs/heads/main' }}
+ cache-provider: "github"
- name: cargo clippy
# Windows can't run shell scripts, so we need to use `cargo xtask`.
@@ -271,24 +271,20 @@ jobs:
timeout-minutes: 60
name: Create a Linux bundle
runs-on:
- - self-hosted
- - deploy
+ - buildjet-16vcpu-ubuntu-2204
if: ${{ startsWith(github.ref, 'refs/tags/v') || contains(github.event.pull_request.labels.*.name, 'run-bundling') }}
needs: [linux_tests]
env:
ZED_CLIENT_CHECKSUM_SEED: ${{ secrets.ZED_CLIENT_CHECKSUM_SEED }}
ZED_CLOUD_PROVIDER_ADDITIONAL_MODELS_JSON: ${{ secrets.ZED_CLOUD_PROVIDER_ADDITIONAL_MODELS_JSON }}
steps:
- - name: Add Rust to the PATH
- run: echo "$HOME/.cargo/bin" >> $GITHUB_PATH
-
- name: Checkout repo
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
with:
clean: false
- - name: Limit target directory size
- run: script/clear-target-dir-if-larger-than 100
+ - name: Install Linux dependencies
+ run: ./script/linux
- name: Determine version and release channel
if: ${{ startsWith(github.ref, 'refs/tags/v') }}
@@ -339,11 +335,11 @@ jobs:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- bundle-linux-aarch64:
+ bundle-linux-aarch64: # this runs on ubuntu22.04
timeout-minutes: 60
name: Create arm64 Linux bundle
runs-on:
- - hosted-linux-arm-1
+ - buildjet-16vcpu-ubuntu-2204-arm
if: ${{ startsWith(github.ref, 'refs/tags/v') || contains(github.event.pull_request.labels.*.name, 'run-bundling') }}
needs: [linux_tests]
env:
@@ -354,26 +350,9 @@ jobs:
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
with:
clean: false
- - name: "Setup jq"
- uses: dcarbone/install-jq-action@8867ddb4788346d7c22b72ea2e2ffe4d514c7bcb # v2
- - name: Set up Clang
- run: |
- sudo apt-get update
- sudo apt-get install -y llvm-10 clang-10 build-essential cmake pkg-config libasound2-dev libfontconfig-dev libwayland-dev libxkbcommon-x11-dev libssl-dev libsqlite3-dev libzstd-dev libvulkan1 libgit2-dev
- echo "/usr/lib/llvm-10/bin" >> $GITHUB_PATH
-
- - uses: rui314/setup-mold@0bf4f07ef9048ec62a45f9dbf2f098afa49695f0 # v1
- with:
- mold-version: 2.32.0
-
- - name: rustup
- run: |
- curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
- echo "$HOME/.cargo/bin" >> $GITHUB_PATH
-
- - name: Limit target directory size
- run: script/clear-target-dir-if-larger-than 100
+ - name: Install Linux dependencies
+ run: ./script/linux
- name: Determine version and release channel
if: ${{ startsWith(github.ref, 'refs/tags/v') }}
diff --git a/.github/workflows/deploy_collab.yml b/.github/workflows/deploy_collab.yml
index 4555698ecd..c4193adcd2 100644
--- a/.github/workflows/deploy_collab.yml
+++ b/.github/workflows/deploy_collab.yml
@@ -8,7 +8,6 @@ on:
env:
DOCKER_BUILDKIT: 1
- DIGITALOCEAN_ACCESS_TOKEN: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }}
jobs:
style:
@@ -61,11 +60,12 @@ jobs:
- style
- tests
runs-on:
- - self-hosted
- - deploy
+ - buildjet-16vcpu-ubuntu-2204
steps:
- - name: Add Rust to the PATH
- run: echo "$HOME/.cargo/bin" >> $GITHUB_PATH
+ - name: Install doctl
+ uses: digitalocean/action-doctl@v2
+ with:
+ token: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }}
- name: Sign into DigitalOcean docker registry
run: doctl registry login
@@ -75,9 +75,6 @@ jobs:
with:
clean: false
- - name: Set up default .cargo/config.toml
- run: cp ./.cargo/collab-config.toml ./.cargo/config.toml
-
- name: Build docker image
run: docker build . --build-arg GITHUB_SHA=$GITHUB_SHA --tag registry.digitalocean.com/zed/collab:$GITHUB_SHA
@@ -92,10 +89,19 @@ jobs:
needs:
- publish
runs-on:
- - self-hosted
- - deploy
+ - buildjet-16vcpu-ubuntu-2204
steps:
+ - name: Checkout repo
+ uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
+ with:
+ clean: false
+
+ - name: Install doctl
+ uses: digitalocean/action-doctl@v2
+ with:
+ token: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }}
+
- name: Sign into Kubernetes
run: doctl kubernetes cluster kubeconfig save --expiry-seconds 600 ${{ secrets.CLUSTER_NAME }}
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index be0f3c5a82..13fe0411a0 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -20,5 +20,11 @@ jobs:
with:
version: 9
- - run: pnpm dlx prettier . --check
+ - run: |
+ pnpm dlx prettier . --check || {
+ echo "To fix, run from the root of the zed repo:"
+ echo " cd docs && pnpm dlx prettier . --write && cd .."
+ false
+ }
+
working-directory: ./docs
diff --git a/.github/workflows/publish_extension_cli.yml b/.github/workflows/publish_extension_cli.yml
index 698a09ad00..7c47ec5ded 100644
--- a/.github/workflows/publish_extension_cli.yml
+++ b/.github/workflows/publish_extension_cli.yml
@@ -24,6 +24,7 @@ jobs:
uses: swatinem/rust-cache@23bce251a8cd2ffc3c1075eaa2367cf899916d84 # v2
with:
save-if: ${{ github.ref == 'refs/heads/main' }}
+ cache-provider: "github"
- name: Configure linux
shell: bash -euxo pipefail {0}
diff --git a/.github/workflows/randomized_tests.yml b/.github/workflows/randomized_tests.yml
index 8b628fe5a2..57f43d4961 100644
--- a/.github/workflows/randomized_tests.yml
+++ b/.github/workflows/randomized_tests.yml
@@ -19,8 +19,7 @@ jobs:
tests:
name: Run randomized tests
runs-on:
- - self-hosted
- - randomized-tests
+ - buildjet-16vcpu-ubuntu-2204
steps:
- name: Install Node
uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4
diff --git a/.github/workflows/release_nightly.yml b/.github/workflows/release_nightly.yml
index e1fc5a39f2..2b973dcddc 100644
--- a/.github/workflows/release_nightly.yml
+++ b/.github/workflows/release_nightly.yml
@@ -100,8 +100,7 @@ jobs:
name: Create a Linux *.tar.gz bundle for x86
if: github.repository_owner == 'zed-industries'
runs-on:
- - self-hosted
- - deploy
+ - buildjet-16vcpu-ubuntu-2204
needs: tests
env:
DIGITALOCEAN_SPACES_ACCESS_KEY: ${{ secrets.DIGITALOCEAN_SPACES_ACCESS_KEY }}
@@ -117,6 +116,12 @@ jobs:
- name: Add Rust to the PATH
run: echo "$HOME/.cargo/bin" >> $GITHUB_PATH
+ - name: Install Linux dependencies
+ run: ./script/linux
+
+ - name: Limit target directory size
+ run: script/clear-target-dir-if-larger-than 100
+
- name: Set release channel to nightly
run: |
set -euo pipefail
@@ -148,23 +153,8 @@ jobs:
with:
clean: false
- - name: "Setup jq"
- uses: dcarbone/install-jq-action@8867ddb4788346d7c22b72ea2e2ffe4d514c7bcb # v2
-
- - name: Set up Clang
- run: |
- sudo apt-get update
- sudo apt-get install -y llvm-10 clang-10 build-essential cmake pkg-config libasound2-dev libfontconfig-dev libwayland-dev libxkbcommon-x11-dev libssl-dev libsqlite3-dev libzstd-dev libvulkan1 libgit2-dev
- echo "/usr/lib/llvm-10/bin" >> $GITHUB_PATH
-
- - uses: rui314/setup-mold@0bf4f07ef9048ec62a45f9dbf2f098afa49695f0 # v1
- with:
- mold-version: 2.32.0
-
- - name: rustup
- run: |
- curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
- echo "$HOME/.cargo/bin" >> $GITHUB_PATH
+ - name: Install Linux dependencies
+ run: ./script/linux
- name: Limit target directory size
run: script/clear-target-dir-if-larger-than 100
@@ -181,3 +171,28 @@ jobs:
- name: Upload Zed Nightly
run: script/upload-nightly linux-targz
+
+ update-nightly-tag:
+ name: Update nightly tag
+ if: github.repository_owner == 'zed-industries'
+ runs-on: ubuntu-latest
+ needs:
+ - bundle-mac
+ - bundle-linux-x86
+ - bundle-linux-arm
+ steps:
+ - name: Checkout repo
+ uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
+ with:
+ fetch-depth: 0
+
+ - name: Update nightly tag
+ run: |
+ if [ "$(git rev-parse nightly)" = "$(git rev-parse HEAD)" ]; then
+ echo "Nightly tag already points to current commit. Skipping tagging."
+ exit 0
+ fi
+ git config user.name github-actions
+ git config user.email github-actions@github.com
+ git tag -f nightly
+ git push origin nightly --force
diff --git a/Cargo.lock b/Cargo.lock
index 8ebc864a26..5e890f1c61 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -21,11 +21,11 @@ dependencies = [
[[package]]
name = "addr2line"
-version = "0.22.0"
+version = "0.24.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678"
+checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375"
dependencies = [
- "gimli 0.29.0",
+ "gimli 0.31.0",
]
[[package]]
@@ -263,9 +263,9 @@ checksum = "34cd60c5e3152cef0a592f1b296f1cc93715d89d2551d85315828c3a09575ff4"
[[package]]
name = "anyhow"
-version = "1.0.86"
+version = "1.0.89"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
+checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6"
[[package]]
name = "approx"
@@ -304,6 +304,9 @@ name = "arrayvec"
version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
+dependencies = [
+ "serde",
+]
[[package]]
name = "as-raw-xcb-connection"
@@ -399,6 +402,7 @@ dependencies = [
"indoc",
"language",
"language_model",
+ "languages",
"log",
"markdown",
"menu",
@@ -415,6 +419,7 @@ dependencies = [
"regex",
"release_channel",
"rope",
+ "rpc",
"schemars",
"search",
"semantic_index",
@@ -432,6 +437,7 @@ dependencies = [
"text",
"theme",
"toml 0.8.19",
+ "tree-sitter-md",
"ui",
"unindent",
"util",
@@ -451,6 +457,7 @@ dependencies = [
"language",
"parking_lot",
"serde",
+ "serde_json",
"workspace",
]
@@ -872,10 +879,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de"
[[package]]
-name = "async-trait"
-version = "0.1.81"
+name = "async-tls"
+version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107"
+checksum = "cfeefd0ca297cbbb3bd34fd6b228401c2a5177038257afd751bc29f0a2da4795"
+dependencies = [
+ "futures-core",
+ "futures-io",
+ "rustls 0.20.9",
+ "rustls-pemfile 1.0.4",
+ "webpki",
+ "webpki-roots 0.22.6",
+]
+
+[[package]]
+name = "async-trait"
+version = "0.1.82"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1"
dependencies = [
"proc-macro2",
"quote",
@@ -888,8 +909,8 @@ version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1e9efbe14612da0a19fb983059a0b621e9cf6225d7018ecab4f9988215540dc"
dependencies = [
- "async-native-tls",
"async-std",
+ "async-tls",
"futures-io",
"futures-util",
"log",
@@ -976,7 +997,6 @@ dependencies = [
"editor",
"gpui",
"http_client",
- "isahc",
"log",
"markdown_preview",
"menu",
@@ -1044,7 +1064,7 @@ dependencies = [
"fastrand 2.1.1",
"hex",
"http 0.2.12",
- "ring",
+ "ring 0.17.8",
"time",
"tokio",
"tracing",
@@ -1213,7 +1233,7 @@ dependencies = [
"once_cell",
"p256",
"percent-encoding",
- "ring",
+ "ring 0.17.8",
"sha2",
"subtle",
"time",
@@ -1326,7 +1346,7 @@ dependencies = [
"once_cell",
"pin-project-lite",
"pin-utils",
- "rustls",
+ "rustls 0.21.12",
"tokio",
"tracing",
]
@@ -1473,17 +1493,17 @@ dependencies = [
[[package]]
name = "backtrace"
-version = "0.3.73"
+version = "0.3.74"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a"
+checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a"
dependencies = [
"addr2line",
- "cc",
"cfg-if",
"libc",
- "miniz_oxide 0.7.4",
- "object 0.36.4",
+ "miniz_oxide 0.8.0",
+ "object",
"rustc-demangle",
+ "windows-targets 0.52.6",
]
[[package]]
@@ -1709,6 +1729,19 @@ dependencies = [
"profiling",
]
+[[package]]
+name = "blake3"
+version = "1.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7"
+dependencies = [
+ "arrayref",
+ "arrayvec",
+ "cc",
+ "cfg-if",
+ "constant_time_eq",
+]
+
[[package]]
name = "block"
version = "0.1.6"
@@ -2249,9 +2282,9 @@ dependencies = [
[[package]]
name = "clap"
-version = "4.5.16"
+version = "4.5.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed6719fffa43d0d87e5fd8caeab59be1554fb028cd30edc88fc4369b17971019"
+checksum = "3e5a21b8495e732f1b3c364c9949b201ca7bae518c502c80256c96ad79eaf6ac"
dependencies = [
"clap_builder",
"clap_derive",
@@ -2259,9 +2292,9 @@ dependencies = [
[[package]]
name = "clap_builder"
-version = "4.5.15"
+version = "4.5.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "216aec2b177652e3846684cbfe25c9964d18ec45234f0f5da5157b207ed1aab6"
+checksum = "8cf2dd12af7a047ad9d6da2b6b249759a22a7abc0f474c1dae1777afa4b21a73"
dependencies = [
"anstream",
"anstyle",
@@ -2387,6 +2420,8 @@ dependencies = [
"rand 0.8.5",
"release_channel",
"rpc",
+ "rustls 0.20.9",
+ "rustls-native-certs 0.8.0",
"schemars",
"serde",
"serde_json",
@@ -2535,6 +2570,7 @@ dependencies = [
"http_client",
"hyper",
"indoc",
+ "isahc_http_client",
"jsonwebtoken",
"language",
"language_model",
@@ -2752,12 +2788,19 @@ dependencies = [
"tiny-keccak",
]
+[[package]]
+name = "constant_time_eq"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6"
+
[[package]]
name = "context_servers"
version = "0.1.0"
dependencies = [
"anyhow",
"collections",
+ "command_palette_hooks",
"futures 0.3.30",
"gpui",
"log",
@@ -3009,27 +3052,38 @@ dependencies = [
[[package]]
name = "cranelift-bforest"
-version = "0.108.1"
+version = "0.111.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29daf137addc15da6bab6eae2c4a11e274b1d270bf2759508e62f6145e863ef6"
+checksum = "b80c3a50b9c4c7e5b5f73c0ed746687774fc9e36ef652b110da8daebf0c6e0e6"
dependencies = [
"cranelift-entity",
]
[[package]]
-name = "cranelift-codegen"
-version = "0.108.1"
+name = "cranelift-bitset"
+version = "0.111.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "de619867d5de4c644b7fd9904d6e3295269c93d8a71013df796ab338681222d4"
+checksum = "38778758c2ca918b05acb2199134e0c561fb577c50574259b26190b6c2d95ded"
+dependencies = [
+ "serde",
+ "serde_derive",
+]
+
+[[package]]
+name = "cranelift-codegen"
+version = "0.111.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "58258667ad10e468bfc13a8d620f50dfcd4bb35d668123e97defa2549b9ad397"
dependencies = [
"bumpalo",
"cranelift-bforest",
+ "cranelift-bitset",
"cranelift-codegen-meta",
"cranelift-codegen-shared",
"cranelift-control",
"cranelift-entity",
"cranelift-isle",
- "gimli 0.28.1",
+ "gimli 0.29.0",
"hashbrown 0.14.5",
"log",
"regalloc2",
@@ -3040,43 +3094,44 @@ dependencies = [
[[package]]
name = "cranelift-codegen-meta"
-version = "0.108.1"
+version = "0.111.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29f5cf277490037d8dae9513d35e0ee8134670ae4a964a5ed5b198d4249d7c10"
+checksum = "043f0b702e529dcb07ff92bd7d40e7d5317b5493595172c5eb0983343751ee06"
dependencies = [
"cranelift-codegen-shared",
]
[[package]]
name = "cranelift-codegen-shared"
-version = "0.108.1"
+version = "0.111.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c3e22ecad1123343a3c09ac6ecc532bb5c184b6fcb7888df0ea953727f79924"
+checksum = "7763578888ab53eca5ce7da141953f828e82c2bfadcffc106d10d1866094ffbb"
[[package]]
name = "cranelift-control"
-version = "0.108.1"
+version = "0.111.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53ca3ec6d30bce84ccf59c81fead4d16381a3ef0ef75e8403bc1e7385980da09"
+checksum = "32db15f08c05df570f11e8ab33cb1ec449a64b37c8a3498377b77650bef33d8b"
dependencies = [
"arbitrary",
]
[[package]]
name = "cranelift-entity"
-version = "0.108.1"
+version = "0.111.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7eabb8d36b0ca8906bec93c78ea516741cac2d7e6b266fa7b0ffddcc09004990"
+checksum = "5289cdb399381a27e7bbfa1b42185916007c3d49aeef70b1d01cb4caa8010130"
dependencies = [
+ "cranelift-bitset",
"serde",
"serde_derive",
]
[[package]]
name = "cranelift-frontend"
-version = "0.108.1"
+version = "0.111.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44b42630229e49a8cfcae90bdc43c8c4c08f7a7aa4618b67f79265cd2f996dd2"
+checksum = "31ba8ab24eb9470477e98ddfa3c799a649ac5a0d9a2042868c4c952133c234e8"
dependencies = [
"cranelift-codegen",
"log",
@@ -3086,15 +3141,15 @@ dependencies = [
[[package]]
name = "cranelift-isle"
-version = "0.108.1"
+version = "0.111.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "918d1e36361805dfe0b6cdfd5a5ffdb5d03fa796170c5717d2727cbe623b93a0"
+checksum = "2b72a3c5c166a70426dcb209bdd0bb71a787c1ea76023dc0974fbabca770e8f9"
[[package]]
name = "cranelift-native"
-version = "0.108.1"
+version = "0.111.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75aea85a0d7e1800b14ce9d3f53adf8ad4d1ee8a9e23b0269bdc50285e93b9b3"
+checksum = "46a42424c956bbc31fc5c2706073df896156c5420ae8fa2a5d48dbc7b295d71b"
dependencies = [
"cranelift-codegen",
"libc",
@@ -3103,9 +3158,9 @@ dependencies = [
[[package]]
name = "cranelift-wasm"
-version = "0.108.1"
+version = "0.111.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dac491fd3473944781f0cf9528c90cc899d18ad438da21961a839a3a44d57dfb"
+checksum = "49778df4289933d735b93c30a345513e030cf83101de0036e19b760f8aa09f68"
dependencies = [
"cranelift-codegen",
"cranelift-entity",
@@ -3113,7 +3168,7 @@ dependencies = [
"itertools 0.12.1",
"log",
"smallvec",
- "wasmparser 0.207.0",
+ "wasmparser 0.215.0",
"wasmtime-types",
]
@@ -3333,7 +3388,6 @@ dependencies = [
"dap-types",
"futures 0.3.30",
"gpui",
- "log",
"parking_lot",
"schemars",
"serde",
@@ -3346,7 +3400,7 @@ dependencies = [
[[package]]
name = "dap-types"
version = "0.0.1"
-source = "git+https://github.com/zed-industries/dap-types#d4e23edcf7c8ded91a3bdfd32a216bcab68b710c"
+source = "git+https://github.com/zed-industries/dap-types#b7404edcd158d7d3ed8a7e81cf6cb3145ff3eb19"
dependencies = [
"serde",
"serde_json",
@@ -3707,7 +3761,6 @@ dependencies = [
"collections",
"convert_case 0.6.0",
"ctor",
- "dap",
"db",
"emojis",
"env_logger",
@@ -3735,6 +3788,7 @@ dependencies = [
"serde",
"serde_json",
"settings",
+ "similar",
"smallvec",
"smol",
"snippet",
@@ -4013,6 +4067,34 @@ dependencies = [
"num-traits",
]
+[[package]]
+name = "evals"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "clap",
+ "client",
+ "clock",
+ "collections",
+ "env_logger",
+ "feature_flags",
+ "fs",
+ "git",
+ "gpui",
+ "http_client",
+ "isahc_http_client",
+ "language",
+ "languages",
+ "node_runtime",
+ "open_ai",
+ "project",
+ "semantic_index",
+ "serde",
+ "serde_json",
+ "settings",
+ "smol",
+]
+
[[package]]
name = "event-listener"
version = "2.5.3"
@@ -4096,6 +4178,7 @@ dependencies = [
"http_client",
"indexed_docs",
"isahc",
+ "isahc_http_client",
"language",
"log",
"lsp",
@@ -4117,8 +4200,8 @@ dependencies = [
"ui",
"url",
"util",
- "wasm-encoder 0.201.0",
- "wasmparser 0.201.0",
+ "wasm-encoder 0.215.0",
+ "wasmparser 0.215.0",
"wasmtime",
"wasmtime-wasi",
"wit-component",
@@ -4134,7 +4217,7 @@ dependencies = [
"env_logger",
"extension",
"fs",
- "http_client",
+ "isahc_http_client",
"language",
"log",
"rpc",
@@ -4238,6 +4321,7 @@ dependencies = [
name = "feature_flags"
version = "0.1.0"
dependencies = [
+ "futures 0.3.30",
"gpui",
]
@@ -4291,6 +4375,7 @@ dependencies = [
"ctor",
"editor",
"env_logger",
+ "file_icons",
"futures 0.3.30",
"fuzzy",
"gpui",
@@ -4298,7 +4383,9 @@ dependencies = [
"menu",
"picker",
"project",
+ "schemars",
"serde",
+ "serde_derive",
"serde_json",
"settings",
"text",
@@ -4380,7 +4467,7 @@ dependencies = [
"futures-core",
"futures-sink",
"nanorand",
- "spin",
+ "spin 0.9.8",
]
[[package]]
@@ -4829,9 +4916,9 @@ dependencies = [
[[package]]
name = "gimli"
-version = "0.28.1"
+version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
+checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd"
dependencies = [
"fallible-iterator",
"indexmap 2.4.0",
@@ -4840,9 +4927,9 @@ dependencies = [
[[package]]
name = "gimli"
-version = "0.29.0"
+version = "0.31.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd"
+checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64"
[[package]]
name = "git"
@@ -4895,7 +4982,6 @@ dependencies = [
"git",
"gpui",
"http_client",
- "isahc",
"pretty_assertions",
"regex",
"serde",
@@ -4912,9 +4998,9 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
[[package]]
name = "globset"
-version = "0.4.14"
+version = "0.4.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1"
+checksum = "15f1ce686646e7f1e19bf7d5533fe443a45dbfb990e00629110797578b42fb19"
dependencies = [
"aho-corasick",
"bstr",
@@ -5212,6 +5298,7 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
dependencies = [
"ahash 0.8.11",
"allocator-api2",
+ "serde",
]
[[package]]
@@ -5527,12 +5614,11 @@ dependencies = [
"anyhow",
"derive_more",
"futures 0.3.30",
- "futures-lite 1.13.0",
- "http 1.1.0",
- "isahc",
+ "http 0.2.12",
"log",
"serde",
"serde_json",
+ "smol",
"url",
]
@@ -5594,8 +5680,8 @@ dependencies = [
"http 0.2.12",
"hyper",
"log",
- "rustls",
- "rustls-native-certs",
+ "rustls 0.21.12",
+ "rustls-native-certs 0.6.3",
"tokio",
"tokio-rustls",
]
@@ -5654,9 +5740,9 @@ dependencies = [
[[package]]
name = "ignore"
-version = "0.4.22"
+version = "0.4.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1"
+checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b"
dependencies = [
"crossbeam-deque",
"globset",
@@ -6007,6 +6093,17 @@ dependencies = [
"waker-fn",
]
+[[package]]
+name = "isahc_http_client"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "futures 0.3.30",
+ "http_client",
+ "isahc",
+ "util",
+]
+
[[package]]
name = "itertools"
version = "0.10.5"
@@ -6111,7 +6208,7 @@ dependencies = [
"base64 0.21.7",
"js-sys",
"pem",
- "ring",
+ "ring 0.17.8",
"serde",
"serde_json",
"simple_asn1",
@@ -6240,6 +6337,7 @@ dependencies = [
"http_client",
"image",
"inline_completion_button",
+ "isahc",
"language",
"log",
"menu",
@@ -6362,7 +6460,7 @@ version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
dependencies = [
- "spin",
+ "spin 0.9.8",
]
[[package]]
@@ -6429,7 +6527,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4"
dependencies = [
"cfg-if",
- "windows-targets 0.52.6",
+ "windows-targets 0.48.5",
]
[[package]]
@@ -7006,7 +7104,6 @@ dependencies = [
"ctor",
"env_logger",
"futures 0.3.30",
- "git",
"gpui",
"itertools 0.13.0",
"language",
@@ -7431,24 +7528,15 @@ dependencies = [
"malloc_buf",
]
-[[package]]
-name = "object"
-version = "0.33.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8dd6c0cdf9429bce006e1362bfce61fa1bfd8c898a643ed8d2b471934701d3d"
-dependencies = [
- "crc32fast",
- "hashbrown 0.14.5",
- "indexmap 2.4.0",
- "memchr",
-]
-
[[package]]
name = "object"
version = "0.36.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a"
dependencies = [
+ "crc32fast",
+ "hashbrown 0.14.5",
+ "indexmap 2.4.0",
"memchr",
]
@@ -7482,7 +7570,6 @@ dependencies = [
"anyhow",
"futures 0.3.30",
"http_client",
- "isahc",
"schemars",
"serde",
"serde_json",
@@ -7924,7 +8011,7 @@ name = "perplexity"
version = "0.1.0"
dependencies = [
"serde",
- "zed_extension_api 0.1.0",
+ "zed_extension_api 0.2.0",
]
[[package]]
@@ -8421,7 +8508,6 @@ dependencies = [
"language",
"log",
"lsp",
- "multi_buffer",
"node_runtime",
"parking_lot",
"pathdiff",
@@ -8583,9 +8669,6 @@ version = "0.1.0"
dependencies = [
"anyhow",
"collections",
- "futures 0.3.30",
- "gpui",
- "parking_lot",
"prost",
"prost-build",
"serde",
@@ -8600,11 +8683,10 @@ checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94"
[[package]]
name = "protols-tree-sitter-proto"
version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9bac092da66e21a71eb832925de7b542f8ac34f75fd05cd2fc3e272863e3fd2b"
+source = "git+https://github.com/zed-industries/tree-sitter-proto?rev=0848bd30a64be48772e15fbb9d5ba8c0cc5772ad#0848bd30a64be48772e15fbb9d5ba8c0cc5772ad"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter-language",
]
[[package]]
@@ -9091,6 +9173,7 @@ dependencies = [
"http_client",
"language",
"log",
+ "lsp",
"node_runtime",
"project",
"remote",
@@ -9101,6 +9184,7 @@ dependencies = [
"shellexpand 2.1.2",
"smol",
"toml 0.8.19",
+ "util",
"worktree",
]
@@ -9180,7 +9264,7 @@ dependencies = [
"once_cell",
"percent-encoding",
"pin-project-lite",
- "rustls-pemfile",
+ "rustls-pemfile 1.0.4",
"serde",
"serde_json",
"serde_urlencoded",
@@ -9244,6 +9328,21 @@ dependencies = [
"util",
]
+[[package]]
+name = "ring"
+version = "0.16.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc"
+dependencies = [
+ "cc",
+ "libc",
+ "once_cell",
+ "spin 0.5.2",
+ "untrusted 0.7.1",
+ "web-sys",
+ "winapi",
+]
+
[[package]]
name = "ring"
version = "0.17.8"
@@ -9254,8 +9353,8 @@ dependencies = [
"cfg-if",
"getrandom 0.2.15",
"libc",
- "spin",
- "untrusted",
+ "spin 0.9.8",
+ "untrusted 0.9.0",
"windows-sys 0.52.0",
]
@@ -9311,12 +9410,13 @@ dependencies = [
[[package]]
name = "rodio"
-version = "0.17.3"
+version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b1bb7b48ee48471f55da122c0044fcc7600cfcc85db88240b89cb832935e611"
+checksum = "6006a627c1a38d37f3d3a85c6575418cfe34a5392d60a686d0071e1c8d427acb"
dependencies = [
"cpal",
"hound",
+ "thiserror",
]
[[package]]
@@ -9410,7 +9510,7 @@ dependencies = [
"futures 0.3.30",
"glob",
"rand 0.8.5",
- "ring",
+ "ring 0.17.8",
"serde",
"serde_json",
"shellexpand 3.1.0",
@@ -9531,6 +9631,18 @@ dependencies = [
"rustix 0.38.35",
]
+[[package]]
+name = "rustls"
+version = "0.20.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99"
+dependencies = [
+ "log",
+ "ring 0.16.20",
+ "sct",
+ "webpki",
+]
+
[[package]]
name = "rustls"
version = "0.21.12"
@@ -9538,7 +9650,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e"
dependencies = [
"log",
- "ring",
+ "ring 0.17.8",
"rustls-webpki",
"sct",
]
@@ -9550,7 +9662,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00"
dependencies = [
"openssl-probe",
- "rustls-pemfile",
+ "rustls-pemfile 1.0.4",
+ "schannel",
+ "security-framework",
+]
+
+[[package]]
+name = "rustls-native-certs"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fcaf18a4f2be7326cd874a5fa579fae794320a0f388d365dca7e480e55f83f8a"
+dependencies = [
+ "openssl-probe",
+ "rustls-pemfile 2.1.3",
+ "rustls-pki-types",
"schannel",
"security-framework",
]
@@ -9564,14 +9689,30 @@ dependencies = [
"base64 0.21.7",
]
+[[package]]
+name = "rustls-pemfile"
+version = "2.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425"
+dependencies = [
+ "base64 0.22.1",
+ "rustls-pki-types",
+]
+
+[[package]]
+name = "rustls-pki-types"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0"
+
[[package]]
name = "rustls-webpki"
version = "0.101.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765"
dependencies = [
- "ring",
- "untrusted",
+ "ring 0.17.8",
+ "untrusted 0.9.0",
]
[[package]]
@@ -9685,8 +9826,8 @@ version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414"
dependencies = [
- "ring",
- "untrusted",
+ "ring 0.17.8",
+ "untrusted 0.9.0",
]
[[package]]
@@ -9869,17 +10010,22 @@ name = "semantic_index"
version = "0.1.0"
dependencies = [
"anyhow",
+ "arrayvec",
+ "blake3",
"client",
"clock",
"collections",
"env_logger",
+ "feature_flags",
"fs",
"futures 0.3.30",
"futures-batch",
"gpui",
"heed",
"http_client",
+ "isahc_http_client",
"language",
+ "language_model",
"languages",
"log",
"open_ai",
@@ -9983,9 +10129,9 @@ dependencies = [
[[package]]
name = "serde_json_lenient"
-version = "0.1.8"
+version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc61c66b53a4035fcce237ef38043f4b2f0ebf918fd0e69541a5166104065581"
+checksum = "a5d0bae483150302560d7cb52e7932f39b69a6fbdd099e48d33ef060a8c9c078"
dependencies = [
"indexmap 2.4.0",
"itoa",
@@ -10309,7 +10455,7 @@ dependencies = [
name = "slash_commands_example"
version = "0.1.0"
dependencies = [
- "zed_extension_api 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "zed_extension_api 0.1.0",
]
[[package]]
@@ -10437,6 +10583,12 @@ dependencies = [
"smallvec",
]
+[[package]]
+name = "spin"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
+
[[package]]
name = "spin"
version = "0.9.8"
@@ -10559,8 +10711,8 @@ dependencies = [
"paste",
"percent-encoding",
"rust_decimal",
- "rustls",
- "rustls-pemfile",
+ "rustls 0.21.12",
+ "rustls-pemfile 1.0.4",
"serde",
"serde_json",
"sha2",
@@ -10573,7 +10725,7 @@ dependencies = [
"tracing",
"url",
"uuid",
- "webpki-roots",
+ "webpki-roots 0.25.4",
]
[[package]]
@@ -11085,17 +11237,16 @@ dependencies = [
[[package]]
name = "sysinfo"
-version = "0.30.13"
+version = "0.31.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a5b4ddaee55fb2bea2bf0e5000747e5f5c0de765e5a5ff87f4cd106439f4bb3"
+checksum = "355dbe4f8799b304b05e1b0f05fc59b2a18d36645cf169607da45bde2f69a1be"
dependencies = [
- "cfg-if",
"core-foundation-sys",
"libc",
+ "memchr",
"ntapi",
- "once_cell",
"rayon",
- "windows 0.52.0",
+ "windows 0.54.0",
]
[[package]]
@@ -11707,7 +11858,7 @@ version = "0.24.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"
dependencies = [
- "rustls",
+ "rustls 0.21.12",
"tokio",
]
@@ -11998,110 +12149,112 @@ dependencies = [
[[package]]
name = "tree-sitter"
-version = "0.22.6"
-source = "git+https://github.com/tree-sitter/tree-sitter?rev=7f4a57817d58a2f134fe863674acad6bbf007228#7f4a57817d58a2f134fe863674acad6bbf007228"
+version = "0.23.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "20f4cd3642c47a85052a887d86704f4eac272969f61b686bdd3f772122aabaff"
dependencies = [
"cc",
"regex",
+ "regex-syntax 0.8.4",
"tree-sitter-language",
"wasmtime-c-api-impl",
]
[[package]]
name = "tree-sitter-bash"
-version = "0.21.0"
+version = "0.23.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b5244703ad2e08a616d859a0557d7aa290adcd5e0990188a692e628ffe9dce40"
+checksum = "3aa5e1c6bd02c0053f3f68edcf5d8866b38a8640584279e30fca88149ce14dda"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter-language",
]
[[package]]
name = "tree-sitter-c"
-version = "0.21.4"
+version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f956d5351d62652864a4ff3ae861747e7a1940dc96c9998ae400ac0d3ce30427"
+checksum = "e795ad541f7ae6a80d22975296340a75a12a29afd3a7089f4368021613728e17"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter-language",
]
[[package]]
name = "tree-sitter-cpp"
-version = "0.22.3"
+version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d509a22a992790d38f2c291961ff8a1ff016c437c7ec6befc9220b8eec8918c"
+checksum = "c0a588a816017469b69f2e3544742e34a5a59dddfb4b9457b657a6052e2ea39c"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter-language",
]
[[package]]
name = "tree-sitter-css"
-version = "0.21.1"
+version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e08e324b1cf60fd3291774b49724c66de2ce8fcf4d358d0b4b82e37b41b1c9b"
+checksum = "8d0018d6b1692a806f9cddaa1e5616951fd58840c39a0b21401b55ab3df12292"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter-language",
]
[[package]]
name = "tree-sitter-elixir"
-version = "0.2.0"
+version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df94bf7f057768b1cab2ee1f14812ed4ae33f9e04d09254043eeaa797db4ef70"
+checksum = "6174acad8a059851f6f768d7893f4b25eedc80eb6643283d545dd71bbb38222a"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter-language",
]
[[package]]
name = "tree-sitter-embedded-template"
-version = "0.20.0"
+version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33817ade928c73a32d4f904a602321e09de9fc24b71d106f3b4b3f8ab30dcc38"
+checksum = "9644d7586ebe850c84037ee2f4804dda4a9348eef053be6b1e0d7712342a2495"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter-language",
]
[[package]]
name = "tree-sitter-go"
-version = "0.21.2"
+version = "0.23.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8d702a98d3c7e70e466456e58ff2b1ac550bf1e29b97e5770676d2fdabec00d"
+checksum = "caf57626e4c9b6d6efaf8a8d5ee1241c5f178ae7bfdf693713ae6a774f01424e"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter-language",
]
[[package]]
name = "tree-sitter-gomod"
version = "1.0.2"
-source = "git+https://github.com/camdencheek/tree-sitter-go-mod?rev=1f55029bacd0a6a11f6eb894c4312d429dcf735c#1f55029bacd0a6a11f6eb894c4312d429dcf735c"
+source = "git+https://github.com/zed-industries/tree-sitter-go-mod?rev=a9aea5e358cde4d0f8ff20b7bc4fa311e359c7ca#a9aea5e358cde4d0f8ff20b7bc4fa311e359c7ca"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter-language",
]
[[package]]
name = "tree-sitter-gowork"
version = "0.0.1"
-source = "git+https://github.com/d1y/tree-sitter-go-work?rev=dcbabff454703c3a4bc98a23cf8778d4be46fd22#dcbabff454703c3a4bc98a23cf8778d4be46fd22"
+source = "git+https://github.com/zed-industries/tree-sitter-go-work?rev=acb0617bf7f4fda02c6217676cc64acb89536dc7#acb0617bf7f4fda02c6217676cc64acb89536dc7"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter-language",
]
[[package]]
name = "tree-sitter-heex"
version = "0.0.1"
-source = "git+https://github.com/phoenixframework/tree-sitter-heex?rev=6dd0303acf7138dd2b9b432a229e16539581c701#6dd0303acf7138dd2b9b432a229e16539581c701"
+source = "git+https://github.com/zed-industries/tree-sitter-heex?rev=1dd45142fbb05562e35b2040c6129c9bca346592#1dd45142fbb05562e35b2040c6129c9bca346592"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter-language",
]
[[package]]
@@ -12116,96 +12269,96 @@ dependencies = [
[[package]]
name = "tree-sitter-jsdoc"
-version = "0.21.0"
+version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8d07920101ff12a59574890318a37fa7e18d9c06d9aa4be334aa24adbb480f18"
+checksum = "f8c4049eb0ad690e34e5f63640f75ce12a2ff8ba18344d0a13926805b139c0c8"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter-language",
]
[[package]]
name = "tree-sitter-json"
-version = "0.21.0"
+version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b737dcb73c35d74b7d64a5f3dde158113c86a012bf3cee2bfdf2150d23b05db"
+checksum = "86a5d6b3ea17e06e7a34aabeadd68f5866c0d0f9359155d432095f8b751865e4"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter-language",
]
[[package]]
name = "tree-sitter-language"
version = "0.1.0"
-source = "git+https://github.com/tree-sitter/tree-sitter?rev=7f4a57817d58a2f134fe863674acad6bbf007228#7f4a57817d58a2f134fe863674acad6bbf007228"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2545046bd1473dac6c626659cc2567c6c0ff302fc8b84a56c4243378276f7f57"
[[package]]
name = "tree-sitter-md"
-version = "0.2.3"
-source = "git+https://github.com/zed-industries/tree-sitter-markdown?rev=e3855e37f8f2c71aa7513c18a9c95fb7461b1b10#e3855e37f8f2c71aa7513c18a9c95fb7461b1b10"
+version = "0.3.2"
+source = "git+https://github.com/zed-industries/tree-sitter-markdown?rev=4cfa6aad6b75052a5077c80fd934757d9267d81b#4cfa6aad6b75052a5077c80fd934757d9267d81b"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter-language",
]
[[package]]
name = "tree-sitter-python"
-version = "0.21.0"
+version = "0.23.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4066c6cf678f962f8c2c4561f205945c84834cce73d981e71392624fdc390a9"
+checksum = "65661b1a3e24139e2e54207e47d910ab07e28790d78efc7d5dc3a11ce2a110eb"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter-language",
]
[[package]]
name = "tree-sitter-regex"
-version = "0.21.0"
+version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ff1286fe9651b2797484839ffa37aa76c8618d4ccb6836d7e31765dfd60c0d5"
+checksum = "0b9a7087b1cf769c96b7e74414947df067fb6135f04d176fd23be08b9396cc0e"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter-language",
]
[[package]]
name = "tree-sitter-ruby"
-version = "0.21.0"
+version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0031f687c0772f2dad7b77104c43428611099a1804c81244ada21560f41f0b1"
+checksum = "6ec5ee842e27791e0adffa0b2a177614de51d2a26e5c7e84d014ed7f097e5ed0"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter-language",
]
[[package]]
name = "tree-sitter-rust"
-version = "0.21.2"
+version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "277690f420bf90741dea984f3da038ace46c4fe6047cba57a66822226cde1c93"
+checksum = "cffbbcb780348fbae8395742ae5b34c1fd794e4085d43aac9f259387f9a84dc8"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter-language",
]
[[package]]
name = "tree-sitter-typescript"
-version = "0.21.2"
+version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ecb35d98a688378e56c18c9c159824fd16f730ccbea19aacf4f206e5d5438ed9"
+checksum = "aecf1585ae2a9dddc2b1d4c0e2140b2ec9876e2a25fd79de47fcf7dae0384685"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter-language",
]
[[package]]
name = "tree-sitter-yaml"
version = "0.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aad27ec46ad343d8b514f64dd3fdffb478c592ece561b6c935d90ef55589c6b6"
+source = "git+https://github.com/zed-industries/tree-sitter-yaml?rev=baff0b51c64ef6a1fb1f8390f3ad6015b83ec13a#baff0b51c64ef6a1fb1f8390f3ad6015b83ec13a"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter-language",
]
[[package]]
@@ -12232,7 +12385,6 @@ dependencies = [
"http 0.2.12",
"httparse",
"log",
- "native-tls",
"rand 0.8.5",
"sha1",
"thiserror",
@@ -12302,6 +12454,7 @@ dependencies = [
"story",
"strum 0.25.0",
"theme",
+ "ui_macros",
"windows 0.58.0",
]
@@ -12316,6 +12469,16 @@ dependencies = [
"ui",
]
+[[package]]
+name = "ui_macros"
+version = "0.1.0"
+dependencies = [
+ "convert_case 0.6.0",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
[[package]]
name = "unicase"
version = "2.7.0"
@@ -12406,6 +12569,12 @@ version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e1766d682d402817b5ac4490b3c3002d91dfa0d22812f341609f97b08757359c"
+[[package]]
+name = "untrusted"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
+
[[package]]
name = "untrusted"
version = "0.9.0"
@@ -12828,9 +12997,9 @@ dependencies = [
[[package]]
name = "wasm-encoder"
-version = "0.207.0"
+version = "0.215.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d996306fb3aeaee0d9157adbe2f670df0236caf19f6728b221e92d0f27b3fe17"
+checksum = "4fb56df3e06b8e6b77e37d2969a50ba51281029a9aeb3855e76b7f49b6418847"
dependencies = [
"leb128",
]
@@ -12864,35 +13033,38 @@ dependencies = [
[[package]]
name = "wasmparser"
-version = "0.207.0"
+version = "0.215.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e19bb9f8ab07616da582ef8adb24c54f1424c7ec876720b7da9db8ec0626c92c"
+checksum = "53fbde0881f24199b81cf49b6ff8f9c145ac8eb1b7fc439adb5c099734f7d90e"
dependencies = [
"ahash 0.8.11",
"bitflags 2.6.0",
"hashbrown 0.14.5",
"indexmap 2.4.0",
"semver",
+ "serde",
]
[[package]]
name = "wasmprinter"
-version = "0.207.0"
+version = "0.215.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c2d8a7b4dabb460208e6b4334d9db5766e84505038b2529e69c3d07ac619115"
+checksum = "d8e9a325d85053408209b3d2ce5eaddd0dd6864d1cff7a007147ba073157defc"
dependencies = [
"anyhow",
- "wasmparser 0.207.0",
+ "termcolor",
+ "wasmparser 0.215.0",
]
[[package]]
name = "wasmtime"
-version = "21.0.1"
+version = "24.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f92a1370c66a0022e6d92dcc277e2c84f5dece19569670b8ce7db8162560d8b6"
+checksum = "9a5883d64dfc8423c56e3d8df27cffc44db25336aa468e8e0724fddf30a333d7"
dependencies = [
"anyhow",
"async-trait",
+ "bitflags 2.6.0",
"bumpalo",
"cc",
"cfg-if",
@@ -12904,8 +13076,7 @@ dependencies = [
"log",
"mach2",
"memfd",
- "memoffset",
- "object 0.33.0",
+ "object",
"once_cell",
"paste",
"postcard",
@@ -12917,7 +13088,7 @@ dependencies = [
"smallvec",
"sptr",
"target-lexicon",
- "wasmparser 0.207.0",
+ "wasmparser 0.215.0",
"wasmtime-asm-macros",
"wasmtime-component-macro",
"wasmtime-component-util",
@@ -12933,18 +13104,18 @@ dependencies = [
[[package]]
name = "wasmtime-asm-macros"
-version = "21.0.1"
+version = "24.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6dee8679c974a7f258c03d60d3c747c426ed219945b6d08cbc77fd2eab15b2d1"
+checksum = "1c4dc7e2a379c0dd6be5b55857d14c4b277f43a9c429a9e14403eb61776ae3be"
dependencies = [
"cfg-if",
]
[[package]]
name = "wasmtime-c-api-impl"
-version = "21.0.1"
+version = "24.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76af8b62c8d2814b7d5975c5dc140122e4c086150db6c15d25a4b76f11c929dd"
+checksum = "765e302e7d9125e614aaeec3ad6b6083605393004eca00214106a4ff6b47fc58"
dependencies = [
"anyhow",
"log",
@@ -12956,9 +13127,9 @@ dependencies = [
[[package]]
name = "wasmtime-c-api-macros"
-version = "21.0.1"
+version = "24.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d74b92f917c9ced9c6262a00e9cb982ebac183e6900b4d44e2480f936b9495eb"
+checksum = "2d09d02eaa84aa2de5babee7b0296557ad6e4903bb10aa8d135e393e753a43d6"
dependencies = [
"proc-macro2",
"quote",
@@ -12966,9 +13137,9 @@ dependencies = [
[[package]]
name = "wasmtime-component-macro"
-version = "21.0.1"
+version = "24.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32cae30035f1cf97dcc6657c979cf39f99ce6be93583675eddf4aeaa5548509c"
+checksum = "4b07773d1c3dab5f014ec61316ee317aa424033e17e70a63abdf7c3a47e58fcf"
dependencies = [
"anyhow",
"proc-macro2",
@@ -12976,20 +13147,20 @@ dependencies = [
"syn 2.0.76",
"wasmtime-component-util",
"wasmtime-wit-bindgen",
- "wit-parser 0.207.0",
+ "wit-parser 0.215.0",
]
[[package]]
name = "wasmtime-component-util"
-version = "21.0.1"
+version = "24.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f7ae611f08cea620c67330925be28a96115bf01f8f393a6cbdf4856a86087134"
+checksum = "e38d735320f4e83478369ce649ad8fe87c6b893220902e798547a225fc0c5874"
[[package]]
name = "wasmtime-cranelift"
-version = "21.0.1"
+version = "24.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2909406a6007e28be964067167890bca4574bd48a9ff18f1fa9f4856d89ea40"
+checksum = "e570d831d0785d93d7d8c722b1eb9a34e0d0c1534317666f65892818358a2da9"
dependencies = [
"anyhow",
"cfg-if",
@@ -12999,36 +13170,38 @@ dependencies = [
"cranelift-frontend",
"cranelift-native",
"cranelift-wasm",
- "gimli 0.28.1",
+ "gimli 0.29.0",
"log",
- "object 0.33.0",
+ "object",
"target-lexicon",
"thiserror",
- "wasmparser 0.207.0",
+ "wasmparser 0.215.0",
"wasmtime-environ",
"wasmtime-versioned-export-macros",
]
[[package]]
name = "wasmtime-environ"
-version = "21.0.1"
+version = "24.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "40e227f9ed2f5421473723d6c0352b5986e6e6044fde5410a274a394d726108f"
+checksum = "c5fe80dfbd81687431a7d4f25929fae1ae96894786d5c96b14ae41164ee97377"
dependencies = [
"anyhow",
"cpp_demangle",
+ "cranelift-bitset",
"cranelift-entity",
- "gimli 0.28.1",
+ "gimli 0.29.0",
"indexmap 2.4.0",
"log",
- "object 0.33.0",
+ "object",
"postcard",
"rustc-demangle",
+ "semver",
"serde",
"serde_derive",
"target-lexicon",
- "wasm-encoder 0.207.0",
- "wasmparser 0.207.0",
+ "wasm-encoder 0.215.0",
+ "wasmparser 0.215.0",
"wasmprinter",
"wasmtime-component-util",
"wasmtime-types",
@@ -13036,9 +13209,9 @@ dependencies = [
[[package]]
name = "wasmtime-fiber"
-version = "21.0.1"
+version = "24.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42edb392586d07038c1638e854382db916b6ca7845a2e6a7f8dc49e08907acdd"
+checksum = "0f39043d13c7b58db69dc9a0feb191a961e75a9ec2402aebf42de183c022bb8a"
dependencies = [
"anyhow",
"cc",
@@ -13051,9 +13224,9 @@ dependencies = [
[[package]]
name = "wasmtime-jit-icache-coherence"
-version = "21.0.1"
+version = "24.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "afe088f9b56bb353adaf837bf7e10f1c2e1676719dd5be4cac8e37f2ba1ee5bc"
+checksum = "d15de8429db996f0d17a4163a35eccc3f874cbfb50f29c379951ea1bbb39452e"
dependencies = [
"anyhow",
"cfg-if",
@@ -13063,28 +13236,29 @@ dependencies = [
[[package]]
name = "wasmtime-slab"
-version = "21.0.1"
+version = "24.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ff75cafffe47b04b036385ce3710f209153525b0ed19d57b0cf44a22d446460"
+checksum = "1f68d38fa6b30c5e1fc7d608263062997306f79e577ebd197ddcd6b0f55d87d1"
[[package]]
name = "wasmtime-types"
-version = "21.0.1"
+version = "24.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2f2fa462bfea3220711c84e2b549f147e4df89eeb49b8a2a3d89148f6cc4a8b1"
+checksum = "6634e7079d9c5cfc81af8610ed59b488cc5b7f9777a2f4c1667a2565c2e45249"
dependencies = [
+ "anyhow",
"cranelift-entity",
"serde",
"serde_derive",
"smallvec",
- "wasmparser 0.207.0",
+ "wasmparser 0.215.0",
]
[[package]]
name = "wasmtime-versioned-export-macros"
-version = "21.0.1"
+version = "24.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4cedc5bfef3db2a85522ee38564b47ef3b7fc7c92e94cacbce99808e63cdd47"
+checksum = "3850e3511d6c7f11a72d571890b0ed5f6204681f7f050b9de2690e7f13123fed"
dependencies = [
"proc-macro2",
"quote",
@@ -13093,9 +13267,9 @@ dependencies = [
[[package]]
name = "wasmtime-wasi"
-version = "21.0.1"
+version = "24.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bdbbe94245904d4c96c7c5f7b55bad896cc27908644efd9442063c0748b631fc"
+checksum = "545ae8298ffce025604f7480f9c7d6948c985bef7ce9aee249ef79307813e83c"
dependencies = [
"anyhow",
"async-trait",
@@ -13124,16 +13298,16 @@ dependencies = [
[[package]]
name = "wasmtime-winch"
-version = "21.0.1"
+version = "24.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "97b27054fed6be4f3800aba5766f7ef435d4220ce290788f021a08d4fa573108"
+checksum = "2a25199625effa4c13dd790d64bd56884b014c69829431bfe43991c740bd5bc1"
dependencies = [
"anyhow",
"cranelift-codegen",
- "gimli 0.28.1",
- "object 0.33.0",
+ "gimli 0.29.0",
+ "object",
"target-lexicon",
- "wasmparser 0.207.0",
+ "wasmparser 0.215.0",
"wasmtime-cranelift",
"wasmtime-environ",
"winch-codegen",
@@ -13141,14 +13315,14 @@ dependencies = [
[[package]]
name = "wasmtime-wit-bindgen"
-version = "21.0.1"
+version = "24.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c936a52ce69c28de2aa3b5fb4f2dbbb2966df304f04cccb7aca4ba56d915fda0"
+checksum = "3cb331ac7ed1d5ba49cddcdb6b11973752a857148858bb308777d2fc5584121f"
dependencies = [
"anyhow",
"heck 0.4.1",
"indexmap 2.4.0",
- "wit-parser 0.207.0",
+ "wit-parser 0.215.0",
]
[[package]]
@@ -13255,6 +13429,25 @@ dependencies = [
"wasm-bindgen",
]
+[[package]]
+name = "webpki"
+version = "0.22.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53"
+dependencies = [
+ "ring 0.17.8",
+ "untrusted 0.9.0",
+]
+
+[[package]]
+name = "webpki-roots"
+version = "0.22.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87"
+dependencies = [
+ "webpki",
+]
+
[[package]]
name = "webpki-roots"
version = "0.25.4"
@@ -13290,6 +13483,7 @@ dependencies = [
"util",
"vim",
"workspace",
+ "zed_actions",
]
[[package]]
@@ -13328,9 +13522,9 @@ dependencies = [
[[package]]
name = "wiggle"
-version = "21.0.1"
+version = "24.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a89ea6f74ece6d1cfbd089783006b8eb69a0219ca83cad22068f0d9fa9df3f91"
+checksum = "cc850ca3c02c5835934d23f28cec4c5a3fb66fe0b4ecd968bbb35609dda5ddc0"
dependencies = [
"anyhow",
"async-trait",
@@ -13343,9 +13537,9 @@ dependencies = [
[[package]]
name = "wiggle-generate"
-version = "21.0.1"
+version = "24.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "36beda94813296ecaf0d91b7ada9da073fd41865ba339bdd3b7764e2e785b8e9"
+checksum = "634b8804a67200bcb43ea8af5f7c53e862439a086b68b16fd333454bc74d5aab"
dependencies = [
"anyhow",
"heck 0.4.1",
@@ -13358,9 +13552,9 @@ dependencies = [
[[package]]
name = "wiggle-macro"
-version = "21.0.1"
+version = "24.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b47d2b4442ce93106dba5d1a9c59d5f85b5732878bb3d0598d3c93c0d01b16b"
+checksum = "474b7cbdb942c74031e619d66c600bba7f73867c5800fc2c2306cf307649be2f"
dependencies = [
"proc-macro2",
"quote",
@@ -13390,7 +13584,7 @@ version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
dependencies = [
- "windows-sys 0.59.0",
+ "windows-sys 0.48.0",
]
[[package]]
@@ -13401,17 +13595,17 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "winch-codegen"
-version = "0.19.1"
+version = "0.22.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1dc69899ccb2da7daa4df31426dcfd284b104d1a85e1dae35806df0c46187f87"
+checksum = "073efe897d9ead7fc609874f94580afc831114af5149b6a90ee0a3a39b497fe0"
dependencies = [
"anyhow",
"cranelift-codegen",
- "gimli 0.28.1",
+ "gimli 0.29.0",
"regalloc2",
"smallvec",
"target-lexicon",
- "wasmparser 0.207.0",
+ "wasmparser 0.215.0",
"wasmtime-cranelift",
"wasmtime-environ",
]
@@ -13425,16 +13619,6 @@ dependencies = [
"windows-targets 0.48.5",
]
-[[package]]
-name = "windows"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be"
-dependencies = [
- "windows-core 0.52.0",
- "windows-targets 0.52.6",
-]
-
[[package]]
name = "windows"
version = "0.54.0"
@@ -13918,9 +14102,9 @@ dependencies = [
[[package]]
name = "wit-parser"
-version = "0.207.0"
+version = "0.215.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78c83dab33a9618d86cfe3563cc864deffd08c17efc5db31a3b7cd1edeffe6e1"
+checksum = "935a97eaffd57c3b413aa510f8f0b550a4a9fe7d59e79cd8b89a83dcb860321f"
dependencies = [
"anyhow",
"id-arena",
@@ -13931,7 +14115,7 @@ dependencies = [
"serde_derive",
"serde_json",
"unicode-xid",
- "wasmparser 0.207.0",
+ "wasmparser 0.215.0",
]
[[package]]
@@ -13958,7 +14142,6 @@ dependencies = [
"client",
"clock",
"collections",
- "dap",
"db",
"derive_more",
"dev_server_projects",
@@ -13975,6 +14158,7 @@ dependencies = [
"parking_lot",
"postage",
"project",
+ "remote",
"schemars",
"serde",
"serde_json",
@@ -14091,7 +14275,7 @@ dependencies = [
[[package]]
name = "xim"
version = "0.4.0"
-source = "git+https://github.com/npmania/xim-rs?rev=27132caffc5b9bc9c432ca4afad184ab6e7c16af#27132caffc5b9bc9c432ca4afad184ab6e7c16af"
+source = "git+https://github.com/XDeme1/xim-rs?rev=d50d461764c2213655cd9cf65a0ea94c70d3c4fd#d50d461764c2213655cd9cf65a0ea94c70d3c4fd"
dependencies = [
"ahash 0.8.11",
"hashbrown 0.14.5",
@@ -14104,7 +14288,7 @@ dependencies = [
[[package]]
name = "xim-ctext"
version = "0.3.0"
-source = "git+https://github.com/npmania/xim-rs?rev=27132caffc5b9bc9c432ca4afad184ab6e7c16af#27132caffc5b9bc9c432ca4afad184ab6e7c16af"
+source = "git+https://github.com/XDeme1/xim-rs?rev=d50d461764c2213655cd9cf65a0ea94c70d3c4fd#d50d461764c2213655cd9cf65a0ea94c70d3c4fd"
dependencies = [
"encoding_rs",
]
@@ -14112,7 +14296,7 @@ dependencies = [
[[package]]
name = "xim-parser"
version = "0.2.1"
-source = "git+https://github.com/npmania/xim-rs?rev=27132caffc5b9bc9c432ca4afad184ab6e7c16af#27132caffc5b9bc9c432ca4afad184ab6e7c16af"
+source = "git+https://github.com/XDeme1/xim-rs?rev=d50d461764c2213655cd9cf65a0ea94c70d3c4fd#d50d461764c2213655cd9cf65a0ea94c70d3c4fd"
dependencies = [
"bitflags 2.6.0",
]
@@ -14254,7 +14438,7 @@ dependencies = [
[[package]]
name = "zed"
-version = "0.153.0"
+version = "0.155.0"
dependencies = [
"activity_indicator",
"anyhow",
@@ -14300,6 +14484,7 @@ dependencies = [
"inline_completion_button",
"install_cli",
"isahc",
+ "isahc_http_client",
"journal",
"language",
"language_model",
@@ -14375,72 +14560,63 @@ name = "zed_astro"
version = "0.1.0"
dependencies = [
"serde",
- "zed_extension_api 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "zed_extension_api 0.1.0",
]
[[package]]
name = "zed_clojure"
version = "0.0.3"
dependencies = [
- "zed_extension_api 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "zed_extension_api 0.1.0",
]
[[package]]
name = "zed_csharp"
version = "0.0.2"
dependencies = [
- "zed_extension_api 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "zed_extension_api 0.1.0",
]
[[package]]
name = "zed_dart"
-version = "0.0.3"
+version = "0.1.0"
dependencies = [
- "zed_extension_api 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "zed_extension_api 0.1.0",
]
[[package]]
name = "zed_deno"
version = "0.0.2"
dependencies = [
- "zed_extension_api 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "zed_extension_api 0.1.0",
]
[[package]]
name = "zed_elixir"
version = "0.0.9"
dependencies = [
- "zed_extension_api 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "zed_extension_api 0.1.0",
]
[[package]]
name = "zed_elm"
version = "0.0.1"
dependencies = [
- "zed_extension_api 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "zed_extension_api 0.1.0",
]
[[package]]
name = "zed_emmet"
version = "0.0.3"
dependencies = [
- "zed_extension_api 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "zed_extension_api 0.1.0",
]
[[package]]
name = "zed_erlang"
-version = "0.0.1"
-dependencies = [
- "zed_extension_api 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "zed_extension_api"
version = "0.1.0"
dependencies = [
- "serde",
- "serde_json",
- "wit-bindgen",
+ "zed_extension_api 0.1.0",
]
[[package]]
@@ -14454,82 +14630,91 @@ dependencies = [
"wit-bindgen",
]
+[[package]]
+name = "zed_extension_api"
+version = "0.2.0"
+dependencies = [
+ "serde",
+ "serde_json",
+ "wit-bindgen",
+]
+
[[package]]
name = "zed_gleam"
version = "0.2.0"
dependencies = [
"html_to_markdown 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "zed_extension_api 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "zed_extension_api 0.1.0",
]
[[package]]
name = "zed_glsl"
version = "0.1.0"
dependencies = [
- "zed_extension_api 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "zed_extension_api 0.1.0",
]
[[package]]
name = "zed_haskell"
version = "0.1.1"
dependencies = [
- "zed_extension_api 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "zed_extension_api 0.1.0",
]
[[package]]
name = "zed_html"
version = "0.1.2"
dependencies = [
- "zed_extension_api 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "zed_extension_api 0.1.0",
]
[[package]]
name = "zed_lua"
version = "0.0.3"
dependencies = [
- "zed_extension_api 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "zed_extension_api 0.1.0",
]
[[package]]
name = "zed_ocaml"
-version = "0.0.2"
+version = "0.1.0"
dependencies = [
- "zed_extension_api 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "zed_extension_api 0.1.0",
]
[[package]]
name = "zed_php"
-version = "0.1.3"
+version = "0.2.0"
dependencies = [
- "zed_extension_api 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "zed_extension_api 0.1.0",
]
[[package]]
name = "zed_prisma"
version = "0.0.3"
dependencies = [
- "zed_extension_api 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "zed_extension_api 0.1.0",
]
[[package]]
name = "zed_purescript"
version = "0.0.1"
dependencies = [
- "zed_extension_api 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "zed_extension_api 0.1.0",
]
[[package]]
name = "zed_ruby"
version = "0.2.0"
dependencies = [
- "zed_extension_api 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "zed_extension_api 0.1.0",
]
[[package]]
name = "zed_ruff"
-version = "0.0.2"
+version = "0.1.0"
dependencies = [
- "zed_extension_api 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "zed_extension_api 0.1.0",
]
[[package]]
@@ -14537,42 +14722,42 @@ name = "zed_snippets"
version = "0.0.5"
dependencies = [
"serde_json",
- "zed_extension_api 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "zed_extension_api 0.1.0",
]
[[package]]
name = "zed_svelte"
-version = "0.1.1"
+version = "0.2.0"
dependencies = [
- "zed_extension_api 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "zed_extension_api 0.1.0",
]
[[package]]
name = "zed_terraform"
version = "0.1.0"
dependencies = [
- "zed_extension_api 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "zed_extension_api 0.1.0",
]
[[package]]
name = "zed_test_extension"
version = "0.1.0"
dependencies = [
- "zed_extension_api 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "zed_extension_api 0.2.0",
]
[[package]]
name = "zed_toml"
version = "0.1.1"
dependencies = [
- "zed_extension_api 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "zed_extension_api 0.1.0",
]
[[package]]
name = "zed_uiua"
version = "0.0.1"
dependencies = [
- "zed_extension_api 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "zed_extension_api 0.1.0",
]
[[package]]
@@ -14580,14 +14765,14 @@ name = "zed_vue"
version = "0.1.0"
dependencies = [
"serde",
- "zed_extension_api 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "zed_extension_api 0.1.0",
]
[[package]]
name = "zed_zig"
version = "0.3.0"
dependencies = [
- "zed_extension_api 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "zed_extension_api 0.1.0",
]
[[package]]
diff --git a/Cargo.toml b/Cargo.toml
index db935f0b0a..752c825aa2 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -29,6 +29,7 @@ members = [
"crates/diagnostics",
"crates/docs_preprocessor",
"crates/editor",
+ "crates/evals",
"crates/extension",
"crates/extension_api",
"crates/extension_cli",
@@ -53,6 +54,7 @@ members = [
"crates/indexed_docs",
"crates/inline_completion_button",
"crates/install_cli",
+ "crates/isahc_http_client",
"crates/journal",
"crates/language",
"crates/language_model",
@@ -120,6 +122,7 @@ members = [
"crates/title_bar",
"crates/ui",
"crates/ui_input",
+ "crates/ui_macros",
"crates/util",
"crates/vcs_menu",
"crates/vim",
@@ -228,6 +231,7 @@ image_viewer = { path = "crates/image_viewer" }
indexed_docs = { path = "crates/indexed_docs" }
inline_completion_button = { path = "crates/inline_completion_button" }
install_cli = { path = "crates/install_cli" }
+isahc_http_client = { path = "crates/isahc_http_client" }
journal = { path = "crates/journal" }
language = { path = "crates/language" }
language_model = { path = "crates/language_model" }
@@ -296,6 +300,7 @@ time_format = { path = "crates/time_format" }
title_bar = { path = "crates/title_bar" }
ui = { path = "crates/ui" }
ui_input = { path = "crates/ui_input" }
+ui_macros = { path = "crates/ui_macros" }
util = { path = "crates/util" }
vcs_menu = { path = "crates/vcs_menu" }
vim = { path = "crates/vim" }
@@ -313,6 +318,7 @@ aho-corasick = "1.1"
alacritty_terminal = { git = "https://github.com/alacritty/alacritty", rev = "91d034ff8b53867143c005acfaa14609147c9a2c" }
any_vec = "0.14"
anyhow = "1.0.86"
+arrayvec = { version = "0.7.4", features = ["serde"] }
ashpd = "0.9.1"
async-compression = { version = "0.4", features = ["gzip", "futures-io"] }
async-dispatcher = "0.1"
@@ -329,12 +335,14 @@ bitflags = "2.6.0"
blade-graphics = { git = "https://github.com/kvark/blade", rev = "e142a3a5e678eb6a13e642ad8401b1f3aa38e969" }
blade-macros = { git = "https://github.com/kvark/blade", rev = "e142a3a5e678eb6a13e642ad8401b1f3aa38e969" }
blade-util = { git = "https://github.com/kvark/blade", rev = "e142a3a5e678eb6a13e642ad8401b1f3aa38e969" }
+blake3 = "1.5.3"
cargo_metadata = "0.18"
cargo_toml = "0.20"
chrono = { version = "0.4", features = ["serde"] }
clap = { version = "4.4", features = ["derive"] }
clickhouse = "0.11.6"
cocoa = "0.26"
+convert_case = "0.6.0"
core-foundation = "0.9.3"
core-foundation-sys = "0.8.6"
ctor = "0.2.6"
@@ -392,12 +400,14 @@ runtimelib = { version = "0.15", default-features = false, features = [
] }
rustc-demangle = "0.1.23"
rust-embed = { version = "8.4", features = ["include-exclude"] }
+rustls = "0.20.3"
+rustls-native-certs = "0.8.0"
schemars = { version = "0.8", features = ["impl_json_schema"] }
semver = "1.0"
serde = { version = "1.0", features = ["derive", "rc"] }
serde_derive = { version = "1.0", features = ["deserialize_in_place"] }
serde_json = { version = "1.0", features = ["preserve_order", "raw_value"] }
-serde_json_lenient = { version = "0.1", features = [
+serde_json_lenient = { version = "0.2", features = [
"preserve_order",
"raw_value",
] }
@@ -414,7 +424,7 @@ strsim = "0.11"
strum = { version = "0.25.0", features = ["derive"] }
subtle = "2.5.0"
sys-locale = "0.3.1"
-sysinfo = "0.30.7"
+sysinfo = "0.31.0"
tempfile = "3.9.0"
thiserror = "1.0.29"
tiktoken-rs = "0.5.9"
@@ -429,43 +439,43 @@ tiny_http = "0.8"
toml = "0.8"
tokio = { version = "1", features = ["full"] }
tower-http = "0.4.4"
-tree-sitter = { version = "0.22", features = ["wasm"] }
-tree-sitter-bash = "0.21"
-tree-sitter-c = "0.21"
-tree-sitter-cpp = "0.22"
-tree-sitter-css = "0.21"
-tree-sitter-elixir = "0.2"
-tree-sitter-embedded-template = "0.20.0"
-tree-sitter-go = "0.21"
-tree-sitter-go-mod = { git = "https://github.com/camdencheek/tree-sitter-go-mod", rev = "1f55029bacd0a6a11f6eb894c4312d429dcf735c", package = "tree-sitter-gomod" }
-tree-sitter-gowork = { git = "https://github.com/d1y/tree-sitter-go-work", rev = "dcbabff454703c3a4bc98a23cf8778d4be46fd22" }
-tree-sitter-heex = { git = "https://github.com/phoenixframework/tree-sitter-heex", rev = "6dd0303acf7138dd2b9b432a229e16539581c701" }
+tree-sitter = { version = "0.23", features = ["wasm"] }
+tree-sitter-bash = "0.23"
+tree-sitter-c = "0.23"
+tree-sitter-cpp = "0.23"
+tree-sitter-css = "0.23"
+tree-sitter-elixir = "0.3"
+tree-sitter-embedded-template = "0.23.0"
+tree-sitter-go = "0.23"
+tree-sitter-go-mod = { git = "https://github.com/zed-industries/tree-sitter-go-mod", rev = "a9aea5e358cde4d0f8ff20b7bc4fa311e359c7ca", package = "tree-sitter-gomod" }
+tree-sitter-gowork = { git = "https://github.com/zed-industries/tree-sitter-go-work", rev = "acb0617bf7f4fda02c6217676cc64acb89536dc7" }
+tree-sitter-heex = { git = "https://github.com/zed-industries/tree-sitter-heex", rev = "1dd45142fbb05562e35b2040c6129c9bca346592" }
tree-sitter-html = "0.20"
-tree-sitter-jsdoc = "0.21"
-tree-sitter-json = "0.21"
-tree-sitter-md = { git = "https://github.com/zed-industries/tree-sitter-markdown", rev = "e3855e37f8f2c71aa7513c18a9c95fb7461b1b10" }
-protols-tree-sitter-proto = "0.2"
-tree-sitter-python = "0.21"
-tree-sitter-regex = "0.21"
-tree-sitter-ruby = "0.21"
-tree-sitter-rust = "0.21"
-tree-sitter-typescript = "0.21"
-tree-sitter-yaml = "0.6"
+tree-sitter-jsdoc = "0.23"
+tree-sitter-json = "0.23"
+tree-sitter-md = { git = "https://github.com/zed-industries/tree-sitter-markdown", rev = "4cfa6aad6b75052a5077c80fd934757d9267d81b" }
+protols-tree-sitter-proto = { git = "https://github.com/zed-industries/tree-sitter-proto", rev = "0848bd30a64be48772e15fbb9d5ba8c0cc5772ad" }
+tree-sitter-python = "0.23"
+tree-sitter-regex = "0.23"
+tree-sitter-ruby = "0.23"
+tree-sitter-rust = "0.23"
+tree-sitter-typescript = "0.23"
+tree-sitter-yaml = { git = "https://github.com/zed-industries/tree-sitter-yaml", rev = "baff0b51c64ef6a1fb1f8390f3ad6015b83ec13a" }
unindent = "0.1.7"
unicase = "2.6"
unicode-segmentation = "1.10"
url = "2.2"
uuid = { version = "1.1.2", features = ["v4", "v5", "serde"] }
-wasmparser = "0.201"
-wasm-encoder = "0.201"
-wasmtime = { version = "21.0.1", default-features = false, features = [
+wasmparser = "0.215"
+wasm-encoder = "0.215"
+wasmtime = { version = "24", default-features = false, features = [
"async",
"demangle",
"runtime",
"cranelift",
"component-model",
] }
-wasmtime-wasi = "21.0.1"
+wasmtime-wasi = "24"
which = "6.0.0"
wit-component = "0.201"
@@ -487,7 +497,7 @@ version = "0.58"
features = [
"implement",
"Foundation_Numerics",
- "System",
+ "Storage",
"System_Threading",
"UI_ViewManagement",
"Wdk_System_SystemServices",
@@ -518,13 +528,10 @@ features = [
"Win32_UI_Input_Ime",
"Win32_UI_Input_KeyboardAndMouse",
"Win32_UI_Shell",
+ "Win32_UI_Shell_Common",
"Win32_UI_WindowsAndMessaging",
]
-[patch.crates-io]
-# Patch Tree-sitter for updated wasmtime.
-tree-sitter = { git = "https://github.com/tree-sitter/tree-sitter", rev = "7f4a57817d58a2f134fe863674acad6bbf007228" }
-
[profile.dev]
split-debuginfo = "unpacked"
debug = "limited"
diff --git a/Dockerfile b/Dockerfile
index 70c47c9f67..2fb5f04147 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -4,11 +4,38 @@ FROM rust:1.81-bookworm as builder
WORKDIR app
COPY . .
+# Replace the Cargo configuration with the one used by collab.
+COPY ./.cargo/collab-config.toml ./.cargo/config.toml
+
# Compile collab server
ARG CARGO_PROFILE_RELEASE_PANIC=abort
ARG GITHUB_SHA
ENV GITHUB_SHA=$GITHUB_SHA
+
+# At some point in the past 3 weeks, additional dependencies on `xkbcommon` and
+# `xkbcommon-x11` were introduced into collab.
+#
+# A `git bisect` points to this commit as being the culprit: `b8e6098f60e5dabe98fe8281f993858dacc04a55`.
+#
+# Now when we try to build collab for the Docker image, it fails with the following
+# error:
+#
+# ```
+# 985.3 = note: /usr/bin/ld: cannot find -lxkbcommon: No such file or directory
+# 985.3 /usr/bin/ld: cannot find -lxkbcommon-x11: No such file or directory
+# 985.3 collect2: error: ld returned 1 exit status
+# ```
+#
+# The last successful deploys were at:
+# - Staging: `4f408ec65a3867278322a189b4eb20f1ab51f508`
+# - Production: `fc4c533d0a8c489e5636a4249d2b52a80039fbd7`
+#
+# Installing these as a temporary workaround, but I think ideally we'd want to figure
+# out what caused them to be included in the first place.
+RUN apt-get update; \
+ apt-get install -y --no-install-recommends libxkbcommon-dev libxkbcommon-x11-dev
+
RUN --mount=type=cache,target=./script/node_modules \
--mount=type=cache,target=/usr/local/cargo/registry \
--mount=type=cache,target=/usr/local/cargo/git \
diff --git a/assets/icons/audio_off.svg b/assets/icons/audio_off.svg
new file mode 100644
index 0000000000..93b98471ca
--- /dev/null
+++ b/assets/icons/audio_off.svg
@@ -0,0 +1 @@
+
diff --git a/assets/icons/audio_on.svg b/assets/icons/audio_on.svg
new file mode 100644
index 0000000000..42310ea32c
--- /dev/null
+++ b/assets/icons/audio_on.svg
@@ -0,0 +1 @@
+
diff --git a/assets/icons/case_insensitive.svg b/assets/icons/case_sensitive.svg
similarity index 100%
rename from assets/icons/case_insensitive.svg
rename to assets/icons/case_sensitive.svg
diff --git a/assets/icons/x.svg b/assets/icons/close.svg
similarity index 100%
rename from assets/icons/x.svg
rename to assets/icons/close.svg
diff --git a/assets/icons/text-cursor.svg b/assets/icons/cursor_i_beam.svg
similarity index 100%
rename from assets/icons/text-cursor.svg
rename to assets/icons/cursor_i_beam.svg
diff --git a/assets/icons/debug-breakpoint.svg b/assets/icons/debug_breakpoint.svg
similarity index 100%
rename from assets/icons/debug-breakpoint.svg
rename to assets/icons/debug_breakpoint.svg
diff --git a/assets/icons/debug-continue.svg b/assets/icons/debug_continue.svg
similarity index 100%
rename from assets/icons/debug-continue.svg
rename to assets/icons/debug_continue.svg
diff --git a/assets/icons/debug-disconnect.svg b/assets/icons/debug_disconnect.svg
similarity index 100%
rename from assets/icons/debug-disconnect.svg
rename to assets/icons/debug_disconnect.svg
diff --git a/assets/icons/debug-log-breakpoint.svg b/assets/icons/debug_log_breakpoint.svg
similarity index 100%
rename from assets/icons/debug-log-breakpoint.svg
rename to assets/icons/debug_log_breakpoint.svg
diff --git a/assets/icons/debug-pause.svg b/assets/icons/debug_pause.svg
similarity index 100%
rename from assets/icons/debug-pause.svg
rename to assets/icons/debug_pause.svg
diff --git a/assets/icons/debug-restart.svg b/assets/icons/debug_restart.svg
similarity index 100%
rename from assets/icons/debug-restart.svg
rename to assets/icons/debug_restart.svg
diff --git a/assets/icons/debug-step-into.svg b/assets/icons/debug_step_into.svg
similarity index 100%
rename from assets/icons/debug-step-into.svg
rename to assets/icons/debug_step_into.svg
diff --git a/assets/icons/debug-step-out.svg b/assets/icons/debug_step_out.svg
similarity index 100%
rename from assets/icons/debug-step-out.svg
rename to assets/icons/debug_step_out.svg
diff --git a/assets/icons/debug-step-over.svg b/assets/icons/debug_step_over.svg
similarity index 100%
rename from assets/icons/debug-step-over.svg
rename to assets/icons/debug_step_over.svg
diff --git a/assets/icons/debug-stop.svg b/assets/icons/debug_stop.svg
similarity index 100%
rename from assets/icons/debug-stop.svg
rename to assets/icons/debug_stop.svg
diff --git a/assets/icons/feedback.svg b/assets/icons/envelope.svg
similarity index 100%
rename from assets/icons/feedback.svg
rename to assets/icons/envelope.svg
diff --git a/assets/icons/file_doc.svg b/assets/icons/file_doc.svg
new file mode 100644
index 0000000000..3b11995f36
--- /dev/null
+++ b/assets/icons/file_doc.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/icons/file_generic.svg b/assets/icons/file_generic.svg
new file mode 100644
index 0000000000..3c72bd3320
--- /dev/null
+++ b/assets/icons/file_generic.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/icons/file_git.svg b/assets/icons/file_git.svg
new file mode 100644
index 0000000000..197db2e9e6
--- /dev/null
+++ b/assets/icons/file_git.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/icons/file_lock.svg b/assets/icons/file_lock.svg
new file mode 100644
index 0000000000..6bfef249b4
--- /dev/null
+++ b/assets/icons/file_lock.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/icons/file_rust.svg b/assets/icons/file_rust.svg
new file mode 100644
index 0000000000..5db753628a
--- /dev/null
+++ b/assets/icons/file_rust.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/icons/file_toml.svg b/assets/icons/file_toml.svg
new file mode 100644
index 0000000000..9ab78af50f
--- /dev/null
+++ b/assets/icons/file_toml.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/icons/project.svg b/assets/icons/file_tree.svg
similarity index 100%
rename from assets/icons/project.svg
rename to assets/icons/file_tree.svg
diff --git a/assets/icons/folder.svg b/assets/icons/folder.svg
new file mode 100644
index 0000000000..a76dc63d1a
--- /dev/null
+++ b/assets/icons/folder.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/folder_open.svg b/assets/icons/folder_open.svg
new file mode 100644
index 0000000000..ef37f55f83
--- /dev/null
+++ b/assets/icons/folder_open.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/icons/stop_sharing.svg b/assets/icons/folder_x.svg
similarity index 100%
rename from assets/icons/stop_sharing.svg
rename to assets/icons/folder_x.svg
diff --git a/assets/icons/conversations.svg b/assets/icons/message_bubbles.svg
similarity index 100%
rename from assets/icons/conversations.svg
rename to assets/icons/message_bubbles.svg
diff --git a/assets/icons/desktop.svg b/assets/icons/screen.svg
similarity index 100%
rename from assets/icons/desktop.svg
rename to assets/icons/screen.svg
diff --git a/assets/icons/settings.svg b/assets/icons/settings.svg
new file mode 100644
index 0000000000..081d25bf48
--- /dev/null
+++ b/assets/icons/settings.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/icons/sliders-alt.svg b/assets/icons/settings_alt.svg
similarity index 100%
rename from assets/icons/sliders-alt.svg
rename to assets/icons/settings_alt.svg
diff --git a/assets/icons/sliders_alt.svg b/assets/icons/sliders_alt.svg
new file mode 100644
index 0000000000..36c3feccfe
--- /dev/null
+++ b/assets/icons/sliders_alt.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/icons/sliders_vertical.svg b/assets/icons/sliders_vertical.svg
new file mode 100644
index 0000000000..ab61037a51
--- /dev/null
+++ b/assets/icons/sliders_vertical.svg
@@ -0,0 +1,11 @@
+
diff --git a/assets/icons/speaker_off.svg b/assets/icons/speaker_off.svg
deleted file mode 100644
index f60c35de7f..0000000000
--- a/assets/icons/speaker_off.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
diff --git a/assets/icons/text_select.svg b/assets/icons/text_snippet.svg
similarity index 100%
rename from assets/icons/text_select.svg
rename to assets/icons/text_snippet.svg
diff --git a/assets/icons/user_group_16.svg b/assets/icons/user_group.svg
similarity index 100%
rename from assets/icons/user_group_16.svg
rename to assets/icons/user_group.svg
diff --git a/assets/icons/word_search.svg b/assets/icons/whole_word.svg
similarity index 100%
rename from assets/icons/word_search.svg
rename to assets/icons/whole_word.svg
diff --git a/assets/icons/error.svg b/assets/icons/x_circle.svg
similarity index 100%
rename from assets/icons/error.svg
rename to assets/icons/x_circle.svg
diff --git a/assets/images/zed_logo.svg b/assets/images/zed_logo.svg
new file mode 100644
index 0000000000..d1769449c1
--- /dev/null
+++ b/assets/images/zed_logo.svg
@@ -0,0 +1,10 @@
+
diff --git a/assets/images/zed_x_copilot.svg b/assets/images/zed_x_copilot.svg
new file mode 100644
index 0000000000..3c5be71074
--- /dev/null
+++ b/assets/images/zed_x_copilot.svg
@@ -0,0 +1,14 @@
+
diff --git a/assets/keymaps/default-linux.json b/assets/keymaps/default-linux.json
index bd2ade4246..f15c4dfe22 100644
--- a/assets/keymaps/default-linux.json
+++ b/assets/keymaps/default-linux.json
@@ -56,6 +56,7 @@
"shift-tab": "editor::TabPrev",
"ctrl-k": "editor::CutToEndOfLine",
// "ctrl-t": "editor::Transpose",
+ "alt-q": "editor::Rewrap",
"ctrl-backspace": "editor::DeleteToPreviousWordStart",
"ctrl-delete": "editor::DeleteToNextWordEnd",
"shift-delete": "editor::Cut",
@@ -165,6 +166,7 @@
{
"context": "AssistantPanel",
"bindings": {
+ "ctrl-k c": "assistant::CopyCode",
"ctrl-g": "search::SelectNextMatch",
"ctrl-shift-g": "search::SelectPrevMatch",
"alt-m": "assistant::ToggleModelSelector",
@@ -245,6 +247,8 @@
"bindings": {
"ctrl-pageup": "pane::ActivatePrevItem",
"ctrl-pagedown": "pane::ActivateNextItem",
+ "ctrl-shift-pageup": "pane::SwapItemLeft",
+ "ctrl-shift-pagedown": "pane::SwapItemRight",
"ctrl-w": "pane::CloseActiveItem",
"ctrl-f4": "pane::CloseActiveItem",
"alt-ctrl-t": "pane::CloseInactiveItems",
@@ -516,6 +520,13 @@
"alt-enter": "editor::Newline"
}
},
+ {
+ "context": "PromptEditor",
+ "bindings": {
+ "ctrl-[": "assistant::CyclePreviousInlineAssist",
+ "ctrl-]": "assistant::CycleNextInlineAssist"
+ }
+ },
{
"context": "ProjectSearchBar && !in_replace",
"bindings": {
@@ -553,6 +564,7 @@
"ctrl-backspace": ["project_panel::Delete", { "skip_prompt": false }],
"ctrl-delete": ["project_panel::Delete", { "skip_prompt": false }],
"alt-ctrl-r": "project_panel::RevealInFileManager",
+ "ctrl-shift-enter": "project_panel::OpenWithSystem",
"alt-shift-f": "project_panel::NewSearchInDirectory",
"shift-down": "menu::SelectNext",
"shift-up": "menu::SelectPrev",
diff --git a/assets/keymaps/default-macos.json b/assets/keymaps/default-macos.json
index dec5cbd9f3..a58112b3c0 100644
--- a/assets/keymaps/default-macos.json
+++ b/assets/keymaps/default-macos.json
@@ -51,6 +51,7 @@
"shift-tab": "editor::TabPrev",
"ctrl-k": "editor::CutToEndOfLine",
"ctrl-t": "editor::Transpose",
+ "alt-q": "editor::Rewrap",
"cmd-backspace": "editor::DeleteToBeginningOfLine",
"cmd-delete": "editor::DeleteToEndOfLine",
"alt-backspace": "editor::DeleteToPreviousWordStart",
@@ -187,6 +188,7 @@
{
"context": "AssistantPanel",
"bindings": {
+ "cmd-k c": "assistant::CopyCode",
"cmd-g": "search::SelectNextMatch",
"cmd-shift-g": "search::SelectPrevMatch",
"alt-m": "assistant::ToggleModelSelector",
@@ -285,6 +287,8 @@
"cmd-}": "pane::ActivateNextItem",
"alt-cmd-left": "pane::ActivatePrevItem",
"alt-cmd-right": "pane::ActivateNextItem",
+ "ctrl-shift-pageup": "pane::SwapItemLeft",
+ "ctrl-shift-pagedown": "pane::SwapItemRight",
"cmd-w": "pane::CloseActiveItem",
"alt-cmd-t": "pane::CloseInactiveItems",
"ctrl-alt-cmd-w": "workspace::CloseInactiveTabsAndPanes",
@@ -523,6 +527,13 @@
"ctrl-enter": "assistant::InlineAssist"
}
},
+ {
+ "context": "PromptEditor",
+ "bindings": {
+ "ctrl-[": "assistant::CyclePreviousInlineAssist",
+ "ctrl-]": "assistant::CycleNextInlineAssist"
+ }
+ },
{
"context": "ProjectSearchBar && !in_replace",
"bindings": {
@@ -563,8 +574,8 @@
"cmd-backspace": ["project_panel::Trash", { "skip_prompt": true }],
"cmd-delete": ["project_panel::Delete", { "skip_prompt": false }],
"alt-cmd-r": "project_panel::RevealInFileManager",
+ "ctrl-shift-enter": "project_panel::OpenWithSystem",
"cmd-alt-backspace": ["project_panel::Delete", { "skip_prompt": false }],
-
"alt-shift-f": "project_panel::NewSearchInDirectory",
"shift-down": "menu::SelectNext",
"shift-up": "menu::SelectPrev",
diff --git a/assets/keymaps/vim.json b/assets/keymaps/vim.json
index 8bb5ac72fe..8d933f19af 100644
--- a/assets/keymaps/vim.json
+++ b/assets/keymaps/vim.json
@@ -214,7 +214,7 @@
"shift-d": "vim::DeleteToEndOfLine",
"shift-j": "vim::JoinLines",
"y": ["vim::PushOperator", "Yank"],
- "shift-y": "vim::YankToEndOfLine",
+ "shift-y": "vim::YankLine",
"i": "vim::InsertBefore",
"shift-i": "vim::InsertFirstNonWhitespace",
"a": "vim::InsertAfter",
@@ -239,6 +239,8 @@
"g shift-u": ["vim::PushOperator", "Uppercase"],
"g ~": ["vim::PushOperator", "OppositeCase"],
"\"": ["vim::PushOperator", "Register"],
+ "g q": ["vim::PushOperator", "Rewrap"],
+ "g w": ["vim::PushOperator", "Rewrap"],
"q": "vim::ToggleRecord",
"shift-q": "vim::ReplayLastRecording",
"@": ["vim::PushOperator", "ReplayRegister"],
@@ -300,6 +302,7 @@
"i": ["vim::PushOperator", { "Object": { "around": false } }],
"a": ["vim::PushOperator", { "Object": { "around": true } }],
"g c": "vim::ToggleComments",
+ "g q": "vim::Rewrap",
"\"": ["vim::PushOperator", "Register"],
// tree-sitter related commands
"[ x": "editor::SelectLargerSyntaxNode",
@@ -427,6 +430,15 @@
"~": "vim::CurrentLine"
}
},
+ {
+ "context": "vim_operator == gq",
+ "bindings": {
+ "g q": "vim::CurrentLine",
+ "q": "vim::CurrentLine",
+ "g w": "vim::CurrentLine",
+ "w": "vim::CurrentLine"
+ }
+ },
{
"context": "vim_operator == y",
"bindings": {
@@ -493,6 +505,7 @@
"v": "project_panel::OpenPermanent",
"p": "project_panel::Open",
"x": "project_panel::RevealInFileManager",
+ "s": "project_panel::OpenWithSystem",
"shift-g": "menu::SelectLast",
"g g": "menu::SelectFirst",
"-": "project_panel::SelectParent",
diff --git a/assets/prompts/content_prompt.hbs b/assets/prompts/content_prompt.hbs
index cf4141349b..e944e230f5 100644
--- a/assets/prompts/content_prompt.hbs
+++ b/assets/prompts/content_prompt.hbs
@@ -47,6 +47,17 @@ And here's the section to rewrite based on that prompt again for reference:
{{{rewrite_section}}}
+
+{{#if diagnostic_errors}}
+{{#each diagnostic_errors}}
+
+ {{line_number}}
+ {{error_message}}
+ {{code_content}}
+
+{{/each}}
+{{/if}}
+
{{/if}}
Only make changes that are necessary to fulfill the prompt, leave everything else as-is. All surrounding {{content_type}} will be preserved.
diff --git a/assets/prompts/project_slash_command.hbs b/assets/prompts/project_slash_command.hbs
new file mode 100644
index 0000000000..6c63f71d89
--- /dev/null
+++ b/assets/prompts/project_slash_command.hbs
@@ -0,0 +1,8 @@
+A software developer is asking a question about their project. The source files in their project have been indexed into a database of semantic text embeddings.
+Your task is to generate a list of 4 diverse search queries that can be run on this embedding database, in order to retrieve a list of code snippets
+that are relevant to the developer's question. Redundant search queries will be heavily penalized, so only include another query if it's sufficiently
+distinct from previous ones.
+
+Here is the question that's been asked, together with context that the developer has added manually:
+
+{{{context_buffer}}}
diff --git a/assets/settings/default.json b/assets/settings/default.json
index ae1579736c..ab80805799 100644
--- a/assets/settings/default.json
+++ b/assets/settings/default.json
@@ -111,6 +111,18 @@
"use_system_path_prompts": true,
// Whether the cursor blinks in the editor.
"cursor_blink": true,
+ // Cursor shape for the default editor.
+ // 1. A vertical bar
+ // "bar"
+ // 2. A block that surrounds the following character
+ // "block"
+ // 3. An underline that runs along the following character
+ // "underscore"
+ // 4. A box drawn around the following character
+ // "hollow"
+ //
+ // Default: not set, defaults to "bar"
+ "cursor_shape": null,
// How to highlight the current line in the editor.
//
// 1. Don't highlight the current line:
@@ -279,6 +291,13 @@
"relative_line_numbers": false,
// If 'search_wrap' is disabled, search result do not wrap around the end of the file.
"search_wrap": true,
+ // Search options to enable by default when opening new project and buffer searches.
+ "search": {
+ "whole_word": false,
+ "case_sensitive": false,
+ "include_ignored": false,
+ "regex": false
+ },
// When to populate a new search's query based on the text under the cursor.
// This setting can take the following three values:
//
@@ -299,6 +318,10 @@
"show_parameter_hints": true,
// Corresponds to null/None LSP hint type value.
"show_other_hints": true,
+ // Whether to show a background for inlay hints.
+ //
+ // If set to `true`, the background will use the `hint.background` color from the current theme.
+ "show_background": false,
// Time to wait after editing the buffer, before requesting the hints,
// set to 0 to disable debouncing.
"edit_debounce_ms": 700,
@@ -473,6 +496,11 @@
// Whether a preview tab gets replaced when code navigation is used to navigate away from the tab.
"enable_preview_from_code_navigation": false
},
+ // Settings related to the file finder.
+ "file_finder": {
+ // Whether to show file icons in the file finder.
+ "file_icons": true
+ },
// Whether or not to remove any trailing whitespace from lines of a buffer
// before saving it.
"remove_trailing_whitespace_on_save": true,
@@ -691,7 +719,7 @@
// to the current working directory. We recommend overriding this
// in your project's settings, rather than globally.
"directories": [".env", "env", ".venv", "venv"],
- // Can also be `csh`, `fish`, and `nushell`
+ // Can also be `csh`, `fish`, `nushell` and `power_shell`
"activate_script": "default"
}
},
@@ -909,7 +937,8 @@
},
"openai": {
"version": "1",
- "api_url": "https://api.openai.com/v1"
+ "api_url": "https://api.openai.com/v1",
+ "low_speed_timeout_in_seconds": 600
}
},
// Zed's Prettier integration settings.
@@ -1005,7 +1034,7 @@
// environment variables.
//
// Examples:
- // - "proxy": "socks5://localhost:10808"
+ // - "proxy": "socks5h://localhost:10808"
// - "proxy": "http://127.0.0.1:10809"
"proxy": null,
// Set to configure aliases for the command palette.
diff --git a/assets/settings/initial_user_settings.json b/assets/settings/initial_user_settings.json
index d8ac1a0021..71f3beb1d6 100644
--- a/assets/settings/initial_user_settings.json
+++ b/assets/settings/initial_user_settings.json
@@ -5,7 +5,7 @@
//
// To see all of Zed's default settings without changing your
// custom settings, run `zed: open default settings` from the
-// command palette
+// command palette (cmd-shift-p / ctrl-shift-p)
{
"ui_font_size": 16,
"buffer_font_size": 16,
diff --git a/crates/activity_indicator/src/activity_indicator.rs b/crates/activity_indicator/src/activity_indicator.rs
index 4b6508edb0..a9ae7d075d 100644
--- a/crates/activity_indicator/src/activity_indicator.rs
+++ b/crates/activity_indicator/src/activity_indicator.rs
@@ -19,7 +19,10 @@ use workspace::{item::ItemHandle, StatusItemView, Workspace};
actions!(activity_indicator, [ShowErrorMessage]);
pub enum Event {
- ShowError { lsp_name: Arc, error: String },
+ ShowError {
+ lsp_name: LanguageServerName,
+ error: String,
+ },
}
pub struct ActivityIndicator {
@@ -123,7 +126,7 @@ impl ActivityIndicator {
self.statuses.retain(|status| {
if let LanguageServerBinaryStatus::Failed { error } = &status.status {
cx.emit(Event::ShowError {
- lsp_name: status.name.0.clone(),
+ lsp_name: status.name.clone(),
error: error.clone(),
});
false
@@ -262,7 +265,7 @@ impl ActivityIndicator {
if !failed.is_empty() {
return Some(Content {
icon: Some(
- Icon::new(IconName::ExclamationTriangle)
+ Icon::new(IconName::Warning)
.size(IconSize::Small)
.into_any_element(),
),
@@ -280,7 +283,7 @@ impl ActivityIndicator {
if let Some(failure) = self.project.read(cx).last_formatting_failure() {
return Some(Content {
icon: Some(
- Icon::new(IconName::ExclamationTriangle)
+ Icon::new(IconName::Warning)
.size(IconSize::Small)
.into_any_element(),
),
@@ -333,7 +336,7 @@ impl ActivityIndicator {
}),
AutoUpdateStatus::Errored => Some(Content {
icon: Some(
- Icon::new(IconName::ExclamationTriangle)
+ Icon::new(IconName::Warning)
.size(IconSize::Small)
.into_any_element(),
),
diff --git a/crates/anthropic/src/anthropic.rs b/crates/anthropic/src/anthropic.rs
index f960dc541a..91b6723e90 100644
--- a/crates/anthropic/src/anthropic.rs
+++ b/crates/anthropic/src/anthropic.rs
@@ -49,6 +49,7 @@ pub enum Model {
/// Indicates whether this custom model supports caching.
cache_configuration: Option,
max_output_tokens: Option,
+ default_temperature: Option,
},
}
@@ -124,6 +125,19 @@ impl Model {
}
}
+ pub fn default_temperature(&self) -> f32 {
+ match self {
+ Self::Claude3_5Sonnet
+ | Self::Claude3Opus
+ | Self::Claude3Sonnet
+ | Self::Claude3Haiku => 1.0,
+ Self::Custom {
+ default_temperature,
+ ..
+ } => default_temperature.unwrap_or(1.0),
+ }
+ }
+
pub fn tool_model_id(&self) -> &str {
if let Self::Custom {
tool_override: Some(tool_override),
diff --git a/crates/assets/src/assets.rs b/crates/assets/src/assets.rs
index 395cbf62f6..ee990085f6 100644
--- a/crates/assets/src/assets.rs
+++ b/crates/assets/src/assets.rs
@@ -8,6 +8,7 @@ use rust_embed::RustEmbed;
#[folder = "../../assets"]
#[include = "fonts/**/*"]
#[include = "icons/**/*"]
+#[include = "images/**/*"]
#[include = "themes/**/*"]
#[exclude = "themes/src/*"]
#[include = "sounds/**/*"]
diff --git a/crates/assistant/Cargo.toml b/crates/assistant/Cargo.toml
index d2b5aed9bd..9f715d8224 100644
--- a/crates/assistant/Cargo.toml
+++ b/crates/assistant/Cargo.toml
@@ -65,6 +65,7 @@ proto.workspace = true
regex.workspace = true
release_channel.workspace = true
rope.workspace = true
+rpc.workspace = true
schemars.workspace = true
search.workspace = true
semantic_index.workspace = true
@@ -93,9 +94,11 @@ editor = { workspace = true, features = ["test-support"] }
env_logger.workspace = true
language = { workspace = true, features = ["test-support"] }
language_model = { workspace = true, features = ["test-support"] }
+languages = { workspace = true, features = ["test-support"] }
log.workspace = true
project = { workspace = true, features = ["test-support"] }
rand.workspace = true
serde_json_lenient.workspace = true
text = { workspace = true, features = ["test-support"] }
+tree-sitter-md.workspace = true
unindent.workspace = true
diff --git a/crates/assistant/src/assistant.rs b/crates/assistant/src/assistant.rs
index 70e37ba239..9cc63af5a1 100644
--- a/crates/assistant/src/assistant.rs
+++ b/crates/assistant/src/assistant.rs
@@ -37,13 +37,14 @@ use language_model::{
pub(crate) use model_selector::*;
pub use prompts::PromptBuilder;
use prompts::PromptLoadingParams;
-use semantic_index::{CloudEmbeddingProvider, SemanticIndex};
+use semantic_index::{CloudEmbeddingProvider, SemanticDb};
use serde::{Deserialize, Serialize};
use settings::{update_settings_file, Settings, SettingsStore};
use slash_command::{
- context_server_command, default_command, diagnostics_command, docs_command, fetch_command,
- file_command, now_command, project_command, prompt_command, search_command, symbols_command,
- tab_command, terminal_command, workflow_command,
+ auto_command, cargo_workspace_command, context_server_command, default_command, delta_command,
+ diagnostics_command, docs_command, fetch_command, file_command, now_command, project_command,
+ prompt_command, search_command, symbols_command, tab_command, terminal_command,
+ workflow_command,
};
use std::path::PathBuf;
use std::sync::Arc;
@@ -58,6 +59,7 @@ actions!(
[
Assist,
Split,
+ CopyCode,
CycleMessageRole,
QuoteSelection,
InsertIntoEditor,
@@ -68,6 +70,8 @@ actions!(
ConfirmCommand,
NewContext,
ToggleModelSelector,
+ CycleNextInlineAssist,
+ CyclePreviousInlineAssist
]
);
@@ -210,12 +214,13 @@ pub fn init(
let client = client.clone();
async move {
let embedding_provider = CloudEmbeddingProvider::new(client.clone());
- let semantic_index = SemanticIndex::new(
+ let semantic_index = SemanticDb::new(
paths::embeddings_dir().join("semantic-index-db.0.mdb"),
Arc::new(embedding_provider),
&mut cx,
)
.await?;
+
cx.update(|cx| cx.set_global(semantic_index))
}
})
@@ -357,30 +362,67 @@ fn update_active_language_model_from_settings(cx: &mut AppContext) {
let settings = AssistantSettings::get_global(cx);
let provider_name = LanguageModelProviderId::from(settings.default_model.provider.clone());
let model_id = LanguageModelId::from(settings.default_model.model.clone());
+ let inline_alternatives = settings
+ .inline_alternatives
+ .iter()
+ .map(|alternative| {
+ (
+ LanguageModelProviderId::from(alternative.provider.clone()),
+ LanguageModelId::from(alternative.model.clone()),
+ )
+ })
+ .collect::>();
LanguageModelRegistry::global(cx).update(cx, |registry, cx| {
registry.select_active_model(&provider_name, &model_id, cx);
+ registry.select_inline_alternative_models(inline_alternatives, cx);
});
}
fn register_slash_commands(prompt_builder: Option>, cx: &mut AppContext) {
let slash_command_registry = SlashCommandRegistry::global(cx);
+
slash_command_registry.register_command(file_command::FileSlashCommand, true);
+ slash_command_registry.register_command(delta_command::DeltaSlashCommand, true);
slash_command_registry.register_command(symbols_command::OutlineSlashCommand, true);
slash_command_registry.register_command(tab_command::TabSlashCommand, true);
- slash_command_registry.register_command(project_command::ProjectSlashCommand, true);
+ slash_command_registry
+ .register_command(cargo_workspace_command::CargoWorkspaceSlashCommand, true);
slash_command_registry.register_command(prompt_command::PromptSlashCommand, true);
slash_command_registry.register_command(default_command::DefaultSlashCommand, false);
slash_command_registry.register_command(terminal_command::TerminalSlashCommand, true);
slash_command_registry.register_command(now_command::NowSlashCommand, false);
slash_command_registry.register_command(diagnostics_command::DiagnosticsSlashCommand, true);
+ slash_command_registry.register_command(fetch_command::FetchSlashCommand, false);
if let Some(prompt_builder) = prompt_builder {
slash_command_registry.register_command(
workflow_command::WorkflowSlashCommand::new(prompt_builder.clone()),
true,
);
+ cx.observe_flag::({
+ let slash_command_registry = slash_command_registry.clone();
+ move |is_enabled, _cx| {
+ if is_enabled {
+ slash_command_registry.register_command(
+ project_command::ProjectSlashCommand::new(prompt_builder.clone()),
+ true,
+ );
+ }
+ }
+ })
+ .detach();
}
- slash_command_registry.register_command(fetch_command::FetchSlashCommand, false);
+
+ cx.observe_flag::({
+ let slash_command_registry = slash_command_registry.clone();
+ move |is_enabled, _cx| {
+ if is_enabled {
+ // [#auto-staff-ship] TODO remove this when /auto is no longer staff-shipped
+ slash_command_registry.register_command(auto_command::AutoCommand, true);
+ }
+ }
+ })
+ .detach();
update_slash_commands_from_settings(cx);
cx.observe_global::(update_slash_commands_from_settings)
@@ -407,10 +449,12 @@ fn update_slash_commands_from_settings(cx: &mut AppContext) {
slash_command_registry.unregister_command(docs_command::DocsSlashCommand);
}
- if settings.project.enabled {
- slash_command_registry.register_command(project_command::ProjectSlashCommand, true);
+ if settings.cargo_workspace.enabled {
+ slash_command_registry
+ .register_command(cargo_workspace_command::CargoWorkspaceSlashCommand, true);
} else {
- slash_command_registry.unregister_command(project_command::ProjectSlashCommand);
+ slash_command_registry
+ .unregister_command(cargo_workspace_command::CargoWorkspaceSlashCommand);
}
}
diff --git a/crates/assistant/src/assistant_panel.rs b/crates/assistant/src/assistant_panel.rs
index 0d32815754..c459dac5d6 100644
--- a/crates/assistant/src/assistant_panel.rs
+++ b/crates/assistant/src/assistant_panel.rs
@@ -11,12 +11,12 @@ use crate::{
},
slash_command_picker,
terminal_inline_assistant::TerminalInlineAssistant,
- Assist, CacheStatus, ConfirmCommand, Context, ContextEvent, ContextId, ContextStore,
- ContextStoreEvent, CycleMessageRole, DeployHistory, DeployPromptLibrary, InlineAssistId,
- InlineAssistant, InsertDraggedFiles, InsertIntoEditor, Message, MessageId, MessageMetadata,
- MessageStatus, ModelPickerDelegate, ModelSelector, NewContext, PendingSlashCommand,
- PendingSlashCommandStatus, QuoteSelection, RemoteContextMetadata, SavedContextMetadata, Split,
- ToggleFocus, ToggleModelSelector, WorkflowStepResolution,
+ Assist, CacheStatus, ConfirmCommand, Content, Context, ContextEvent, ContextId, ContextStore,
+ ContextStoreEvent, CopyCode, CycleMessageRole, DeployHistory, DeployPromptLibrary,
+ InlineAssistId, InlineAssistant, InsertDraggedFiles, InsertIntoEditor, Message, MessageId,
+ MessageMetadata, MessageStatus, ModelPickerDelegate, ModelSelector, NewContext,
+ PendingSlashCommand, PendingSlashCommandStatus, QuoteSelection, RemoteContextMetadata,
+ SavedContextMetadata, Split, ToggleFocus, ToggleModelSelector, WorkflowStepResolution,
};
use anyhow::{anyhow, Result};
use assistant_slash_command::{SlashCommand, SlashCommandOutputSection};
@@ -26,14 +26,15 @@ use collections::{BTreeSet, HashMap, HashSet};
use editor::{
actions::{FoldAt, MoveToEndOfLine, Newline, ShowCompletions, UnfoldAt},
display_map::{
- BlockDisposition, BlockId, BlockProperties, BlockStyle, Crease, CustomBlockId, FoldId,
- RenderBlock, ToDisplayPoint,
+ BlockDisposition, BlockId, BlockProperties, BlockStyle, Crease, CreaseMetadata,
+ CustomBlockId, FoldId, RenderBlock, ToDisplayPoint,
},
scroll::{Autoscroll, AutoscrollStrategy, ScrollAnchor},
Anchor, Editor, EditorEvent, ExcerptRange, MultiBuffer, RowExt, ToOffset as _, ToPoint,
};
use editor::{display_map::CreaseId, FoldPlaceholder};
use fs::Fs;
+use futures::FutureExt;
use gpui::{
canvas, div, img, percentage, point, pulsating_between, size, Action, Animation, AnimationExt,
AnyElement, AnyView, AppContext, AsyncWindowContext, ClipboardEntry, ClipboardItem,
@@ -44,23 +45,27 @@ use gpui::{
};
use indexed_docs::IndexedDocsStore;
use language::{
- language_settings::SoftWrap, Capability, LanguageRegistry, LspAdapterDelegate, Point, ToOffset,
+ language_settings::SoftWrap, BufferSnapshot, Capability, LanguageRegistry, LspAdapterDelegate,
+ ToOffset,
};
use language_model::{
provider::cloud::PROVIDER_ID, LanguageModelProvider, LanguageModelProviderId,
LanguageModelRegistry, Role,
};
+use language_model::{LanguageModelImage, LanguageModelToolUse};
use multi_buffer::MultiBufferRow;
use picker::{Picker, PickerDelegate};
-use project::{Project, ProjectLspAdapterDelegate, Worktree};
+use project::lsp_store::LocalLspAdapterDelegate;
+use project::{Project, Worktree};
+use rope::Point;
use search::{buffer_search::DivRegistrar, BufferSearchBar};
+use serde::{Deserialize, Serialize};
use settings::{update_settings_file, Settings};
use smol::stream::StreamExt;
use std::{
borrow::Cow,
cmp,
collections::hash_map,
- fmt::Write,
ops::{ControlFlow, Range},
path::PathBuf,
sync::Arc,
@@ -78,9 +83,10 @@ use util::{maybe, ResultExt};
use workspace::{
dock::{DockPosition, Panel, PanelEvent},
item::{self, FollowableItem, Item, ItemHandle},
+ notifications::NotificationId,
pane::{self, SaveIntent},
searchable::{SearchEvent, SearchableItem},
- DraggedSelection, Pane, Save, ShowConfiguration, ToggleZoom, ToolbarItemEvent,
+ DraggedSelection, Pane, Save, ShowConfiguration, Toast, ToggleZoom, ToolbarItemEvent,
ToolbarItemLocation, ToolbarItemView, Workspace,
};
use workspace::{searchable::SearchableItemHandle, DraggedTab};
@@ -102,6 +108,7 @@ pub fn init(cx: &mut AppContext) {
.register_action(AssistantPanel::inline_assist)
.register_action(ContextEditor::quote_selection)
.register_action(ContextEditor::insert_selection)
+ .register_action(ContextEditor::copy_code)
.register_action(ContextEditor::insert_dragged_files)
.register_action(AssistantPanel::show_configuration)
.register_action(AssistantPanel::create_new_context);
@@ -939,9 +946,16 @@ impl AssistantPanel {
cx: &mut ViewContext,
) {
if let Some(panel) = workspace.panel::(cx) {
- panel.update(cx, |panel, cx| {
- panel.new_context(cx);
- });
+ let did_create_context = panel
+ .update(cx, |panel, cx| {
+ panel.new_context(cx)?;
+
+ Some(())
+ })
+ .is_some();
+ if did_create_context {
+ ContextEditor::quote_selection(workspace, &Default::default(), cx);
+ }
}
}
@@ -1896,7 +1910,22 @@ impl ContextEditor {
cx: &mut ViewContext,
) {
if let Some(command) = SlashCommandRegistry::global(cx).command(name) {
- let output = command.run(arguments, workspace, self.lsp_adapter_delegate.clone(), cx);
+ let context = self.context.read(cx);
+ let sections = context
+ .slash_command_output_sections()
+ .into_iter()
+ .filter(|section| section.is_valid(context.buffer().read(cx)))
+ .cloned()
+ .collect::>();
+ let snapshot = context.buffer().read(cx).snapshot();
+ let output = command.run(
+ arguments,
+ §ions,
+ snapshot,
+ workspace,
+ self.lsp_adapter_delegate.clone(),
+ cx,
+ );
self.context.update(cx, |context, cx| {
context.insert_command_output(
command_range,
@@ -1988,6 +2017,20 @@ impl ContextEditor {
let buffer_row = MultiBufferRow(start.to_point(&buffer).row);
buffer_rows_to_fold.insert(buffer_row);
+ self.context.update(cx, |context, cx| {
+ context.insert_content(
+ Content::ToolUse {
+ range: tool_use.source_range.clone(),
+ tool_use: LanguageModelToolUse {
+ id: tool_use.id.to_string(),
+ name: tool_use.name.clone(),
+ input: tool_use.input.clone(),
+ },
+ },
+ cx,
+ );
+ });
+
Crease::new(
start..end,
placeholder,
@@ -2491,20 +2534,26 @@ impl ContextEditor {
.unwrap();
let buffer_row = MultiBufferRow(start.to_point(&buffer).row);
buffer_rows_to_fold.insert(buffer_row);
- creases.push(Crease::new(
- start..end,
- FoldPlaceholder {
- render: render_fold_icon_button(
- cx.view().downgrade(),
- section.icon,
- section.label.clone(),
- ),
- constrain_width: false,
- merge_adjacent: false,
- },
- render_slash_command_output_toggle,
- |_, _, _| Empty.into_any_element(),
- ));
+ creases.push(
+ Crease::new(
+ start..end,
+ FoldPlaceholder {
+ render: render_fold_icon_button(
+ cx.view().downgrade(),
+ section.icon,
+ section.label.clone(),
+ ),
+ constrain_width: false,
+ merge_adjacent: false,
+ },
+ render_slash_command_output_toggle,
+ |_, _, _| Empty.into_any_element(),
+ )
+ .with_metadata(CreaseMetadata {
+ icon: section.icon,
+ label: section.label,
+ }),
+ );
}
editor.insert_creases(creases, cx);
@@ -2765,9 +2814,8 @@ impl ContextEditor {
} else {
// If there are multiple buffers or suggestion groups, create a multibuffer
let multibuffer = cx.new_model(|cx| {
- let replica_id = project.read(cx).replica_id();
- let mut multibuffer = MultiBuffer::new(replica_id, Capability::ReadWrite)
- .with_title(resolved_step.title.clone());
+ let mut multibuffer =
+ MultiBuffer::new(Capability::ReadWrite).with_title(resolved_step.title.clone());
for (buffer, groups) in &resolved_step.suggestion_groups {
let excerpt_ids = multibuffer.push_excerpts(
buffer.clone(),
@@ -3055,6 +3103,49 @@ impl ContextEditor {
});
}
+ /// Returns either the selected text, or the content of the Markdown code
+ /// block surrounding the cursor.
+ fn get_selection_or_code_block(
+ context_editor_view: &View,
+ cx: &mut ViewContext,
+ ) -> Option<(String, bool)> {
+ const CODE_FENCE_DELIMITER: &'static str = "```";
+
+ let context_editor = context_editor_view.read(cx).editor.read(cx);
+
+ if context_editor.selections.newest::(cx).is_empty() {
+ let snapshot = context_editor.buffer().read(cx).snapshot(cx);
+ let (_, _, snapshot) = snapshot.as_singleton()?;
+
+ let head = context_editor.selections.newest::(cx).head();
+ let offset = snapshot.point_to_offset(head);
+
+ let surrounding_code_block_range = find_surrounding_code_block(snapshot, offset)?;
+ let mut text = snapshot
+ .text_for_range(surrounding_code_block_range)
+ .collect::();
+
+ // If there is no newline trailing the closing three-backticks, then
+ // tree-sitter-md extends the range of the content node to include
+ // the backticks.
+ if text.ends_with(CODE_FENCE_DELIMITER) {
+ text.drain((text.len() - CODE_FENCE_DELIMITER.len())..);
+ }
+
+ (!text.is_empty()).then_some((text, true))
+ } else {
+ let anchor = context_editor.selections.newest_anchor();
+ let text = context_editor
+ .buffer()
+ .read(cx)
+ .read(cx)
+ .text_for_range(anchor.range())
+ .collect::();
+
+ (!text.is_empty()).then_some((text, false))
+ }
+ }
+
fn insert_selection(
workspace: &mut Workspace,
_: &InsertIntoEditor,
@@ -3073,17 +3164,7 @@ impl ContextEditor {
return;
};
- let context_editor = context_editor_view.read(cx).editor.read(cx);
- let anchor = context_editor.selections.newest_anchor();
- let text = context_editor
- .buffer()
- .read(cx)
- .read(cx)
- .text_for_range(anchor.range())
- .collect::();
-
- // If nothing is selected, don't delete the current selection; instead, be a no-op.
- if !text.is_empty() {
+ if let Some((text, _)) = Self::get_selection_or_code_block(&context_editor_view, cx) {
active_editor_view.update(cx, |editor, cx| {
editor.insert(&text, cx);
editor.focus(cx);
@@ -3091,6 +3172,36 @@ impl ContextEditor {
}
}
+ fn copy_code(workspace: &mut Workspace, _: &CopyCode, cx: &mut ViewContext) {
+ let result = maybe!({
+ let panel = workspace.panel::(cx)?;
+ let context_editor_view = panel.read(cx).active_context_editor(cx)?;
+ Self::get_selection_or_code_block(&context_editor_view, cx)
+ });
+ let Some((text, is_code_block)) = result else {
+ return;
+ };
+
+ cx.write_to_clipboard(ClipboardItem::new_string(text));
+
+ struct CopyToClipboardToast;
+ workspace.show_toast(
+ Toast::new(
+ NotificationId::unique::(),
+ format!(
+ "{} copied to clipboard.",
+ if is_code_block {
+ "Code block"
+ } else {
+ "Selection"
+ }
+ ),
+ )
+ .autohide(),
+ cx,
+ );
+ }
+
fn insert_dragged_files(
workspace: &mut Workspace,
action: &InsertDraggedFiles,
@@ -3180,87 +3291,93 @@ impl ContextEditor {
return;
};
- let selection = editor.update(cx, |editor, cx| editor.selections.newest_adjusted(cx));
- let editor = editor.read(cx);
- let buffer = editor.buffer().read(cx).snapshot(cx);
- let range = editor::ToOffset::to_offset(&selection.start, &buffer)
- ..editor::ToOffset::to_offset(&selection.end, &buffer);
- let selected_text = buffer.text_for_range(range.clone()).collect::();
- if selected_text.is_empty() {
- return;
- }
-
- let start_language = buffer.language_at(range.start);
- let end_language = buffer.language_at(range.end);
- let language_name = if start_language == end_language {
- start_language.map(|language| language.code_fence_block_name())
- } else {
- None
- };
- let language_name = language_name.as_deref().unwrap_or("");
-
- let filename = buffer
- .file_at(selection.start)
- .map(|file| file.full_path(cx));
-
- let text = if language_name == "markdown" {
- selected_text
- .lines()
- .map(|line| format!("> {}", line))
- .collect::>()
- .join("\n")
- } else {
- let start_symbols = buffer
- .symbols_containing(selection.start, None)
- .map(|(_, symbols)| symbols);
- let end_symbols = buffer
- .symbols_containing(selection.end, None)
- .map(|(_, symbols)| symbols);
-
- let outline_text =
- if let Some((start_symbols, end_symbols)) = start_symbols.zip(end_symbols) {
- Some(
- start_symbols
- .into_iter()
- .zip(end_symbols)
- .take_while(|(a, b)| a == b)
- .map(|(a, _)| a.text)
- .collect::>()
- .join(" > "),
- )
+ let mut creases = vec![];
+ editor.update(cx, |editor, cx| {
+ let selections = editor.selections.all_adjusted(cx);
+ let buffer = editor.buffer().read(cx).snapshot(cx);
+ for selection in selections {
+ let range = editor::ToOffset::to_offset(&selection.start, &buffer)
+ ..editor::ToOffset::to_offset(&selection.end, &buffer);
+ let selected_text = buffer.text_for_range(range.clone()).collect::();
+ if selected_text.is_empty() {
+ continue;
+ }
+ let start_language = buffer.language_at(range.start);
+ let end_language = buffer.language_at(range.end);
+ let language_name = if start_language == end_language {
+ start_language.map(|language| language.code_fence_block_name())
} else {
None
};
+ let language_name = language_name.as_deref().unwrap_or("");
+ let filename = buffer
+ .file_at(selection.start)
+ .map(|file| file.full_path(cx));
+ let text = if language_name == "markdown" {
+ selected_text
+ .lines()
+ .map(|line| format!("> {}", line))
+ .collect::>()
+ .join("\n")
+ } else {
+ let start_symbols = buffer
+ .symbols_containing(selection.start, None)
+ .map(|(_, symbols)| symbols);
+ let end_symbols = buffer
+ .symbols_containing(selection.end, None)
+ .map(|(_, symbols)| symbols);
- let line_comment_prefix = start_language
- .and_then(|l| l.default_scope().line_comment_prefixes().first().cloned());
+ let outline_text = if let Some((start_symbols, end_symbols)) =
+ start_symbols.zip(end_symbols)
+ {
+ Some(
+ start_symbols
+ .into_iter()
+ .zip(end_symbols)
+ .take_while(|(a, b)| a == b)
+ .map(|(a, _)| a.text)
+ .collect::>()
+ .join(" > "),
+ )
+ } else {
+ None
+ };
- let fence = codeblock_fence_for_path(
- filename.as_deref(),
- Some(selection.start.row..selection.end.row),
- );
+ let line_comment_prefix = start_language
+ .and_then(|l| l.default_scope().line_comment_prefixes().first().cloned());
- if let Some((line_comment_prefix, outline_text)) = line_comment_prefix.zip(outline_text)
- {
- let breadcrumb = format!("{line_comment_prefix}Excerpt from: {outline_text}\n");
- format!("{fence}{breadcrumb}{selected_text}\n```")
- } else {
- format!("{fence}{selected_text}\n```")
+ let fence = codeblock_fence_for_path(
+ filename.as_deref(),
+ Some(selection.start.row..=selection.end.row),
+ );
+
+ if let Some((line_comment_prefix, outline_text)) =
+ line_comment_prefix.zip(outline_text)
+ {
+ let breadcrumb =
+ format!("{line_comment_prefix}Excerpt from: {outline_text}\n");
+ format!("{fence}{breadcrumb}{selected_text}\n```")
+ } else {
+ format!("{fence}{selected_text}\n```")
+ }
+ };
+ let crease_title = if let Some(path) = filename {
+ let start_line = selection.start.row + 1;
+ let end_line = selection.end.row + 1;
+ if start_line == end_line {
+ format!("{}, Line {}", path.display(), start_line)
+ } else {
+ format!("{}, Lines {} to {}", path.display(), start_line, end_line)
+ }
+ } else {
+ "Quoted selection".to_string()
+ };
+ creases.push((text, crease_title));
}
- };
-
- let crease_title = if let Some(path) = filename {
- let start_line = selection.start.row + 1;
- let end_line = selection.end.row + 1;
- if start_line == end_line {
- format!("{}, Line {}", path.display(), start_line)
- } else {
- format!("{}, Lines {} to {}", path.display(), start_line, end_line)
- }
- } else {
- "Quoted selection".to_string()
- };
-
+ });
+ if creases.is_empty() {
+ return;
+ }
// Activate the panel
if !panel.focus_handle(cx).contains_focused(cx) {
workspace.toggle_panel_focus::(cx);
@@ -3277,39 +3394,40 @@ impl ContextEditor {
context.update(cx, |context, cx| {
context.editor.update(cx, |editor, cx| {
editor.insert("\n", cx);
+ for (text, crease_title) in creases {
+ let point = editor.selections.newest::(cx).head();
+ let start_row = MultiBufferRow(point.row);
- let point = editor.selections.newest::(cx).head();
- let start_row = MultiBufferRow(point.row);
+ editor.insert(&text, cx);
- editor.insert(&text, cx);
+ let snapshot = editor.buffer().read(cx).snapshot(cx);
+ let anchor_before = snapshot.anchor_after(point);
+ let anchor_after = editor
+ .selections
+ .newest_anchor()
+ .head()
+ .bias_left(&snapshot);
- let snapshot = editor.buffer().read(cx).snapshot(cx);
- let anchor_before = snapshot.anchor_after(point);
- let anchor_after = editor
- .selections
- .newest_anchor()
- .head()
- .bias_left(&snapshot);
+ editor.insert("\n", cx);
- editor.insert("\n", cx);
-
- let fold_placeholder = quote_selection_fold_placeholder(
- crease_title,
- cx.view().downgrade(),
- );
- let crease = Crease::new(
- anchor_before..anchor_after,
- fold_placeholder,
- render_quote_selection_output_toggle,
- |_, _, _| Empty.into_any(),
- );
- editor.insert_creases(vec![crease], cx);
- editor.fold_at(
- &FoldAt {
- buffer_row: start_row,
- },
- cx,
- );
+ let fold_placeholder = quote_selection_fold_placeholder(
+ crease_title,
+ cx.view().downgrade(),
+ );
+ let crease = Crease::new(
+ anchor_before..anchor_after,
+ fold_placeholder,
+ render_quote_selection_output_toggle,
+ |_, _, _| Empty.into_any(),
+ );
+ editor.insert_creases(vec![crease], cx);
+ editor.fold_at(
+ &FoldAt {
+ buffer_row: start_row,
+ },
+ cx,
+ );
+ }
})
});
};
@@ -3318,39 +3436,115 @@ impl ContextEditor {
}
fn copy(&mut self, _: &editor::actions::Copy, cx: &mut ViewContext) {
- let editor = self.editor.read(cx);
- let context = self.context.read(cx);
- if editor.selections.count() == 1 {
- let selection = editor.selections.newest::(cx);
- let mut copied_text = String::new();
- let mut spanned_messages = 0;
- for message in context.messages(cx) {
- if message.offset_range.start >= selection.range().end {
- break;
- } else if message.offset_range.end >= selection.range().start {
- let range = cmp::max(message.offset_range.start, selection.range().start)
- ..cmp::min(message.offset_range.end, selection.range().end);
- if !range.is_empty() {
- spanned_messages += 1;
- write!(&mut copied_text, "## {}\n\n", message.role).unwrap();
- for chunk in context.buffer().read(cx).text_for_range(range) {
- copied_text.push_str(chunk);
- }
- copied_text.push('\n');
- }
- }
- }
-
- if spanned_messages > 1 {
- cx.write_to_clipboard(ClipboardItem::new_string(copied_text));
- return;
- }
+ if self.editor.read(cx).selections.count() == 1 {
+ let (copied_text, metadata) = self.get_clipboard_contents(cx);
+ cx.write_to_clipboard(ClipboardItem::new_string_with_json_metadata(
+ copied_text,
+ metadata,
+ ));
+ cx.stop_propagation();
+ return;
}
cx.propagate();
}
- fn paste(&mut self, _: &editor::actions::Paste, cx: &mut ViewContext) {
+ fn cut(&mut self, _: &editor::actions::Cut, cx: &mut ViewContext) {
+ if self.editor.read(cx).selections.count() == 1 {
+ let (copied_text, metadata) = self.get_clipboard_contents(cx);
+
+ self.editor.update(cx, |editor, cx| {
+ let selections = editor.selections.all::(cx);
+
+ editor.transact(cx, |this, cx| {
+ this.change_selections(Some(Autoscroll::fit()), cx, |s| {
+ s.select(selections);
+ });
+ this.insert("", cx);
+ cx.write_to_clipboard(ClipboardItem::new_string_with_json_metadata(
+ copied_text,
+ metadata,
+ ));
+ });
+ });
+
+ cx.stop_propagation();
+ return;
+ }
+
+ cx.propagate();
+ }
+
+ fn get_clipboard_contents(&mut self, cx: &mut ViewContext) -> (String, CopyMetadata) {
+ let creases = self.editor.update(cx, |editor, cx| {
+ let selection = editor.selections.newest::(cx);
+ let selection_start = editor.selections.newest::(cx).start;
+ let snapshot = editor.buffer().read(cx).snapshot(cx);
+ editor.display_map.update(cx, |display_map, cx| {
+ display_map
+ .snapshot(cx)
+ .crease_snapshot
+ .creases_in_range(
+ MultiBufferRow(selection.start.row)..MultiBufferRow(selection.end.row + 1),
+ &snapshot,
+ )
+ .filter_map(|crease| {
+ if let Some(metadata) = &crease.metadata {
+ let start = crease
+ .range
+ .start
+ .to_offset(&snapshot)
+ .saturating_sub(selection_start);
+ let end = crease
+ .range
+ .end
+ .to_offset(&snapshot)
+ .saturating_sub(selection_start);
+
+ let range_relative_to_selection = start..end;
+
+ if range_relative_to_selection.is_empty() {
+ None
+ } else {
+ Some(SelectedCreaseMetadata {
+ range_relative_to_selection,
+ crease: metadata.clone(),
+ })
+ }
+ } else {
+ None
+ }
+ })
+ .collect::>()
+ })
+ });
+
+ let context = self.context.read(cx);
+ let selection = self.editor.read(cx).selections.newest::(cx);
+ let mut text = String::new();
+ for message in context.messages(cx) {
+ if message.offset_range.start >= selection.range().end {
+ break;
+ } else if message.offset_range.end >= selection.range().start {
+ let range = cmp::max(message.offset_range.start, selection.range().start)
+ ..cmp::min(message.offset_range.end, selection.range().end);
+ if !range.is_empty() {
+ for chunk in context.buffer().read(cx).text_for_range(range) {
+ text.push_str(chunk);
+ }
+ if message.offset_range.end < selection.range().end {
+ text.push('\n');
+ }
+ }
+ }
+ }
+
+ (text, CopyMetadata { creases })
+ }
+
+ fn paste(&mut self, action: &editor::actions::Paste, cx: &mut ViewContext) {
+ cx.stop_propagation();
+
let images = if let Some(item) = cx.read_from_clipboard() {
item.into_entries()
.filter_map(|entry| {
@@ -3365,9 +3559,62 @@ impl ContextEditor {
Vec::new()
};
+ let metadata = if let Some(item) = cx.read_from_clipboard() {
+ item.entries().first().and_then(|entry| {
+ if let ClipboardEntry::String(text) = entry {
+ text.metadata_json::()
+ } else {
+ None
+ }
+ })
+ } else {
+ None
+ };
+
if images.is_empty() {
- // If we didn't find any valid image data to paste, propagate to let normal pasting happen.
- cx.propagate();
+ self.editor.update(cx, |editor, cx| {
+ let paste_position = editor.selections.newest::(cx).head();
+ editor.paste(action, cx);
+
+ if let Some(metadata) = metadata {
+ let buffer = editor.buffer().read(cx).snapshot(cx);
+
+ let mut buffer_rows_to_fold = BTreeSet::new();
+ let weak_editor = cx.view().downgrade();
+ editor.insert_creases(
+ metadata.creases.into_iter().map(|metadata| {
+ let start = buffer.anchor_after(
+ paste_position + metadata.range_relative_to_selection.start,
+ );
+ let end = buffer.anchor_before(
+ paste_position + metadata.range_relative_to_selection.end,
+ );
+
+ let buffer_row = MultiBufferRow(start.to_point(&buffer).row);
+ buffer_rows_to_fold.insert(buffer_row);
+ Crease::new(
+ start..end,
+ FoldPlaceholder {
+ constrain_width: false,
+ render: render_fold_icon_button(
+ weak_editor.clone(),
+ metadata.crease.icon,
+ metadata.crease.label.clone(),
+ ),
+ merge_adjacent: false,
+ },
+ render_slash_command_output_toggle,
+ |_, _, _| Empty.into_any(),
+ )
+ .with_metadata(metadata.crease.clone())
+ }),
+ cx,
+ );
+ for buffer_row in buffer_rows_to_fold.into_iter().rev() {
+ editor.fold_at(&FoldAt { buffer_row }, cx);
+ }
+ }
+ });
} else {
let mut image_positions = Vec::new();
self.editor.update(cx, |editor, cx| {
@@ -3388,10 +3635,22 @@ impl ContextEditor {
self.context.update(cx, |context, cx| {
for image in images {
+ let Some(render_image) = image.to_image_data(cx).log_err() else {
+ continue;
+ };
let image_id = image.id();
- context.insert_image(image, cx);
+ let image_task = LanguageModelImage::from_image(image, cx).shared();
+
for image_position in image_positions.iter() {
- context.insert_image_anchor(image_id, image_position.text_anchor, cx);
+ context.insert_content(
+ Content::Image {
+ anchor: image_position.text_anchor,
+ image_id,
+ image: image_task.clone(),
+ render_image: render_image.clone(),
+ },
+ cx,
+ );
}
}
});
@@ -3406,11 +3665,23 @@ impl ContextEditor {
let new_blocks = self
.context
.read(cx)
- .images(cx)
- .filter_map(|image| {
+ .contents(cx)
+ .filter_map(|content| {
+ if let Content::Image {
+ anchor,
+ render_image,
+ ..
+ } = content
+ {
+ Some((anchor, render_image))
+ } else {
+ None
+ }
+ })
+ .filter_map(|(anchor, render_image)| {
const MAX_HEIGHT_IN_LINES: u32 = 8;
- let anchor = buffer.anchor_in_excerpt(excerpt_id, image.anchor).unwrap();
- let image = image.render_image.clone();
+ let anchor = buffer.anchor_in_excerpt(excerpt_id, anchor).unwrap();
+ let image = render_image.clone();
anchor.is_valid(&buffer).then(|| BlockProperties {
position: anchor,
height: MAX_HEIGHT_IN_LINES,
@@ -3922,16 +4193,18 @@ impl ContextEditor {
h_flex()
.gap_3()
.child(
- Icon::new(IconName::ExclamationTriangle)
+ Icon::new(IconName::Warning)
.size(IconSize::Small)
.color(Color::Warning),
)
.child(Label::new(label)),
)
.child(
- Button::new("open-configuration", "Open configuration")
+ Button::new("open-configuration", "Configure Providers")
.size(ButtonSize::Compact)
+ .icon(Some(IconName::SlidersVertical))
.icon_size(IconSize::Small)
+ .icon_position(IconPosition::Start)
.style(ButtonStyle::Filled)
.on_click({
let focus_handle = self.focus_handle(cx).clone();
@@ -4010,6 +4283,48 @@ impl ContextEditor {
}
}
+/// Returns the contents of the *outermost* fenced code block that contains the given offset.
+fn find_surrounding_code_block(snapshot: &BufferSnapshot, offset: usize) -> Option> {
+ const CODE_BLOCK_NODE: &'static str = "fenced_code_block";
+ const CODE_BLOCK_CONTENT: &'static str = "code_fence_content";
+
+ let layer = snapshot.syntax_layers().next()?;
+
+ let root_node = layer.node();
+ let mut cursor = root_node.walk();
+
+ // Go to the first child for the given offset
+ while cursor.goto_first_child_for_byte(offset).is_some() {
+ // If we're at the end of the node, go to the next one.
+ // Example: if you have a fenced-code-block, and you're on the start of the line
+ // right after the closing ```, you want to skip the fenced-code-block and
+ // go to the next sibling.
+ if cursor.node().end_byte() == offset {
+ cursor.goto_next_sibling();
+ }
+
+ if cursor.node().start_byte() > offset {
+ break;
+ }
+
+ // We found the fenced code block.
+ if cursor.node().kind() == CODE_BLOCK_NODE {
+ // Now we need to find the child node that contains the code.
+ cursor.goto_first_child();
+ loop {
+ if cursor.node().kind() == CODE_BLOCK_CONTENT {
+ return Some(cursor.node().byte_range());
+ }
+ if !cursor.goto_next_sibling() {
+ break;
+ }
+ }
+ }
+ }
+
+ None
+}
+
fn render_fold_icon_button(
editor: WeakView,
icon: IconName,
@@ -4037,6 +4352,17 @@ fn render_fold_icon_button(
})
}
+#[derive(Debug, Clone, Serialize, Deserialize)]
+struct CopyMetadata {
+ creases: Vec,
+}
+
+#[derive(Debug, Clone, Serialize, Deserialize)]
+struct SelectedCreaseMetadata {
+ range_relative_to_selection: Range,
+ crease: CreaseMetadata,
+}
+
impl EventEmitter for ContextEditor {}
impl EventEmitter for ContextEditor {}
@@ -4062,6 +4388,7 @@ impl Render for ContextEditor {
.capture_action(cx.listener(ContextEditor::cancel))
.capture_action(cx.listener(ContextEditor::save))
.capture_action(cx.listener(ContextEditor::copy))
+ .capture_action(cx.listener(ContextEditor::cut))
.capture_action(cx.listener(ContextEditor::paste))
.capture_action(cx.listener(ContextEditor::cycle_message_role))
.capture_action(cx.listener(ContextEditor::confirm_command))
@@ -4523,6 +4850,20 @@ impl Render for ContextEditorToolbarItem {
let weak_self = cx.view().downgrade();
let right_side = h_flex()
.gap_2()
+ // TODO display this in a nicer way, once we have a design for it.
+ // .children({
+ // let project = self
+ // .workspace
+ // .upgrade()
+ // .map(|workspace| workspace.read(cx).project().downgrade());
+ //
+ // let scan_items_remaining = cx.update_global(|db: &mut SemanticDb, cx| {
+ // project.and_then(|project| db.remaining_summaries(&project, cx))
+ // });
+
+ // scan_items_remaining
+ // .map(|remaining_items| format!("Files to scan: {}", remaining_items))
+ // })
.child(
ModelSelector::new(
self.fs.clone(),
@@ -5021,7 +5362,7 @@ fn quote_selection_fold_placeholder(title: String, editor: WeakView) ->
ButtonLike::new(fold_id)
.style(ButtonStyle::Filled)
.layer(ElevationIndex::ElevatedSurface)
- .child(Icon::new(IconName::TextSelect))
+ .child(Icon::new(IconName::TextSnippet))
.child(Label::new(title.clone()).single_line())
.on_click(move |_, cx| {
editor
@@ -5125,7 +5466,7 @@ fn render_docs_slash_command_trailer(
div()
.id(("latest-error", row.0))
.child(
- Icon::new(IconName::ExclamationTriangle)
+ Icon::new(IconName::Warning)
.size(IconSize::Small)
.color(Color::Warning),
)
@@ -5153,10 +5494,16 @@ fn make_lsp_adapter_delegate(
let worktree = project
.worktrees(cx)
.next()
- .ok_or_else(|| anyhow!("no worktrees when constructing ProjectLspAdapterDelegate"))?;
+ .ok_or_else(|| anyhow!("no worktrees when constructing LocalLspAdapterDelegate"))?;
+ let http_client = project.client().http_client().clone();
project.lsp_store().update(cx, |lsp_store, cx| {
- Ok(ProjectLspAdapterDelegate::new(lsp_store, &worktree, cx)
- as Arc)
+ Ok(LocalLspAdapterDelegate::new(
+ lsp_store,
+ &worktree,
+ http_client,
+ project.fs().clone(),
+ cx,
+ ) as Arc)
})
})
}
@@ -5260,3 +5607,85 @@ fn configuration_error(cx: &AppContext) -> Option {
None
}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use gpui::{AppContext, Context};
+ use language::Buffer;
+ use unindent::Unindent;
+
+ #[gpui::test]
+ fn test_find_code_blocks(cx: &mut AppContext) {
+ let markdown = languages::language("markdown", tree_sitter_md::LANGUAGE.into());
+
+ let buffer = cx.new_model(|cx| {
+ let text = r#"
+ line 0
+ line 1
+ ```rust
+ fn main() {}
+ ```
+ line 5
+ line 6
+ line 7
+ ```go
+ func main() {}
+ ```
+ line 11
+ ```
+ this is plain text code block
+ ```
+
+ ```go
+ func another() {}
+ ```
+ line 19
+ "#
+ .unindent();
+ let mut buffer = Buffer::local(text, cx);
+ buffer.set_language(Some(markdown.clone()), cx);
+ buffer
+ });
+ let snapshot = buffer.read(cx).snapshot();
+
+ let code_blocks = vec![
+ Point::new(3, 0)..Point::new(4, 0),
+ Point::new(9, 0)..Point::new(10, 0),
+ Point::new(13, 0)..Point::new(14, 0),
+ Point::new(17, 0)..Point::new(18, 0),
+ ]
+ .into_iter()
+ .map(|range| snapshot.point_to_offset(range.start)..snapshot.point_to_offset(range.end))
+ .collect::>();
+
+ let expected_results = vec![
+ (0, None),
+ (1, None),
+ (2, Some(code_blocks[0].clone())),
+ (3, Some(code_blocks[0].clone())),
+ (4, Some(code_blocks[0].clone())),
+ (5, None),
+ (6, None),
+ (7, None),
+ (8, Some(code_blocks[1].clone())),
+ (9, Some(code_blocks[1].clone())),
+ (10, Some(code_blocks[1].clone())),
+ (11, None),
+ (12, Some(code_blocks[2].clone())),
+ (13, Some(code_blocks[2].clone())),
+ (14, Some(code_blocks[2].clone())),
+ (15, None),
+ (16, Some(code_blocks[3].clone())),
+ (17, Some(code_blocks[3].clone())),
+ (18, Some(code_blocks[3].clone())),
+ (19, None),
+ ];
+
+ for (row, expected) in expected_results {
+ let offset = snapshot.point_to_offset(Point::new(row, 0));
+ let range = find_surrounding_code_block(&snapshot, offset);
+ assert_eq!(range, expected, "unexpected result on row {:?}", row);
+ }
+ }
+}
diff --git a/crates/assistant/src/assistant_settings.rs b/crates/assistant/src/assistant_settings.rs
index d57c1f19b6..5aa379bae3 100644
--- a/crates/assistant/src/assistant_settings.rs
+++ b/crates/assistant/src/assistant_settings.rs
@@ -59,6 +59,7 @@ pub struct AssistantSettings {
pub default_width: Pixels,
pub default_height: Pixels,
pub default_model: LanguageModelSelection,
+ pub inline_alternatives: Vec,
pub using_outdated_settings_version: bool,
}
@@ -160,12 +161,16 @@ impl AssistantSettingsContent {
.filter_map(|model| match model {
OpenAiModel::Custom {
name,
+ display_name,
max_tokens,
max_output_tokens,
+ max_completion_tokens: None,
} => Some(open_ai::AvailableModel {
name,
+ display_name,
max_tokens,
max_output_tokens,
+ max_completion_tokens: None,
}),
_ => None,
})
@@ -232,6 +237,7 @@ impl AssistantSettingsContent {
})
}
}),
+ inline_alternatives: None,
},
VersionedAssistantSettingsContent::V2(settings) => settings.clone(),
},
@@ -250,6 +256,7 @@ impl AssistantSettingsContent {
.id()
.to_string(),
}),
+ inline_alternatives: None,
},
}
}
@@ -365,6 +372,7 @@ impl Default for VersionedAssistantSettingsContent {
default_width: None,
default_height: None,
default_model: None,
+ inline_alternatives: None,
})
}
}
@@ -393,6 +401,8 @@ pub struct AssistantSettingsContentV2 {
default_height: Option,
/// The default model to use when creating new contexts.
default_model: Option,
+ /// Additional models with which to generate alternatives when performing inline assists.
+ inline_alternatives: Option>,
}
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq)]
@@ -513,10 +523,9 @@ impl Settings for AssistantSettings {
&mut settings.default_height,
value.default_height.map(Into::into),
);
- merge(
- &mut settings.default_model,
- value.default_model.map(Into::into),
- );
+ merge(&mut settings.default_model, value.default_model);
+ merge(&mut settings.inline_alternatives, value.inline_alternatives);
+ // merge(&mut settings.infer_context, value.infer_context); TODO re-enable this once we ship context inference
}
Ok(settings)
@@ -569,6 +578,7 @@ mod tests {
provider: "test-provider".into(),
model: "gpt-99".into(),
}),
+ inline_alternatives: None,
enabled: None,
button: None,
dock: None,
diff --git a/crates/assistant/src/context.rs b/crates/assistant/src/context.rs
index 1bf846369b..4f1f885b33 100644
--- a/crates/assistant/src/context.rs
+++ b/crates/assistant/src/context.rs
@@ -17,28 +17,27 @@ use feature_flags::{FeatureFlag, FeatureFlagAppExt};
use fs::{Fs, RemoveOptions};
use futures::{
future::{self, Shared},
- stream::FuturesUnordered,
FutureExt, StreamExt,
};
use gpui::{
- AppContext, AsyncAppContext, Context as _, EventEmitter, Image, Model, ModelContext,
- RenderImage, SharedString, Subscription, Task,
+ AppContext, AsyncAppContext, Context as _, EventEmitter, Model, ModelContext, RenderImage,
+ SharedString, Subscription, Task,
};
use language::{AnchorRangeExt, Bias, Buffer, LanguageRegistry, OffsetRangeExt, Point, ToOffset};
use language_model::{
LanguageModel, LanguageModelCacheConfiguration, LanguageModelCompletionEvent,
LanguageModelImage, LanguageModelRegistry, LanguageModelRequest, LanguageModelRequestMessage,
- LanguageModelRequestTool, MessageContent, Role, StopReason,
+ LanguageModelRequestTool, LanguageModelToolResult, LanguageModelToolUse, MessageContent, Role,
+ StopReason,
};
use open_ai::Model as OpenAiModel;
-use paths::{context_images_dir, contexts_dir};
+use paths::contexts_dir;
use project::Project;
use serde::{Deserialize, Serialize};
use smallvec::SmallVec;
use std::{
cmp::{self, max, Ordering},
- collections::hash_map,
fmt::Debug,
iter, mem,
ops::Range,
@@ -47,7 +46,7 @@ use std::{
sync::Arc,
time::{Duration, Instant},
};
-use telemetry_events::AssistantKind;
+use telemetry_events::{AssistantKind, AssistantPhase};
use text::BufferSnapshot;
use util::{post_inc, ResultExt, TryFutureExt};
use uuid::Uuid;
@@ -163,6 +162,9 @@ impl ContextOperation {
)?,
icon: section.icon_name.parse()?,
label: section.label.into(),
+ metadata: section
+ .metadata
+ .and_then(|metadata| serde_json::from_str(&metadata).log_err()),
})
})
.collect::>>()?,
@@ -243,6 +245,9 @@ impl ContextOperation {
)),
icon_name: icon_name.to_string(),
label: section.label.to_string(),
+ metadata: section.metadata.as_ref().and_then(|metadata| {
+ serde_json::to_string(metadata).log_err()
+ }),
}
})
.collect(),
@@ -377,23 +382,8 @@ impl MessageMetadata {
}
}
-#[derive(Clone, Debug)]
-pub struct MessageImage {
- image_id: u64,
- image: Shared>>,
-}
-
-impl PartialEq for MessageImage {
- fn eq(&self, other: &Self) -> bool {
- self.image_id == other.image_id
- }
-}
-
-impl Eq for MessageImage {}
-
#[derive(Clone, Debug)]
pub struct Message {
- pub image_offsets: SmallVec<[(usize, MessageImage); 1]>,
pub offset_range: Range,
pub index_range: Range,
pub anchor_range: Range,
@@ -403,60 +393,43 @@ pub struct Message {
pub cache: Option,
}
-impl Message {
- fn to_request_message(&self, buffer: &Buffer) -> Option {
- let mut content = Vec::new();
-
- let mut range_start = self.offset_range.start;
- for (image_offset, message_image) in self.image_offsets.iter() {
- if *image_offset != range_start {
- if let Some(text) = Self::collect_text_content(buffer, range_start..*image_offset) {
- content.push(text);
- }
- }
-
- if let Some(image) = message_image.image.clone().now_or_never().flatten() {
- content.push(language_model::MessageContent::Image(image));
- }
-
- range_start = *image_offset;
- }
-
- if range_start != self.offset_range.end {
- if let Some(text) =
- Self::collect_text_content(buffer, range_start..self.offset_range.end)
- {
- content.push(text);
- }
- }
-
- if content.is_empty() {
- return None;
- }
-
- Some(LanguageModelRequestMessage {
- role: self.role,
- content,
- cache: self.cache.as_ref().map_or(false, |cache| cache.is_anchor),
- })
- }
-
- fn collect_text_content(buffer: &Buffer, range: Range) -> Option {
- let text: String = buffer.text_for_range(range.clone()).collect();
- if text.trim().is_empty() {
- None
- } else {
- Some(MessageContent::Text(text))
- }
- }
+#[derive(Debug, Clone)]
+pub enum Content {
+ Image {
+ anchor: language::Anchor,
+ image_id: u64,
+ render_image: Arc,
+ image: Shared>>,
+ },
+ ToolUse {
+ range: Range,
+ tool_use: LanguageModelToolUse,
+ },
+ ToolResult {
+ range: Range,
+ tool_use_id: Arc,
+ },
}
-#[derive(Clone, Debug)]
-pub struct ImageAnchor {
- pub anchor: language::Anchor,
- pub image_id: u64,
- pub render_image: Arc,
- pub image: Shared>>,
+impl Content {
+ fn range(&self) -> Range {
+ match self {
+ Self::Image { anchor, .. } => *anchor..*anchor,
+ Self::ToolUse { range, .. } | Self::ToolResult { range, .. } => range.clone(),
+ }
+ }
+
+ fn cmp(&self, other: &Self, buffer: &BufferSnapshot) -> Ordering {
+ let self_range = self.range();
+ let other_range = other.range();
+ if self_range.end.cmp(&other_range.start, buffer).is_lt() {
+ Ordering::Less
+ } else if self_range.start.cmp(&other_range.end, buffer).is_gt() {
+ Ordering::Greater
+ } else {
+ Ordering::Equal
+ }
+ }
}
struct PendingCompletion {
@@ -500,8 +473,7 @@ pub struct Context {
slash_command_output_sections: Vec>,
pending_tool_uses_by_id: HashMap, PendingToolUse>,
message_anchors: Vec,
- images: HashMap, Shared>>)>,
- image_anchors: Vec,
+ contents: Vec,
messages_metadata: HashMap,
summary: Option,
pending_summary: Task