From 5ed13a0293fa3507ea5e43c12b85615bc1a9bd63 Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Sat, 7 Feb 2026 12:54:29 -0500 Subject: [PATCH] Move extension API DTOs into `cloud_api_types` (#48689) This PR moves the DTOs for the extension API from the `rpc` crate into the `cloud_api_types` crate. Release Notes: - N/A --- Cargo.lock | 7 ++++-- crates/cloud_api_types/Cargo.toml | 1 + crates/cloud_api_types/src/cloud_api_types.rs | 2 ++ .../{rpc => cloud_api_types}/src/extension.rs | 0 crates/collab/Cargo.toml | 1 + crates/collab/src/api/extensions.rs | 2 +- crates/collab/src/db.rs | 4 ++-- crates/collab/src/db/queries/extensions.rs | 2 +- .../collab/src/db/tables/extension_version.rs | 2 +- .../integration/db_tests/extension_tests.rs | 24 +++++++++---------- crates/extension_cli/Cargo.toml | 2 +- crates/extension_cli/src/main.rs | 4 ++-- crates/extension_host/Cargo.toml | 1 + crates/extension_host/src/extension_host.rs | 4 ++-- crates/extensions_ui/Cargo.toml | 1 + .../src/extension_version_selector.rs | 2 +- crates/extensions_ui/src/extensions_ui.rs | 3 ++- crates/rpc/Cargo.toml | 1 - crates/rpc/src/rpc.rs | 2 -- 19 files changed, 36 insertions(+), 29 deletions(-) rename crates/{rpc => cloud_api_types}/src/extension.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index 19bd981e39253e977d5fd7676f376f245a244183..8682919045556be302e4c7fc0be2848ffade85d5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3174,6 +3174,7 @@ dependencies = [ "pretty_assertions", "serde", "serde_json", + "strum 0.27.2", ] [[package]] @@ -3335,6 +3336,7 @@ dependencies = [ "chrono", "client", "clock", + "cloud_api_types", "collab", "collab_ui", "collections", @@ -6056,6 +6058,7 @@ version = "0.1.0" dependencies = [ "anyhow", "clap", + "cloud_api_types", "env_logger 0.11.8", "extension", "fs", @@ -6063,7 +6066,6 @@ dependencies = [ "language", "log", "reqwest_client", - "rpc", "serde", "serde_json", "serde_json_lenient", @@ -6084,6 +6086,7 @@ dependencies = [ "async-tar", "async-trait", "client", + "cloud_api_types", "collections", "criterion", "ctor", @@ -6134,6 +6137,7 @@ version = "0.1.0" dependencies = [ "anyhow", "client", + "cloud_api_types", "collections", "db", "editor", @@ -14161,7 +14165,6 @@ dependencies = [ "anyhow", "async-tungstenite", "base64 0.22.1", - "chrono", "collections", "futures 0.3.31", "gpui", diff --git a/crates/cloud_api_types/Cargo.toml b/crates/cloud_api_types/Cargo.toml index 46d5d109b1bd5328c9c4d8b7cb1fbb8325e27656..3ca12021181d28daabd20df45801521c4492cc27 100644 --- a/crates/cloud_api_types/Cargo.toml +++ b/crates/cloud_api_types/Cargo.toml @@ -17,6 +17,7 @@ chrono.workspace = true ciborium.workspace = true cloud_llm_client.workspace = true serde.workspace = true +strum.workspace = true [dev-dependencies] pretty_assertions.workspace = true diff --git a/crates/cloud_api_types/src/cloud_api_types.rs b/crates/cloud_api_types/src/cloud_api_types.rs index ea944446ab68c8fb4d1382d77ec8c81d34199132..df3ab9ddba8e05d98c25e18e82851c9911fbcd12 100644 --- a/crates/cloud_api_types/src/cloud_api_types.rs +++ b/crates/cloud_api_types/src/cloud_api_types.rs @@ -1,3 +1,4 @@ +mod extension; mod known_or_unknown; mod plan; mod timestamp; @@ -5,6 +6,7 @@ pub mod websocket_protocol; use serde::{Deserialize, Serialize}; +pub use crate::extension::*; pub use crate::known_or_unknown::*; pub use crate::plan::*; pub use crate::timestamp::Timestamp; diff --git a/crates/rpc/src/extension.rs b/crates/cloud_api_types/src/extension.rs similarity index 100% rename from crates/rpc/src/extension.rs rename to crates/cloud_api_types/src/extension.rs diff --git a/crates/collab/Cargo.toml b/crates/collab/Cargo.toml index 4a91c31cd77f99cbb241e0a4734b438448800090..dee26a37c3856f1a5d4a582f44a2b8a8d349bdfb 100644 --- a/crates/collab/Cargo.toml +++ b/crates/collab/Cargo.toml @@ -37,6 +37,7 @@ axum-extra = { version = "0.4", features = ["erased-json"] } base64.workspace = true chrono.workspace = true clock.workspace = true +cloud_api_types.workspace = true collections.workspace = true dashmap.workspace = true envy = "0.4.2" diff --git a/crates/collab/src/api/extensions.rs b/crates/collab/src/api/extensions.rs index 187b2ab279e1b99b257a61cd2841617ecefb7b3c..b7bff3d445e655b5a00150c6013e654849d42c67 100644 --- a/crates/collab/src/api/extensions.rs +++ b/crates/collab/src/api/extensions.rs @@ -9,8 +9,8 @@ use axum::{ response::Redirect, routing::get, }; +use cloud_api_types::{ExtensionApiManifest, ExtensionProvides, GetExtensionsResponse}; use collections::{BTreeSet, HashMap}; -use rpc::{ExtensionApiManifest, ExtensionProvides, GetExtensionsResponse}; use semver::Version as SemanticVersion; use serde::Deserialize; use std::str::FromStr; diff --git a/crates/collab/src/db.rs b/crates/collab/src/db.rs index 165d5fc3cbe569b6a2b8963f2d70b6de0cc28b48..57fb0df86495dc2013e7cd780c2e62e57298bd11 100644 --- a/crates/collab/src/db.rs +++ b/crates/collab/src/db.rs @@ -4,13 +4,13 @@ mod tables; use crate::{Error, Result}; use anyhow::{Context as _, anyhow}; +use cloud_api_types::{ExtensionMetadata, ExtensionProvides}; use collections::{BTreeMap, BTreeSet, HashMap, HashSet}; use dashmap::DashMap; use futures::StreamExt; use project_repository_statuses::StatusKind; -use rpc::ExtensionProvides; use rpc::{ - ConnectionId, ExtensionMetadata, + ConnectionId, proto::{self}, }; use sea_orm::{ diff --git a/crates/collab/src/db/queries/extensions.rs b/crates/collab/src/db/queries/extensions.rs index 729e3de99f16bd7351bb510ec24156a4fcae7c60..be1196ecf9b3af1a580bc2dbda45a7adfb2ede38 100644 --- a/crates/collab/src/db/queries/extensions.rs +++ b/crates/collab/src/db/queries/extensions.rs @@ -455,7 +455,7 @@ fn metadata_from_extension_and_version( ExtensionMetadata { id: extension.external_id.into(), - manifest: rpc::ExtensionApiManifest { + manifest: cloud_api_types::ExtensionApiManifest { name: extension.name, version: version.version.into(), authors: version diff --git a/crates/collab/src/db/tables/extension_version.rs b/crates/collab/src/db/tables/extension_version.rs index 5e71914ddb0dd60c75fa3a6b1b5ee86fe1b662b6..9544846e215dd9466331b9a5a358f53456496e41 100644 --- a/crates/collab/src/db/tables/extension_version.rs +++ b/crates/collab/src/db/tables/extension_version.rs @@ -1,6 +1,6 @@ use crate::db::ExtensionId; +use cloud_api_types::ExtensionProvides; use collections::BTreeSet; -use rpc::ExtensionProvides; use sea_orm::entity::prelude::*; use time::PrimitiveDateTime; diff --git a/crates/collab/tests/integration/db_tests/extension_tests.rs b/crates/collab/tests/integration/db_tests/extension_tests.rs index 0f1939955376285bd1e1709812d18dad61326ac3..993188feb8d40aac35c916f58cddb8baf0a72d38 100644 --- a/crates/collab/tests/integration/db_tests/extension_tests.rs +++ b/crates/collab/tests/integration/db_tests/extension_tests.rs @@ -1,13 +1,13 @@ use std::collections::BTreeSet; use std::sync::Arc; -use rpc::ExtensionProvides; - -use crate::test_both_dbs; +use cloud_api_types::{ExtensionMetadata, ExtensionProvides}; use collab::db::Database; use collab::db::ExtensionVersionConstraints; use collab::db::{NewExtensionVersion, queries::extensions::convert_time_to_chrono}; -use rpc::ExtensionMetadata; + +use crate::test_both_dbs; + test_both_dbs!( test_extensions, test_extensions_postgres, @@ -160,7 +160,7 @@ async fn test_extensions(db: &Arc) { &[ ExtensionMetadata { id: "ext1".into(), - manifest: rpc::ExtensionApiManifest { + manifest: cloud_api_types::ExtensionApiManifest { name: "Extension One".into(), version: "0.0.2".into(), authors: vec!["max".into(), "marshall".into()], @@ -175,7 +175,7 @@ async fn test_extensions(db: &Arc) { }, ExtensionMetadata { id: "ext2".into(), - manifest: rpc::ExtensionApiManifest { + manifest: cloud_api_types::ExtensionApiManifest { name: "Extension Two".into(), version: "0.2.0".into(), authors: vec!["marshall".into()], @@ -197,7 +197,7 @@ async fn test_extensions(db: &Arc) { extensions, &[ExtensionMetadata { id: "ext2".into(), - manifest: rpc::ExtensionApiManifest { + manifest: cloud_api_types::ExtensionApiManifest { name: "Extension Two".into(), version: "0.2.0".into(), authors: vec!["marshall".into()], @@ -239,7 +239,7 @@ async fn test_extensions(db: &Arc) { &[ ExtensionMetadata { id: "ext2".into(), - manifest: rpc::ExtensionApiManifest { + manifest: cloud_api_types::ExtensionApiManifest { name: "Extension Two".into(), version: "0.2.0".into(), authors: vec!["marshall".into()], @@ -254,7 +254,7 @@ async fn test_extensions(db: &Arc) { }, ExtensionMetadata { id: "ext1".into(), - manifest: rpc::ExtensionApiManifest { + manifest: cloud_api_types::ExtensionApiManifest { name: "Extension One".into(), version: "0.0.2".into(), authors: vec!["max".into(), "marshall".into()], @@ -329,7 +329,7 @@ async fn test_extensions(db: &Arc) { &[ ExtensionMetadata { id: "ext2".into(), - manifest: rpc::ExtensionApiManifest { + manifest: cloud_api_types::ExtensionApiManifest { name: "Extension Two".into(), version: "0.2.0".into(), authors: vec!["marshall".into()], @@ -344,7 +344,7 @@ async fn test_extensions(db: &Arc) { }, ExtensionMetadata { id: "ext1".into(), - manifest: rpc::ExtensionApiManifest { + manifest: cloud_api_types::ExtensionApiManifest { name: "Extension One".into(), version: "0.0.3".into(), authors: vec!["max".into(), "marshall".into()], @@ -466,7 +466,7 @@ async fn test_extensions_by_id(db: &Arc) { extensions, &[ExtensionMetadata { id: "ext1".into(), - manifest: rpc::ExtensionApiManifest { + manifest: cloud_api_types::ExtensionApiManifest { name: "Extension 1".into(), version: "0.0.2".into(), authors: vec!["max".into()], diff --git a/crates/extension_cli/Cargo.toml b/crates/extension_cli/Cargo.toml index 9f751f2103a3c7ab013fe922bd9bb05eb7f207dd..2c780c41a63212d2a87dd74a28a17164ed0bff3f 100644 --- a/crates/extension_cli/Cargo.toml +++ b/crates/extension_cli/Cargo.toml @@ -15,6 +15,7 @@ path = "src/main.rs" [dependencies] anyhow.workspace = true clap = { workspace = true, features = ["derive"] } +cloud_api_types.workspace = true env_logger.workspace = true extension.workspace = true fs.workspace = true @@ -22,7 +23,6 @@ gpui.workspace = true language.workspace = true log.workspace = true reqwest_client.workspace = true -rpc.workspace = true serde.workspace = true serde_json.workspace = true serde_json_lenient.workspace = true diff --git a/crates/extension_cli/src/main.rs b/crates/extension_cli/src/main.rs index fbffe877e588b4827eb0bb2e8bac3f59b9db334a..584193c2b4583bd46b9973b39e734692ee83b42c 100644 --- a/crates/extension_cli/src/main.rs +++ b/crates/extension_cli/src/main.rs @@ -7,11 +7,11 @@ use std::sync::Arc; use ::fs::{CopyOptions, Fs, RealFs, copy_recursive}; use anyhow::{Context as _, Result, anyhow, bail}; use clap::Parser; +use cloud_api_types::ExtensionProvides; use extension::extension_builder::{CompileExtensionOptions, ExtensionBuilder}; use extension::{ExtensionManifest, ExtensionSnippets}; use language::LanguageConfig; use reqwest_client::ReqwestClient; -use rpc::ExtensionProvides; use snippet_provider::file_to_snippets; use snippet_provider::format::VsSnippetsFile; use tokio::process::Command; @@ -108,7 +108,7 @@ async fn main() -> Result<()> { ); } - let manifest_json = serde_json::to_string(&rpc::ExtensionApiManifest { + let manifest_json = serde_json::to_string(&cloud_api_types::ExtensionApiManifest { name: manifest.name, version: manifest.version, description: manifest.description, diff --git a/crates/extension_host/Cargo.toml b/crates/extension_host/Cargo.toml index 2305bf5e2a19c446e810a68c3cf80e7af36ff8e9..c4d1f6d98c82ee348f4a7453a3bb6e3255924b77 100644 --- a/crates/extension_host/Cargo.toml +++ b/crates/extension_host/Cargo.toml @@ -21,6 +21,7 @@ async-compression.workspace = true async-tar.workspace = true async-trait.workspace = true client.workspace = true +cloud_api_types.workspace = true collections.workspace = true dap.workspace = true extension.workspace = true diff --git a/crates/extension_host/src/extension_host.rs b/crates/extension_host/src/extension_host.rs index 7ad75e228917b83c15ac66d4313364e08fe3c259..6699a9dca099177cfd550ba0f68ef62828356d15 100644 --- a/crates/extension_host/src/extension_host.rs +++ b/crates/extension_host/src/extension_host.rs @@ -9,8 +9,8 @@ mod extension_store_test; use anyhow::{Context as _, Result, anyhow, bail}; use async_compression::futures::bufread::GzipDecoder; use async_tar::Archive; -use client::ExtensionProvides; -use client::{Client, ExtensionMetadata, GetExtensionsResponse, proto, telemetry::Telemetry}; +use client::{Client, proto, telemetry::Telemetry}; +use cloud_api_types::{ExtensionMetadata, ExtensionProvides, GetExtensionsResponse}; use collections::{BTreeMap, BTreeSet, HashSet, btree_map}; pub use extension::ExtensionManifest; use extension::extension_builder::{CompileExtensionOptions, ExtensionBuilder}; diff --git a/crates/extensions_ui/Cargo.toml b/crates/extensions_ui/Cargo.toml index 707938a9eb83209149a261fbe4c8cf9d6ca4e91e..a80defd128549e9f2ed6b634c188a7f2f319ef6a 100644 --- a/crates/extensions_ui/Cargo.toml +++ b/crates/extensions_ui/Cargo.toml @@ -14,6 +14,7 @@ path = "src/extensions_ui.rs" [dependencies] anyhow.workspace = true client.workspace = true +cloud_api_types.workspace = true collections.workspace = true db.workspace = true editor.workspace = true diff --git a/crates/extensions_ui/src/extension_version_selector.rs b/crates/extensions_ui/src/extension_version_selector.rs index 17d293da76d4831e30af8ed7d26d2df4c7706716..6dd45954a7128295d3c24a1bd9f09681b05b0632 100644 --- a/crates/extensions_ui/src/extension_version_selector.rs +++ b/crates/extensions_ui/src/extension_version_selector.rs @@ -1,7 +1,7 @@ use std::str::FromStr; use std::sync::Arc; -use client::ExtensionMetadata; +use cloud_api_types::ExtensionMetadata; use extension_host::ExtensionStore; use fs::Fs; use fuzzy::{StringMatch, StringMatchCandidate, match_strings}; diff --git a/crates/extensions_ui/src/extensions_ui.rs b/crates/extensions_ui/src/extensions_ui.rs index 0b1d1f75011a64583479e6c6a5b57f7130ff7a8a..7c77579c9172e24680e8398645544cd1099dfaff 100644 --- a/crates/extensions_ui/src/extensions_ui.rs +++ b/crates/extensions_ui/src/extensions_ui.rs @@ -7,7 +7,8 @@ use std::time::Duration; use std::{ops::Range, sync::Arc}; use anyhow::Context as _; -use client::{ExtensionMetadata, ExtensionProvides, zed_urls}; +use client::zed_urls; +use cloud_api_types::{ExtensionMetadata, ExtensionProvides}; use collections::{BTreeMap, BTreeSet}; use editor::{Editor, EditorElement, EditorStyle}; use extension_host::{ExtensionManifest, ExtensionOperation, ExtensionStore}; diff --git a/crates/rpc/Cargo.toml b/crates/rpc/Cargo.toml index 10ebde26b6b9242ecee9ef52cdb4a00323efaf3f..dcf890e9c91c696ee6c26831b73101bdb4de7781 100644 --- a/crates/rpc/Cargo.toml +++ b/crates/rpc/Cargo.toml @@ -21,7 +21,6 @@ test-support = ["collections/test-support", "gpui/test-support", "proto/test-sup anyhow.workspace = true async-tungstenite.workspace = true base64.workspace = true -chrono.workspace = true collections.workspace = true futures.workspace = true gpui = { workspace = true, optional = true } diff --git a/crates/rpc/src/rpc.rs b/crates/rpc/src/rpc.rs index ad1ebb757c22783658d0ece51156b3864234aba1..d62693bf40b10fa967ba3d090cd4978696cd6587 100644 --- a/crates/rpc/src/rpc.rs +++ b/crates/rpc/src/rpc.rs @@ -1,12 +1,10 @@ pub mod auth; mod conn; -mod extension; mod message_stream; mod notification; mod peer; pub use conn::Connection; -pub use extension::*; pub use notification::*; pub use peer::*; pub use proto;