diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index ef1570fbf2..6718b91ade 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -7,9 +7,13 @@ on:
- "v[0-9]+.[0-9]+.x"
tags:
- "v*"
+ paths-ignore:
+ - "docs/**"
pull_request:
branches:
- "**"
+ paths-ignore:
+ - "docs/**"
concurrency:
# Allow only one workflow per any non-`main` branch.
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index 13fe0411a0..7d7b564a54 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -20,11 +20,14 @@ jobs:
with:
version: 9
- - run: |
+ - name: Prettier Check on /docs
+ working-directory: ./docs
+ 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
+ - name: Check spelling
+ run: script/check-spelling docs/
diff --git a/Cargo.lock b/Cargo.lock
index 797685fbab..eca04c7508 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -9055,7 +9055,6 @@ dependencies = [
"gpui",
"language",
"log",
- "markdown",
"menu",
"ordered-float 2.10.1",
"picker",
@@ -9218,6 +9217,7 @@ version = "0.1.0"
dependencies = [
"anyhow",
"cargo_toml",
+ "clap",
"client",
"clock",
"env_logger",
@@ -10764,6 +10764,7 @@ dependencies = [
"parking_lot",
"project",
"smol",
+ "sqlformat",
"thread_local",
"util",
"uuid",
@@ -11051,6 +11052,7 @@ dependencies = [
"theme",
"title_bar",
"ui",
+ "ureq_client",
]
[[package]]
@@ -11552,6 +11554,7 @@ dependencies = [
name = "telemetry_events"
version = "0.1.0"
dependencies = [
+ "language",
"semantic_version",
"serde",
]
@@ -14377,6 +14380,7 @@ dependencies = [
"parking_lot",
"postage",
"project",
+ "release_channel",
"remote",
"schemars",
"serde",
@@ -14905,7 +14909,7 @@ dependencies = [
[[package]]
name = "zed_php"
-version = "0.2.0"
+version = "0.2.1"
dependencies = [
"zed_extension_api 0.1.0",
]
@@ -14917,6 +14921,13 @@ dependencies = [
"zed_extension_api 0.1.0",
]
+[[package]]
+name = "zed_proto"
+version = "0.2.0"
+dependencies = [
+ "zed_extension_api 0.1.0",
+]
+
[[package]]
name = "zed_purescript"
version = "0.0.1"
diff --git a/Cargo.toml b/Cargo.toml
index e7f0dd755c..9c6b2ab5ea 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -156,6 +156,7 @@ members = [
"extensions/php",
"extensions/perplexity",
"extensions/prisma",
+ "extensions/proto",
"extensions/purescript",
"extensions/ruff",
"extensions/ruby",
@@ -423,6 +424,7 @@ similar = "1.3"
simplelog = "0.12.2"
smallvec = { version = "1.6", features = ["union"] }
smol = "1.2"
+sqlformat = "0.2"
strsim = "0.11"
strum = { version = "0.25.0", features = ["derive"] }
subtle = "2.5.0"
diff --git a/assets/icons/trash_alt.svg b/assets/icons/trash_alt.svg
new file mode 100644
index 0000000000..6867b42147
--- /dev/null
+++ b/assets/icons/trash_alt.svg
@@ -0,0 +1 @@
+
diff --git a/assets/keymaps/default-macos.json b/assets/keymaps/default-macos.json
index b405ee1852..de929b8dd1 100644
--- a/assets/keymaps/default-macos.json
+++ b/assets/keymaps/default-macos.json
@@ -440,7 +440,12 @@
"cmd-k shift-right": ["workspace::SwapPaneInDirection", "Right"],
"cmd-k shift-up": ["workspace::SwapPaneInDirection", "Up"],
"cmd-k shift-down": ["workspace::SwapPaneInDirection", "Down"],
- "cmd-shift-x": "zed::Extensions",
+ "cmd-shift-x": "zed::Extensions"
+ }
+ },
+ {
+ "context": "Workspace && !Terminal",
+ "bindings": {
"alt-t": "task::Rerun",
"alt-shift-t": "task::Spawn"
}
diff --git a/clippy.toml b/clippy.toml
index 787620d865..8c8da03a26 100644
--- a/clippy.toml
+++ b/clippy.toml
@@ -1 +1,2 @@
allow-private-module-inception = true
+avoid-breaking-exported-api = false
diff --git a/crates/assistant/src/assistant_panel.rs b/crates/assistant/src/assistant_panel.rs
index 1242d5d044..acced4d289 100644
--- a/crates/assistant/src/assistant_panel.rs
+++ b/crates/assistant/src/assistant_panel.rs
@@ -77,7 +77,7 @@ use ui::TintColor;
use ui::{
prelude::*,
utils::{format_distance_from_now, DateTimeType},
- Avatar, AvatarShape, ButtonLike, ContextMenu, Disclosure, ElevationIndex, KeyBinding, ListItem,
+ Avatar, ButtonLike, ContextMenu, Disclosure, ElevationIndex, KeyBinding, ListItem,
ListItemSpacing, PopoverMenu, PopoverMenuHandle, Tooltip,
};
use util::{maybe, ResultExt};
@@ -262,9 +262,7 @@ impl PickerDelegate for SavedContextPickerDelegate {
.gap_2()
.children(if let Some(host_user) = host_user {
vec![
- Avatar::new(host_user.avatar_uri.clone())
- .shape(AvatarShape::Circle)
- .into_any_element(),
+ Avatar::new(host_user.avatar_uri.clone()).into_any_element(),
Label::new(format!("Shared by @{}", host_user.github_login))
.color(Color::Muted)
.size(LabelSize::Small)
diff --git a/crates/assistant/src/context.rs b/crates/assistant/src/context.rs
index 4f1f885b33..c27d17f8c5 100644
--- a/crates/assistant/src/context.rs
+++ b/crates/assistant/src/context.rs
@@ -46,7 +46,7 @@ use std::{
sync::Arc,
time::{Duration, Instant},
};
-use telemetry_events::{AssistantKind, AssistantPhase};
+use telemetry_events::{AssistantEvent, AssistantKind, AssistantPhase};
use text::BufferSnapshot;
use util::{post_inc, ResultExt, TryFutureExt};
use uuid::Uuid;
@@ -549,7 +549,7 @@ impl Context {
cx: &mut ModelContext,
) -> Self {
let buffer = cx.new_model(|_cx| {
- let mut buffer = Buffer::remote(
+ let buffer = Buffer::remote(
language::BufferId::new(1).unwrap(),
replica_id,
capability,
@@ -2133,14 +2133,21 @@ impl Context {
});
if let Some(telemetry) = this.telemetry.as_ref() {
- telemetry.report_assistant_event(
- Some(this.id.0.clone()),
- AssistantKind::Panel,
- AssistantPhase::Response,
- model.telemetry_id(),
+ let language_name = this
+ .buffer
+ .read(cx)
+ .language()
+ .map(|language| language.name());
+ telemetry.report_assistant_event(AssistantEvent {
+ conversation_id: Some(this.id.0.clone()),
+ kind: AssistantKind::Panel,
+ phase: AssistantPhase::Response,
+ model: model.telemetry_id(),
+ model_provider: model.provider_id().to_string(),
response_latency,
error_message,
- );
+ language_name,
+ });
}
if let Ok(stop_reason) = result {
diff --git a/crates/assistant/src/inline_assistant.rs b/crates/assistant/src/inline_assistant.rs
index fac70f233c..b3427271b9 100644
--- a/crates/assistant/src/inline_assistant.rs
+++ b/crates/assistant/src/inline_assistant.rs
@@ -50,6 +50,7 @@ use std::{
task::{self, Poll},
time::{Duration, Instant},
};
+use telemetry_events::{AssistantEvent, AssistantKind, AssistantPhase};
use terminal_view::terminal_panel::TerminalPanel;
use text::{OffsetRangeExt, ToPoint as _};
use theme::ThemeSettings;
@@ -209,18 +210,6 @@ impl InlineAssistant {
initial_prompt: Option,
cx: &mut WindowContext,
) {
- if let Some(telemetry) = self.telemetry.as_ref() {
- if let Some(model) = LanguageModelRegistry::read_global(cx).active_model() {
- telemetry.report_assistant_event(
- None,
- telemetry_events::AssistantKind::Inline,
- telemetry_events::AssistantPhase::Invoked,
- model.telemetry_id(),
- None,
- None,
- );
- }
- }
let snapshot = editor.read(cx).buffer().read(cx).snapshot(cx);
let mut selections = Vec::>::new();
@@ -267,6 +256,21 @@ impl InlineAssistant {
text_anchor: buffer.anchor_after(buffer_range.end),
};
codegen_ranges.push(start..end);
+
+ if let Some(telemetry) = self.telemetry.as_ref() {
+ if let Some(model) = LanguageModelRegistry::read_global(cx).active_model() {
+ telemetry.report_assistant_event(AssistantEvent {
+ conversation_id: None,
+ kind: AssistantKind::Inline,
+ phase: AssistantPhase::Invoked,
+ model: model.telemetry_id(),
+ model_provider: model.provider_id().to_string(),
+ response_latency: None,
+ error_message: None,
+ language_name: buffer.language().map(|language| language.name()),
+ });
+ }
+ }
}
let assist_group_id = self.next_assist_group_id.post_inc();
@@ -761,23 +765,34 @@ impl InlineAssistant {
}
pub fn finish_assist(&mut self, assist_id: InlineAssistId, undo: bool, cx: &mut WindowContext) {
- if let Some(telemetry) = self.telemetry.as_ref() {
- if let Some(model) = LanguageModelRegistry::read_global(cx).active_model() {
- telemetry.report_assistant_event(
- None,
- telemetry_events::AssistantKind::Inline,
- if undo {
- telemetry_events::AssistantPhase::Rejected
- } else {
- telemetry_events::AssistantPhase::Accepted
- },
- model.telemetry_id(),
- None,
- None,
- );
- }
- }
if let Some(assist) = self.assists.get(&assist_id) {
+ if let Some(telemetry) = self.telemetry.as_ref() {
+ if let Some(model) = LanguageModelRegistry::read_global(cx).active_model() {
+ let language_name = assist.editor.upgrade().and_then(|editor| {
+ let multibuffer = editor.read(cx).buffer().read(cx);
+ let ranges = multibuffer.range_to_buffer_ranges(assist.range.clone(), cx);
+ ranges
+ .first()
+ .and_then(|(buffer, _, _)| buffer.read(cx).language())
+ .map(|language| language.name())
+ });
+ telemetry.report_assistant_event(AssistantEvent {
+ conversation_id: None,
+ kind: AssistantKind::Inline,
+ phase: if undo {
+ AssistantPhase::Rejected
+ } else {
+ AssistantPhase::Accepted
+ },
+ model: model.telemetry_id(),
+ model_provider: model.provider_id().to_string(),
+ response_latency: None,
+ error_message: None,
+ language_name,
+ });
+ }
+ }
+
let assist_group_id = assist.group_id;
if self.assist_groups[&assist_group_id].linked {
for assist_id in self.unlink_assist_group(assist_group_id, cx) {
@@ -2706,6 +2721,7 @@ impl CodegenAlternative {
self.edit_position = Some(self.range.start.bias_right(&self.snapshot));
let telemetry_id = model.telemetry_id();
+ let provider_id = model.provider_id();
let chunks: LocalBoxFuture>>> =
if user_prompt.trim().to_lowercase() == "delete" {
async { Ok(stream::empty().boxed()) }.boxed_local()
@@ -2716,7 +2732,7 @@ impl CodegenAlternative {
.spawn(|_, cx| async move { model.stream_completion_text(request, &cx).await });
async move { Ok(chunks.await?.boxed()) }.boxed_local()
};
- self.handle_stream(telemetry_id, chunks, cx);
+ self.handle_stream(telemetry_id, provider_id.to_string(), chunks, cx);
Ok(())
}
@@ -2780,6 +2796,7 @@ impl CodegenAlternative {
pub fn handle_stream(
&mut self,
model_telemetry_id: String,
+ model_provider_id: String,
stream: impl 'static + Future