Merge gpui::Task and scheduler::Task

Conrad Irwin created

Change summary

crates/agent/src/agent.rs                                                    |  2 
crates/agent/src/edit_agent/evals/fixtures/disable_cursor_blinking/before.rs |  2 
crates/agent/src/thread_store.rs                                             |  2 
crates/agent/src/tools/evals/fixtures/disable_cursor_blinking/before.rs      |  2 
crates/agent_ui/src/agent_configuration.rs                                   |  2 
crates/agent_ui/src/agent_configuration/add_llm_provider_modal.rs            |  2 
crates/agent_ui/src/agent_configuration/configure_context_server_modal.rs    |  3 
crates/agent_ui/src/agent_diff.rs                                            |  2 
crates/agent_ui/src/conversation_view.rs                                     |  2 
crates/agent_ui/src/conversation_view/thread_view.rs                         |  2 
crates/agent_ui/src/inline_assistant.rs                                      |  4 
crates/agent_ui/src/message_editor.rs                                        |  2 
crates/agent_ui/src/model_selector.rs                                        |  2 
crates/agent_ui/src/thread_branch_picker.rs                                  |  2 
crates/agent_ui/src/thread_history_view.rs                                   |  2 
crates/agent_ui/src/thread_import.rs                                         |  2 
crates/agent_ui/src/thread_metadata_store.rs                                 |  2 
crates/agent_ui/src/threads_archive_view.rs                                  |  3 
crates/agent_ui/src/ui/mention_crease.rs                                     |  3 
crates/ai_onboarding/src/ai_onboarding.rs                                    |  2 
crates/auto_update/src/auto_update.rs                                        |  4 
crates/auto_update_ui/src/auto_update_ui.rs                                  |  3 
crates/call/src/call_impl/mod.rs                                             |  2 
crates/call/src/call_impl/room.rs                                            |  2 
crates/client/src/client.rs                                                  |  2 
crates/client/src/llm_token.rs                                               |  1 
crates/client/src/user.rs                                                    |  3 
crates/collab/tests/integration/random_project_collaboration_tests.rs        |  2 
crates/collab_ui/src/collab_panel.rs                                         |  4 
crates/collab_ui/src/collab_panel/channel_modal.rs                           |  3 
crates/collab_ui/src/notifications/incoming_call_notification.rs             |  2 
crates/collab_ui/src/notifications/project_shared_notification.rs            |  2 
crates/command_palette/src/command_palette.rs                                |  2 
crates/copilot/src/copilot_edit_prediction_delegate.rs                       |  2 
crates/copilot_chat/src/copilot_chat.rs                                      |  2 
crates/copilot_ui/src/sign_in.rs                                             |  2 
crates/debugger_tools/src/dap_log.rs                                         |  3 
crates/debugger_ui/src/attach_modal.rs                                       |  2 
crates/debugger_ui/src/debugger_panel.rs                                     |  2 
crates/debugger_ui/src/debugger_ui.rs                                        |  2 
crates/debugger_ui/src/new_process_modal.rs                                  |  2 
crates/debugger_ui/src/session/running.rs                                    |  2 
crates/debugger_ui/src/session/running/stack_frame_list.rs                   |  2 
crates/debugger_ui/src/session/running/variable_list.rs                      |  5 
crates/diagnostics/src/buffer_diagnostics.rs                                 |  2 
crates/edit_prediction/src/edit_prediction.rs                                |  2 
crates/edit_prediction/src/mercury.rs                                        |  2 
crates/edit_prediction/src/ollama.rs                                         |  2 
crates/edit_prediction/src/zeta.rs                                           |  2 
crates/edit_prediction_context/src/edit_prediction_context.rs                |  4 
crates/edit_prediction_ui/src/edit_prediction_button.rs                      |  2 
crates/edit_prediction_ui/src/edit_prediction_ui.rs                          |  1 
crates/editor/src/clangd_ext.rs                                              |  2 
crates/editor/src/code_context_menus.rs                                      |  4 
crates/editor/src/editor.rs                                                  |  6 
crates/editor/src/editor_tests.rs                                            |  2 
crates/editor/src/element.rs                                                 |  7 
crates/editor/src/hover_popover.rs                                           |  4 
crates/editor/src/rust_analyzer_ext.rs                                       |  2 
crates/extension_host/src/extension_host.rs                                  |  4 
crates/extension_host/src/extension_store_test.rs                            |  2 
crates/extensions_ui/src/extensions_ui.rs                                    |  2 
crates/file_finder/src/file_finder.rs                                        |  4 
crates/git_ui/src/branch_picker.rs                                           |  2 
crates/git_ui/src/git_panel.rs                                               |  2 
crates/git_ui/src/stash_picker.rs                                            |  2 
crates/git_ui/src/worktree_picker.rs                                         |  2 
crates/gpui/src/executor.rs                                                  | 86 
crates/gpui/src/prelude.rs                                                   |  2 
crates/gpui_util/src/lib.rs                                                  |  1 
crates/inspector_ui/src/inspector.rs                                         |  2 
crates/journal/src/journal.rs                                                |  2 
crates/keymap_editor/src/keymap_editor.rs                                    |  4 
crates/language_models/src/provider/anthropic.rs                             |  2 
crates/language_models/src/provider/bedrock.rs                               |  3 
crates/language_models/src/provider/cloud.rs                                 |  2 
crates/language_models/src/provider/deepseek.rs                              |  2 
crates/language_models/src/provider/google.rs                                |  2 
crates/language_models/src/provider/lmstudio.rs                              |  2 
crates/language_models/src/provider/mistral.rs                               |  2 
crates/language_models/src/provider/ollama.rs                                |  2 
crates/language_models/src/provider/open_ai.rs                               |  2 
crates/language_models/src/provider/open_ai_compatible.rs                    |  2 
crates/language_models/src/provider/open_router.rs                           |  2 
crates/language_models/src/provider/opencode.rs                              |  2 
crates/language_models/src/provider/vercel.rs                                |  2 
crates/language_models/src/provider/vercel_ai_gateway.rs                     |  2 
crates/language_models/src/provider/x_ai.rs                                  |  2 
crates/language_selector/src/language_selector.rs                            |  2 
crates/language_tools/src/lsp_button.rs                                      |  2 
crates/onboarding/src/basics_page.rs                                         |  2 
crates/outline_panel/src/outline_panel.rs                                    |  2 
crates/project/src/agent_registry_store.rs                                   |  2 
crates/project/src/agent_server_store.rs                                     |  2 
crates/project/src/buffer_store.rs                                           |  3 
crates/project/src/context_server_store.rs                                   |  4 
crates/project/src/debugger/dap_store.rs                                     |  2 
crates/project/src/debugger/session.rs                                       |  2 
crates/project/src/git_store.rs                                              |  2 
crates/project/src/lsp_command.rs                                            |  2 
crates/project/src/lsp_store.rs                                              |  2 
crates/project/src/lsp_store/log_store.rs                                    |  4 
crates/project/src/project.rs                                                |  2 
crates/project/src/worktree_store.rs                                         |  2 
crates/project_benchmarks/src/main.rs                                        |  1 
crates/project_panel/src/project_panel.rs                                    |  2 
crates/project_symbols/src/project_symbols.rs                                |  4 
crates/recent_projects/src/recent_projects.rs                                |  2 
crates/recent_projects/src/remote_servers.rs                                 |  2 
crates/recent_projects/src/sidebar_recent_projects.rs                        |  2 
crates/remote/src/remote_client.rs                                           |  2 
crates/remote_server/src/headless_project.rs                                 |  2 
crates/repl/src/repl_sessions_ui.rs                                          |  2 
crates/repl/src/repl_store.rs                                                |  4 
crates/rules_library/src/rules_library.rs                                    |  2 
crates/search/src/buffer_search.rs                                           |  2 
crates/search/src/project_search.rs                                          |  3 
crates/settings_ui/src/pages/edit_prediction_provider_setup.rs               |  2 
crates/snippets_ui/src/snippets_ui.rs                                        |  2 
crates/tab_switcher/src/tab_switcher.rs                                      |  2 
crates/task/src/static_source.rs                                             |  2 
crates/tasks_ui/src/tasks_ui.rs                                              |  2 
crates/terminal_view/src/terminal_panel.rs                                   |  4 
crates/terminal_view/src/terminal_path_like_target.rs                        |  2 
crates/terminal_view/src/terminal_view.rs                                    |  4 
crates/title_bar/src/collab.rs                                               |  4 
crates/title_bar/src/onboarding_banner.rs                                    |  2 
crates/title_bar/src/title_bar.rs                                            |  2 
crates/ui/src/components/context_menu.rs                                     |  2 
crates/vim/src/command.rs                                                    |  3 
crates/vim/src/helix.rs                                                      |  2 
crates/vim/src/normal.rs                                                     |  2 
crates/vim/src/normal/mark.rs                                                |  2 
crates/vim/src/normal/search.rs                                              |  2 
crates/vim/src/state.rs                                                      |  3 
crates/workspace/src/item.rs                                                 |  2 
crates/workspace/src/multi_workspace.rs                                      |  4 
crates/workspace/src/pane.rs                                                 |  4 
crates/workspace/src/persistence.rs                                          |  2 
crates/workspace/src/tasks.rs                                                |  2 
crates/workspace/src/welcome.rs                                              |  4 
crates/workspace/src/workspace.rs                                            |  4 
crates/zed/src/main.rs                                                       |  4 
crates/zed/src/reliability.rs                                                |  2 
crates/zed/src/zed.rs                                                        |  2 
crates/zed/src/zed/open_listener.rs                                          |  2 
crates/zed/src/zed/quick_action_bar/repl_menu.rs                             |  2 
crates/zed/src/zed/remote_debug.rs                                           |  1 
148 files changed, 206 insertions(+), 235 deletions(-)

Detailed changes

crates/agent/src/agent.rs 🔗

@@ -38,7 +38,7 @@ use futures::future::Shared;
 use futures::{FutureExt as _, StreamExt as _, future};
 use gpui::{
     App, AppContext, AsyncApp, Context, Entity, EntityId, SharedString, Subscription, Task,
-    WeakEntity,
+    TaskExt, WeakEntity,
 };
 use language_model::{IconOrSvg, LanguageModel, LanguageModelProvider, LanguageModelRegistry};
 use project::{AgentId, Project, ProjectItem, ProjectPath, Worktree};

crates/agent/src/edit_agent/evals/fixtures/disable_cursor_blinking/before.rs 🔗

@@ -85,7 +85,7 @@ use code_context_menus::{
     CompletionsMenu, ContextMenuOrigin,
 };
 use git::blame::{GitBlame, GlobalBlameRenderer};
-use gpui::{
+use gpui::{GpuiTaskExt, 
     Action, Animation, AnimationExt, AnyElement, App, AppContext, AsyncWindowContext,
     AvailableSpace, Background, Bounds, ClickEvent, ClipboardEntry, ClipboardItem, Context,
     DispatchPhase, Edges, Entity, EntityInputHandler, EventEmitter, FocusHandle, FocusOutEvent,

crates/agent/src/thread_store.rs 🔗

@@ -1,7 +1,7 @@
 use crate::{DbThread, DbThreadMetadata, ThreadsDatabase};
 use agent_client_protocol as acp;
 use anyhow::{Result, anyhow};
-use gpui::{App, Context, Entity, Global, Task, prelude::*};
+use gpui::{App, Context, Entity, Global, Task, TaskExt, prelude::*};
 use util::path_list::PathList;
 
 struct GlobalThreadStore(Entity<ThreadStore>);

crates/agent/src/tools/evals/fixtures/disable_cursor_blinking/before.rs 🔗

@@ -85,7 +85,7 @@ use code_context_menus::{
     CompletionsMenu, ContextMenuOrigin,
 };
 use git::blame::{GitBlame, GlobalBlameRenderer};
-use gpui::{
+use gpui::{GpuiTaskExt, 
     Action, Animation, AnimationExt, AnyElement, App, AppContext, AsyncWindowContext,
     AvailableSpace, Background, Bounds, ClickEvent, ClipboardEntry, ClipboardItem, Context,
     DispatchPhase, Edges, Entity, EntityInputHandler, EventEmitter, FocusHandle, FocusOutEvent,

crates/agent_ui/src/agent_configuration.rs 🔗

@@ -17,7 +17,7 @@ use extension_host::ExtensionStore;
 use fs::Fs;
 use gpui::{
     Action, AnyView, App, AsyncWindowContext, Corner, Entity, EventEmitter, FocusHandle, Focusable,
-    ScrollHandle, Subscription, Task, WeakEntity,
+    ScrollHandle, Subscription, Task, TaskExt, WeakEntity,
 };
 use itertools::Itertools;
 use language::LanguageRegistry;

crates/agent_ui/src/agent_configuration/add_llm_provider_modal.rs 🔗

@@ -4,7 +4,7 @@ use anyhow::Result;
 use collections::HashSet;
 use fs::Fs;
 use gpui::{
-    DismissEvent, Entity, EventEmitter, FocusHandle, Focusable, Render, ScrollHandle, Task,
+    DismissEvent, Entity, EventEmitter, FocusHandle, Focusable, Render, ScrollHandle, Task, TaskExt,
 };
 use language_model::LanguageModelRegistry;
 use language_models::provider::open_ai_compatible::{AvailableModel, ModelCapabilities};

crates/agent_ui/src/agent_configuration/configure_context_server_modal.rs 🔗

@@ -5,7 +5,8 @@ use editor::{Editor, EditorElement, EditorStyle};
 
 use gpui::{
     AsyncWindowContext, DismissEvent, Entity, EventEmitter, FocusHandle, Focusable, ScrollHandle,
-    Subscription, Task, TextStyle, TextStyleRefinement, UnderlineStyle, WeakEntity, prelude::*,
+    Subscription, Task, TaskExt, TextStyle, TextStyleRefinement, UnderlineStyle, WeakEntity,
+    prelude::*,
 };
 use language::{Language, LanguageRegistry};
 use markdown::{Markdown, MarkdownElement, MarkdownStyle};

crates/agent_ui/src/agent_diff.rs 🔗

@@ -15,7 +15,7 @@ use editor::{
 
 use gpui::{
     Action, AnyElement, App, AppContext, Empty, Entity, EventEmitter, FocusHandle, Focusable,
-    Global, SharedString, Subscription, Task, WeakEntity, Window, prelude::*,
+    Global, SharedString, Subscription, Task, TaskExt, WeakEntity, Window, prelude::*,
 };
 
 use language::{Buffer, Capability, OffsetRangeExt, Point};

crates/agent_ui/src/conversation_view.rs 🔗

@@ -32,7 +32,7 @@ use futures::FutureExt as _;
 use gpui::{
     Action, Animation, AnimationExt, AnyView, App, ClickEvent, ClipboardItem, CursorStyle,
     ElementId, Empty, Entity, EventEmitter, FocusHandle, Focusable, Hsla, ListOffset, ListState,
-    ObjectFit, PlatformDisplay, ScrollHandle, SharedString, Subscription, Task, TextStyle,
+    ObjectFit, PlatformDisplay, ScrollHandle, SharedString, Subscription, Task, TaskExt, TextStyle,
     WeakEntity, Window, WindowHandle, div, ease_in_out, img, linear_color_stop, linear_gradient,
     list, point, pulsating_between,
 };

crates/agent_ui/src/conversation_view/thread_view.rs 🔗

@@ -10,7 +10,7 @@ use editor::actions::OpenExcerpts;
 
 use crate::StartThreadIn;
 use crate::message_editor::SharedSessionCapabilities;
-use gpui::{Corner, List};
+use gpui::{Corner, List, TaskExt};
 use heapless::Vec as ArrayVec;
 use language_model::{LanguageModelEffortLevel, Speed};
 use settings::update_settings_file;

crates/agent_ui/src/inline_assistant.rs 🔗

@@ -36,8 +36,8 @@ use editor::{
 use fs::Fs;
 use futures::{FutureExt, channel::mpsc};
 use gpui::{
-    App, Context, Entity, Focusable, Global, HighlightStyle, Subscription, Task, UpdateGlobal,
-    WeakEntity, Window, point,
+    App, Context, Entity, Focusable, Global, HighlightStyle, Subscription, Task, TaskExt,
+    UpdateGlobal, WeakEntity, Window, point,
 };
 use language::{Buffer, Point, Selection, TransactionId};
 use language_model::{ConfigurationError, ConfiguredModel, LanguageModelRegistry};

crates/agent_ui/src/message_editor.rs 🔗

@@ -21,7 +21,7 @@ use editor::{
 use futures::{FutureExt as _, future::join_all};
 use gpui::{
     AppContext, ClipboardEntry, Context, Entity, EventEmitter, FocusHandle, Focusable, ImageFormat,
-    KeyContext, SharedString, Subscription, Task, TextStyle, WeakEntity,
+    KeyContext, SharedString, Subscription, Task, TaskExt, TextStyle, WeakEntity,
 };
 use language::{Buffer, language_settings::InlayHintKind};
 use parking_lot::RwLock;

crates/agent_ui/src/model_selector.rs 🔗

@@ -11,7 +11,7 @@ use futures::FutureExt;
 use fuzzy::{StringMatchCandidate, match_strings};
 use gpui::{
     Action, AsyncWindowContext, BackgroundExecutor, DismissEvent, FocusHandle, Subscription, Task,
-    WeakEntity,
+    TaskExt, WeakEntity,
 };
 use itertools::Itertools;
 use ordered_float::OrderedFloat;

crates/agent_ui/src/thread_branch_picker.rs 🔗

@@ -9,7 +9,7 @@ use fuzzy::StringMatchCandidate;
 use git::repository::Branch as GitBranch;
 use gpui::{
     AnyElement, App, Context, DismissEvent, Entity, EventEmitter, FocusHandle, Focusable,
-    IntoElement, ParentElement, Render, SharedString, Styled, Task, Window, rems,
+    IntoElement, ParentElement, Render, SharedString, Styled, Task, TaskExt, Window, rems,
 };
 use picker::{Picker, PickerDelegate, PickerEditorPosition};
 use project::Project;

crates/agent_ui/src/thread_history_view.rs 🔗

@@ -5,7 +5,7 @@ use chrono::{Datelike as _, Local, NaiveDate, TimeDelta, Utc};
 use editor::{Editor, EditorEvent};
 use fuzzy::StringMatchCandidate;
 use gpui::{
-    AnyElement, App, Entity, EventEmitter, FocusHandle, Focusable, ScrollStrategy, Task,
+    AnyElement, App, Entity, EventEmitter, FocusHandle, Focusable, ScrollStrategy, Task, TaskExt,
     UniformListScrollHandle, Window, uniform_list,
 };
 use std::{fmt::Display, ops::Range};

crates/agent_ui/src/thread_import.rs 🔗

@@ -8,7 +8,7 @@ use fs::Fs;
 use futures::FutureExt as _;
 use gpui::{
     App, Context, DismissEvent, Entity, EventEmitter, FocusHandle, Focusable, MouseDownEvent,
-    Render, SharedString, Task, WeakEntity, Window,
+    Render, SharedString, Task, TaskExt, WeakEntity, Window,
 };
 use notifications::status_toast::{StatusToast, ToastIcon};
 use project::{AgentId, AgentRegistryStore, AgentServerStore};

crates/agent_ui/src/thread_metadata_store.rs 🔗

@@ -19,7 +19,7 @@ use db::{
 };
 use fs::Fs;
 use futures::{FutureExt, future::Shared};
-use gpui::{AppContext as _, Entity, Global, Subscription, Task};
+use gpui::{AppContext as _, Entity, Global, Subscription, Task, TaskExt};
 use project::AgentId;
 use remote::RemoteConnectionOptions;
 use ui::{App, Context, SharedString};

crates/agent_ui/src/threads_archive_view.rs 🔗

@@ -15,7 +15,8 @@ use fs::Fs;
 use fuzzy::{StringMatch, StringMatchCandidate};
 use gpui::{
     AnyElement, App, Context, DismissEvent, Entity, EventEmitter, FocusHandle, Focusable,
-    ListState, Render, SharedString, Subscription, Task, WeakEntity, Window, list, prelude::*, px,
+    ListState, Render, SharedString, Subscription, Task, TaskExt, WeakEntity, Window, list,
+    prelude::*, px,
 };
 use itertools::Itertools as _;
 use menu::{Confirm, SelectFirst, SelectLast, SelectNext, SelectPrevious};

crates/agent_ui/src/ui/mention_crease.rs 🔗

@@ -4,7 +4,8 @@ use acp_thread::MentionUri;
 use agent_client_protocol as acp;
 use editor::{Editor, SelectionEffects, scroll::Autoscroll};
 use gpui::{
-    Animation, AnimationExt, AnyView, Context, IntoElement, WeakEntity, Window, pulsating_between,
+    Animation, AnimationExt, AnyView, Context, IntoElement, TaskExt, WeakEntity, Window,
+    pulsating_between,
 };
 use prompt_store::PromptId;
 use rope::Point;

crates/ai_onboarding/src/ai_onboarding.rs 🔗

@@ -16,7 +16,7 @@ pub use young_account_banner::YoungAccountBanner;
 use std::sync::Arc;
 
 use client::{Client, UserStore, zed_urls};
-use gpui::{AnyElement, Entity, IntoElement, ParentElement};
+use gpui::{AnyElement, Entity, IntoElement, ParentElement, TaskExt};
 use ui::{
     Divider, List, ListBulletItem, RegisterComponent, Tooltip, Vector, VectorName, prelude::*,
 };

crates/auto_update/src/auto_update.rs 🔗

@@ -3,8 +3,8 @@ use client::Client;
 use db::kvp::KeyValueStore;
 use futures_lite::StreamExt;
 use gpui::{
-    App, AppContext as _, AsyncApp, BackgroundExecutor, Context, Entity, Global, Task, Window,
-    actions,
+    App, AppContext as _, AsyncApp, BackgroundExecutor, Context, Entity, Global, Task, TaskExt,
+    Window, actions,
 };
 use http_client::{HttpClient, HttpClientWithUrl};
 use paths::remote_servers_dir;

crates/auto_update_ui/src/auto_update_ui.rs 🔗

@@ -6,7 +6,8 @@ use db::kvp::Dismissable;
 use editor::{Editor, MultiBuffer};
 use fs::Fs;
 use gpui::{
-    App, DismissEvent, Entity, EventEmitter, FocusHandle, Focusable, Window, actions, prelude::*,
+    App, DismissEvent, Entity, EventEmitter, FocusHandle, Focusable, TaskExt, Window, actions,
+    prelude::*,
 };
 use markdown_preview::markdown_preview_view::{MarkdownPreviewMode, MarkdownPreviewView};
 use release_channel::{AppVersion, ReleaseChannel};

crates/call/src/call_impl/mod.rs 🔗

@@ -9,7 +9,7 @@ use collections::HashSet;
 use futures::{Future, FutureExt, channel::oneshot, future::Shared};
 use gpui::{
     AnyView, App, AppContext as _, AsyncApp, Context, Entity, EventEmitter, Subscription, Task,
-    WeakEntity, Window,
+    TaskExt, WeakEntity, Window,
 };
 use postage::watch;
 use project::Project;

crates/call/src/call_impl/room.rs 🔗

@@ -14,7 +14,7 @@ use fs::Fs;
 use futures::StreamExt;
 use gpui::{
     App, AppContext as _, AsyncApp, Context, Entity, EventEmitter, FutureExt as _,
-    ScreenCaptureSource, ScreenCaptureStream, Task, Timeout, WeakEntity,
+    ScreenCaptureSource, ScreenCaptureStream, Task, TaskExt, Timeout, WeakEntity,
 };
 use gpui_tokio::Tokio;
 use language::LanguageRegistry;

crates/client/src/client.rs 🔗

@@ -25,7 +25,7 @@ use futures::{
     channel::{mpsc, oneshot},
     future::BoxFuture,
 };
-use gpui::{App, AsyncApp, Entity, Global, Task, WeakEntity, actions};
+use gpui::{App, AsyncApp, Entity, Global, Task, TaskExt, WeakEntity, actions};
 use http_client::{HttpClient, HttpClientWithUrl, http, read_proxy_from_env};
 use parking_lot::{Mutex, RwLock};
 use postage::watch;

crates/client/src/llm_token.rs 🔗

@@ -4,6 +4,7 @@ use cloud_api_types::websocket_protocol::MessageToClient;
 use cloud_llm_client::{EXPIRED_LLM_TOKEN_HEADER_NAME, OUTDATED_LLM_TOKEN_HEADER_NAME};
 use gpui::{
     App, AppContext as _, Context, Entity, EventEmitter, Global, ReadGlobal as _, Subscription,
+    TaskExt,
 };
 use std::sync::Arc;
 

crates/client/src/user.rs 🔗

@@ -15,7 +15,8 @@ use derive_more::Deref;
 use feature_flags::FeatureFlagAppExt;
 use futures::{Future, StreamExt, channel::mpsc};
 use gpui::{
-    App, AsyncApp, Context, Entity, EventEmitter, SharedString, SharedUri, Task, WeakEntity,
+    App, AsyncApp, Context, Entity, EventEmitter, SharedString, SharedUri, Task, TaskExt,
+    WeakEntity,
 };
 use http_client::http::{HeaderMap, HeaderValue};
 use postage::{sink::Sink, watch};

crates/collab/tests/integration/random_project_collaboration_tests.rs 🔗

@@ -7,7 +7,7 @@ use collections::{BTreeMap, HashMap};
 use editor::Bias;
 use fs::{FakeFs, Fs as _};
 use git::status::{FileStatus, StatusCode, TrackedStatus, UnmergedStatus, UnmergedStatusCode};
-use gpui::{BackgroundExecutor, Entity, TestAppContext};
+use gpui::{BackgroundExecutor, Entity, TaskExt, TestAppContext};
 use language::{
     FakeLspAdapter, Language, LanguageConfig, LanguageMatcher, PointUtf16, range_to_lsp,
 };

crates/collab_ui/src/collab_panel.rs 🔗

@@ -16,8 +16,8 @@ use gpui::{
     AnyElement, App, AsyncWindowContext, Bounds, ClickEvent, ClipboardItem, DismissEvent, Div,
     Empty, Entity, EventEmitter, FocusHandle, Focusable, FontStyle, KeyContext, ListOffset,
     ListState, MouseDownEvent, Pixels, Point, PromptLevel, SharedString, Subscription, Task,
-    TextStyle, WeakEntity, Window, actions, anchored, canvas, deferred, div, fill, list, point,
-    prelude::*, px,
+    TaskExt, TextStyle, WeakEntity, Window, actions, anchored, canvas, deferred, div, fill, list,
+    point, prelude::*, px,
 };
 
 use menu::{Cancel, Confirm, SecondaryConfirm, SelectNext, SelectPrevious};

crates/collab_ui/src/collab_panel/channel_modal.rs 🔗

@@ -6,7 +6,8 @@ use client::{
 use fuzzy::{StringMatchCandidate, match_strings};
 use gpui::{
     App, ClipboardItem, Context, DismissEvent, Entity, EventEmitter, Focusable, ParentElement,
-    Render, Styled, Subscription, Task, WeakEntity, Window, actions, anchored, deferred, div,
+    Render, Styled, Subscription, Task, TaskExt, WeakEntity, Window, actions, anchored, deferred,
+    div,
 };
 use picker::{Picker, PickerDelegate};
 use std::sync::Arc;

crates/collab_ui/src/notifications/incoming_call_notification.rs 🔗

@@ -1,7 +1,7 @@
 use crate::notification_window_options;
 use call::{ActiveCall, IncomingCall};
 use futures::StreamExt;
-use gpui::{App, WindowHandle, prelude::*};
+use gpui::{App, TaskExt, WindowHandle, prelude::*};
 
 use std::sync::{Arc, Weak};
 use ui::{CollabNotification, prelude::*};

crates/command_palette/src/command_palette.rs 🔗

@@ -16,7 +16,7 @@ use command_palette_hooks::{
 use fuzzy::{StringMatch, StringMatchCandidate};
 use gpui::{
     Action, App, Context, DismissEvent, Entity, EventEmitter, FocusHandle, Focusable,
-    ParentElement, Render, Styled, Task, WeakEntity, Window,
+    ParentElement, Render, Styled, Task, TaskExt, WeakEntity, Window,
 };
 use persistence::CommandPaletteDB;
 use picker::Direction;

crates/copilot/src/copilot_edit_prediction_delegate.rs 🔗

@@ -10,7 +10,7 @@ use edit_prediction_types::{
     EditPrediction, EditPredictionDelegate, EditPredictionDiscardReason, EditPredictionIconSet,
     interpolate_edits,
 };
-use gpui::{App, Context, Entity, Task};
+use gpui::{App, Context, Entity, Task, TaskExt};
 use icons::IconName;
 use language::{Anchor, Buffer, BufferSnapshot, EditPreview, OffsetRangeExt, ToPointUtf16};
 use std::{ops::Range, sync::Arc, time::Duration};

crates/copilot_chat/src/copilot_chat.rs 🔗

@@ -10,7 +10,7 @@ use collections::HashSet;
 use fs::Fs;
 use futures::{AsyncBufReadExt, AsyncReadExt, StreamExt, io::BufReader, stream::BoxStream};
 use gpui::WeakEntity;
-use gpui::{App, AsyncApp, Global, prelude::*};
+use gpui::{App, AsyncApp, Global, TaskExt, prelude::*};
 use http_client::HttpRequestExt;
 use http_client::{AsyncBody, HttpClient, Method, Request as HttpRequest};
 use paths::home_dir;

crates/copilot_ui/src/sign_in.rs 🔗

@@ -6,7 +6,7 @@ use copilot::{
 use gpui::{
     App, ClipboardItem, Context, DismissEvent, Element, Entity, EventEmitter, FocusHandle,
     Focusable, InteractiveElement, IntoElement, MouseDownEvent, ParentElement, Render, Styled,
-    Subscription, Window, WindowBounds, WindowOptions, div, point,
+    Subscription, TaskExt, Window, WindowBounds, WindowOptions, div, point,
 };
 use project::project_settings::ProjectSettings;
 use settings::Settings as _;

crates/debugger_tools/src/dap_log.rs 🔗

@@ -11,7 +11,8 @@ use futures::{
 };
 use gpui::{
     App, AppContext, Context, Empty, Entity, EventEmitter, FocusHandle, Focusable, IntoElement,
-    ParentElement, Render, SharedString, Styled, Subscription, WeakEntity, Window, actions, div,
+    ParentElement, Render, SharedString, Styled, Subscription, TaskExt, WeakEntity, Window,
+    actions, div,
 };
 use project::{
     Project,

crates/debugger_ui/src/attach_modal.rs 🔗

@@ -1,7 +1,7 @@
 use dap::{DapRegistry, DebugRequest};
 use futures::channel::oneshot;
 use fuzzy::{StringMatch, StringMatchCandidate};
-use gpui::{AppContext, DismissEvent, Entity, EventEmitter, Focusable, Render, Task};
+use gpui::{AppContext, DismissEvent, Entity, EventEmitter, Focusable, Render, Task, TaskExt};
 use gpui::{Subscription, WeakEntity};
 use picker::{Picker, PickerDelegate};
 use project::Project;

crates/debugger_ui/src/debugger_panel.rs 🔗

@@ -19,7 +19,7 @@ use feature_flags::{FeatureFlag, FeatureFlagAppExt as _};
 use gpui::{
     Action, App, AsyncWindowContext, ClipboardItem, Context, Corner, DismissEvent, Entity,
     EntityId, EventEmitter, FocusHandle, Focusable, MouseButton, MouseDownEvent, Point,
-    Subscription, Task, WeakEntity, anchored, deferred,
+    Subscription, Task, TaskExt, WeakEntity, anchored, deferred,
 };
 
 use itertools::Itertools as _;

crates/debugger_ui/src/debugger_ui.rs 🔗

@@ -2,7 +2,7 @@ use std::any::TypeId;
 
 use debugger_panel::DebugPanel;
 use editor::{Editor, MultiBufferOffsetUtf16};
-use gpui::{Action, App, DispatchPhase, EntityInputHandler, actions};
+use gpui::{Action, App, DispatchPhase, EntityInputHandler, TaskExt, actions};
 use new_process_modal::{NewProcessModal, NewProcessMode};
 use project::debugger::{self, breakpoint_store::SourceBreakpoint, session::ThreadStatus};
 use schemars::JsonSchema;

crates/debugger_ui/src/new_process_modal.rs 🔗

@@ -16,7 +16,7 @@ use editor::Editor;
 use fuzzy::{StringMatch, StringMatchCandidate};
 use gpui::{
     Action, App, AppContext, DismissEvent, Entity, EventEmitter, FocusHandle, Focusable,
-    KeyContext, Render, Subscription, Task, WeakEntity, actions,
+    KeyContext, Render, Subscription, Task, TaskExt, WeakEntity, actions,
 };
 use itertools::Itertools as _;
 use picker::{Picker, PickerDelegate, highlighted_match_with_paths::HighlightedMatch};

crates/debugger_ui/src/session/running.rs 🔗

@@ -33,7 +33,7 @@ use dap::{
 use futures::{SinkExt, channel::mpsc};
 use gpui::{
     Action as _, AnyView, AppContext, Axis, Entity, EntityId, EventEmitter, FocusHandle, Focusable,
-    NoAction, Pixels, Point, Subscription, Task, WeakEntity,
+    NoAction, Pixels, Point, Subscription, Task, TaskExt, WeakEntity,
 };
 use language::Buffer;
 use loaded_source_list::LoadedSourceList;

crates/debugger_ui/src/session/running/stack_frame_list.rs 🔗

@@ -8,7 +8,7 @@ use dap::adapters::DebugAdapterName;
 use db::kvp::KeyValueStore;
 use gpui::{
     Action, AnyElement, Entity, EventEmitter, FocusHandle, Focusable, FontWeight, ListState,
-    Subscription, Task, WeakEntity, list,
+    Subscription, Task, TaskExt, WeakEntity, list,
 };
 use util::{
     debug_panic,

crates/debugger_ui/src/session/running/variable_list.rs 🔗

@@ -8,8 +8,9 @@ use dap::{
 use editor::Editor;
 use gpui::{
     Action, AnyElement, ClickEvent, ClipboardItem, Context, DismissEvent, Empty, Entity,
-    FocusHandle, Focusable, Hsla, MouseDownEvent, Point, Subscription, TextStyleRefinement,
-    UniformListScrollHandle, WeakEntity, actions, anchored, deferred, uniform_list,
+    FocusHandle, Focusable, Hsla, MouseDownEvent, Point, Subscription, TaskExt,
+    TextStyleRefinement, UniformListScrollHandle, WeakEntity, actions, anchored, deferred,
+    uniform_list,
 };
 use itertools::Itertools;
 use menu::{SelectFirst, SelectLast, SelectNext, SelectPrevious};

crates/diagnostics/src/buffer_diagnostics.rs 🔗

@@ -13,7 +13,7 @@ use editor::{
 use gpui::{
     AnyElement, App, AppContext, Context, Entity, EntityId, EventEmitter, FocusHandle, Focusable,
     InteractiveElement, IntoElement, ParentElement, Render, SharedString, Styled, Subscription,
-    Task, WeakEntity, Window, actions, div,
+    Task, TaskExt, WeakEntity, Window, actions, div,
 };
 use language::{Buffer, Capability, DiagnosticEntry, DiagnosticEntryRef, Point};
 use project::{

crates/edit_prediction/src/edit_prediction.rs 🔗

@@ -24,7 +24,7 @@ use futures::{
 use gpui::BackgroundExecutor;
 use gpui::http_client::Url;
 use gpui::{
-    App, AsyncApp, Entity, EntityId, Global, SharedString, Task, WeakEntity, actions,
+    App, AsyncApp, Entity, EntityId, Global, SharedString, Task, TaskExt, WeakEntity, actions,
     http_client::{self, AsyncBody, Method},
     prelude::*,
 };

crates/edit_prediction/src/mercury.rs 🔗

@@ -8,7 +8,7 @@ use cloud_llm_client::EditPredictionRejectReason;
 use credentials_provider::CredentialsProvider;
 use futures::AsyncReadExt as _;
 use gpui::{
-    App, AppContext as _, Context, Entity, Global, SharedString, Task,
+    App, AppContext as _, Context, Entity, Global, SharedString, Task, TaskExt,
     http_client::{self, AsyncBody, HttpClient, Method, StatusCode},
 };
 use language::{ToOffset, ToPoint as _};

crates/edit_prediction/src/ollama.rs 🔗

@@ -1,7 +1,7 @@
 use anyhow::{Context as _, Result};
 use futures::AsyncReadExt as _;
 use gpui::{
-    App, SharedString,
+    App, SharedString, TaskExt,
     http_client::{self, HttpClient},
 };
 use language::language_settings::OpenAiCompatibleEditPredictionSettings;

crates/edit_prediction/src/zeta.rs 🔗

@@ -10,7 +10,7 @@ use cloud_llm_client::{
     AcceptEditPredictionBody, EditPredictionRejectReason, predict_edits_v3::RawCompletionRequest,
 };
 use edit_prediction_types::PredictedCursorPosition;
-use gpui::{App, AppContext as _, Entity, Task, WeakEntity, prelude::*};
+use gpui::{App, AppContext as _, Entity, Task, TaskExt, WeakEntity, prelude::*};
 use language::{
     Buffer, BufferSnapshot, DiagnosticSeverity, OffsetRangeExt as _, ToOffset as _,
     language_settings::all_language_settings, text_diff,

crates/edit_prediction_context/src/edit_prediction_context.rs 🔗

@@ -2,7 +2,9 @@ use crate::assemble_excerpts::assemble_excerpt_ranges;
 use anyhow::Result;
 use collections::HashMap;
 use futures::{FutureExt, StreamExt as _, channel::mpsc, future};
-use gpui::{App, AppContext, AsyncApp, Context, Entity, EntityId, EventEmitter, Task, WeakEntity};
+use gpui::{
+    App, AppContext, AsyncApp, Context, Entity, EntityId, EventEmitter, Task, TaskExt, WeakEntity,
+};
 use language::{Anchor, Buffer, BufferSnapshot, OffsetRangeExt as _, Point, ToOffset as _};
 use project::{LocationLink, Project, ProjectPath};
 use smallvec::SmallVec;

crates/edit_prediction_ui/src/edit_prediction_button.rs 🔗

@@ -12,7 +12,7 @@ use feature_flags::FeatureFlagAppExt;
 use fs::Fs;
 use gpui::{
     Action, Animation, AnimationExt, App, AsyncWindowContext, Corner, Entity, FocusHandle,
-    Focusable, IntoElement, ParentElement, Render, Subscription, WeakEntity, actions, div,
+    Focusable, IntoElement, ParentElement, Render, Subscription, TaskExt, WeakEntity, actions, div,
     ease_in_out, pulsating_between,
 };
 use indoc::indoc;

crates/edit_prediction_ui/src/edit_prediction_ui.rs 🔗

@@ -7,6 +7,7 @@ use edit_prediction::{EditPredictionStore, ResetOnboarding, capture_example};
 use edit_prediction_context_view::EditPredictionContextView;
 use editor::Editor;
 use feature_flags::FeatureFlagAppExt as _;
+use gpui::TaskExt;
 use gpui::actions;
 use language::language_settings::AllLanguageSettings;
 use project::DisableAiSettings;

crates/editor/src/clangd_ext.rs 🔗

@@ -1,5 +1,5 @@
 use anyhow::Context as _;
-use gpui::{App, Context, Entity, Window};
+use gpui::{App, Context, Entity, TaskExt, Window};
 use language::Language;
 use project::lsp_store::lsp_ext_command::SwitchSourceHeaderResult;
 use rpc::proto;

crates/editor/src/code_context_menus.rs 🔗

@@ -2,8 +2,8 @@ use crate::scroll::ScrollAmount;
 use fuzzy::{StringMatch, StringMatchCandidate};
 use gpui::{
     AnyElement, Entity, Focusable, FontWeight, ListSizingBehavior, ScrollHandle, ScrollStrategy,
-    SharedString, Size, StrikethroughStyle, StyledText, Task, UniformListScrollHandle, div, px,
-    uniform_list,
+    SharedString, Size, StrikethroughStyle, StyledText, Task, TaskExt, UniformListScrollHandle,
+    div, px, uniform_list,
 };
 use itertools::Itertools;
 use language::CodeLabel;

crates/editor/src/editor.rs 🔗

@@ -121,9 +121,9 @@ use gpui::{
     FocusOutEvent, Focusable, FontId, FontStyle, FontWeight, Global, HighlightStyle, Hsla,
     KeyContext, Modifiers, MouseButton, MouseDownEvent, MouseMoveEvent, PaintQuad, ParentElement,
     Pixels, PressureStage, Render, ScrollHandle, SharedString, SharedUri, Size, Stateful, Styled,
-    Subscription, Task, TextRun, TextStyle, TextStyleRefinement, UTF16Selection, UnderlineStyle,
-    UniformListScrollHandle, WeakEntity, WeakFocusHandle, Window, div, point, prelude::*,
-    pulsating_between, px, relative, size,
+    Subscription, Task, TaskExt, TextRun, TextStyle, TextStyleRefinement, UTF16Selection,
+    UnderlineStyle, UniformListScrollHandle, WeakEntity, WeakFocusHandle, Window, div, point,
+    prelude::*, pulsating_between, px, relative, size,
 };
 use hover_links::{HoverLink, HoveredLinkState, find_file};
 use hover_popover::{HoverState, hide_hover};

crates/editor/src/editor_tests.rs 🔗

@@ -18,7 +18,7 @@ use buffer_diff::{BufferDiff, DiffHunkSecondaryStatus, DiffHunkStatus, DiffHunkS
 use collections::HashMap;
 use futures::{StreamExt, channel::oneshot};
 use gpui::{
-    BackgroundExecutor, DismissEvent, TestAppContext, UpdateGlobal, VisualTestContext,
+    BackgroundExecutor, DismissEvent, TaskExt, TestAppContext, UpdateGlobal, VisualTestContext,
     WindowBounds, WindowOptions, div,
 };
 use indoc::indoc;

crates/editor/src/element.rs 🔗

@@ -46,9 +46,10 @@ use gpui::{
     IsZero, Length, Modifiers, ModifiersChangedEvent, MouseButton, MouseClickEvent, MouseDownEvent,
     MouseMoveEvent, MousePressureEvent, MouseUpEvent, PaintQuad, ParentElement, Pixels,
     PressureStage, ScrollDelta, ScrollHandle, ScrollWheelEvent, ShapedLine, SharedString, Size,
-    StatefulInteractiveElement, Style, Styled, StyledText, TextAlign, TextRun, TextStyleRefinement,
-    WeakEntity, Window, anchored, deferred, div, fill, linear_color_stop, linear_gradient, outline,
-    pattern_slash, point, px, quad, relative, size, solid_background, transparent_black,
+    StatefulInteractiveElement, Style, Styled, StyledText, TaskExt, TextAlign, TextRun,
+    TextStyleRefinement, WeakEntity, Window, anchored, deferred, div, fill, linear_color_stop,
+    linear_gradient, outline, pattern_slash, point, px, quad, relative, size, solid_background,
+    transparent_black,
 };
 use itertools::Itertools;
 use language::{

crates/editor/src/hover_popover.rs 🔗

@@ -11,8 +11,8 @@ use anyhow::Context as _;
 use gpui::{
     AnyElement, App, AsyncWindowContext, Bounds, Context, Entity, Focusable as _, FontWeight, Hsla,
     InteractiveElement, IntoElement, MouseButton, ParentElement, Pixels, ScrollHandle, Size,
-    StatefulInteractiveElement, StyleRefinement, Styled, Subscription, Task, TextStyleRefinement,
-    Window, canvas, div, px,
+    StatefulInteractiveElement, StyleRefinement, Styled, Subscription, Task, TaskExt,
+    TextStyleRefinement, Window, canvas, div, px,
 };
 use itertools::Itertools;
 use language::{DiagnosticEntry, Language, LanguageRegistry};

crates/editor/src/rust_analyzer_ext.rs 🔗

@@ -1,7 +1,7 @@
 use std::{fs, path::Path};
 
 use anyhow::Context as _;
-use gpui::{App, AppContext as _, Context, Entity, Window};
+use gpui::{App, AppContext as _, Context, Entity, TaskExt, Window};
 use language::{Capability, Language, proto::serialize_anchor};
 use multi_buffer::MultiBuffer;
 use project::{

crates/extension_host/src/extension_host.rs 🔗

@@ -31,8 +31,8 @@ use futures::{
     select_biased,
 };
 use gpui::{
-    App, AppContext as _, AsyncApp, Context, Entity, EventEmitter, Global, Task, UpdateGlobal as _,
-    WeakEntity, actions,
+    App, AppContext as _, AsyncApp, Context, Entity, EventEmitter, Global, Task, TaskExt,
+    UpdateGlobal as _, WeakEntity, actions,
 };
 use http_client::{AsyncBody, HttpClient, HttpClientWithUrl};
 use language::{

crates/extension_host/src/extension_store_test.rs 🔗

@@ -8,7 +8,7 @@ use collections::{BTreeMap, HashSet};
 use extension::ExtensionHostProxy;
 use fs::{FakeFs, Fs, RealFs};
 use futures::{AsyncReadExt, FutureExt, StreamExt, io::BufReader};
-use gpui::{AppContext as _, BackgroundExecutor, TestAppContext};
+use gpui::{AppContext as _, BackgroundExecutor, TaskExt, TestAppContext};
 use http_client::{FakeHttpClient, Response};
 use language::{BinaryStatus, LanguageMatcher, LanguageName, LanguageRegistry};
 use language_extension::LspAccess;

crates/extensions_ui/src/extensions_ui.rs 🔗

@@ -15,7 +15,7 @@ use extension_host::{ExtensionManifest, ExtensionOperation, ExtensionStore};
 use fuzzy::{StringMatchCandidate, match_strings};
 use gpui::{
     Action, App, ClipboardItem, Context, Corner, Entity, EventEmitter, Focusable,
-    InteractiveElement, KeyContext, ParentElement, Point, Render, Styled, Task, TextStyle,
+    InteractiveElement, KeyContext, ParentElement, Point, Render, Styled, Task, TaskExt, TextStyle,
     UniformListScrollHandle, WeakEntity, Window, actions, point, uniform_list,
 };
 use num_format::{Locale, ToFormattedString};

crates/file_finder/src/file_finder.rs 🔗

@@ -13,8 +13,8 @@ use fuzzy::{StringMatch, StringMatchCandidate};
 use fuzzy_nucleo::{PathMatch, PathMatchCandidate};
 use gpui::{
     Action, AnyElement, App, Context, DismissEvent, Entity, EventEmitter, FocusHandle, Focusable,
-    KeyContext, Modifiers, ModifiersChangedEvent, ParentElement, Render, Styled, Task, WeakEntity,
-    Window, actions, rems,
+    KeyContext, Modifiers, ModifiersChangedEvent, ParentElement, Render, Styled, Task, TaskExt,
+    WeakEntity, Window, actions, rems,
 };
 use open_path_prompt::{
     OpenPathPrompt,

crates/git_ui/src/branch_picker.rs 🔗

@@ -8,7 +8,7 @@ use gpui::http_client::Url;
 use gpui::{
     Action, App, Context, DismissEvent, Entity, EventEmitter, FocusHandle, Focusable,
     InteractiveElement, IntoElement, Modifiers, ModifiersChangedEvent, ParentElement, Render,
-    SharedString, Styled, Subscription, Task, WeakEntity, Window, actions, rems,
+    SharedString, Styled, Subscription, Task, TaskExt, WeakEntity, Window, actions, rems,
 };
 use picker::{Picker, PickerDelegate, PickerEditorPosition};
 use project::git_store::Repository;

crates/git_ui/src/git_panel.rs 🔗

@@ -39,7 +39,7 @@ use git::{
 use gpui::{
     Action, AsyncApp, AsyncWindowContext, Bounds, ClickEvent, Corner, DismissEvent, Empty, Entity,
     EventEmitter, FocusHandle, Focusable, KeyContext, MouseButton, MouseDownEvent, Point,
-    PromptLevel, ScrollStrategy, Subscription, Task, TextStyle, UniformListScrollHandle,
+    PromptLevel, ScrollStrategy, Subscription, Task, TaskExt, TextStyle, UniformListScrollHandle,
     WeakEntity, actions, anchored, deferred, point, size, uniform_list,
 };
 use itertools::Itertools;

crates/git_ui/src/stash_picker.rs 🔗

@@ -4,7 +4,7 @@ use git::stash::StashEntry;
 use gpui::{
     Action, AnyElement, App, Context, DismissEvent, Entity, EventEmitter, FocusHandle, Focusable,
     InteractiveElement, IntoElement, Modifiers, ModifiersChangedEvent, ParentElement, Render,
-    SharedString, Styled, Subscription, Task, WeakEntity, Window, actions, rems,
+    SharedString, Styled, Subscription, Task, TaskExt, WeakEntity, Window, actions, rems,
 };
 use picker::{Picker, PickerDelegate};
 use project::git_store::{Repository, RepositoryEvent};

crates/git_ui/src/worktree_picker.rs 🔗

@@ -6,7 +6,7 @@ use git::repository::Worktree as GitWorktree;
 use gpui::{
     Action, App, AsyncWindowContext, Context, DismissEvent, Entity, EventEmitter, FocusHandle,
     Focusable, InteractiveElement, IntoElement, Modifiers, ModifiersChangedEvent, ParentElement,
-    Render, SharedString, Styled, Subscription, Task, WeakEntity, Window, actions, rems,
+    Render, SharedString, Styled, Subscription, Task, TaskExt, WeakEntity, Window, actions, rems,
 };
 use picker::{Picker, PickerDelegate, PickerEditorPosition};
 use project::project_settings::ProjectSettings;

crates/gpui/src/executor.rs 🔗

@@ -9,7 +9,9 @@ use std::{
     time::Duration,
 };
 
-pub use scheduler::{FallibleTask, ForegroundExecutor as SchedulerForegroundExecutor, Priority};
+pub use scheduler::{
+    FallibleTask, ForegroundExecutor as SchedulerForegroundExecutor, Priority, Task,
+};
 
 /// A pointer to the executor that is currently running,
 /// for spawning background tasks.
@@ -28,67 +30,21 @@ pub struct ForegroundExecutor {
     not_send: PhantomData<Rc<()>>,
 }
 
-/// Task is a primitive that allows work to happen in the background.
-///
-/// It implements [`Future`] so you can `.await` on it.
+/// Extension trait for `Task<Result<T, E>>` that adds `detach_and_log_err` with an `&App` context.
 ///
-/// If you drop a task it will be cancelled immediately. Calling [`Task::detach`] allows
-/// the task to continue running, but with no way to return a value.
-#[must_use]
-#[derive(Debug)]
-pub struct Task<T>(scheduler::Task<T>);
-
-impl<T> Task<T> {
-    /// Creates a new task that will resolve with the value.
-    pub fn ready(val: T) -> Self {
-        Task(scheduler::Task::ready(val))
-    }
-
-    /// Returns true if the task has completed or was created with `Task::ready`.
-    pub fn is_ready(&self) -> bool {
-        self.0.is_ready()
-    }
-
-    /// Detaching a task runs it to completion in the background.
-    pub fn detach(self) {
-        self.0.detach()
-    }
-
-    /// Wraps a scheduler::Task.
-    pub fn from_scheduler(task: scheduler::Task<T>) -> Self {
-        Task(task)
-    }
-
-    /// Converts this task into a fallible task that returns `Option<T>`.
-    ///
-    /// Unlike the standard `Task<T>`, a [`FallibleTask`] will return `None`
-    /// if the task was cancelled.
-    ///
-    /// # Example
-    ///
-    /// ```ignore
-    /// // Background task that gracefully handles cancellation:
-    /// cx.background_spawn(async move {
-    ///     let result = foreground_task.fallible().await;
-    ///     if let Some(value) = result {
-    ///         // Process the value
-    ///     }
-    ///     // If None, task was cancelled - just exit gracefully
-    /// }).detach();
-    /// ```
-    pub fn fallible(self) -> FallibleTask<T> {
-        self.0.fallible()
-    }
+/// This trait is automatically implemented for all `Task<Result<T, E>>` types.
+pub trait TaskExt<T, E> {
+    /// Run the task to completion in the background and log any errors that occur.
+    fn detach_and_log_err(self, cx: &App);
 }
 
-impl<T, E> Task<Result<T, E>>
+impl<T, E> TaskExt<T, E> for Task<Result<T, E>>
 where
     T: 'static,
     E: 'static + Debug,
 {
-    /// Run the task to completion in the background and log any errors that occur.
     #[track_caller]
-    pub fn detach_and_log_err(self, cx: &App) {
+    fn detach_and_log_err(self, cx: &App) {
         let location = core::panic::Location::caller();
         cx.foreground_executor()
             .spawn(self.log_tracked_err(*location))
@@ -96,20 +52,6 @@ where
     }
 }
 
-impl<T> std::future::Future for Task<T> {
-    type Output = T;
-
-    fn poll(
-        self: std::pin::Pin<&mut Self>,
-        cx: &mut std::task::Context<'_>,
-    ) -> std::task::Poll<Self::Output> {
-        // SAFETY: Task is a repr(transparent) wrapper around scheduler::Task,
-        // and we're just projecting the pin through to the inner task.
-        let inner = unsafe { self.map_unchecked_mut(|t| &mut t.0) };
-        inner.poll(cx)
-    }
-}
-
 impl BackgroundExecutor {
     /// Creates a new BackgroundExecutor from the given PlatformDispatcher.
     pub fn new(dispatcher: Arc<dyn PlatformDispatcher>) -> Self {
@@ -159,9 +101,9 @@ impl BackgroundExecutor {
         R: Send + 'static,
     {
         if priority == Priority::RealtimeAudio {
-            Task::from_scheduler(self.inner.spawn_realtime(future))
+            self.inner.spawn_realtime(future)
         } else {
-            Task::from_scheduler(self.inner.spawn_with_priority(priority, future))
+            self.inner.spawn_with_priority(priority, future)
         }
     }
 
@@ -410,7 +352,7 @@ impl ForegroundExecutor {
     where
         R: 'static,
     {
-        Task::from_scheduler(self.inner.spawn(future.boxed_local()))
+        self.inner.spawn(future.boxed_local())
     }
 
     /// Enqueues the given Task to run on the main thread with the given priority.
@@ -424,7 +366,7 @@ impl ForegroundExecutor {
         R: 'static,
     {
         // Priority is ignored for foreground tasks - they run in order on the main thread
-        Task::from_scheduler(self.inner.spawn(future))
+        self.inner.spawn(future)
     }
 
     /// Used by the test harness to run an async test in a synchronous fashion.

crates/gpui/src/prelude.rs 🔗

@@ -5,5 +5,5 @@
 pub use crate::{
     AppContext as _, BorrowAppContext, Context, Element, InteractiveElement, IntoElement,
     ParentElement, Refineable, Render, RenderOnce, StatefulInteractiveElement, Styled, StyledImage,
-    VisualContext, util::FluentBuilder,
+    TaskExt as _, VisualContext, util::FluentBuilder,
 };

crates/inspector_ui/src/inspector.rs 🔗

@@ -1,5 +1,5 @@
 use anyhow::{Context as _, anyhow};
-use gpui::{App, DivInspectorState, Inspector, InspectorElementId, IntoElement, Window};
+use gpui::{App, DivInspectorState, Inspector, InspectorElementId, IntoElement, TaskExt, Window};
 use std::{cell::OnceCell, path::Path, sync::Arc};
 use ui::{Label, Tooltip, prelude::*, utils::platform_title_bar_height};
 use util::{ResultExt as _, command::new_command};

crates/journal/src/journal.rs 🔗

@@ -1,7 +1,7 @@
 use chrono::{Datelike, Local, NaiveTime, Timelike};
 use editor::scroll::Autoscroll;
 use editor::{Editor, SelectionEffects};
-use gpui::{App, AppContext as _, Context, Window, actions};
+use gpui::{App, AppContext as _, Context, TaskExt, Window, actions};
 pub use settings::HourFormat;
 use settings::{RegisterSetting, Settings};
 use std::{

crates/keymap_editor/src/keymap_editor.rs 🔗

@@ -20,8 +20,8 @@ use gpui::{
     FocusHandle, Focusable, Global, IsZero,
     KeyBindingContextPredicate::{And, Descendant, Equal, Identifier, Not, NotEqual, Or},
     KeyContext, KeybindingKeystroke, MouseButton, PlatformKeyboardMapper, Point, ScrollStrategy,
-    ScrollWheelEvent, Stateful, StyledText, Subscription, Task, TextStyleRefinement, WeakEntity,
-    actions, anchored, deferred, div,
+    ScrollWheelEvent, Stateful, StyledText, Subscription, Task, TaskExt, TextStyleRefinement,
+    WeakEntity, actions, anchored, deferred, div,
 };
 use language::{Language, LanguageConfig, ToOffset as _};
 

crates/language_models/src/provider/anthropic.rs 🔗

@@ -5,7 +5,7 @@ use anyhow::Result;
 use collections::BTreeMap;
 use credentials_provider::CredentialsProvider;
 use futures::{FutureExt, StreamExt, future::BoxFuture, stream::BoxStream};
-use gpui::{AnyView, App, AsyncApp, Context, Entity, Task};
+use gpui::{AnyView, App, AsyncApp, Context, Entity, Task, TaskExt};
 use http_client::HttpClient;
 use language_model::{
     ANTHROPIC_PROVIDER_ID, ANTHROPIC_PROVIDER_NAME, ApiKeyState, AuthenticateError,

crates/language_models/src/provider/bedrock.rs 🔗

@@ -24,7 +24,8 @@ use collections::{BTreeMap, HashMap};
 use credentials_provider::CredentialsProvider;
 use futures::{FutureExt, Stream, StreamExt, future::BoxFuture, stream::BoxStream};
 use gpui::{
-    AnyView, App, AsyncApp, Context, Entity, FocusHandle, Subscription, Task, Window, actions,
+    AnyView, App, AsyncApp, Context, Entity, FocusHandle, Subscription, Task, TaskExt, Window,
+    actions,
 };
 use gpui_tokio::Tokio;
 use http_client::HttpClient;

crates/language_models/src/provider/cloud.rs 🔗

@@ -7,7 +7,7 @@ use cloud_api_types::Plan;
 use futures::StreamExt;
 use futures::future::BoxFuture;
 use gpui::AsyncApp;
-use gpui::{AnyElement, AnyView, App, Context, Entity, Subscription, Task};
+use gpui::{AnyElement, AnyView, App, Context, Entity, Subscription, Task, TaskExt};
 use language_model::{
     AuthenticateError, IconOrSvg, LanguageModel, LanguageModelProvider, LanguageModelProviderId,
     LanguageModelProviderName, LanguageModelProviderState, ZED_CLOUD_PROVIDER_ID,

crates/language_models/src/provider/deepseek.rs 🔗

@@ -5,7 +5,7 @@ use deepseek::DEEPSEEK_API_URL;
 
 use futures::Stream;
 use futures::{FutureExt, StreamExt, future::BoxFuture, stream::BoxStream};
-use gpui::{AnyView, App, AsyncApp, Context, Entity, SharedString, Task, Window};
+use gpui::{AnyView, App, AsyncApp, Context, Entity, SharedString, Task, TaskExt, Window};
 use http_client::HttpClient;
 use language_model::{
     ApiKeyState, AuthenticateError, EnvVar, IconOrSvg, LanguageModel, LanguageModelCompletionError,

crates/language_models/src/provider/google.rs 🔗

@@ -4,7 +4,7 @@ use credentials_provider::CredentialsProvider;
 use futures::{FutureExt, StreamExt, future::BoxFuture};
 pub use google_ai::completion::{GoogleEventMapper, count_google_tokens, into_google};
 use google_ai::{GenerateContentResponse, GoogleModelMode};
-use gpui::{AnyView, App, AsyncApp, Context, Entity, SharedString, Task, Window};
+use gpui::{AnyView, App, AsyncApp, Context, Entity, SharedString, Task, TaskExt, Window};
 use http_client::HttpClient;
 use language_model::{
     AuthenticateError, ConfigurationViewTargetAgent, EnvVar, LanguageModelCompletionError,

crates/language_models/src/provider/lmstudio.rs 🔗

@@ -4,7 +4,7 @@ use credentials_provider::CredentialsProvider;
 use fs::Fs;
 use futures::Stream;
 use futures::{FutureExt, StreamExt, future::BoxFuture, stream::BoxStream};
-use gpui::{AnyView, App, AsyncApp, Context, CursorStyle, Entity, Subscription, Task};
+use gpui::{AnyView, App, AsyncApp, Context, CursorStyle, Entity, Subscription, Task, TaskExt};
 use http_client::HttpClient;
 use language_model::{
     ApiKeyState, AuthenticateError, EnvVar, IconOrSvg, LanguageModel, LanguageModelCompletionError,

crates/language_models/src/provider/mistral.rs 🔗

@@ -3,7 +3,7 @@ use collections::BTreeMap;
 use credentials_provider::CredentialsProvider;
 
 use futures::{FutureExt, Stream, StreamExt, future::BoxFuture, stream::BoxStream};
-use gpui::{AnyView, App, AsyncApp, Context, Entity, Global, SharedString, Task, Window};
+use gpui::{AnyView, App, AsyncApp, Context, Entity, Global, SharedString, Task, TaskExt, Window};
 use http_client::HttpClient;
 use language_model::{
     ApiKeyState, AuthenticateError, EnvVar, IconOrSvg, LanguageModel, LanguageModelCompletionError,

crates/language_models/src/provider/ollama.rs 🔗

@@ -3,7 +3,7 @@ use credentials_provider::CredentialsProvider;
 use fs::Fs;
 use futures::{FutureExt, StreamExt, future::BoxFuture, stream::BoxStream};
 use futures::{Stream, TryFutureExt, stream};
-use gpui::{AnyView, App, AsyncApp, Context, CursorStyle, Entity, Task};
+use gpui::{AnyView, App, AsyncApp, Context, CursorStyle, Entity, Task, TaskExt};
 use http_client::HttpClient;
 use language_model::{
     ApiKeyState, AuthenticateError, EnvVar, IconOrSvg, LanguageModel, LanguageModelCompletionError,

crates/language_models/src/provider/open_ai.rs 🔗

@@ -2,7 +2,7 @@ use anyhow::Result;
 use collections::BTreeMap;
 use credentials_provider::CredentialsProvider;
 use futures::{FutureExt, StreamExt, future::BoxFuture};
-use gpui::{AnyView, App, AsyncApp, Context, Entity, SharedString, Task, Window};
+use gpui::{AnyView, App, AsyncApp, Context, Entity, SharedString, Task, TaskExt, Window};
 use http_client::HttpClient;
 use language_model::{
     ApiKeyState, AuthenticateError, EnvVar, IconOrSvg, LanguageModel, LanguageModelCompletionError,

crates/language_models/src/provider/open_ai_compatible.rs 🔗

@@ -2,7 +2,7 @@ use anyhow::Result;
 use convert_case::{Case, Casing};
 use credentials_provider::CredentialsProvider;
 use futures::{FutureExt, StreamExt, future::BoxFuture};
-use gpui::{AnyView, App, AsyncApp, Context, Entity, SharedString, Task, Window};
+use gpui::{AnyView, App, AsyncApp, Context, Entity, SharedString, Task, TaskExt, Window};
 use http_client::HttpClient;
 use language_model::{
     ApiKeyState, AuthenticateError, EnvVar, IconOrSvg, LanguageModel, LanguageModelCompletionError,

crates/language_models/src/provider/open_router.rs 🔗

@@ -2,7 +2,7 @@ use anyhow::Result;
 use collections::HashMap;
 use credentials_provider::CredentialsProvider;
 use futures::{FutureExt, Stream, StreamExt, future::BoxFuture};
-use gpui::{AnyView, App, AsyncApp, Context, Entity, SharedString, Task};
+use gpui::{AnyView, App, AsyncApp, Context, Entity, SharedString, Task, TaskExt};
 use http_client::HttpClient;
 use language_model::{
     ApiKeyState, AuthenticateError, EnvVar, IconOrSvg, LanguageModel, LanguageModelCompletionError,

crates/language_models/src/provider/opencode.rs 🔗

@@ -2,7 +2,7 @@ use anyhow::Result;
 use collections::BTreeMap;
 use credentials_provider::CredentialsProvider;
 use futures::{FutureExt, StreamExt, future::BoxFuture};
-use gpui::{AnyView, App, AsyncApp, Context, Entity, SharedString, Task, Window};
+use gpui::{AnyView, App, AsyncApp, Context, Entity, SharedString, Task, TaskExt, Window};
 use http_client::HttpClient;
 use language_model::{
     ApiKeyState, AuthenticateError, EnvVar, IconOrSvg, LanguageModel, LanguageModelCompletionError,

crates/language_models/src/provider/vercel.rs 🔗

@@ -2,7 +2,7 @@ use anyhow::Result;
 use collections::BTreeMap;
 use credentials_provider::CredentialsProvider;
 use futures::{FutureExt, StreamExt, future::BoxFuture};
-use gpui::{AnyView, App, AsyncApp, Context, Entity, SharedString, Task, Window};
+use gpui::{AnyView, App, AsyncApp, Context, Entity, SharedString, Task, TaskExt, Window};
 use http_client::HttpClient;
 use language_model::{
     ApiKeyState, AuthenticateError, EnvVar, IconOrSvg, LanguageModel, LanguageModelCompletionError,

crates/language_models/src/provider/vercel_ai_gateway.rs 🔗

@@ -2,7 +2,7 @@ use anyhow::Result;
 use collections::BTreeMap;
 use credentials_provider::CredentialsProvider;
 use futures::{AsyncReadExt, FutureExt, StreamExt, future::BoxFuture};
-use gpui::{AnyView, App, AsyncApp, Context, Entity, SharedString, Task, Window};
+use gpui::{AnyView, App, AsyncApp, Context, Entity, SharedString, Task, TaskExt, Window};
 use http_client::{AsyncBody, HttpClient, Method, Request as HttpRequest, http};
 use language_model::{
     ApiKeyState, AuthenticateError, EnvVar, IconOrSvg, LanguageModel, LanguageModelCompletionError,

crates/language_models/src/provider/x_ai.rs 🔗

@@ -2,7 +2,7 @@ use anyhow::Result;
 use collections::BTreeMap;
 use credentials_provider::CredentialsProvider;
 use futures::{FutureExt, StreamExt, future::BoxFuture};
-use gpui::{AnyView, App, AsyncApp, Context, Entity, Task, Window};
+use gpui::{AnyView, App, AsyncApp, Context, Entity, Task, TaskExt, Window};
 use http_client::HttpClient;
 use language_model::{
     ApiKeyState, AuthenticateError, EnvVar, IconOrSvg, LanguageModel, LanguageModelCompletionError,

crates/language_selector/src/language_selector.rs 🔗

@@ -6,7 +6,7 @@ use editor::Editor;
 use fuzzy::{StringMatch, StringMatchCandidate, match_strings};
 use gpui::{
     App, Context, DismissEvent, Entity, EventEmitter, FocusHandle, Focusable, ParentElement,
-    Render, Styled, WeakEntity, Window, actions,
+    Render, Styled, TaskExt, WeakEntity, Window, actions,
 };
 use language::{Buffer, LanguageMatcher, LanguageName, LanguageRegistry};
 use open_path_prompt::file_finder_settings::FileFinderSettings;

crates/language_tools/src/lsp_button.rs 🔗

@@ -13,7 +13,7 @@ use language::language_settings::{EditPredictionProvider, all_language_settings}
 use client::proto;
 use collections::HashSet;
 use editor::{Editor, EditorEvent};
-use gpui::{Corner, Entity, Subscription, Task, WeakEntity, actions};
+use gpui::{Corner, Entity, Subscription, Task, TaskExt, WeakEntity, actions};
 use language::{BinaryStatus, BufferId, ServerHealth};
 use lsp::{LanguageServerId, LanguageServerName, LanguageServerSelector};
 use project::{

crates/onboarding/src/basics_page.rs 🔗

@@ -5,7 +5,7 @@ use client::{Client, TelemetrySettings, UserStore, zed_urls};
 use cloud_api_types::Plan;
 use collections::HashMap;
 use fs::Fs;
-use gpui::{Action, Animation, AnimationExt, App, Entity, IntoElement, pulsating_between};
+use gpui::{Action, Animation, AnimationExt, App, Entity, IntoElement, TaskExt, pulsating_between};
 use project::agent_server_store::AllAgentServersSettings;
 use project::project_settings::ProjectSettings;
 use project::{AgentRegistryStore, RegistryAgent};

crates/outline_panel/src/outline_panel.rs 🔗

@@ -18,7 +18,7 @@ use gpui::{
     DismissEvent, Div, ElementId, Entity, EventEmitter, FocusHandle, Focusable, HighlightStyle,
     InteractiveElement, IntoElement, KeyContext, ListHorizontalSizingBehavior, ListSizingBehavior,
     MouseButton, MouseDownEvent, ParentElement, Pixels, Point, Render, ScrollStrategy,
-    SharedString, Stateful, StatefulInteractiveElement as _, Styled, Subscription, Task,
+    SharedString, Stateful, StatefulInteractiveElement as _, Styled, Subscription, Task, TaskExt,
     UniformListScrollHandle, WeakEntity, Window, actions, anchored, deferred, div, point, px, size,
     uniform_list,
 };

crates/project/src/agent_registry_store.rs 🔗

@@ -6,7 +6,7 @@ use anyhow::{Context as _, Result, bail};
 use collections::HashMap;
 use fs::Fs;
 use futures::AsyncReadExt;
-use gpui::{App, AppContext as _, Context, Entity, Global, SharedString, Task};
+use gpui::{App, AppContext as _, Context, Entity, Global, SharedString, Task, TaskExt};
 use http_client::{AsyncBody, HttpClient};
 use serde::Deserialize;
 use settings::Settings as _;

crates/project/src/agent_server_store.rs 🔗

@@ -8,7 +8,7 @@ use std::{
 use anyhow::{Context as _, Result, bail};
 use collections::HashMap;
 use fs::Fs;
-use gpui::{AsyncApp, Context, Entity, EventEmitter, SharedString, Subscription, Task};
+use gpui::{AsyncApp, Context, Entity, EventEmitter, SharedString, Subscription, Task, TaskExt};
 use http_client::{HttpClient, github::AssetKind};
 use node_runtime::NodeRuntime;
 use percent_encoding::percent_decode_str;

crates/project/src/buffer_store.rs 🔗

@@ -8,7 +8,8 @@ use client::Client;
 use collections::{HashMap, HashSet, hash_map};
 use futures::{Future, FutureExt as _, channel::oneshot, future::Shared};
 use gpui::{
-    App, AppContext as _, AsyncApp, Context, Entity, EventEmitter, Subscription, Task, WeakEntity,
+    App, AppContext as _, AsyncApp, Context, Entity, EventEmitter, Subscription, Task, TaskExt,
+    WeakEntity,
 };
 use language::{
     Buffer, BufferEvent, Capability, DiskState, File as _, Language, Operation,

crates/project/src/context_server_store.rs 🔗

@@ -13,7 +13,9 @@ use context_server::{ContextServer, ContextServerCommand, ContextServerId};
 use credentials_provider::CredentialsProvider;
 use futures::future::Either;
 use futures::{FutureExt as _, StreamExt as _, future::join_all};
-use gpui::{App, AsyncApp, Context, Entity, EventEmitter, Subscription, Task, WeakEntity, actions};
+use gpui::{
+    App, AsyncApp, Context, Entity, EventEmitter, Subscription, Task, TaskExt, WeakEntity, actions,
+};
 use http_client::HttpClient;
 use itertools::Itertools;
 use rand::Rng as _;

crates/project/src/debugger/dap_store.rs 🔗

@@ -30,7 +30,7 @@ use futures::{
     channel::mpsc::{self, UnboundedSender},
     future::{Shared, join_all},
 };
-use gpui::{App, AppContext, AsyncApp, Context, Entity, EventEmitter, SharedString, Task};
+use gpui::{App, AppContext, AsyncApp, Context, Entity, EventEmitter, SharedString, Task, TaskExt};
 use http_client::HttpClient;
 use language::{Buffer, LanguageToolchainStore};
 use node_runtime::NodeRuntime;

crates/project/src/debugger/session.rs 🔗

@@ -38,7 +38,7 @@ use futures::{AsyncBufReadExt as _, SinkExt, StreamExt, TryStreamExt};
 use futures::{FutureExt, future::Shared};
 use gpui::{
     App, AppContext, AsyncApp, BackgroundExecutor, Context, Entity, EventEmitter, SharedString,
-    Task, WeakEntity,
+    Task, TaskExt, WeakEntity,
 };
 use http_client::HttpClient;
 use node_runtime::NodeRuntime;

crates/project/src/git_store.rs 🔗

@@ -45,7 +45,7 @@ use git::{
 };
 use gpui::{
     App, AppContext, AsyncApp, Context, Entity, EventEmitter, SharedString, Subscription, Task,
-    WeakEntity,
+    TaskExt, WeakEntity,
 };
 use language::{
     Buffer, BufferEvent, Language, LanguageRegistry,

crates/project/src/lsp_command.rs 🔗

@@ -14,7 +14,7 @@ use client::proto::{self, PeerId};
 use clock::Global;
 use collections::HashMap;
 use futures::future;
-use gpui::{App, AsyncApp, Entity, SharedString, Task, prelude::FluentBuilder};
+use gpui::{App, AsyncApp, Entity, SharedString, Task, TaskExt, prelude::FluentBuilder};
 use language::{
     Anchor, Bias, Buffer, BufferSnapshot, CachedLspAdapter, CharKind, CharScopeContext,
     OffsetRangeExt, PointUtf16, ToOffset, ToPointUtf16, Transaction, Unclipped,

crates/project/src/lsp_store.rs 🔗

@@ -65,7 +65,7 @@ use futures::{
 use globset::{Glob, GlobBuilder, GlobMatcher, GlobSet, GlobSetBuilder};
 use gpui::{
     App, AppContext, AsyncApp, Context, Entity, EventEmitter, PromptLevel, SharedString,
-    Subscription, Task, WeakEntity,
+    Subscription, Task, TaskExt, WeakEntity,
 };
 use http_client::HttpClient;
 use itertools::Itertools as _;

crates/project/src/lsp_store/log_store.rs 🔗

@@ -2,7 +2,9 @@ use std::{collections::VecDeque, sync::Arc};
 
 use collections::HashMap;
 use futures::{StreamExt, channel::mpsc};
-use gpui::{App, AppContext as _, Context, Entity, EventEmitter, Global, Subscription, WeakEntity};
+use gpui::{
+    App, AppContext as _, Context, Entity, EventEmitter, Global, Subscription, TaskExt, WeakEntity,
+};
 use lsp::{
     IoKind, LanguageServer, LanguageServerId, LanguageServerName, LanguageServerSelector,
     MessageType, TraceValue,

crates/project/src/project.rs 🔗

@@ -83,7 +83,7 @@ use image_store::{ImageItemEvent, ImageStoreEvent};
 use ::git::{blame::Blame, status::FileStatus};
 use gpui::{
     App, AppContext, AsyncApp, BorrowAppContext, Context, Entity, EventEmitter, Hsla, SharedString,
-    Task, WeakEntity, Window,
+    Task, TaskExt, WeakEntity, Window,
 };
 use language::{
     Buffer, BufferEvent, Capability, CodeLabel, CursorShape, DiskState, Language, LanguageName,

crates/project/src/worktree_store.rs 🔗

@@ -12,7 +12,7 @@ use collections::HashMap;
 use fs::{Fs, copy_recursive};
 use futures::{FutureExt, future::Shared};
 use gpui::{
-    App, AppContext as _, AsyncApp, Context, Entity, EntityId, EventEmitter, Global, Task,
+    App, AppContext as _, AsyncApp, Context, Entity, EntityId, EventEmitter, Global, Task, TaskExt,
     WeakEntity,
 };
 use itertools::Either;

crates/project_benchmarks/src/main.rs 🔗

@@ -6,6 +6,7 @@ use clap::Parser;
 use client::{Client, UserStore};
 use futures::channel::oneshot;
 use gpui::AppContext as _;
+use gpui::TaskExt;
 use http_client::FakeHttpClient;
 use language::LanguageRegistry;
 use node_runtime::NodeRuntime;

crates/project_panel/src/project_panel.rs 🔗

@@ -25,7 +25,7 @@ use gpui::{
     ExternalPaths, FocusHandle, Focusable, FontWeight, Hsla, InteractiveElement, KeyContext,
     ListHorizontalSizingBehavior, ListSizingBehavior, Modifiers, ModifiersChangedEvent,
     MouseButton, MouseDownEvent, ParentElement, PathPromptOptions, Pixels, Point, PromptLevel,
-    Render, ScrollStrategy, Stateful, Styled, Subscription, Task, UniformListScrollHandle,
+    Render, ScrollStrategy, Stateful, Styled, Subscription, Task, TaskExt, UniformListScrollHandle,
     WeakEntity, Window, actions, anchored, deferred, div, hsla, linear_color_stop, linear_gradient,
     point, px, size, transparent_white, uniform_list,
 };

crates/project_symbols/src/project_symbols.rs 🔗

@@ -1,8 +1,8 @@
 use editor::{Bias, Editor, SelectionEffects, scroll::Autoscroll, styled_runs_for_code_label};
 use fuzzy::{StringMatch, StringMatchCandidate};
 use gpui::{
-    App, Context, DismissEvent, Entity, HighlightStyle, ParentElement, StyledText, Task, TextStyle,
-    WeakEntity, Window, relative, rems,
+    App, Context, DismissEvent, Entity, HighlightStyle, ParentElement, StyledText, Task, TaskExt,
+    TextStyle, WeakEntity, Window, relative, rems,
 };
 use ordered_float::OrderedFloat;
 use picker::{Picker, PickerDelegate};

crates/recent_projects/src/recent_projects.rs 🔗

@@ -25,7 +25,7 @@ use disconnected_overlay::DisconnectedOverlay;
 use fuzzy::{StringMatch, StringMatchCandidate};
 use gpui::{
     Action, AnyElement, App, Context, DismissEvent, Entity, EventEmitter, FocusHandle, Focusable,
-    Subscription, Task, WeakEntity, Window, actions, px,
+    Subscription, Task, TaskExt, WeakEntity, Window, actions, px,
 };
 
 use picker::{

crates/recent_projects/src/remote_servers.rs 🔗

@@ -15,7 +15,7 @@ use extension_host::ExtensionStore;
 use futures::{FutureExt, channel::oneshot, future::Shared};
 use gpui::{
     Action, AnyElement, App, ClickEvent, ClipboardItem, Context, DismissEvent, Entity,
-    EventEmitter, FocusHandle, Focusable, PromptLevel, ScrollHandle, Subscription, Task,
+    EventEmitter, FocusHandle, Focusable, PromptLevel, ScrollHandle, Subscription, Task, TaskExt,
     WeakEntity, Window, canvas,
 };
 use log::{debug, info};

crates/recent_projects/src/sidebar_recent_projects.rs 🔗

@@ -4,7 +4,7 @@ use chrono::{DateTime, Utc};
 use fuzzy::{StringMatch, StringMatchCandidate};
 use gpui::{
     Action, AnyElement, App, Context, DismissEvent, Entity, EventEmitter, FocusHandle, Focusable,
-    Subscription, Task, WeakEntity, Window,
+    Subscription, Task, TaskExt, WeakEntity, Window,
 };
 use picker::{
     Picker, PickerDelegate,

crates/remote/src/remote_client.rs 🔗

@@ -25,7 +25,7 @@ use futures::{
 };
 use gpui::{
     App, AppContext as _, AsyncApp, BackgroundExecutor, BorrowAppContext, Context, Entity,
-    EventEmitter, FutureExt, Global, Task, WeakEntity,
+    EventEmitter, FutureExt, Global, Task, TaskExt, WeakEntity,
 };
 use parking_lot::Mutex;
 

crates/remote_server/src/headless_project.rs 🔗

@@ -8,7 +8,7 @@ use lsp::LanguageServerId;
 use extension::ExtensionHostProxy;
 use extension_host::headless_host::HeadlessExtensionStore;
 use fs::Fs;
-use gpui::{App, AppContext as _, AsyncApp, Context, Entity, PromptLevel};
+use gpui::{App, AppContext as _, AsyncApp, Context, Entity, PromptLevel, TaskExt};
 use http_client::HttpClient;
 use language::{Buffer, BufferEvent, LanguageRegistry, proto::serialize_operation};
 use node_runtime::NodeRuntime;

crates/repl/src/repl_sessions_ui.rs 🔗

@@ -1,6 +1,6 @@
 use editor::Editor;
 use gpui::{
-    AnyElement, App, Entity, EventEmitter, FocusHandle, Focusable, Subscription, actions,
+    AnyElement, App, Entity, EventEmitter, FocusHandle, Focusable, Subscription, TaskExt, actions,
     prelude::*,
 };
 use project::ProjectItem as _;

crates/repl/src/repl_store.rs 🔗

@@ -4,7 +4,9 @@ use std::sync::Arc;
 use anyhow::{Context as _, Result};
 use collections::{HashMap, HashSet};
 use command_palette_hooks::CommandPaletteFilter;
-use gpui::{App, Context, Entity, EntityId, Global, SharedString, Subscription, Task, prelude::*};
+use gpui::{
+    App, Context, Entity, EntityId, Global, SharedString, Subscription, Task, TaskExt, prelude::*,
+};
 use jupyter_websocket_client::RemoteServer;
 use language::{Language, LanguageName};
 use project::{Fs, Project, ProjectPath, WorktreeId};

crates/rules_library/src/rules_library.rs 🔗

@@ -4,7 +4,7 @@ use editor::SelectionEffects;
 use editor::{CurrentLineHighlight, Editor, EditorElement, EditorEvent, EditorStyle, actions::Tab};
 use gpui::{
     App, Bounds, DEFAULT_ADDITIONAL_WINDOW_SIZE, Entity, EventEmitter, Focusable, PromptLevel,
-    Subscription, Task, TextStyle, Tiling, TitlebarOptions, WindowBounds, WindowHandle,
+    Subscription, Task, TaskExt, TextStyle, Tiling, TitlebarOptions, WindowBounds, WindowHandle,
     WindowOptions, actions, point, size, transparent_black,
 };
 use language::{Buffer, LanguageRegistry, language_settings::SoftWrap};

crates/search/src/buffer_search.rs 🔗

@@ -22,7 +22,7 @@ use futures::channel::oneshot;
 use gpui::{
     Action as _, App, ClickEvent, Context, Entity, EventEmitter, Focusable,
     InteractiveElement as _, IntoElement, KeyContext, ParentElement as _, Render, ScrollHandle,
-    Styled, Subscription, Task, WeakEntity, Window, div,
+    Styled, Subscription, Task, TaskExt, WeakEntity, Window, div,
 };
 use language::{Language, LanguageRegistry};
 use project::{

crates/search/src/project_search.rs 🔗

@@ -22,7 +22,8 @@ use futures::{StreamExt, stream::FuturesOrdered};
 use gpui::{
     Action, AnyElement, App, Axis, Context, Entity, EntityId, EventEmitter, FocusHandle, Focusable,
     Global, Hsla, InteractiveElement, IntoElement, KeyContext, ParentElement, Point, Render,
-    SharedString, Styled, Subscription, Task, UpdateGlobal, WeakEntity, Window, actions, div,
+    SharedString, Styled, Subscription, Task, TaskExt, UpdateGlobal, WeakEntity, Window, actions,
+    div,
 };
 use itertools::Itertools;
 use language::{Buffer, Language};

crates/settings_ui/src/pages/edit_prediction_provider_setup.rs 🔗

@@ -5,7 +5,7 @@ use edit_prediction::{
     open_ai_compatible::{open_ai_compatible_api_token, open_ai_compatible_api_url},
 };
 use edit_prediction_ui::{get_available_providers, set_completion_provider};
-use gpui::{Entity, ScrollHandle, prelude::*};
+use gpui::{Entity, ScrollHandle, TaskExt, prelude::*};
 use language::language_settings::AllLanguageSettings;
 
 use settings::Settings as _;

crates/snippets_ui/src/snippets_ui.rs 🔗

@@ -2,7 +2,7 @@ use file_icons::FileIcons;
 use fuzzy::{StringMatch, StringMatchCandidate, match_strings};
 use gpui::{
     App, Context, DismissEvent, Entity, EventEmitter, Focusable, ParentElement, Render, Styled,
-    WeakEntity, Window, actions,
+    TaskExt, WeakEntity, Window, actions,
 };
 use language::{LanguageMatcher, LanguageName, LanguageRegistry};
 use open_path_prompt::file_finder_settings::FileFinderSettings;

crates/tab_switcher/src/tab_switcher.rs 🔗

@@ -9,7 +9,7 @@ use fuzzy::StringMatchCandidate;
 use gpui::{
     Action, AnyElement, App, Context, DismissEvent, Entity, EntityId, EventEmitter, FocusHandle,
     Focusable, Modifiers, ModifiersChangedEvent, MouseButton, MouseUpEvent, ParentElement, Point,
-    Render, Styled, Task, WeakEntity, Window, actions, rems,
+    Render, Styled, Task, TaskExt, WeakEntity, Window, actions, rems,
 };
 use picker::{Picker, PickerDelegate};
 use project::Project;

crates/task/src/static_source.rs 🔗

@@ -3,7 +3,7 @@
 use std::sync::Arc;
 
 use futures::{StreamExt, channel::mpsc::UnboundedSender};
-use gpui::{App, AppContext};
+use gpui::{App, AppContext, TaskExt};
 use parking_lot::RwLock;
 use serde::Deserialize;
 use util::ResultExt;

crates/tasks_ui/src/tasks_ui.rs 🔗

@@ -2,7 +2,7 @@ use std::{path::Path, sync::Arc};
 
 use collections::HashMap;
 use editor::Editor;
-use gpui::{App, AppContext as _, Context, Entity, Task, Window};
+use gpui::{App, AppContext as _, Context, Entity, Task, TaskExt, Window};
 use project::{Location, TaskContexts, TaskSourceKind, Worktree};
 use task::{RevealTarget, TaskContext, TaskId, TaskTemplate, TaskVariables, VariableName};
 use workspace::Workspace;

crates/terminal_view/src/terminal_panel.rs 🔗

@@ -12,8 +12,8 @@ use db::kvp::KeyValueStore;
 use futures::{channel::oneshot, future::join_all};
 use gpui::{
     Action, AnyView, App, AsyncApp, AsyncWindowContext, Context, Corner, Entity, EventEmitter,
-    FocusHandle, Focusable, IntoElement, ParentElement, Pixels, Render, Styled, Task, WeakEntity,
-    Window, actions,
+    FocusHandle, Focusable, IntoElement, ParentElement, Pixels, Render, Styled, Task, TaskExt,
+    WeakEntity, Window, actions,
 };
 use itertools::Itertools;
 use project::{Fs, Project};

crates/terminal_view/src/terminal_path_like_target.rs 🔗

@@ -1,7 +1,7 @@
 use super::{HoverTarget, HoveredWord, TerminalView};
 use anyhow::{Context as _, Result};
 use editor::Editor;
-use gpui::{App, AppContext, Context, Task, WeakEntity, Window};
+use gpui::{App, AppContext, Context, Task, TaskExt, WeakEntity, Window};
 use itertools::Itertools;
 use project::{Entry, Metadata};
 use std::path::PathBuf;

crates/terminal_view/src/terminal_view.rs 🔗

@@ -11,8 +11,8 @@ use editor::{
 use gpui::{
     Action, AnyElement, App, ClipboardEntry, DismissEvent, Entity, EventEmitter, ExternalPaths,
     FocusHandle, Focusable, Font, KeyContext, KeyDownEvent, Keystroke, MouseButton, MouseDownEvent,
-    Pixels, Point, Render, ScrollWheelEvent, Styled, Subscription, Task, WeakEntity, actions,
-    anchored, deferred, div,
+    Pixels, Point, Render, ScrollWheelEvent, Styled, Subscription, Task, TaskExt, WeakEntity,
+    actions, anchored, deferred, div,
 };
 use itertools::Itertools;
 use menu;

crates/title_bar/src/collab.rs 🔗

@@ -5,8 +5,8 @@ use call::{ActiveCall, Room};
 use channel::ChannelStore;
 use client::{User, proto::PeerId};
 use gpui::{
-    AnyElement, Hsla, IntoElement, MouseButton, Path, ScreenCaptureSource, Styled, WeakEntity,
-    canvas, point,
+    AnyElement, Hsla, IntoElement, MouseButton, Path, ScreenCaptureSource, Styled, TaskExt,
+    WeakEntity, canvas, point,
 };
 use gpui::{App, Task, Window};
 use icons::IconName;

crates/title_bar/src/onboarding_banner.rs 🔗

@@ -2,7 +2,7 @@
 // It's currently not in use but is kept for future feature announcements.
 #![allow(dead_code)]
 
-use gpui::{Action, Entity, Global, Render, SharedString};
+use gpui::{Action, Entity, Global, Render, SharedString, TaskExt};
 use ui::{ButtonLike, Tooltip, prelude::*};
 use util::ResultExt;
 

crates/title_bar/src/title_bar.rs 🔗

@@ -26,7 +26,7 @@ use cloud_api_types::Plan;
 use gpui::{
     Action, Animation, AnimationExt, AnyElement, App, Context, Corner, Element, Entity, Focusable,
     InteractiveElement, IntoElement, MouseButton, ParentElement, Render,
-    StatefulInteractiveElement, Styled, Subscription, WeakEntity, Window, actions, div,
+    StatefulInteractiveElement, Styled, Subscription, TaskExt, WeakEntity, Window, actions, div,
     pulsating_between,
 };
 use onboarding_banner::OnboardingBanner;

crates/ui/src/components/context_menu.rs 🔗

@@ -5,7 +5,7 @@ use crate::{
 use gpui::{
     Action, AnyElement, App, Bounds, Corner, DismissEvent, Entity, EventEmitter, FocusHandle,
     Focusable, MouseButton, MouseDownEvent, MouseMoveEvent, MouseUpEvent, Pixels, Point, Size,
-    Subscription, anchored, canvas, prelude::*, px,
+    Subscription, TaskExt, anchored, canvas, prelude::*, px,
 };
 use menu::{SelectChild, SelectFirst, SelectLast, SelectNext, SelectParent, SelectPrevious};
 use std::{

crates/vim/src/command.rs 🔗

@@ -8,7 +8,8 @@ use editor::{
 };
 use futures::AsyncWriteExt as _;
 use gpui::{
-    Action, App, AppContext as _, Context, Global, Keystroke, Task, WeakEntity, Window, actions,
+    Action, App, AppContext as _, Context, Global, Keystroke, Task, TaskExt, WeakEntity, Window,
+    actions,
 };
 use itertools::Itertools;
 use language::Point;

crates/vim/src/helix.rs 🔗

@@ -11,7 +11,7 @@ use editor::{
     SelectionEffects, ToOffset, ToPoint, movement,
 };
 use gpui::actions;
-use gpui::{Context, Window};
+use gpui::{Context, TaskExt, Window};
 use language::{CharClassifier, CharKind, Point};
 use search::{BufferSearchBar, SearchOptions};
 use settings::Settings;

crates/vim/src/normal.rs 🔗

@@ -28,7 +28,7 @@ use editor::Editor;
 use editor::{Anchor, SelectionEffects};
 use editor::{Bias, ToPoint};
 use editor::{display_map::ToDisplayPoint, movement};
-use gpui::{Context, Window, actions};
+use gpui::{Context, TaskExt, Window, actions};
 use language::{Point, SelectionGoal};
 use log::error;
 use multi_buffer::MultiBufferRow;

crates/vim/src/normal/mark.rs 🔗

@@ -5,7 +5,7 @@ use editor::{
     display_map::{DisplaySnapshot, ToDisplayPoint},
     movement,
 };
-use gpui::{Context, Entity, EntityId, UpdateGlobal, Window};
+use gpui::{Context, Entity, EntityId, TaskExt, UpdateGlobal, Window};
 use language::SelectionGoal;
 use text::Point;
 use ui::App;

crates/vim/src/normal/search.rs 🔗

@@ -1,5 +1,5 @@
 use editor::{Editor, EditorSettings};
-use gpui::{Action, Context, Window, actions};
+use gpui::{Action, Context, TaskExt, Window, actions};
 use language::Point;
 use schemars::JsonSchema;
 use search::{BufferSearchBar, SearchOptions, buffer_search};

crates/vim/src/state.rs 🔗

@@ -15,7 +15,8 @@ use editor::display_map::{is_invisible, replacement};
 use editor::{Anchor, ClipboardSelection, Editor, MultiBuffer, ToPoint as EditorToPoint};
 use gpui::{
     Action, App, AppContext, BorrowAppContext, ClipboardEntry, ClipboardItem, DismissEvent, Entity,
-    EntityId, Global, HighlightStyle, StyledText, Subscription, Task, TextStyle, WeakEntity,
+    EntityId, Global, HighlightStyle, StyledText, Subscription, Task, TaskExt, TextStyle,
+    WeakEntity,
 };
 use language::{Buffer, BufferEvent, BufferId, Chunk, LanguageAwareStyling, Point};
 

crates/workspace/src/item.rs 🔗

@@ -12,7 +12,7 @@ use client::{Client, proto};
 use futures::channel::mpsc;
 use gpui::{
     Action, AnyElement, AnyEntity, AnyView, App, AppContext, Context, Entity, EntityId,
-    EventEmitter, FocusHandle, Focusable, Font, Pixels, Point, Render, SharedString, Task,
+    EventEmitter, FocusHandle, Focusable, Font, Pixels, Point, Render, SharedString, Task, TaskExt,
     WeakEntity, Window,
 };
 use language::Capability;

crates/workspace/src/multi_workspace.rs 🔗

@@ -2,8 +2,8 @@ use anyhow::Result;
 use gpui::PathPromptOptions;
 use gpui::{
     AnyView, App, Context, DragMoveEvent, Entity, EntityId, EventEmitter, FocusHandle, Focusable,
-    ManagedView, MouseButton, Pixels, Render, Subscription, Task, Tiling, Window, WindowId,
-    actions, deferred, px,
+    ManagedView, MouseButton, Pixels, Render, Subscription, Task, TaskExt, Tiling, Window,
+    WindowId, actions, deferred, px,
 };
 use project::{DirectoryLister, DisableAiSettings, Project, ProjectGroupKey};
 use remote::RemoteConnectionOptions;

crates/workspace/src/pane.rs 🔗

@@ -24,8 +24,8 @@ use gpui::{
     Action, AnyElement, App, AsyncWindowContext, ClickEvent, ClipboardItem, Context, Corner, Div,
     DragMoveEvent, Entity, EntityId, EventEmitter, ExternalPaths, FocusHandle, FocusOutEvent,
     Focusable, KeyContext, MouseButton, NavigationDirection, Pixels, Point, PromptLevel, Render,
-    ScrollHandle, Subscription, Task, WeakEntity, WeakFocusHandle, Window, actions, anchored,
-    deferred, prelude::*,
+    ScrollHandle, Subscription, Task, TaskExt, WeakEntity, WeakFocusHandle, Window, actions,
+    anchored, deferred, prelude::*,
 };
 use itertools::Itertools;
 use language::{Capability, DiagnosticSeverity};

crates/workspace/src/persistence.rs 🔗

@@ -2506,7 +2506,7 @@ mod tests {
         },
     };
     use feature_flags::FeatureFlagAppExt;
-    use gpui::AppContext as _;
+    use gpui::{AppContext as _, TaskExt};
     use pretty_assertions::assert_eq;
     use project::{Project, ProjectGroupKey};
     use remote::SshConnectionOptions;

crates/workspace/src/tasks.rs 🔗

@@ -2,7 +2,7 @@ use std::process::ExitStatus;
 
 use anyhow::Result;
 use collections::HashSet;
-use gpui::{AppContext, Context, Entity, Task};
+use gpui::{AppContext, Context, Entity, Task, TaskExt};
 use language::Buffer;
 use project::{TaskSourceKind, WorktreeId};
 use remote::ConnectionState;

crates/workspace/src/welcome.rs 🔗

@@ -9,9 +9,9 @@ use chrono::{DateTime, Utc};
 use git::Clone as GitClone;
 use gpui::{
     Action, App, Context, Entity, EventEmitter, FocusHandle, Focusable, InteractiveElement,
-    ParentElement, Render, Styled, Task, Window, actions,
+    ParentElement, Render, Styled, Task, TaskExt, WeakEntity, Window, actions, linear_color_stop,
+    linear_gradient,
 };
-use gpui::{WeakEntity, linear_color_stop, linear_gradient};
 use menu::{SelectNext, SelectPrevious};
 
 use schemars::JsonSchema;

crates/workspace/src/workspace.rs 🔗

@@ -60,8 +60,8 @@ use gpui::{
     Context, CursorStyle, Decorations, DragMoveEvent, Entity, EntityId, EventEmitter, FocusHandle,
     Focusable, Global, HitboxBehavior, Hsla, KeyContext, Keystroke, ManagedView, MouseButton,
     PathPromptOptions, Point, PromptLevel, Render, ResizeEdge, Size, Stateful, Subscription,
-    SystemWindowTabController, Task, Tiling, WeakEntity, WindowBounds, WindowHandle, WindowId,
-    WindowOptions, actions, canvas, point, relative, size, transparent_black,
+    SystemWindowTabController, Task, TaskExt, Tiling, WeakEntity, WindowBounds, WindowHandle,
+    WindowId, WindowOptions, actions, canvas, point, relative, size, transparent_black,
 };
 pub use history_manager::*;
 pub use item::{

crates/zed/src/main.rs 🔗

@@ -21,7 +21,9 @@ use fs::{Fs, RealFs};
 use futures::{StreamExt, channel::oneshot, future};
 use git::GitHostingProviderRegistry;
 use git_ui::clone::clone_and_open;
-use gpui::{App, AppContext, Application, AsyncApp, Focusable as _, QuitMode, UpdateGlobal as _};
+use gpui::{
+    App, AppContext, Application, AsyncApp, Focusable as _, QuitMode, TaskExt, UpdateGlobal as _,
+};
 use gpui_platform;
 
 use gpui_tokio::Tokio;

crates/zed/src/reliability.rs 🔗

@@ -2,7 +2,7 @@ use anyhow::{Context as _, Result};
 use client::{Client, telemetry::MINIDUMP_ENDPOINT};
 use feature_flags::FeatureFlagAppExt;
 use futures::{AsyncReadExt, TryStreamExt};
-use gpui::{App, AppContext as _, SerializedThreadTaskTimings};
+use gpui::{App, AppContext as _, SerializedThreadTaskTimings, TaskExt};
 use http_client::{self, AsyncBody, HttpClient, Request};
 use log::info;
 use project::Project;

crates/zed/src/zed.rs 🔗

@@ -35,7 +35,7 @@ use git_ui::project_diff::{BranchDiffToolbar, ProjectDiffToolbar};
 use gpui::{
     Action, App, AppContext as _, AsyncWindowContext, ClipboardItem, Context, DismissEvent,
     Element, Entity, FocusHandle, Focusable, Image, ImageFormat, KeyBinding, ParentElement,
-    PathPromptOptions, PromptLevel, ReadGlobal, SharedString, Size, Task, TitlebarOptions,
+    PathPromptOptions, PromptLevel, ReadGlobal, SharedString, Size, Task, TaskExt, TitlebarOptions,
     UpdateGlobal, WeakEntity, Window, WindowBounds, WindowHandle, WindowKind, WindowOptions,
     actions, image_cache, img, point, px, retain_all,
 };

crates/zed/src/zed/open_listener.rs 🔗

@@ -14,7 +14,7 @@ use futures::future;
 
 use futures::{FutureExt, StreamExt};
 use git_ui::{file_diff_view::FileDiffView, multi_diff_view::MultiDiffView};
-use gpui::{App, AsyncApp, Global, WindowHandle};
+use gpui::{App, AsyncApp, Global, TaskExt, WindowHandle};
 use onboarding::FIRST_OPEN;
 use onboarding::show_onboarding_view;
 use recent_projects::{RemoteSettings, navigate_to_positions, open_remote_project};

crates/zed/src/zed/quick_action_bar/repl_menu.rs 🔗

@@ -1,5 +1,5 @@
 use gpui::ElementId;
-use gpui::{AnyElement, Entity};
+use gpui::{AnyElement, Entity, TaskExt};
 use picker::Picker;
 use repl::{
     ExecutionState, JupyterSettings, Kernel, KernelSpecification, KernelStatus, Session,

crates/zed/src/zed/remote_debug.rs 🔗

@@ -1,3 +1,4 @@
+use gpui::TaskExt as _;

 use workspace::Workspace;
 use zed_actions::remote_debug::{SimulateDisconnect, SimulateTimeout, SimulateTimeoutExhausted};