diff --git a/.github/workflows/release_actions.yml b/.github/workflows/release_actions.yml
index 550eda882b..c1d2457ed4 100644
--- a/.github/workflows/release_actions.yml
+++ b/.github/workflows/release_actions.yml
@@ -6,26 +6,27 @@ jobs:
discord_release:
runs-on: ubuntu-latest
steps:
- - name: Get release URL
- id: get-release-url
- run: |
- if [ "${{ github.event.release.prerelease }}" == "true" ]; then
- URL="https://zed.dev/releases/preview/latest"
- else
- URL="https://zed.dev/releases/stable/latest"
- fi
- echo "::set-output name=URL::$URL"
- - name: Get content
- uses: 2428392/gh-truncate-string-action@v1.2.0
- id: get-content
- with:
- stringToTruncate: |
- 📣 Zed [${{ github.event.release.tag_name }}](${{ steps.get-release-url.outputs.URL }}) was just released!
+ - name: Get release URL
+ id: get-release-url
+ run: |
+ if [ "${{ github.event.release.prerelease }}" == "true" ]; then
+ URL="https://zed.dev/releases/preview/latest"
+ else
+ URL="https://zed.dev/releases/stable/latest"
+ fi
+ echo "::set-output name=URL::$URL"
+ - name: Get content
+ uses: 2428392/gh-truncate-string-action@v1.3.0
+ id: get-content
+ with:
+ stringToTruncate: |
+ 📣 Zed [${{ github.event.release.tag_name }}](${{ steps.get-release-url.outputs.URL }}) was just released!
- ${{ github.event.release.body }}
- maxLength: 2000
- - name: Discord Webhook Action
- uses: tsickert/discord-webhook@v5.3.0
- with:
- webhook-url: ${{ secrets.DISCORD_WEBHOOK_URL }}
- content: ${{ steps.get-content.outputs.string }}
+ ${{ github.event.release.body }}
+ maxLength: 2000
+ truncationSymbol: "..."
+ - name: Discord Webhook Action
+ uses: tsickert/discord-webhook@v5.3.0
+ with:
+ webhook-url: ${{ secrets.DISCORD_WEBHOOK_URL }}
+ content: ${{ steps.get-content.outputs.string }}
diff --git a/Cargo.lock b/Cargo.lock
index d0e7939bb5..7259836f82 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1169,7 +1169,7 @@ dependencies = [
"futures 0.3.28",
"gpui2",
"language2",
- "live_kit_client",
+ "live_kit_client2",
"log",
"media",
"postage",
@@ -1541,13 +1541,12 @@ dependencies = [
"schemars",
"serde",
"serde_derive",
- "settings",
"settings2",
"smol",
"sum_tree",
"sysinfo",
"tempfile",
- "text",
+ "text2",
"thiserror",
"time",
"tiny_http",
@@ -1603,7 +1602,7 @@ dependencies = [
[[package]]
name = "collab"
-version = "0.27.0"
+version = "0.28.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3092,7 +3091,7 @@ dependencies = [
"smol",
"sum_tree",
"tempfile",
- "text",
+ "text2",
"time",
"util",
]
@@ -3384,6 +3383,26 @@ dependencies = [
"url",
]
+[[package]]
+name = "git3"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "async-trait",
+ "clock",
+ "collections",
+ "futures 0.3.28",
+ "git2",
+ "lazy_static",
+ "log",
+ "parking_lot 0.11.2",
+ "smol",
+ "sum_tree",
+ "text2",
+ "unindent",
+ "util",
+]
+
[[package]]
name = "glob"
version = "0.3.1"
@@ -4225,7 +4244,7 @@ dependencies = [
"settings2",
"shellexpand",
"util",
- "workspace",
+ "workspace2",
]
[[package]]
@@ -4358,7 +4377,7 @@ dependencies = [
"env_logger 0.9.3",
"futures 0.3.28",
"fuzzy2",
- "git",
+ "git3",
"globset",
"gpui2",
"indoc",
@@ -4379,7 +4398,7 @@ dependencies = [
"smallvec",
"smol",
"sum_tree",
- "text",
+ "text2",
"theme2",
"tree-sitter",
"tree-sitter-elixir",
@@ -4601,6 +4620,39 @@ dependencies = [
"simplelog",
]
+[[package]]
+name = "live_kit_client2"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "async-broadcast",
+ "async-trait",
+ "block",
+ "byteorder",
+ "bytes 1.5.0",
+ "cocoa",
+ "collections",
+ "core-foundation",
+ "core-graphics",
+ "foreign-types",
+ "futures 0.3.28",
+ "gpui2",
+ "hmac 0.12.1",
+ "jwt",
+ "live_kit_server",
+ "log",
+ "media",
+ "nanoid",
+ "objc",
+ "parking_lot 0.11.2",
+ "postage",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "sha2 0.10.7",
+ "simplelog",
+]
+
[[package]]
name = "live_kit_server"
version = "0.1.0"
@@ -5047,6 +5099,53 @@ dependencies = [
"workspace",
]
+[[package]]
+name = "multi_buffer2"
+version = "0.1.0"
+dependencies = [
+ "aho-corasick",
+ "anyhow",
+ "client2",
+ "clock",
+ "collections",
+ "convert_case 0.6.0",
+ "copilot2",
+ "ctor",
+ "env_logger 0.9.3",
+ "futures 0.3.28",
+ "git3",
+ "gpui2",
+ "indoc",
+ "itertools 0.10.5",
+ "language2",
+ "lazy_static",
+ "log",
+ "lsp2",
+ "ordered-float 2.10.0",
+ "parking_lot 0.11.2",
+ "postage",
+ "project2",
+ "pulldown-cmark",
+ "rand 0.8.5",
+ "rich_text2",
+ "schemars",
+ "serde",
+ "serde_derive",
+ "settings2",
+ "smallvec",
+ "smol",
+ "snippet",
+ "sum_tree",
+ "text2",
+ "theme2",
+ "tree-sitter",
+ "tree-sitter-html",
+ "tree-sitter-rust",
+ "tree-sitter-typescript",
+ "unindent",
+ "util",
+]
+
[[package]]
name = "multimap"
version = "0.8.3"
@@ -6218,8 +6317,8 @@ dependencies = [
"fsevent",
"futures 0.3.28",
"fuzzy2",
- "git",
"git2",
+ "git3",
"globset",
"gpui2",
"ignore",
@@ -6247,7 +6346,7 @@ dependencies = [
"sum_tree",
"tempdir",
"terminal2",
- "text",
+ "text2",
"thiserror",
"toml 0.5.11",
"unindent",
@@ -6878,6 +6977,24 @@ dependencies = [
"util",
]
+[[package]]
+name = "rich_text2"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "collections",
+ "futures 0.3.28",
+ "gpui2",
+ "language2",
+ "lazy_static",
+ "pulldown-cmark",
+ "smallvec",
+ "smol",
+ "sum_tree",
+ "theme2",
+ "util",
+]
+
[[package]]
name = "ring"
version = "0.16.20"
@@ -7493,7 +7610,6 @@ dependencies = [
"collections",
"editor",
"futures 0.3.28",
- "globset",
"gpui",
"language",
"log",
@@ -7746,7 +7862,6 @@ dependencies = [
"anyhow",
"collections",
"feature_flags2",
- "fs",
"fs2",
"futures 0.3.28",
"gpui2",
@@ -8756,6 +8871,29 @@ dependencies = [
"util",
]
+[[package]]
+name = "text2"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "clock",
+ "collections",
+ "ctor",
+ "digest 0.9.0",
+ "env_logger 0.9.3",
+ "gpui2",
+ "lazy_static",
+ "log",
+ "parking_lot 0.11.2",
+ "postage",
+ "rand 0.8.5",
+ "regex",
+ "rope",
+ "smallvec",
+ "sum_tree",
+ "util",
+]
+
[[package]]
name = "textwrap"
version = "0.16.0"
@@ -8785,10 +8923,11 @@ name = "theme2"
version = "0.1.0"
dependencies = [
"anyhow",
- "fs",
+ "fs2",
"gpui2",
"indexmap 1.9.3",
"parking_lot 0.11.2",
+ "refineable",
"schemars",
"serde",
"serde_derive",
@@ -8798,21 +8937,6 @@ dependencies = [
"util",
]
-[[package]]
-name = "theme_converter"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "clap 4.4.4",
- "convert_case 0.6.0",
- "gpui2",
- "log",
- "rust-embed",
- "serde",
- "simplelog",
- "theme2",
-]
-
[[package]]
name = "theme_selector"
version = "0.1.0"
@@ -9630,6 +9754,7 @@ dependencies = [
"itertools 0.11.0",
"rand 0.8.5",
"serde",
+ "settings2",
"smallvec",
"strum",
"theme2",
@@ -9791,6 +9916,7 @@ dependencies = [
"dirs 3.0.2",
"futures 0.3.28",
"git2",
+ "globset",
"isahc",
"lazy_static",
"log",
@@ -10752,6 +10878,44 @@ dependencies = [
"text",
]
+[[package]]
+name = "workspace2"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "async-recursion 1.0.5",
+ "bincode",
+ "call2",
+ "client2",
+ "collections",
+ "db2",
+ "env_logger 0.9.3",
+ "fs2",
+ "futures 0.3.28",
+ "gpui2",
+ "indoc",
+ "install_cli2",
+ "itertools 0.10.5",
+ "language2",
+ "lazy_static",
+ "log",
+ "node_runtime",
+ "parking_lot 0.11.2",
+ "postage",
+ "project2",
+ "schemars",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "settings2",
+ "smallvec",
+ "terminal2",
+ "theme2",
+ "ui2",
+ "util",
+ "uuid 1.4.1",
+]
+
[[package]]
name = "ws2_32-sys"
version = "0.2.1"
@@ -10832,7 +10996,7 @@ dependencies = [
[[package]]
name = "zed"
-version = "0.111.0"
+version = "0.112.0"
dependencies = [
"activity_indicator",
"ai",
@@ -11029,7 +11193,7 @@ dependencies = [
"smol",
"sum_tree",
"tempdir",
- "text",
+ "text2",
"theme2",
"thiserror",
"tiny_http",
@@ -11067,6 +11231,7 @@ dependencies = [
"urlencoding",
"util",
"uuid 1.4.1",
+ "workspace2",
]
[[package]]
diff --git a/Cargo.toml b/Cargo.toml
index b41eef1338..be9deba5ed 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -62,6 +62,7 @@ members = [
"crates/menu",
"crates/menu2",
"crates/multi_buffer",
+ "crates/multi_buffer2",
"crates/node_runtime",
"crates/notifications",
"crates/outline",
@@ -94,14 +95,13 @@ members = [
"crates/text",
"crates/theme",
"crates/theme2",
- "crates/theme_converter",
"crates/theme_selector",
"crates/ui2",
"crates/util",
"crates/semantic_index",
"crates/vim",
"crates/vcs_menu",
- "crates/workspace",
+ "crates/workspace2",
"crates/welcome",
"crates/xtask",
"crates/zed",
diff --git a/assets/icons/at-sign.svg b/assets/icons/at-sign.svg
new file mode 100644
index 0000000000..5adac38f62
--- /dev/null
+++ b/assets/icons/at-sign.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/bell-off.svg b/assets/icons/bell-off.svg
new file mode 100644
index 0000000000..db1021f2d3
--- /dev/null
+++ b/assets/icons/bell-off.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/bell-ring.svg b/assets/icons/bell-ring.svg
new file mode 100644
index 0000000000..da51fdc5be
--- /dev/null
+++ b/assets/icons/bell-ring.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/bell.svg b/assets/icons/bell.svg
index ea1c6dd42e..4c7d5472db 100644
--- a/assets/icons/bell.svg
+++ b/assets/icons/bell.svg
@@ -1,8 +1 @@
-
+
\ No newline at end of file
diff --git a/assets/icons/mail-open.svg b/assets/icons/mail-open.svg
new file mode 100644
index 0000000000..b63915bd73
--- /dev/null
+++ b/assets/icons/mail-open.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/crates/ai/src/test.rs b/crates/ai/src/test.rs
index d4165f3cca..3f331da117 100644
--- a/crates/ai/src/test.rs
+++ b/crates/ai/src/test.rs
@@ -153,10 +153,17 @@ impl FakeCompletionProvider {
pub fn send_completion(&self, completion: impl Into) {
let mut tx = self.last_completion_tx.lock();
- tx.as_mut().unwrap().try_send(completion.into()).unwrap();
+
+ println!("COMPLETION TX: {:?}", &tx);
+
+ let a = tx.as_mut().unwrap();
+ a.try_send(completion.into()).unwrap();
+
+ // tx.as_mut().unwrap().try_send(completion.into()).unwrap();
}
pub fn finish_completion(&self) {
+ println!("FINISHING COMPLETION");
self.last_completion_tx.lock().take().unwrap();
}
}
@@ -181,8 +188,10 @@ impl CompletionProvider for FakeCompletionProvider {
&self,
_prompt: Box,
) -> BoxFuture<'static, anyhow::Result>>> {
+ println!("COMPLETING");
let (tx, rx) = mpsc::channel(1);
*self.last_completion_tx.lock() = Some(tx);
+ println!("TX: {:?}", *self.last_completion_tx.lock());
async move { Ok(rx.map(|rx| Ok(rx)).boxed()) }.boxed()
}
fn box_clone(&self) -> Box {
diff --git a/crates/ai2/Cargo.toml b/crates/ai2/Cargo.toml
index 4f06840e8e..aee265db6e 100644
--- a/crates/ai2/Cargo.toml
+++ b/crates/ai2/Cargo.toml
@@ -12,9 +12,9 @@ doctest = false
test-support = []
[dependencies]
-gpui2 = { path = "../gpui2" }
+gpui = { package = "gpui2", path = "../gpui2" }
util = { path = "../util" }
-language2 = { path = "../language2" }
+language = { package = "language2", path = "../language2" }
async-trait.workspace = true
anyhow.workspace = true
futures.workspace = true
@@ -35,4 +35,4 @@ rusqlite = { version = "0.29.0", features = ["blob", "array", "modern_sqlite"] }
bincode = "1.3.3"
[dev-dependencies]
-gpui2 = { path = "../gpui2", features = ["test-support"] }
+gpui = { package = "gpui2", path = "../gpui2", features = ["test-support"] }
diff --git a/crates/ai2/src/auth.rs b/crates/ai2/src/auth.rs
index e4670bb449..baa1fe7b83 100644
--- a/crates/ai2/src/auth.rs
+++ b/crates/ai2/src/auth.rs
@@ -1,5 +1,4 @@
-use async_trait::async_trait;
-use gpui2::AppContext;
+use gpui::AppContext;
#[derive(Clone, Debug)]
pub enum ProviderCredential {
@@ -8,10 +7,9 @@ pub enum ProviderCredential {
NotNeeded,
}
-#[async_trait]
-pub trait CredentialProvider: Send + Sync {
+pub trait CredentialProvider {
fn has_credentials(&self) -> bool;
- async fn retrieve_credentials(&self, cx: &mut AppContext) -> ProviderCredential;
- async fn save_credentials(&self, cx: &mut AppContext, credential: ProviderCredential);
- async fn delete_credentials(&self, cx: &mut AppContext);
+ fn retrieve_credentials(&self, cx: &mut AppContext) -> ProviderCredential;
+ fn save_credentials(&self, cx: &mut AppContext, credential: ProviderCredential);
+ fn delete_credentials(&self, cx: &mut AppContext);
}
diff --git a/crates/ai2/src/embedding.rs b/crates/ai2/src/embedding.rs
index 7ea4786178..6768b7ce7b 100644
--- a/crates/ai2/src/embedding.rs
+++ b/crates/ai2/src/embedding.rs
@@ -81,7 +81,7 @@ mod tests {
use super::*;
use rand::prelude::*;
- #[gpui2::test]
+ #[gpui::test]
fn test_similarity(mut rng: StdRng) {
assert_eq!(
Embedding::from(vec![1., 0., 0., 0., 0.])
diff --git a/crates/ai2/src/prompts/base.rs b/crates/ai2/src/prompts/base.rs
index 29091d0f5b..75bad00154 100644
--- a/crates/ai2/src/prompts/base.rs
+++ b/crates/ai2/src/prompts/base.rs
@@ -2,7 +2,7 @@ use std::cmp::Reverse;
use std::ops::Range;
use std::sync::Arc;
-use language2::BufferSnapshot;
+use language::BufferSnapshot;
use util::ResultExt;
use crate::models::LanguageModel;
diff --git a/crates/ai2/src/prompts/file_context.rs b/crates/ai2/src/prompts/file_context.rs
index 4a741beb24..f108a62f6f 100644
--- a/crates/ai2/src/prompts/file_context.rs
+++ b/crates/ai2/src/prompts/file_context.rs
@@ -1,6 +1,6 @@
use anyhow::anyhow;
-use language2::BufferSnapshot;
-use language2::ToOffset;
+use language::BufferSnapshot;
+use language::ToOffset;
use crate::models::LanguageModel;
use crate::models::TruncationDirection;
diff --git a/crates/ai2/src/prompts/repository_context.rs b/crates/ai2/src/prompts/repository_context.rs
index 1bb75de7d2..0d831c2cb2 100644
--- a/crates/ai2/src/prompts/repository_context.rs
+++ b/crates/ai2/src/prompts/repository_context.rs
@@ -2,8 +2,8 @@ use crate::prompts::base::{PromptArguments, PromptTemplate};
use std::fmt::Write;
use std::{ops::Range, path::PathBuf};
-use gpui2::{AsyncAppContext, Model};
-use language2::{Anchor, Buffer};
+use gpui::{AsyncAppContext, Model};
+use language::{Anchor, Buffer};
#[derive(Clone)]
pub struct PromptCodeSnippet {
diff --git a/crates/ai2/src/providers/open_ai/completion.rs b/crates/ai2/src/providers/open_ai/completion.rs
index eca5611027..3e49fc5290 100644
--- a/crates/ai2/src/providers/open_ai/completion.rs
+++ b/crates/ai2/src/providers/open_ai/completion.rs
@@ -1,10 +1,9 @@
use anyhow::{anyhow, Result};
-use async_trait::async_trait;
use futures::{
future::BoxFuture, io::BufReader, stream::BoxStream, AsyncBufReadExt, AsyncReadExt, FutureExt,
Stream, StreamExt,
};
-use gpui2::{AppContext, Executor};
+use gpui::{AppContext, BackgroundExecutor};
use isahc::{http::StatusCode, Request, RequestExt};
use parking_lot::RwLock;
use serde::{Deserialize, Serialize};
@@ -105,7 +104,7 @@ pub struct OpenAIResponseStreamEvent {
pub async fn stream_completion(
credential: ProviderCredential,
- executor: Arc,
+ executor: Arc,
request: Box,
) -> Result>> {
let api_key = match credential {
@@ -198,11 +197,11 @@ pub async fn stream_completion(
pub struct OpenAICompletionProvider {
model: OpenAILanguageModel,
credential: Arc>,
- executor: Arc,
+ executor: Arc,
}
impl OpenAICompletionProvider {
- pub fn new(model_name: &str, executor: Arc) -> Self {
+ pub fn new(model_name: &str, executor: Arc) -> Self {
let model = OpenAILanguageModel::load(model_name);
let credential = Arc::new(RwLock::new(ProviderCredential::NoCredentials));
Self {
@@ -213,7 +212,6 @@ impl OpenAICompletionProvider {
}
}
-#[async_trait]
impl CredentialProvider for OpenAICompletionProvider {
fn has_credentials(&self) -> bool {
match *self.credential.read() {
@@ -221,52 +219,45 @@ impl CredentialProvider for OpenAICompletionProvider {
_ => false,
}
}
- async fn retrieve_credentials(&self, cx: &mut AppContext) -> ProviderCredential {
+
+ fn retrieve_credentials(&self, cx: &mut AppContext) -> ProviderCredential {
let existing_credential = self.credential.read().clone();
-
- let retrieved_credential = cx
- .run_on_main(move |cx| match existing_credential {
- ProviderCredential::Credentials { .. } => {
- return existing_credential.clone();
- }
- _ => {
- if let Some(api_key) = env::var("OPENAI_API_KEY").log_err() {
- return ProviderCredential::Credentials { api_key };
- }
-
- if let Some(Some((_, api_key))) = cx.read_credentials(OPENAI_API_URL).log_err()
- {
- if let Some(api_key) = String::from_utf8(api_key).log_err() {
- return ProviderCredential::Credentials { api_key };
- } else {
- return ProviderCredential::NoCredentials;
- }
+ let retrieved_credential = match existing_credential {
+ ProviderCredential::Credentials { .. } => existing_credential.clone(),
+ _ => {
+ if let Some(api_key) = env::var("OPENAI_API_KEY").log_err() {
+ ProviderCredential::Credentials { api_key }
+ } else if let Some(Some((_, api_key))) =
+ cx.read_credentials(OPENAI_API_URL).log_err()
+ {
+ if let Some(api_key) = String::from_utf8(api_key).log_err() {
+ ProviderCredential::Credentials { api_key }
} else {
- return ProviderCredential::NoCredentials;
+ ProviderCredential::NoCredentials
}
+ } else {
+ ProviderCredential::NoCredentials
}
- })
- .await;
-
+ }
+ };
*self.credential.write() = retrieved_credential.clone();
retrieved_credential
}
- async fn save_credentials(&self, cx: &mut AppContext, credential: ProviderCredential) {
+ fn save_credentials(&self, cx: &mut AppContext, credential: ProviderCredential) {
*self.credential.write() = credential.clone();
let credential = credential.clone();
- cx.run_on_main(move |cx| match credential {
+ match credential {
ProviderCredential::Credentials { api_key } => {
cx.write_credentials(OPENAI_API_URL, "Bearer", api_key.as_bytes())
.log_err();
}
_ => {}
- })
- .await;
+ }
}
- async fn delete_credentials(&self, cx: &mut AppContext) {
- cx.run_on_main(move |cx| cx.delete_credentials(OPENAI_API_URL).log_err())
- .await;
+
+ fn delete_credentials(&self, cx: &mut AppContext) {
+ cx.delete_credentials(OPENAI_API_URL).log_err();
*self.credential.write() = ProviderCredential::NoCredentials;
}
}
diff --git a/crates/ai2/src/providers/open_ai/embedding.rs b/crates/ai2/src/providers/open_ai/embedding.rs
index fc49c15134..8f62c8dc0d 100644
--- a/crates/ai2/src/providers/open_ai/embedding.rs
+++ b/crates/ai2/src/providers/open_ai/embedding.rs
@@ -1,8 +1,8 @@
use anyhow::{anyhow, Result};
use async_trait::async_trait;
use futures::AsyncReadExt;
-use gpui2::Executor;
-use gpui2::{serde_json, AppContext};
+use gpui::BackgroundExecutor;
+use gpui::{serde_json, AppContext};
use isahc::http::StatusCode;
use isahc::prelude::Configurable;
use isahc::{AsyncBody, Response};
@@ -35,7 +35,7 @@ pub struct OpenAIEmbeddingProvider {
model: OpenAILanguageModel,
credential: Arc>,
pub client: Arc,
- pub executor: Arc,
+ pub executor: Arc,
rate_limit_count_rx: watch::Receiver