logiguard fork v3: full patch set on verified 8c74db0 tree

Includes prior-session patches (carry forward so the app compiles):
  - crates/gpui/build.rs: cross-compile manifest fix
  - crates/gpui/src/platform.rs: PlatformWindow::activate_with_token trait method
  - crates/gpui/src/window.rs: Window::activate_with_token public API
  - crates/gpui_linux/src/linux/wayland/window.rs: WaylandWindow::activate_with_token + activate() keyboard-serial fix

Plus the focus-serial fix:
  - serial.rs: SerialKind::KeyboardEnter
  - client.rs: store wl_keyboard.enter serial; latest_serial_of()

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Mohamad Khani
2026-07-14 01:52:12 +03:30
commit b9819977a5
3984 changed files with 1487015 additions and 0 deletions

27
crates/proto/Cargo.toml Normal file
View File

@@ -0,0 +1,27 @@
[package]
description = "Shared protocol for communication between the Zed app and the zed.dev server"
edition.workspace = true
name = "proto"
version = "0.1.0"
publish.workspace = true
license = "GPL-3.0-or-later"
[features]
test-support = []
[lints]
workspace = true
[lib]
path = "src/proto.rs"
doctest = false
[dependencies]
anyhow.workspace = true
prost.workspace = true
serde.workspace = true
[build-dependencies]
prost-build.workspace = true
[dev-dependencies]

1
crates/proto/LICENSE-GPL Symbolic link
View File

@@ -0,0 +1 @@
../../LICENSE-GPL

10
crates/proto/build.rs Normal file
View File

@@ -0,0 +1,10 @@
fn main() {
println!("cargo:rerun-if-changed=proto");
let mut build = prost_build::Config::new();
build
.type_attribute(".", "#[derive(serde::Serialize, serde::Deserialize)]")
.type_attribute("ProjectPath", "#[derive(Hash, Eq)]")
.type_attribute("Anchor", "#[derive(Hash, Eq)]")
.compile_protos(&["proto/zed.proto"], &["proto"])
.unwrap();
}

View File

@@ -0,0 +1,87 @@
syntax = "proto3";
package zed.messages;
import "task.proto";
message GetAgentServerCommand {
uint64 project_id = 1;
string name = 2;
optional string root_dir = 3;
}
message GetContextServerCommand {
uint64 project_id = 1;
string server_id = 2;
optional string root_dir = 3;
}
message ContextServerCommand {
string path = 1;
repeated string args = 2;
map<string, string> env = 3;
}
message AgentServerCommand {
string path = 1;
repeated string args = 2;
map<string, string> env = 3;
string root_dir = 4;
optional SpawnInTerminal login = 5;
}
message ExternalAgentsUpdated {
uint64 project_id = 1;
repeated string names = 2;
}
message ExternalExtensionAgentTarget {
string archive = 1;
string cmd = 2;
repeated string args = 3;
optional string sha256 = 4;
map<string, string> env = 5;
}
message ExternalExtensionAgent {
string name = 1;
optional string icon_path = 2;
string extension_id = 3;
map<string, ExternalExtensionAgentTarget> targets = 4;
map<string, string> env = 5;
optional string version = 6;
}
message ExternalExtensionAgentsUpdated {
uint64 project_id = 1;
repeated ExternalExtensionAgent agents = 2;
}
message ExternalAgentLoadingStatusUpdated {
uint64 project_id = 1;
string name = 2;
reserved 3;
}
message NewExternalAgentVersionAvailable {
uint64 project_id = 1;
string name = 2;
string version = 3;
}
message ShareAgentThread {
string session_id = 1; // Client-generated UUID (acp::SessionId)
string title = 2;
bytes thread_data = 3;
}
message GetSharedAgentThread {
string session_id = 1; // UUID string
}
message GetSharedAgentThreadResponse {
string title = 1;
bytes thread_data = 2;
string sharer_username = 3;
string created_at = 4;
}

View File

@@ -0,0 +1,92 @@
syntax = "proto3";
package zed.messages;
message ShutdownRemoteServer {}
message Toast {
uint64 project_id = 1;
string notification_id = 2;
string message = 3;
}
message HideToast {
uint64 project_id = 1;
string notification_id = 2;
}
message OpenServerSettings {
uint64 project_id = 1;
}
message GetCrashFiles {}
message GetCrashFilesResponse {
repeated CrashReport crashes = 1;
reserved 2; // old panics
}
message CrashReport {
reserved 1, 2;
string metadata = 3;
bytes minidump_contents = 4;
}
message Extension {
string id = 1;
string version = 2;
bool dev = 3;
}
message SyncExtensions {
repeated Extension extensions = 1;
}
message SyncExtensionsResponse {
string tmp_dir = 1;
repeated Extension missing_extensions = 2;
}
message InstallExtension {
Extension extension = 1;
string tmp_dir = 2;
}
message AskPassRequest {
uint64 project_id = 1;
reserved 2;
uint64 repository_id = 3;
uint64 askpass_id = 4;
string prompt = 5;
}
message AskPassResponse {
string response = 1;
}
message GetRemoteProfilingData {
uint64 project_id = 1;
bool foreground_only = 2;
}
message GetRemoteProfilingDataResponse {
repeated RemoteProfilingThread threads = 1;
uint64 now_nanos = 2;
}
message RemoteProfilingThread {
optional string thread_name = 1;
uint64 thread_id = 2;
repeated RemoteProfilingTiming timings = 3;
}
message RemoteProfilingTiming {
RemoteProfilingLocation location = 1;
uint64 start_nanos = 2;
uint64 duration_nanos = 3;
}
message RemoteProfilingLocation {
string file = 1;
uint32 line = 2;
uint32 column = 3;
}

View File

@@ -0,0 +1,14 @@
version: v1
breaking:
use:
- WIRE
lint:
except:
# Since we use post_build instead of buf this doesn't matter
- PACKAGE_DIRECTORY_MATCH
# This is internal to Zed only so we don't enforce versions
- PACKAGE_VERSION_SUFFIX
# Style rules we don't enforce
- ENUM_VALUE_PREFIX
- ENUM_VALUE_UPPER_SNAKE_CASE
- ENUM_ZERO_VALUE_SUFFIX

View File

@@ -0,0 +1,339 @@
syntax = "proto3";
package zed.messages;
import "core.proto";
import "worktree.proto";
message OpenNewBuffer {
uint64 project_id = 1;
}
message OpenBufferResponse {
uint64 buffer_id = 1;
}
message CreateBufferForPeer {
uint64 project_id = 1;
PeerId peer_id = 2;
oneof variant {
BufferState state = 3;
BufferChunk chunk = 4;
}
}
message UpdateBuffer {
uint64 project_id = 1;
uint64 buffer_id = 2;
repeated Operation operations = 3;
}
message OpenBufferByPath {
uint64 project_id = 1;
uint64 worktree_id = 2;
string path = 3;
}
message OpenBufferById {
uint64 project_id = 1;
uint64 id = 2;
}
message UpdateBufferFile {
uint64 project_id = 1;
uint64 buffer_id = 2;
File file = 3;
}
message SaveBuffer {
uint64 project_id = 1;
uint64 buffer_id = 2;
repeated VectorClockEntry version = 3;
optional ProjectPath new_path = 4;
}
message CloseBuffer {
uint64 project_id = 1;
uint64 buffer_id = 2;
}
message BufferSaved {
uint64 project_id = 1;
uint64 buffer_id = 2;
repeated VectorClockEntry version = 3;
Timestamp mtime = 4;
reserved 5;
}
message BufferReloaded {
uint64 project_id = 1;
uint64 buffer_id = 2;
repeated VectorClockEntry version = 3;
Timestamp mtime = 4;
reserved 5;
LineEnding line_ending = 6;
}
message ReloadBuffers {
uint64 project_id = 1;
repeated uint64 buffer_ids = 2;
}
message ReloadBuffersResponse {
ProjectTransaction transaction = 1;
}
message SynchronizeBuffers {
uint64 project_id = 1;
repeated BufferVersion buffers = 2;
}
message SynchronizeBuffersResponse {
repeated BufferVersion buffers = 1;
}
message BufferVersion {
uint64 id = 1;
repeated VectorClockEntry version = 2;
}
message BufferState {
uint64 id = 1;
optional File file = 2;
string base_text = 3;
LineEnding line_ending = 5;
repeated VectorClockEntry saved_version = 6;
Timestamp saved_mtime = 8;
reserved 7;
reserved 4;
}
message BufferChunk {
uint64 buffer_id = 1;
repeated Operation operations = 2;
bool is_last = 3;
}
enum LineEnding {
Unix = 0;
Windows = 1;
}
message VectorClockEntry {
uint32 replica_id = 1;
uint32 timestamp = 2;
}
message UndoMapEntry {
uint32 replica_id = 1;
uint32 local_timestamp = 2;
repeated UndoCount counts = 3;
}
message UndoCount {
uint32 replica_id = 1;
uint32 lamport_timestamp = 2;
uint32 count = 3;
}
message Operation {
oneof variant {
Edit edit = 1;
Undo undo = 2;
UpdateSelections update_selections = 3;
UpdateDiagnostics update_diagnostics = 4;
UpdateCompletionTriggers update_completion_triggers = 5;
UpdateLineEnding update_line_ending = 6;
}
message Edit {
uint32 replica_id = 1;
uint32 lamport_timestamp = 2;
repeated VectorClockEntry version = 3;
repeated Range ranges = 4;
repeated string new_text = 5;
}
message Undo {
uint32 replica_id = 1;
uint32 lamport_timestamp = 2;
repeated VectorClockEntry version = 3;
repeated UndoCount counts = 4;
}
message UpdateSelections {
uint32 replica_id = 1;
uint32 lamport_timestamp = 2;
repeated Selection selections = 3;
bool line_mode = 4;
CursorShape cursor_shape = 5;
}
message UpdateCompletionTriggers {
uint32 replica_id = 1;
uint32 lamport_timestamp = 2;
repeated string triggers = 3;
uint64 language_server_id = 4;
}
message UpdateLineEnding {
uint32 replica_id = 1;
uint32 lamport_timestamp = 2;
LineEnding line_ending = 3;
}
}
message ProjectTransaction {
repeated uint64 buffer_ids = 1;
repeated Transaction transactions = 2;
}
message Transaction {
LamportTimestamp id = 1;
repeated LamportTimestamp edit_ids = 2;
repeated VectorClockEntry start = 3;
}
message LamportTimestamp {
uint32 replica_id = 1;
uint32 value = 2;
}
message Range {
uint64 start = 1;
uint64 end = 2;
}
message Selection {
uint64 id = 1;
EditorAnchor start = 2;
EditorAnchor end = 3;
bool reversed = 4;
}
message EditorAnchor {
optional uint64 excerpt_id = 1;
Anchor anchor = 2;
}
message PathKey {
optional uint64 sort_prefix = 1;
string path = 2;
}
enum CursorShape {
CursorBar = 0;
CursorBlock = 1;
CursorUnderscore = 2;
CursorHollow = 3;
}
message UpdateDiagnostics {
uint32 replica_id = 1;
uint32 lamport_timestamp = 2;
uint64 server_id = 3;
repeated Diagnostic diagnostics = 4;
}
message Anchor {
uint32 replica_id = 1;
uint32 timestamp = 2;
uint64 offset = 3;
Bias bias = 4;
optional uint64 buffer_id = 5;
}
message AnchorRange {
Anchor start = 1;
Anchor end = 2;
}
message Location {
uint64 buffer_id = 1;
Anchor start = 2;
Anchor end = 3;
}
enum Bias {
Left = 0;
Right = 1;
}
message Diagnostic {
Anchor start = 1;
Anchor end = 2;
optional string source = 3;
optional string registration_id = 17;
enum SourceKind {
Pulled = 0;
Pushed = 1;
Other = 2;
}
SourceKind source_kind = 16;
Severity severity = 4;
string message = 5;
optional string code = 6;
uint64 group_id = 7;
bool is_primary = 8;
reserved 9;
bool is_disk_based = 10;
bool is_unnecessary = 11;
bool underline = 15;
enum Severity {
None = 0;
Error = 1;
Warning = 2;
Information = 3;
Hint = 4;
}
optional string data = 12;
optional string code_description = 13;
optional string markdown = 14;
}
message SearchQuery {
string query = 2;
bool regex = 3;
bool whole_word = 4;
bool case_sensitive = 5;
repeated string files_to_include = 10;
repeated string files_to_exclude = 11;
bool match_full_paths = 9;
bool include_ignored = 8;
string files_to_include_legacy = 6;
string files_to_exclude_legacy = 7;
}
message FindSearchCandidates {
uint64 project_id = 1;
SearchQuery query = 2;
uint64 limit = 3;
uint64 handle = 4;
}
message FindSearchCandidatesDone {}
message FindSearchCandidatesMatches {
repeated uint64 buffer_ids = 1;
}
message FindSearchCandidatesChunk {
uint64 project_id = 1;
PeerId peer_id = 2;
uint64 handle = 3;
oneof variant {
FindSearchCandidatesMatches matches = 4;
FindSearchCandidatesDone done = 5;
}
}
message FindSearchCandidatesCancelled {
uint64 project_id = 1;
uint64 handle = 2;
}

View File

@@ -0,0 +1,440 @@
syntax = "proto3";
package zed.messages;
import "buffer.proto";
import "channel.proto";
import "core.proto";
import "git.proto";
import "lsp.proto";
import "worktree.proto";
message CreateRoom {}
message CreateRoomResponse {
Room room = 1;
optional LiveKitConnectionInfo live_kit_connection_info = 2;
}
message JoinRoom {
uint64 id = 1;
}
message JoinRoomResponse {
Room room = 1;
optional uint64 channel_id = 2;
optional LiveKitConnectionInfo live_kit_connection_info = 3;
}
message RejoinRoom {
uint64 id = 1;
repeated UpdateProject reshared_projects = 2;
repeated RejoinProject rejoined_projects = 3;
}
message RejoinRemoteProjects {
repeated RejoinProject rejoined_projects = 1;
}
message RejoinRemoteProjectsResponse {
repeated RejoinedProject rejoined_projects = 1;
}
message RejoinProject {
uint64 id = 1;
repeated RejoinWorktree worktrees = 2;
repeated RejoinRepository repositories = 3;
}
message RejoinWorktree {
uint64 id = 1;
uint64 scan_id = 2;
}
message RejoinRepository {
uint64 id = 1;
uint64 scan_id = 2;
}
message RejoinRoomResponse {
Room room = 1;
repeated ResharedProject reshared_projects = 2;
repeated RejoinedProject rejoined_projects = 3;
}
message ResharedProject {
uint64 id = 1;
repeated Collaborator collaborators = 2;
}
message RejoinedProject {
uint64 id = 1;
repeated WorktreeMetadata worktrees = 2;
repeated Collaborator collaborators = 3;
repeated LanguageServer language_servers = 4;
repeated string language_server_capabilities = 5;
}
message LeaveRoom {}
message Room {
uint64 id = 1;
repeated Participant participants = 2;
repeated PendingParticipant pending_participants = 3;
repeated Follower followers = 4;
string livekit_room = 5;
}
message Participant {
uint64 user_id = 1;
PeerId peer_id = 2;
repeated ParticipantProject projects = 3;
ParticipantLocation location = 4;
uint32 participant_index = 5;
ChannelRole role = 6;
reserved 7;
}
message PendingParticipant {
uint64 user_id = 1;
uint64 calling_user_id = 2;
optional uint64 initial_project_id = 3;
}
message ParticipantProject {
uint64 id = 1;
repeated string worktree_root_names = 2;
}
message Follower {
PeerId leader_id = 1;
PeerId follower_id = 2;
uint64 project_id = 3;
}
message ParticipantLocation {
oneof variant {
SharedProject shared_project = 1;
UnsharedProject unshared_project = 2;
External external = 3;
}
message SharedProject {
uint64 id = 1;
}
message UnsharedProject {}
message External {}
}
message Call {
uint64 room_id = 1;
uint64 called_user_id = 2;
optional uint64 initial_project_id = 3;
}
message IncomingCall {
uint64 room_id = 1;
uint64 calling_user_id = 2;
repeated uint64 participant_user_ids = 3;
optional ParticipantProject initial_project = 4;
}
message CallCanceled {
uint64 room_id = 1;
}
message CancelCall {
uint64 room_id = 1;
uint64 called_user_id = 2;
}
message DeclineCall {
uint64 room_id = 1;
}
message UpdateParticipantLocation {
uint64 room_id = 1;
ParticipantLocation location = 2;
}
message RoomUpdated {
Room room = 1;
}
message LiveKitConnectionInfo {
string server_url = 1;
string token = 2;
bool can_publish = 3;
}
message ShareProject {
uint64 room_id = 1;
repeated WorktreeMetadata worktrees = 2;
reserved 3;
bool is_ssh_project = 4;
optional bool windows_paths = 5;
repeated string features = 6;
}
message ShareProjectResponse {
uint64 project_id = 1;
}
message UnshareProject {
uint64 project_id = 1;
}
message UpdateProject {
uint64 project_id = 1;
repeated WorktreeMetadata worktrees = 2;
}
message JoinProject {
uint64 project_id = 1;
optional string committer_email = 2;
optional string committer_name = 3;
repeated string features = 4;
}
message JoinProjectResponse {
uint64 project_id = 5;
uint32 replica_id = 1;
repeated WorktreeMetadata worktrees = 2;
repeated Collaborator collaborators = 3;
repeated LanguageServer language_servers = 4;
repeated string language_server_capabilities = 8;
ChannelRole role = 6;
bool windows_paths = 9;
repeated string features = 10;
reserved 7;
}
message LeaveProject {
uint64 project_id = 1;
}
message UpdateWorktree {
uint64 project_id = 1;
uint64 worktree_id = 2;
string root_name = 3;
repeated Entry updated_entries = 4;
repeated uint64 removed_entries = 5;
repeated RepositoryEntry updated_repositories = 6; // deprecated
repeated uint64 removed_repositories = 7; // deprecated
uint64 scan_id = 8;
bool is_last_update = 9;
string abs_path = 10;
optional string root_repo_common_dir = 11;
}
// deprecated
message RepositoryEntry {
uint64 repository_id = 1;
reserved 2;
repeated StatusEntry updated_statuses = 3;
repeated string removed_statuses = 4;
repeated string current_merge_conflicts = 5;
optional Branch branch_summary = 6;
}
message AddProjectCollaborator {
uint64 project_id = 1;
Collaborator collaborator = 2;
}
message UpdateProjectCollaborator {
uint64 project_id = 1;
PeerId old_peer_id = 2;
PeerId new_peer_id = 3;
}
message RemoveProjectCollaborator {
uint64 project_id = 1;
PeerId peer_id = 2;
}
message GetUsers {
repeated uint64 user_ids = 1;
}
message FuzzySearchUsers {
string query = 1;
}
message UsersResponse {
repeated User users = 1;
}
message RequestContact {
uint64 responder_id = 1;
}
message RemoveContact {
uint64 user_id = 1;
}
message RespondToContactRequest {
uint64 requester_id = 1;
ContactRequestResponse response = 2;
}
enum ContactRequestResponse {
Accept = 0;
Decline = 1;
Block = 2;
Dismiss = 3;
}
message UpdateContacts {
repeated Contact contacts = 1;
repeated uint64 remove_contacts = 2;
repeated IncomingContactRequest incoming_requests = 3;
repeated uint64 remove_incoming_requests = 4;
repeated uint64 outgoing_requests = 5;
repeated uint64 remove_outgoing_requests = 6;
}
message ShowContacts {}
message IncomingContactRequest {
uint64 requester_id = 1;
}
message Follow {
uint64 room_id = 1;
optional uint64 project_id = 2;
PeerId leader_id = 3;
}
message FollowResponse {
View active_view = 3;
reserved 1;
repeated View views = 2;
}
message UpdateFollowers {
uint64 room_id = 1;
optional uint64 project_id = 2;
reserved 3;
oneof variant {
View create_view = 5;
UpdateActiveView update_active_view = 4;
UpdateView update_view = 6;
}
}
message Unfollow {
uint64 room_id = 1;
optional uint64 project_id = 2;
PeerId leader_id = 3;
}
message ViewId {
PeerId creator = 1;
uint64 id = 2;
}
message UpdateActiveView {
reserved 1, 2;
View view = 3;
}
enum PanelId {
AssistantPanel = 0;
DebugPanel = 1;
}
message UpdateView {
ViewId id = 1;
optional PeerId leader_id = 2;
oneof variant {
Editor editor = 3;
}
message Editor {
repeated ExcerptInsertion inserted_excerpts = 1;
repeated uint64 deleted_excerpts = 2;
repeated Selection selections = 3;
optional Selection pending_selection = 4;
EditorAnchor scroll_top_anchor = 5;
reserved 6;
reserved 7;
double scroll_x = 8;
double scroll_y = 9;
repeated PathExcerpts updated_paths = 10;
repeated uint64 deleted_buffers = 11;
}
}
message View {
ViewId id = 1;
optional PeerId leader_id = 2;
optional PanelId panel_id = 6;
oneof variant {
Editor editor = 3;
ChannelView channel_view = 4;
}
reserved 5;
message Editor {
bool singleton = 1;
optional string title = 2;
repeated Excerpt excerpts = 3;
repeated Selection selections = 4;
optional Selection pending_selection = 5;
EditorAnchor scroll_top_anchor = 6;
reserved 7;
reserved 8;
double scroll_x = 9;
double scroll_y = 10;
repeated PathExcerpts path_excerpts = 11;
}
message ChannelView {
uint64 channel_id = 1;
Editor editor = 2;
}
}
message ExcerptInsertion {
Excerpt excerpt = 1;
optional uint64 previous_excerpt_id = 2;
}
message Excerpt {
uint64 id = 1;
uint64 buffer_id = 2;
Anchor context_start = 3;
Anchor context_end = 4;
Anchor primary_start = 5;
Anchor primary_end = 6;
}
message ExcerptRange {
Anchor context_start = 1;
Anchor context_end = 2;
Anchor primary_start = 3;
Anchor primary_end = 4;
}
message PathExcerpts {
PathKey path_key = 1;
uint64 buffer_id = 2;
repeated ExcerptRange ranges = 3;
}
message Contact {
uint64 user_id = 1;
bool online = 2;
bool busy = 3;
}
message SetRoomParticipantRole {
uint64 room_id = 1;
uint64 user_id = 2;
ChannelRole role = 3;
}

View File

@@ -0,0 +1,294 @@
syntax = "proto3";
package zed.messages;
import "buffer.proto";
import "core.proto";
message Channel {
uint64 id = 1;
string name = 2;
ChannelVisibility visibility = 3;
int32 channel_order = 4;
repeated uint64 parent_path = 5;
}
enum ChannelVisibility {
Public = 0;
Members = 1;
}
message UpdateChannels {
repeated Channel channels = 1;
repeated uint64 delete_channels = 4;
repeated Channel channel_invitations = 5;
repeated uint64 remove_channel_invitations = 6;
repeated ChannelParticipants channel_participants = 7;
repeated ChannelBufferVersion latest_channel_buffer_versions = 9;
reserved 8;
reserved 10 to 15;
}
message UpdateUserChannels {
repeated ChannelBufferVersion observed_channel_buffer_version = 2;
repeated ChannelMembership channel_memberships = 3;
reserved 1;
}
message ChannelMembership {
uint64 channel_id = 1;
ChannelRole role = 2;
}
message ChannelMessageId {
uint64 channel_id = 1;
uint64 message_id = 2;
}
message ChannelPermission {
uint64 channel_id = 1;
ChannelRole role = 3;
}
message ChannelParticipants {
uint64 channel_id = 1;
repeated uint64 participant_user_ids = 2;
}
message JoinChannel {
uint64 channel_id = 1;
}
message DeleteChannel {
uint64 channel_id = 1;
}
message GetChannelMembers {
uint64 channel_id = 1;
string query = 2;
uint64 limit = 3;
}
message GetChannelMembersResponse {
repeated ChannelMember members = 1;
repeated User users = 2;
}
message ChannelMember {
uint64 user_id = 1;
Kind kind = 3;
ChannelRole role = 4;
enum Kind {
Member = 0;
Invitee = 1;
}
}
message SubscribeToChannels {}
message CreateChannel {
string name = 1;
optional uint64 parent_id = 2;
}
message CreateChannelResponse {
Channel channel = 1;
optional uint64 parent_id = 2;
}
message InviteChannelMember {
uint64 channel_id = 1;
uint64 user_id = 2;
ChannelRole role = 4;
}
message RemoveChannelMember {
uint64 channel_id = 1;
uint64 user_id = 2;
}
enum ChannelRole {
Admin = 0;
Member = 1;
Guest = 2;
Banned = 3;
Talker = 4;
}
message SetChannelMemberRole {
uint64 channel_id = 1;
uint64 user_id = 2;
ChannelRole role = 3;
}
message SetChannelVisibility {
uint64 channel_id = 1;
ChannelVisibility visibility = 2;
}
message RenameChannel {
uint64 channel_id = 1;
string name = 2;
}
message RenameChannelResponse {
Channel channel = 1;
}
message JoinChannelChat {
uint64 channel_id = 1;
}
message JoinChannelChatResponse {
repeated ChannelMessage messages = 1;
bool done = 2;
}
message LeaveChannelChat {
uint64 channel_id = 1;
}
message SendChannelMessage {
uint64 channel_id = 1;
string body = 2;
Nonce nonce = 3;
repeated ChatMention mentions = 4;
optional uint64 reply_to_message_id = 5;
}
message RemoveChannelMessage {
uint64 channel_id = 1;
uint64 message_id = 2;
}
message UpdateChannelMessage {
uint64 channel_id = 1;
uint64 message_id = 2;
Nonce nonce = 4;
string body = 5;
repeated ChatMention mentions = 6;
}
message AckChannelMessage {
uint64 channel_id = 1;
uint64 message_id = 2;
}
message SendChannelMessageResponse {
ChannelMessage message = 1;
}
message ChannelMessageSent {
uint64 channel_id = 1;
ChannelMessage message = 2;
}
message ChannelMessageUpdate {
uint64 channel_id = 1;
ChannelMessage message = 2;
}
message GetChannelMessages {
uint64 channel_id = 1;
uint64 before_message_id = 2;
}
message GetChannelMessagesResponse {
repeated ChannelMessage messages = 1;
bool done = 2;
}
message GetChannelMessagesById {
repeated uint64 message_ids = 1;
}
message MoveChannel {
uint64 channel_id = 1;
uint64 to = 2;
}
message ReorderChannel {
uint64 channel_id = 1;
enum Direction {
Up = 0;
Down = 1;
}
Direction direction = 2;
}
message JoinChannelBuffer {
uint64 channel_id = 1;
}
message ChannelBufferVersion {
uint64 channel_id = 1;
repeated VectorClockEntry version = 2;
uint64 epoch = 3;
}
message UpdateChannelBufferCollaborators {
uint64 channel_id = 1;
repeated Collaborator collaborators = 2;
}
message UpdateChannelBuffer {
uint64 channel_id = 1;
repeated Operation operations = 2;
}
message ChannelMessage {
uint64 id = 1;
string body = 2;
uint64 timestamp = 3;
uint64 sender_id = 4;
Nonce nonce = 5;
repeated ChatMention mentions = 6;
optional uint64 reply_to_message_id = 7;
optional uint64 edited_at = 8;
}
message ChatMention {
Range range = 1;
uint64 user_id = 2;
}
message RejoinChannelBuffers {
repeated ChannelBufferVersion buffers = 1;
}
message RejoinChannelBuffersResponse {
repeated RejoinedChannelBuffer buffers = 1;
}
message AckBufferOperation {
uint64 buffer_id = 1;
uint64 epoch = 2;
repeated VectorClockEntry version = 3;
}
message JoinChannelBufferResponse {
uint64 buffer_id = 1;
uint32 replica_id = 2;
string base_text = 3;
repeated Operation operations = 4;
repeated Collaborator collaborators = 5;
uint64 epoch = 6;
}
message RejoinedChannelBuffer {
uint64 channel_id = 1;
repeated VectorClockEntry version = 2;
repeated Operation operations = 3;
repeated Collaborator collaborators = 4;
}
message LeaveChannelBuffer {
uint64 channel_id = 1;
}
message RespondToChannelInvite {
uint64 channel_id = 1;
bool accept = 2;
}

View File

@@ -0,0 +1,29 @@
syntax = "proto3";
package zed.messages;
message PeerId {
uint32 owner_id = 1;
uint32 id = 2;
}
message User {
reserved 4;
uint64 id = 1;
string github_login = 2;
string avatar_url = 3;
optional string name = 5;
}
message Nonce {
uint64 upper_half = 1;
uint64 lower_half = 2;
}
message Collaborator {
PeerId peer_id = 1;
uint32 replica_id = 2;
uint64 user_id = 3;
bool is_host = 4;
optional string committer_name = 5;
optional string committer_email = 6;
}

View File

@@ -0,0 +1,553 @@
syntax = "proto3";
package zed.messages;
import "buffer.proto";
import "task.proto";
enum BreakpointState {
Enabled = 0;
Disabled = 1;
}
message Breakpoint {
Anchor position = 1;
BreakpointState state = 2;
reserved 3;
optional string message = 4;
optional string condition = 5;
optional string hit_condition = 6;
map<uint64, BreakpointSessionState> session_state = 7;
}
message BreakpointSessionState {
uint64 id = 1;
bool verified = 2;
}
message BreakpointsForFile {
uint64 project_id = 1;
string path = 2;
repeated Breakpoint breakpoints = 3;
}
message ToggleBreakpoint {
uint64 project_id = 1;
string path = 2;
Breakpoint breakpoint = 3;
}
enum DapThreadStatus {
Running = 0;
Stopped = 1;
Exited = 2;
Ended = 3;
}
enum VariablesArgumentsFilter {
Indexed = 0;
Named = 1;
}
message ValueFormat {
optional bool hex = 1;
}
message VariablesRequest {
uint64 project_id = 1;
uint64 client_id = 2;
uint64 variables_reference = 3;
optional VariablesArgumentsFilter filter = 4;
optional uint64 start = 5;
optional uint64 count = 6;
optional ValueFormat format = 7;
}
enum SteppingGranularity {
Statement = 0;
Line = 1;
Instruction = 2;
}
message DapLocationsRequest {
uint64 project_id = 1;
uint64 session_id = 2;
uint64 location_reference = 3;
}
message DapLocationsResponse {
DapSource source = 1;
uint64 line = 2;
optional uint64 column = 3;
optional uint64 end_line = 4;
optional uint64 end_column = 5;
}
enum DapEvaluateContext {
Repl = 0;
Watch = 1;
Hover = 2;
Clipboard = 3;
EvaluateVariables = 4;
EvaluateUnknown = 5;
}
message DapEvaluateRequest {
uint64 project_id = 1;
uint64 client_id = 2;
string expression = 3;
optional uint64 frame_id = 4;
optional DapEvaluateContext context = 5;
}
message DapEvaluateResponse {
string result = 1;
optional string evaluate_type = 2;
uint64 variable_reference = 3;
optional uint64 named_variables = 4;
optional uint64 indexed_variables = 5;
optional string memory_reference = 6;
}
message DapCompletionRequest {
uint64 project_id = 1;
uint64 client_id = 2;
string query = 3;
optional uint64 frame_id = 4;
optional uint64 line = 5;
uint64 column = 6;
}
enum DapCompletionItemType {
Method = 0;
Function = 1;
Constructor = 2;
Field = 3;
Variable = 4;
Class = 5;
Interface = 6;
Module = 7;
Property = 8;
Unit = 9;
Value = 10;
Enum = 11;
Keyword = 12;
Snippet = 13;
Text = 14;
Color = 15;
CompletionItemFile = 16;
Reference = 17;
Customcolor = 19;
}
message DapCompletionItem {
string label = 1;
optional string text = 2;
optional string sort_text = 3;
optional string detail = 4;
optional DapCompletionItemType typ = 5;
optional uint64 start = 6;
optional uint64 length = 7;
optional uint64 selection_start = 8;
optional uint64 selection_length = 9;
}
message DapCompletionResponse {
uint64 client_id = 1;
repeated DapCompletionItem completions = 2;
}
message DapScopesRequest {
uint64 project_id = 1;
uint64 client_id = 2;
uint64 stack_frame_id = 3;
}
message DapScopesResponse {
repeated DapScope scopes = 1;
}
message DapSetVariableValueRequest {
uint64 project_id = 1;
uint64 client_id = 2;
string name = 3;
string value = 4;
uint64 variables_reference = 5;
}
message DapSetVariableValueResponse {
uint64 client_id = 1;
string value = 2;
optional string variable_type = 3;
optional uint64 variables_reference = 4;
optional uint64 named_variables = 5;
optional uint64 indexed_variables = 6;
optional string memory_reference = 7;
}
message DapPauseRequest {
uint64 project_id = 1;
uint64 client_id = 2;
int64 thread_id = 3;
}
message DapDisconnectRequest {
uint64 project_id = 1;
uint64 client_id = 2;
optional bool restart = 3;
optional bool terminate_debuggee = 4;
optional bool suspend_debuggee = 5;
}
message DapTerminateThreadsRequest {
uint64 project_id = 1;
uint64 client_id = 2;
repeated int64 thread_ids = 3;
}
message DapThreadsRequest {
uint64 project_id = 1;
uint64 client_id = 2;
}
message DapThreadsResponse {
repeated DapThread threads = 1;
}
message DapTerminateRequest {
uint64 project_id = 1;
uint64 client_id = 2;
optional bool restart = 3;
}
message DapRestartRequest {
uint64 project_id = 1;
uint64 client_id = 2;
bytes raw_args = 3;
}
message DapRestartStackFrameRequest {
uint64 project_id = 1;
uint64 client_id = 2;
uint64 stack_frame_id = 3;
}
message ToggleIgnoreBreakpoints {
uint64 project_id = 1;
uint32 session_id = 2;
}
message IgnoreBreakpointState {
uint64 project_id = 1;
uint64 session_id = 2;
bool ignore = 3;
}
message DapNextRequest {
uint64 project_id = 1;
uint64 client_id = 2;
int64 thread_id = 3;
optional bool single_thread = 4;
optional SteppingGranularity granularity = 5;
}
message DapStepInRequest {
uint64 project_id = 1;
uint64 client_id = 2;
int64 thread_id = 3;
optional uint64 target_id = 4;
optional bool single_thread = 5;
optional SteppingGranularity granularity = 6;
}
message DapStepOutRequest {
uint64 project_id = 1;
uint64 client_id = 2;
int64 thread_id = 3;
optional bool single_thread = 4;
optional SteppingGranularity granularity = 5;
}
message DapStepBackRequest {
uint64 project_id = 1;
uint64 client_id = 2;
int64 thread_id = 3;
optional bool single_thread = 4;
optional SteppingGranularity granularity = 5;
}
message DapContinueRequest {
uint64 project_id = 1;
uint64 client_id = 2;
int64 thread_id = 3;
optional bool single_thread = 4;
}
message DapContinueResponse {
uint64 client_id = 1;
optional bool all_threads_continued = 2;
}
message DapModulesRequest {
uint64 project_id = 1;
uint64 client_id = 2;
}
message DapModulesResponse {
uint64 client_id = 1;
repeated DapModule modules = 2;
}
message DapLoadedSourcesRequest {
uint64 project_id = 1;
uint64 client_id = 2;
}
message DapLoadedSourcesResponse {
uint64 client_id = 1;
repeated DapSource sources = 2;
}
message DapStackTraceRequest {
uint64 project_id = 1;
uint64 client_id = 2;
int64 thread_id = 3;
optional uint64 start_frame = 4;
optional uint64 stack_trace_levels = 5;
}
message DapStackTraceResponse {
repeated DapStackFrame frames = 1;
}
message DapStackFrame {
uint64 id = 1;
string name = 2;
optional DapSource source = 3;
uint64 line = 4;
uint64 column = 5;
optional uint64 end_line = 6;
optional uint64 end_column = 7;
optional bool can_restart = 8;
optional string instruction_pointer_reference = 9;
optional DapModuleId module_id = 10;
optional DapStackPresentationHint presentation_hint = 11;
}
message DebuggerLoadedSourceList {
uint64 client_id = 1;
repeated DapSource sources = 2;
}
message DapVariables {
uint64 client_id = 1;
repeated DapVariable variables = 2;
}
// Remote Debugging: Dap Types
message DapVariable {
string name = 1;
string value = 2;
optional string type = 3;
// optional DapVariablePresentationHint presentation_hint = 4;
optional string evaluate_name = 5;
uint64 variables_reference = 6;
optional uint64 named_variables = 7;
optional uint64 indexed_variables = 8;
optional string memory_reference = 9;
}
message DapThread {
int64 id = 1;
string name = 2;
}
message DapScope {
string name = 1;
optional DapScopePresentationHint presentation_hint = 2;
uint64 variables_reference = 3;
optional uint64 named_variables = 4;
optional uint64 indexed_variables = 5;
bool expensive = 6;
optional DapSource source = 7;
optional uint64 line = 8;
optional uint64 column = 9;
optional uint64 end_line = 10;
optional uint64 end_column = 11;
}
message DapSource {
optional string name = 1;
optional string path = 2;
optional uint64 source_reference = 3;
optional DapSourcePresentationHint presentation_hint = 4;
optional string origin = 5;
repeated DapSource sources = 6;
optional bytes adapter_data = 7;
repeated DapChecksum checksums = 8;
}
enum DapOutputCategory {
ConsoleOutput = 0;
Important = 1;
Stdout = 2;
Stderr = 3;
Unknown = 4;
}
enum DapOutputEventGroup {
Start = 0;
StartCollapsed = 1;
End = 2;
}
message DapOutputEvent {
string output = 1;
optional DapOutputCategory category = 2;
optional uint64 variables_reference = 3;
optional DapOutputEventGroup group = 4;
optional DapSource source = 5;
optional uint32 line = 6;
optional uint32 column = 7;
}
enum DapChecksumAlgorithm {
CHECKSUM_ALGORITHM_UNSPECIFIED = 0;
MD5 = 1;
SHA1 = 2;
SHA256 = 3;
TIMESTAMP = 4;
}
message DapChecksum {
DapChecksumAlgorithm algorithm = 1;
string checksum = 2;
}
enum DapScopePresentationHint {
Arguments = 0;
Locals = 1;
Registers = 2;
ReturnValue = 3;
ScopeUnknown = 4;
}
enum DapSourcePresentationHint {
SourceNormal = 0;
Emphasize = 1;
Deemphasize = 2;
SourceUnknown = 3;
}
enum DapStackPresentationHint {
StackNormal = 0;
Label = 1;
Subtle = 2;
StackUnknown = 3;
}
message DapModule {
DapModuleId id = 1;
string name = 2;
optional string path = 3;
optional bool is_optimized = 4;
optional bool is_user_code = 5;
optional string version = 6;
optional string symbol_status = 7;
optional string symbol_file_path = 8;
optional string date_time_stamp = 9;
optional string address_range = 10;
}
message DebugTaskDefinition {
string adapter = 1;
string label = 2;
string config = 3;
optional TcpHost tcp_connection = 4;
}
message TcpHost {
optional uint32 port = 1;
optional string host = 2;
optional uint64 timeout = 3;
}
message DebugLaunchRequest {
string program = 1;
optional string cwd = 2;
repeated string args = 3;
map<string, string> env = 4;
}
message DebugAttachRequest {
uint32 process_id = 1;
}
message DapModuleId {
oneof id {
uint32 number = 1;
string string = 2;
}
}
message GetDebugAdapterBinary {
uint64 project_id = 1;
uint64 session_id = 3;
DebugTaskDefinition definition = 2;
uint64 worktree_id = 4;
}
message DebugAdapterBinary {
optional string command = 1;
repeated string arguments = 2;
map<string, string> envs = 3;
optional string cwd = 4;
optional TcpHost connection = 5;
string configuration = 7;
LaunchType launch_type = 8;
enum LaunchType {
Attach = 0;
Launch = 1;
}
}
message RunDebugLocators {
uint64 project_id = 1;
SpawnInTerminal build_command = 2;
string locator = 3;
}
message DebugRequest {
oneof request {
DebugLaunchRequest debug_launch_request = 1;
DebugAttachRequest debug_attach_request = 2;
}
}
message DebugScenario {
string label = 1;
string adapter = 2;
reserved 3;
DebugRequest request = 4;
optional TcpHost connection = 5;
optional bool stop_on_entry = 6;
optional string configuration = 7;
}
message LogToDebugConsole {
uint64 project_id = 1;
uint64 session_id = 2;
string message = 3;
}
message GetProcesses {
uint64 project_id = 1;
}
message GetProcessesResponse {
repeated ProcessInfo processes = 1;
}
message ProcessInfo {
uint32 pid = 1;
string name = 2;
repeated string command = 3;
}

View File

@@ -0,0 +1,36 @@
syntax = "proto3";
package zed.messages;
import "core.proto";
import "worktree.proto";
message DownloadFileByPath {
uint64 project_id = 1;
uint64 worktree_id = 2;
string path = 3;
uint64 file_id = 4;
}
message DownloadFileResponse {
uint64 file_id = 1;
}
message CreateFileForPeer {
uint64 project_id = 1;
PeerId peer_id = 2;
oneof variant {
FileState state = 3;
FileChunk chunk = 4;
}
}
message FileState {
uint64 id = 1;
optional File file = 2;
uint64 content_size = 3;
}
message FileChunk {
uint64 file_id = 1;
bytes data = 2;
}

View File

@@ -0,0 +1,743 @@
syntax = "proto3";
package zed.messages;
import "buffer.proto";
import "worktree.proto";
message GitBranchesResponse {
repeated Branch branches = 1;
}
message UpdateDiffBases {
uint64 project_id = 1;
uint64 buffer_id = 2;
enum Mode {
// No collaborator is using the unstaged diff.
HEAD_ONLY = 0;
// No collaborator is using the diff from HEAD.
INDEX_ONLY = 1;
// Both the unstaged and uncommitted diffs are demanded,
// and the contents of the index and HEAD are the same for this path.
INDEX_MATCHES_HEAD = 2;
// Both the unstaged and uncommitted diffs are demanded,
// and the contents of the index and HEAD differ for this path,
// where None means the path doesn't exist in that state of the repo.
INDEX_AND_HEAD = 3;
}
optional string staged_text = 3;
optional string committed_text = 4;
Mode mode = 5;
}
message OpenUnstagedDiff {
uint64 project_id = 1;
uint64 buffer_id = 2;
}
message OpenUnstagedDiffResponse {
optional string staged_text = 1;
}
message OpenUncommittedDiff {
uint64 project_id = 1;
uint64 buffer_id = 2;
}
message OpenUncommittedDiffResponse {
enum Mode {
INDEX_MATCHES_HEAD = 0;
INDEX_AND_HEAD = 1;
}
optional string staged_text = 1;
optional string committed_text = 2;
Mode mode = 3;
}
message SetIndexText {
uint64 project_id = 1;
reserved 2;
uint64 repository_id = 3;
string path = 4;
optional string text = 5;
}
message GetPermalinkToLine {
uint64 project_id = 1;
uint64 buffer_id = 2;
Range selection = 3;
}
message GetPermalinkToLineResponse {
string permalink = 1;
}
message Branch {
bool is_head = 1;
string ref_name = 2;
optional uint64 unix_timestamp = 3;
optional GitUpstream upstream = 4;
optional CommitSummary most_recent_commit = 5;
}
message GitUpstream {
string ref_name = 1;
optional UpstreamTracking tracking = 2;
}
message UpstreamTracking {
uint64 ahead = 1;
uint64 behind = 2;
}
message CommitSummary {
string sha = 1;
string subject = 2;
int64 commit_timestamp = 3;
string author_name = 4;
}
message GitBranches {
uint64 project_id = 1;
ProjectPath repository = 2;
}
message UpdateGitBranch {
uint64 project_id = 1;
string branch_name = 2;
ProjectPath repository = 3;
}
message UpdateRepository {
uint64 project_id = 1;
uint64 id = 2;
string abs_path = 3;
repeated uint64 entry_ids = 4;
optional Branch branch_summary = 5;
repeated StatusEntry updated_statuses = 6;
repeated string removed_statuses = 7;
repeated string current_merge_conflicts = 8;
uint64 scan_id = 9;
bool is_last_update = 10;
optional GitCommitDetails head_commit_details = 11;
optional string merge_message = 12;
repeated StashEntry stash_entries = 13;
optional string remote_upstream_url = 14;
optional string remote_origin_url = 15;
reserved 16;
repeated Worktree linked_worktrees = 17;
repeated Branch branch_list = 18;
optional string repository_dir_abs_path = 19;
optional string common_dir_abs_path = 20;
}
message RemoveRepository {
uint64 project_id = 1;
uint64 id = 2;
}
enum GitStatus {
Added = 0;
Modified = 1;
Conflict = 2;
Deleted = 3;
Updated = 4;
TypeChanged = 5;
Renamed = 6;
Copied = 7;
Unmodified = 8;
}
message GitFileStatus {
oneof variant {
Untracked untracked = 1;
Ignored ignored = 2;
Unmerged unmerged = 3;
Tracked tracked = 4;
}
message Untracked {}
message Ignored {}
message Unmerged {
GitStatus first_head = 1;
GitStatus second_head = 2;
}
message Tracked {
GitStatus index_status = 1;
GitStatus worktree_status = 2;
}
}
message GitGetBranches {
uint64 project_id = 1;
reserved 2;
uint64 repository_id = 3;
}
message GitCreateBranch {
uint64 project_id = 1;
reserved 2;
uint64 repository_id = 3;
string branch_name = 4;
optional string base_branch = 5;
}
message GitChangeBranch {
uint64 project_id = 1;
reserved 2;
uint64 repository_id = 3;
string branch_name = 4;
}
message GitRenameBranch {
uint64 project_id = 1;
uint64 repository_id = 2;
string branch = 3;
string new_name = 4;
}
message GitCreateRemote {
uint64 project_id = 1;
uint64 repository_id = 2;
string remote_name = 3;
string remote_url = 4;
}
message GitRemoveRemote {
uint64 project_id = 1;
uint64 repository_id = 2;
string remote_name = 3;
}
message GitDeleteBranch {
uint64 project_id = 1;
uint64 repository_id = 2;
string branch_name = 3;
bool is_remote = 4;
bool force = 5;
}
message GitDiff {
uint64 project_id = 1;
reserved 2;
uint64 repository_id = 3;
DiffType diff_type = 4;
optional string merge_base_ref = 5;
enum DiffType {
HEAD_TO_WORKTREE = 0;
HEAD_TO_INDEX = 1;
MERGE_BASE = 2;
}
}
message GitDiffResponse {
string diff = 1;
}
message GitInit {
uint64 project_id = 1;
string abs_path = 2;
string fallback_branch_name = 3;
}
message GitClone {
uint64 project_id = 1;
string abs_path = 2;
string remote_repo = 3;
}
message GitCloneResponse {
bool success = 1;
}
message CheckForPushedCommits {
uint64 project_id = 1;
reserved 2;
uint64 repository_id = 3;
}
message CheckForPushedCommitsResponse {
repeated string pushed_to = 1;
}
message GitShow {
uint64 project_id = 1;
reserved 2;
uint64 repository_id = 3;
string commit = 4;
}
message GitCommitDetails {
string sha = 1;
string message = 2;
int64 commit_timestamp = 3;
string author_email = 4;
string author_name = 5;
}
message LoadCommitDiff {
uint64 project_id = 1;
reserved 2;
uint64 repository_id = 3;
string commit = 4;
}
message LoadCommitDiffResponse {
repeated CommitFile files = 1;
}
message CommitFile {
string path = 1;
optional string old_text = 2;
optional string new_text = 3;
bool is_binary = 4;
}
message GitReset {
uint64 project_id = 1;
reserved 2;
uint64 repository_id = 3;
string commit = 4;
ResetMode mode = 5;
enum ResetMode {
SOFT = 0;
MIXED = 1;
}
}
message GitCheckoutFiles {
uint64 project_id = 1;
reserved 2;
uint64 repository_id = 3;
string commit = 4;
repeated string paths = 5;
}
// Move to `git.proto` once collab's min version is >=0.171.0.
message StatusEntry {
string repo_path = 1;
// Can be removed once collab's min version is >=0.171.0.
GitStatus simple_status = 2;
GitFileStatus status = 3;
optional uint32 diff_stat_added = 4;
optional uint32 diff_stat_deleted = 5;
}
message StashEntry {
bytes oid = 1;
string message = 2;
optional string branch = 3;
uint64 index = 4;
int64 timestamp = 5;
}
message Stage {
uint64 project_id = 1;
reserved 2;
uint64 repository_id = 3;
repeated string paths = 4;
}
message Unstage {
uint64 project_id = 1;
reserved 2;
uint64 repository_id = 3;
repeated string paths = 4;
}
message Stash {
uint64 project_id = 1;
uint64 repository_id = 2;
repeated string paths = 3;
}
message StashPop {
uint64 project_id = 1;
uint64 repository_id = 2;
optional uint64 stash_index = 3;
}
message StashApply {
uint64 project_id = 1;
uint64 repository_id = 2;
optional uint64 stash_index = 3;
}
message StashDrop {
uint64 project_id = 1;
uint64 repository_id = 2;
optional uint64 stash_index = 3;
}
message Commit {
uint64 project_id = 1;
reserved 2;
uint64 repository_id = 3;
optional string name = 4;
optional string email = 5;
string message = 6;
optional CommitOptions options = 7;
reserved 8;
uint64 askpass_id = 9;
message CommitOptions {
bool amend = 1;
bool signoff = 2;
bool allow_empty = 3;
}
}
message OpenCommitMessageBuffer {
uint64 project_id = 1;
reserved 2;
uint64 repository_id = 3;
}
message Push {
uint64 project_id = 1;
reserved 2;
uint64 repository_id = 3;
string remote_name = 4;
string branch_name = 5;
optional PushOptions options = 6;
uint64 askpass_id = 7;
string remote_branch_name = 8;
enum PushOptions {
SET_UPSTREAM = 0;
FORCE = 1;
}
}
message Fetch {
uint64 project_id = 1;
reserved 2;
uint64 repository_id = 3;
uint64 askpass_id = 4;
optional string remote = 5;
}
message GetRemotes {
uint64 project_id = 1;
reserved 2;
uint64 repository_id = 3;
optional string branch_name = 4;
bool is_push = 5;
}
message GetRemotesResponse {
repeated Remote remotes = 1;
message Remote {
string name = 1;
}
}
message Pull {
uint64 project_id = 1;
reserved 2;
uint64 repository_id = 3;
string remote_name = 4;
optional string branch_name = 5;
uint64 askpass_id = 6;
bool rebase = 7;
}
message RemoteMessageResponse {
string stdout = 1;
string stderr = 2;
}
message BlameBuffer {
uint64 project_id = 1;
uint64 buffer_id = 2;
repeated VectorClockEntry version = 3;
}
message BlameEntry {
bytes sha = 1;
uint32 start_line = 2;
uint32 end_line = 3;
uint32 original_line_number = 4;
optional string author = 5;
optional string author_mail = 6;
optional int64 author_time = 7;
optional string author_tz = 8;
optional string committer = 9;
optional string committer_mail = 10;
optional int64 committer_time = 11;
optional string committer_tz = 12;
optional string summary = 13;
optional string previous = 14;
string filename = 15;
}
message CommitMessage {
bytes oid = 1;
string message = 2;
}
message CommitPermalink {
bytes oid = 1;
string permalink = 2;
}
message BlameBufferResponse {
message BlameResponse {
repeated BlameEntry entries = 1;
repeated CommitMessage messages = 2;
reserved 3;
reserved 4;
}
optional BlameResponse blame_response = 5;
reserved 1 to 4;
}
message GetDefaultBranch {
uint64 project_id = 1;
uint64 repository_id = 2;
}
message GetDefaultBranchResponse {
optional string branch = 1;
}
message GetTreeDiff {
uint64 project_id = 1;
uint64 repository_id = 2;
bool is_merge = 3;
string base = 4;
string head = 5;
}
message GetTreeDiffResponse {
repeated TreeDiffStatus entries = 1;
}
message TreeDiffStatus {
enum Status {
ADDED = 0;
MODIFIED = 1;
DELETED = 2;
}
Status status = 1;
string path = 2;
optional string oid = 3;
}
message GetBlobContent {
uint64 project_id = 1;
uint64 repository_id = 2;
string oid = 3;
}
message GetBlobContentResponse {
string content = 1;
}
message GitGetWorktrees {
uint64 project_id = 1;
uint64 repository_id = 2;
}
message GitGetHeadSha {
uint64 project_id = 1;
uint64 repository_id = 2;
}
message GitGetHeadShaResponse {
optional string sha = 1;
}
message GitEditRef {
uint64 project_id = 1;
uint64 repository_id = 2;
string ref_name = 3;
oneof action {
string update_to_commit = 4;
DeleteRef delete = 5;
}
message DeleteRef {}
}
message GitRepairWorktrees {
uint64 project_id = 1;
uint64 repository_id = 2;
}
message GitWorktreesResponse {
repeated Worktree worktrees = 1;
}
message Worktree {
string path = 1;
string ref_name = 2;
string sha = 3;
bool is_main = 4;
bool is_bare = 5;
}
message GitCreateWorktree {
uint64 project_id = 1;
uint64 repository_id = 2;
string name = 3;
string directory = 4;
optional string commit = 5;
bool use_existing_branch = 6;
}
message GitCreateCheckpoint {
uint64 project_id = 1;
uint64 repository_id = 2;
}
message GitCreateCheckpointResponse {
bytes commit_sha = 1;
}
message GitCreateArchiveCheckpoint {
uint64 project_id = 1;
uint64 repository_id = 2;
}
message GitCreateArchiveCheckpointResponse {
string staged_commit_sha = 1;
string unstaged_commit_sha = 2;
}
message GitRestoreCheckpoint {
uint64 project_id = 1;
uint64 repository_id = 2;
bytes commit_sha = 3;
}
message GitRestoreArchiveCheckpoint {
uint64 project_id = 1;
uint64 repository_id = 2;
string staged_commit_sha = 3;
string unstaged_commit_sha = 4;
}
message GitCompareCheckpoints {
uint64 project_id = 1;
uint64 repository_id = 2;
bytes left_commit_sha = 3;
bytes right_commit_sha = 4;
}
message GitCompareCheckpointsResponse {
bool equal = 1;
}
message GitDiffCheckpoints {
uint64 project_id = 1;
uint64 repository_id = 2;
bytes base_commit_sha = 3;
bytes target_commit_sha = 4;
}
message GitDiffCheckpointsResponse {
string diff = 1;
}
message GitRemoveWorktree {
uint64 project_id = 1;
uint64 repository_id = 2;
string path = 3;
bool force = 4;
}
message GitRenameWorktree {
uint64 project_id = 1;
uint64 repository_id = 2;
string old_path = 3;
string new_path = 4;
}
message RunGitHook {
enum GitHook {
PRE_COMMIT = 0;
reserved 1;
}
uint64 project_id = 1;
uint64 repository_id = 2;
GitHook hook = 3;
}
message GetCommitData {
uint64 project_id = 1;
uint64 repository_id = 2;
repeated string shas = 3;
}
message CommitData {
string sha = 1;
repeated string parents = 2;
string author_name = 3;
string author_email = 4;
int64 commit_timestamp = 5;
string subject = 6;
string message = 7;
}
message GetCommitDataResponse {
repeated CommitData commits = 1;
}
message GitLogSourceAll {}
message GitLogSource {
oneof source {
GitLogSourceAll all = 1;
string branch = 2;
string sha = 3;
string path = 4;
}
}
message GetInitialGraphData {
uint64 project_id = 1;
uint64 repository_id = 2;
GitLogSource log_source = 3;
enum LogOrder {
DATE_ORDER = 0;
TOPO_ORDER = 1;
AUTHOR_DATE_ORDER = 2;
REVERSE_CHRONOLOGICAL = 3;
}
LogOrder log_order = 4;
}
message InitialGraphCommit {
string sha = 1;
repeated string parents = 2;
repeated string ref_names = 3;
}
message GetInitialGraphDataResponse {
repeated InitialGraphCommit commits = 1;
}
message SearchCommits {
uint64 project_id = 1;
uint64 repository_id = 2;
GitLogSource log_source = 3;
string query = 4;
bool case_sensitive = 5;
}
message SearchCommitsResponse {
repeated string shas = 1;
}

View File

@@ -0,0 +1,36 @@
syntax = "proto3";
package zed.messages;
import "core.proto";
import "worktree.proto";
message OpenImageByPath {
uint64 project_id = 1;
uint64 worktree_id = 2;
string path = 3;
}
message OpenImageResponse {
uint64 image_id = 1;
}
message CreateImageForPeer {
uint64 project_id = 1;
PeerId peer_id = 2;
oneof variant {
ImageState state = 3;
ImageChunk chunk = 4;
}
}
message ImageState {
uint64 id = 1;
optional File file = 2;
uint64 content_size = 3;
string format = 4; // e.g., "png", "jpeg", "webp", etc.
}
message ImageChunk {
uint64 image_id = 1;
bytes data = 2;
}

1020
crates/proto/proto/lsp.proto Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,37 @@
syntax = "proto3";
package zed.messages;
message GetNotifications {
optional uint64 before_id = 1;
}
message AddNotification {
Notification notification = 1;
}
message GetNotificationsResponse {
repeated Notification notifications = 1;
bool done = 2;
}
message DeleteNotification {
uint64 notification_id = 1;
}
message UpdateNotification {
Notification notification = 1;
}
message MarkNotificationRead {
uint64 notification_id = 1;
}
message Notification {
uint64 id = 1;
uint64 timestamp = 2;
string kind = 3;
optional uint64 entity_id = 4;
string content = 5;
bool is_read = 6;
optional bool response = 7;
}

View File

@@ -0,0 +1,60 @@
syntax = "proto3";
package zed.messages;
import "buffer.proto";
message TaskContextForLocation {
uint64 project_id = 1;
Location location = 2;
map<string, string> task_variables = 3;
}
message TaskContext {
optional string cwd = 1;
map<string, string> task_variables = 2;
map<string, string> project_env = 3;
}
message Shell {
message WithArguments {
string program = 1;
repeated string args = 2;
}
oneof shell_type {
System system = 1;
string program = 2;
WithArguments with_arguments = 3;
}
}
message System {}
enum RevealStrategy {
RevealAlways = 0;
RevealNever = 1;
}
enum HideStrategy {
HideAlways = 0;
HideNever = 1;
HideOnSuccess = 2;
}
message SpawnInTerminal {
string label = 1;
optional string command = 2;
repeated string args = 3;
map<string, string> env = 4;
optional string cwd = 5;
}
message GetDirectoryEnvironment {
uint64 project_id = 1;
Shell shell = 2;
string directory = 3;
}
message DirectoryEnvironment {
map<string, string> environment = 1;
}

View File

@@ -0,0 +1,59 @@
syntax = "proto3";
package zed.messages;
message ListToolchains {
uint64 project_id = 1;
uint64 worktree_id = 2;
string language_name = 3;
optional string path = 4;
}
message Toolchain {
string name = 1;
string path = 2;
string raw_json = 3;
}
message ToolchainGroup {
uint64 start_index = 1;
string name = 2;
}
message ListToolchainsResponse {
repeated Toolchain toolchains = 1;
bool has_values = 2;
repeated ToolchainGroup groups = 3;
optional string relative_worktree_path = 4;
}
message ActivateToolchain {
uint64 project_id = 1;
uint64 worktree_id = 2;
Toolchain toolchain = 3;
string language_name = 4;
optional string path = 5;
}
message ActiveToolchain {
uint64 project_id = 1;
uint64 worktree_id = 2;
string language_name = 3;
optional string path = 4;
}
message ActiveToolchainResponse {
optional Toolchain toolchain = 1;
}
message ResolveToolchain {
uint64 project_id = 1;
string abs_path = 2;
string language_name = 3;
}
message ResolveToolchainResponse {
oneof response {
Toolchain toolchain = 1;
string error = 2;
}
}

View File

@@ -0,0 +1,196 @@
syntax = "proto3";
package zed.messages;
message Timestamp {
uint64 seconds = 1;
uint32 nanos = 2;
}
message File {
uint64 worktree_id = 1;
optional uint64 entry_id = 2;
string path = 3;
Timestamp mtime = 4;
bool is_deleted = 5;
bool is_historic = 6;
}
message Entry {
uint64 id = 1;
bool is_dir = 2;
string path = 3;
uint64 inode = 4;
Timestamp mtime = 5;
bool is_ignored = 7;
bool is_external = 8;
reserved 6;
reserved 9;
bool is_fifo = 10;
optional uint64 size = 11;
optional string canonical_path = 12;
bool is_hidden = 13;
}
message AddWorktree {
string path = 1;
uint64 project_id = 2;
bool visible = 3;
}
message AddWorktreeResponse {
uint64 worktree_id = 1;
string canonicalized_path = 2;
optional string root_repo_common_dir = 3;
}
message RemoveWorktree {
uint64 worktree_id = 1;
}
message GetPathMetadata {
uint64 project_id = 1;
string path = 2;
}
message GetPathMetadataResponse {
bool exists = 1;
string path = 2;
bool is_dir = 3;
}
message WorktreeMetadata {
uint64 id = 1;
string root_name = 2;
bool visible = 3;
string abs_path = 4;
optional string root_repo_common_dir = 5;
}
message ProjectPath {
uint64 worktree_id = 1;
string path = 2;
}
message ListRemoteDirectoryConfig {
bool is_dir = 1;
}
message ListRemoteDirectory {
uint64 dev_server_id = 1;
string path = 2;
ListRemoteDirectoryConfig config = 3;
}
message EntryInfo {
bool is_dir = 1;
}
message ListRemoteDirectoryResponse {
repeated string entries = 1;
repeated EntryInfo entry_info = 2;
}
message CreateProjectEntry {
uint64 project_id = 1;
uint64 worktree_id = 2;
string path = 3;
bool is_directory = 4;
optional bytes content = 5;
}
message RenameProjectEntry {
uint64 project_id = 1;
uint64 entry_id = 2;
string new_path = 3;
uint64 new_worktree_id = 4;
}
message CopyProjectEntry {
uint64 project_id = 1;
uint64 entry_id = 2;
string new_path = 3;
uint64 new_worktree_id = 5;
reserved 4;
}
message DeleteProjectEntry {
uint64 project_id = 1;
uint64 entry_id = 2;
bool use_trash = 3;
}
message ExpandProjectEntry {
uint64 project_id = 1;
uint64 entry_id = 2;
}
message ExpandProjectEntryResponse {
uint64 worktree_scan_id = 1;
}
message ExpandAllForProjectEntry {
uint64 project_id = 1;
uint64 entry_id = 2;
}
message ExpandAllForProjectEntryResponse {
uint64 worktree_scan_id = 1;
}
message ProjectEntryResponse {
optional Entry entry = 1;
uint64 worktree_scan_id = 2;
}
message UpdateWorktreeSettings {
uint64 project_id = 1;
uint64 worktree_id = 2;
string path = 3;
optional string content = 4;
optional LocalSettingsKind kind = 5;
optional bool outside_worktree = 6;
}
enum LocalSettingsKind {
Settings = 0;
Tasks = 1;
Editorconfig = 2;
Debug = 3;
}
message UpdateUserSettings {
uint64 project_id = 1;
string contents = 2;
}
message TrustWorktrees {
uint64 project_id = 1;
repeated PathTrust trusted_paths = 2;
}
message PathTrust {
oneof content {
uint64 worktree_id = 2;
string abs_path = 3;
}
reserved 1;
}
message RestrictWorktrees {
uint64 project_id = 1;
repeated uint64 worktree_ids = 3;
reserved 2;
}
// Request from the remote server to the client to allocate a new worktree ID.
// This allows the client to maintain a single WorktreeIdCounter that prevents
// ID collisions when connected to multiple remote servers.
message AllocateWorktreeId {
uint64 project_id = 1;
}
message AllocateWorktreeIdResponse {
uint64 worktree_id = 1;
}

View File

@@ -0,0 +1,581 @@
syntax = "proto3";
package zed.messages;
import "ai.proto";
import "app.proto";
import "buffer.proto";
import "call.proto";
import "channel.proto";
import "core.proto";
import "debugger.proto";
import "download.proto";
import "git.proto";
import "image.proto";
import "lsp.proto";
import "notification.proto";
import "task.proto";
import "toolchain.proto";
import "worktree.proto";
// Looking for a number? Search "// current max"
message Envelope {
uint32 id = 1;
optional uint32 responding_to = 2;
optional PeerId original_sender_id = 3;
optional uint32 ack_id = 266;
oneof payload {
Hello hello = 4;
Ack ack = 5;
Error error = 6;
Ping ping = 7;
Test test = 8;
EndStream end_stream = 165;
CreateRoom create_room = 9;
CreateRoomResponse create_room_response = 10;
JoinRoom join_room = 11;
JoinRoomResponse join_room_response = 12;
RejoinRoom rejoin_room = 13;
RejoinRoomResponse rejoin_room_response = 14;
LeaveRoom leave_room = 15;
Call call = 16;
IncomingCall incoming_call = 17;
CallCanceled call_canceled = 18;
CancelCall cancel_call = 19;
DeclineCall decline_call = 20;
UpdateParticipantLocation update_participant_location = 21;
RoomUpdated room_updated = 22;
ShareProject share_project = 23;
ShareProjectResponse share_project_response = 24;
UnshareProject unshare_project = 25;
JoinProject join_project = 26;
JoinProjectResponse join_project_response = 27;
LeaveProject leave_project = 28;
AddProjectCollaborator add_project_collaborator = 29;
UpdateProjectCollaborator update_project_collaborator = 30;
RemoveProjectCollaborator remove_project_collaborator = 31;
GetDefinition get_definition = 32;
GetDefinitionResponse get_definition_response = 33;
GetDeclaration get_declaration = 237;
GetDeclarationResponse get_declaration_response = 238;
GetTypeDefinition get_type_definition = 34;
GetTypeDefinitionResponse get_type_definition_response = 35;
GetReferences get_references = 36;
GetReferencesResponse get_references_response = 37;
GetDocumentHighlights get_document_highlights = 38;
GetDocumentHighlightsResponse get_document_highlights_response = 39;
GetProjectSymbols get_project_symbols = 40;
GetProjectSymbolsResponse get_project_symbols_response = 41;
OpenBufferForSymbol open_buffer_for_symbol = 42;
OpenBufferForSymbolResponse open_buffer_for_symbol_response = 43;
UpdateProject update_project = 44;
UpdateWorktree update_worktree = 45;
CreateProjectEntry create_project_entry = 46;
RenameProjectEntry rename_project_entry = 47;
CopyProjectEntry copy_project_entry = 48;
DeleteProjectEntry delete_project_entry = 49;
ProjectEntryResponse project_entry_response = 50;
ExpandProjectEntry expand_project_entry = 51;
ExpandProjectEntryResponse expand_project_entry_response = 52;
ExpandAllForProjectEntry expand_all_for_project_entry = 291;
ExpandAllForProjectEntryResponse expand_all_for_project_entry_response = 292;
UpdateDiagnosticSummary update_diagnostic_summary = 53;
StartLanguageServer start_language_server = 54;
UpdateLanguageServer update_language_server = 55;
OpenBufferById open_buffer_by_id = 56;
OpenBufferByPath open_buffer_by_path = 57;
OpenBufferResponse open_buffer_response = 58;
CreateBufferForPeer create_buffer_for_peer = 59;
UpdateBuffer update_buffer = 60;
UpdateBufferFile update_buffer_file = 61;
SaveBuffer save_buffer = 62;
BufferSaved buffer_saved = 63;
BufferReloaded buffer_reloaded = 64;
ReloadBuffers reload_buffers = 65;
ReloadBuffersResponse reload_buffers_response = 66;
SynchronizeBuffers synchronize_buffers = 67;
SynchronizeBuffersResponse synchronize_buffers_response = 68;
FormatBuffers format_buffers = 69;
FormatBuffersResponse format_buffers_response = 70;
GetCompletions get_completions = 71;
GetCompletionsResponse get_completions_response = 72;
ResolveCompletionDocumentation resolve_completion_documentation = 73;
ResolveCompletionDocumentationResponse resolve_completion_documentation_response = 74;
ApplyCompletionAdditionalEdits apply_completion_additional_edits = 75;
ApplyCompletionAdditionalEditsResponse apply_completion_additional_edits_response = 76;
GetCodeActions get_code_actions = 77;
GetCodeActionsResponse get_code_actions_response = 78;
GetHover get_hover = 79;
GetHoverResponse get_hover_response = 80;
ApplyCodeAction apply_code_action = 81;
ApplyCodeActionResponse apply_code_action_response = 82;
PrepareRename prepare_rename = 83;
PrepareRenameResponse prepare_rename_response = 84;
PerformRename perform_rename = 85;
PerformRenameResponse perform_rename_response = 86;
UpdateContacts update_contacts = 89;
ShowContacts show_contacts = 91;
GetUsers get_users = 92;
FuzzySearchUsers fuzzy_search_users = 93;
UsersResponse users_response = 94;
RequestContact request_contact = 95;
RespondToContactRequest respond_to_contact_request = 96;
RemoveContact remove_contact = 97;
Follow follow = 98;
FollowResponse follow_response = 99;
UpdateFollowers update_followers = 100;
Unfollow unfollow = 101;
UpdateDiffBases update_diff_bases = 104;
OnTypeFormatting on_type_formatting = 105;
OnTypeFormattingResponse on_type_formatting_response = 106;
UpdateWorktreeSettings update_worktree_settings = 107;
InlayHints inlay_hints = 108;
InlayHintsResponse inlay_hints_response = 109;
ResolveInlayHint resolve_inlay_hint = 110;
ResolveInlayHintResponse resolve_inlay_hint_response = 111;
RefreshInlayHints refresh_inlay_hints = 112;
CreateChannel create_channel = 113;
CreateChannelResponse create_channel_response = 114;
InviteChannelMember invite_channel_member = 115;
RemoveChannelMember remove_channel_member = 116;
RespondToChannelInvite respond_to_channel_invite = 117;
UpdateChannels update_channels = 118;
JoinChannel join_channel = 119;
DeleteChannel delete_channel = 120;
GetChannelMembers get_channel_members = 121;
GetChannelMembersResponse get_channel_members_response = 122;
SetChannelMemberRole set_channel_member_role = 123;
RenameChannel rename_channel = 124;
RenameChannelResponse rename_channel_response = 125;
SubscribeToChannels subscribe_to_channels = 207;
JoinChannelBuffer join_channel_buffer = 126;
JoinChannelBufferResponse join_channel_buffer_response = 127;
UpdateChannelBuffer update_channel_buffer = 128;
LeaveChannelBuffer leave_channel_buffer = 129;
UpdateChannelBufferCollaborators update_channel_buffer_collaborators = 130;
RejoinChannelBuffers rejoin_channel_buffers = 131;
RejoinChannelBuffersResponse rejoin_channel_buffers_response = 132;
AckBufferOperation ack_buffer_operation = 133;
JoinChannelChat join_channel_chat = 134;
JoinChannelChatResponse join_channel_chat_response = 135;
LeaveChannelChat leave_channel_chat = 136;
SendChannelMessage send_channel_message = 137;
SendChannelMessageResponse send_channel_message_response = 138;
ChannelMessageSent channel_message_sent = 139;
GetChannelMessages get_channel_messages = 140;
GetChannelMessagesResponse get_channel_messages_response = 141;
RemoveChannelMessage remove_channel_message = 142;
AckChannelMessage ack_channel_message = 143;
GetChannelMessagesById get_channel_messages_by_id = 144;
MoveChannel move_channel = 147;
ReorderChannel reorder_channel = 349;
SetChannelVisibility set_channel_visibility = 148;
AddNotification add_notification = 149;
GetNotifications get_notifications = 150;
GetNotificationsResponse get_notifications_response = 151;
DeleteNotification delete_notification = 152;
MarkNotificationRead mark_notification_read = 153;
LspExtExpandMacro lsp_ext_expand_macro = 154;
LspExtExpandMacroResponse lsp_ext_expand_macro_response = 155;
SetRoomParticipantRole set_room_participant_role = 156;
UpdateUserChannels update_user_channels = 157;
GetImplementation get_implementation = 162;
GetImplementationResponse get_implementation_response = 163;
UpdateChannelMessage update_channel_message = 170;
ChannelMessageUpdate channel_message_update = 171;
BlameBuffer blame_buffer = 172;
BlameBufferResponse blame_buffer_response = 173;
UpdateNotification update_notification = 174;
RestartLanguageServers restart_language_servers = 208;
RejoinRemoteProjects rejoin_remote_projects = 186;
RejoinRemoteProjectsResponse rejoin_remote_projects_response = 187;
OpenNewBuffer open_new_buffer = 196;
TaskContextForLocation task_context_for_location = 203;
TaskContext task_context = 204;
LinkedEditingRange linked_editing_range = 209;
LinkedEditingRangeResponse linked_editing_range_response = 210;
GetSignatureHelp get_signature_help = 217;
GetSignatureHelpResponse get_signature_help_response = 218;
ListRemoteDirectory list_remote_directory = 219;
ListRemoteDirectoryResponse list_remote_directory_response = 220;
AddWorktree add_worktree = 222;
AddWorktreeResponse add_worktree_response = 223;
LspExtSwitchSourceHeader lsp_ext_switch_source_header = 241;
LspExtSwitchSourceHeaderResponse lsp_ext_switch_source_header_response = 242;
FindSearchCandidates find_search_candidates = 243;
CloseBuffer close_buffer = 245;
ShutdownRemoteServer shutdown_remote_server = 257;
RemoveWorktree remove_worktree = 258;
LanguageServerLog language_server_log = 260;
Toast toast = 261;
HideToast hide_toast = 262;
OpenServerSettings open_server_settings = 263;
GetPermalinkToLine get_permalink_to_line = 264;
GetPermalinkToLineResponse get_permalink_to_line_response = 265;
FlushBufferedMessages flush_buffered_messages = 267;
LanguageServerPromptRequest language_server_prompt_request = 268;
LanguageServerPromptResponse language_server_prompt_response = 269;
GitBranchesResponse git_branches_response = 271;
UpdateGitBranch update_git_branch = 272;
ListToolchains list_toolchains = 273;
ListToolchainsResponse list_toolchains_response = 274;
ActivateToolchain activate_toolchain = 275;
ActiveToolchain active_toolchain = 276;
ActiveToolchainResponse active_toolchain_response = 277;
GetPathMetadata get_path_metadata = 278;
GetPathMetadataResponse get_path_metadata_response = 279;
CancelLanguageServerWork cancel_language_server_work = 282;
LspExtOpenDocs lsp_ext_open_docs = 283;
LspExtOpenDocsResponse lsp_ext_open_docs_response = 284;
SyncExtensions sync_extensions = 285;
SyncExtensionsResponse sync_extensions_response = 286;
InstallExtension install_extension = 287;
OpenUnstagedDiff open_unstaged_diff = 288;
OpenUnstagedDiffResponse open_unstaged_diff_response = 289;
RegisterBufferWithLanguageServers register_buffer_with_language_servers = 290;
Stage stage = 293;
Unstage unstage = 294;
Commit commit = 295;
OpenCommitMessageBuffer open_commit_message_buffer = 296;
OpenUncommittedDiff open_uncommitted_diff = 297;
OpenUncommittedDiffResponse open_uncommitted_diff_response = 298;
SetIndexText set_index_text = 299;
GitShow git_show = 300;
GitReset git_reset = 301;
GitCommitDetails git_commit_details = 302;
GitCheckoutFiles git_checkout_files = 303;
Push push = 304;
Fetch fetch = 305;
GetRemotes get_remotes = 306;
GetRemotesResponse get_remotes_response = 307;
Pull pull = 308;
ApplyCodeActionKind apply_code_action_kind = 309;
ApplyCodeActionKindResponse apply_code_action_kind_response = 310;
RemoteMessageResponse remote_message_response = 311;
GitGetBranches git_get_branches = 312;
GitCreateBranch git_create_branch = 313;
GitChangeBranch git_change_branch = 314;
CheckForPushedCommits check_for_pushed_commits = 315;
CheckForPushedCommitsResponse check_for_pushed_commits_response = 316;
AskPassRequest ask_pass_request = 317;
AskPassResponse ask_pass_response = 318;
GitDiff git_diff = 319;
GitDiffResponse git_diff_response = 320;
GitInit git_init = 321;
CodeLens code_lens = 322;
GetCodeLens get_code_lens = 323;
GetCodeLensResponse get_code_lens_response = 324;
RefreshCodeLens refresh_code_lens = 325;
ToggleBreakpoint toggle_breakpoint = 326;
BreakpointsForFile breakpoints_for_file = 327;
UpdateRepository update_repository = 328;
RemoveRepository remove_repository = 329;
GetDocumentSymbols get_document_symbols = 330;
GetDocumentSymbolsResponse get_document_symbols_response = 331;
LoadCommitDiff load_commit_diff = 334;
LoadCommitDiffResponse load_commit_diff_response = 335;
StopLanguageServers stop_language_servers = 336;
LspExtRunnables lsp_ext_runnables = 337;
LspExtRunnablesResponse lsp_ext_runnables_response = 338;
GetDebugAdapterBinary get_debug_adapter_binary = 339;
DebugAdapterBinary debug_adapter_binary = 340;
RunDebugLocators run_debug_locators = 341;
DebugRequest debug_request = 342;
LspExtGoToParentModule lsp_ext_go_to_parent_module = 343;
LspExtGoToParentModuleResponse lsp_ext_go_to_parent_module_response = 344;
LspExtCancelFlycheck lsp_ext_cancel_flycheck = 345;
LspExtRunFlycheck lsp_ext_run_flycheck = 346;
LspExtClearFlycheck lsp_ext_clear_flycheck = 347;
LogToDebugConsole log_to_debug_console = 348;
GetDocumentDiagnostics get_document_diagnostics = 350;
GetDocumentDiagnosticsResponse get_document_diagnostics_response = 351;
PullWorkspaceDiagnostics pull_workspace_diagnostics = 352;
GetDocumentColor get_document_color = 353;
GetDocumentColorResponse get_document_color_response = 354;
GetColorPresentation get_color_presentation = 355;
GetColorPresentationResponse get_color_presentation_response = 356;
Stash stash = 357;
StashPop stash_pop = 358;
GetDefaultBranch get_default_branch = 359;
GetDefaultBranchResponse get_default_branch_response = 360;
GetCrashFiles get_crash_files = 361;
GetCrashFilesResponse get_crash_files_response = 362;
GitClone git_clone = 363;
GitCloneResponse git_clone_response = 364;
LspQuery lsp_query = 365;
LspQueryResponse lsp_query_response = 366;
ToggleLspLogs toggle_lsp_logs = 367;
UpdateUserSettings update_user_settings = 368;
GetProcesses get_processes = 369;
GetProcessesResponse get_processes_response = 370;
ResolveToolchain resolve_toolchain = 371;
ResolveToolchainResponse resolve_toolchain_response = 372;
GetAgentServerCommand get_agent_server_command = 373;
AgentServerCommand agent_server_command = 374;
ExternalAgentsUpdated external_agents_updated = 375;
ExternalAgentLoadingStatusUpdated external_agent_loading_status_updated = 376;
NewExternalAgentVersionAvailable new_external_agent_version_available = 377;
StashDrop stash_drop = 378;
StashApply stash_apply = 379;
GitRenameBranch git_rename_branch = 380;
RemoteStarted remote_started = 381;
GetDirectoryEnvironment get_directory_environment = 382;
DirectoryEnvironment directory_environment = 383;
GetTreeDiff get_tree_diff = 384;
GetTreeDiffResponse get_tree_diff_response = 385;
GetBlobContent get_blob_content = 386;
GetBlobContentResponse get_blob_content_response = 387;
GitWorktreesResponse git_worktrees_response = 388;
GitGetWorktrees git_get_worktrees = 389;
GitCreateWorktree git_create_worktree = 390;
OpenImageByPath open_image_by_path = 391;
OpenImageResponse open_image_response = 392;
CreateImageForPeer create_image_for_peer = 393;
RunGitHook run_git_hook = 399;
GitDeleteBranch git_delete_branch = 400;
ExternalExtensionAgentsUpdated external_extension_agents_updated = 401;
GitCreateRemote git_create_remote = 402;
GitRemoveRemote git_remove_remote = 403;
TrustWorktrees trust_worktrees = 404;
RestrictWorktrees restrict_worktrees = 405;
ShareAgentThread share_agent_thread = 406;
GetSharedAgentThread get_shared_agent_thread = 407;
GetSharedAgentThreadResponse get_shared_agent_thread_response = 408;
FindSearchCandidatesChunk find_search_candidates_chunk = 409;
FindSearchCandidatesCancelled find_search_candidates_cancelled = 410;
GetContextServerCommand get_context_server_command = 411;
ContextServerCommand context_server_command = 412;
AllocateWorktreeId allocate_worktree_id = 413;
AllocateWorktreeIdResponse allocate_worktree_id_response = 414;
DownloadFileByPath download_file_by_path = 415;
DownloadFileResponse download_file_response = 416;
CreateFileForPeer create_file_for_peer = 417;
SemanticTokens semantic_tokens = 418;
SemanticTokensResponse semantic_tokens_response = 419;
RefreshSemanticTokens refresh_semantic_tokens = 420;
GetFoldingRanges get_folding_ranges = 421;
GetFoldingRangesResponse get_folding_ranges_response = 422;
GetRemoteProfilingData get_remote_profiling_data = 423;
GetRemoteProfilingDataResponse get_remote_profiling_data_response = 424;
SpawnKernel spawn_kernel = 426;
SpawnKernelResponse spawn_kernel_response = 427;
KillKernel kill_kernel = 428;
GitRemoveWorktree git_remove_worktree = 431;
GitRenameWorktree git_rename_worktree = 432;
GitCreateCheckpoint git_create_checkpoint = 433;
GitCreateCheckpointResponse git_create_checkpoint_response = 434;
GitRestoreCheckpoint git_restore_checkpoint = 435;
GitCompareCheckpoints git_compare_checkpoints = 436;
GitCompareCheckpointsResponse git_compare_checkpoints_response = 437;
GitDiffCheckpoints git_diff_checkpoints = 438;
GitDiffCheckpointsResponse git_diff_checkpoints_response = 439;
GitGetHeadSha git_get_head_sha = 440;
GitGetHeadShaResponse git_get_head_sha_response = 441;
GitRepairWorktrees git_repair_worktrees = 442;
GitEditRef git_edit_ref = 443;
GitCreateArchiveCheckpoint git_create_archive_checkpoint = 444;
GitCreateArchiveCheckpointResponse git_create_archive_checkpoint_response = 445;
GitRestoreArchiveCheckpoint git_restore_archive_checkpoint = 446;
GetCommitData get_commit_data = 447;
GetCommitDataResponse get_commit_data_response = 448;
SearchCommits search_commits = 449;
SearchCommitsResponse search_commits_response = 450;
GetInitialGraphData get_initial_graph_data = 451;
GetInitialGraphDataResponse get_initial_graph_data_response = 452; // current max
}
reserved 87 to 88;
reserved 90;
reserved 102 to 103;
reserved 158 to 161;
reserved 164;
reserved 166 to 169;
reserved 175 to 185;
reserved 188 to 195;
reserved 197;
reserved 198 to 202;
reserved 205 to 206;
reserved 221;
reserved 224 to 231;
reserved 234 to 236;
reserved 239 to 240;
reserved 244;
reserved 246 to 256;
reserved 259;
reserved 270;
reserved 280 to 281;
reserved 332 to 333;
reserved 394 to 396;
reserved 429 to 430;
reserved 211 to 216, 232 to 233;
reserved 397 to 398;
}
message Hello {
PeerId peer_id = 1;
}
message Ping {}
message Ack {}
message Error {
string message = 1;
ErrorCode code = 2;
repeated string tags = 3;
}
enum ErrorCode {
Internal = 0;
NoSuchChannel = 1;
Disconnected = 2;
SignedOut = 3;
UpgradeRequired = 4;
Forbidden = 5;
NeedsCla = 7;
NotARootChannel = 8;
BadPublicNesting = 9;
CircularNesting = 10;
WrongMoveTarget = 11;
UnsharedItem = 12;
NoSuchProject = 13;
DevServerProjectPathDoesNotExist = 16;
RemoteUpgradeRequired = 17;
RateLimitExceeded = 18;
CommitFailed = 19;
reserved 6;
reserved 14 to 15;
}
message EndStream {}
message Test {
uint64 id = 1;
}
message FlushBufferedMessages {}
message FlushBufferedMessagesResponse {}
message RemoteStarted {}
message SpawnKernel {
string kernel_name = 1;
string working_directory = 2;
uint64 project_id = 3;
string command = 4;
repeated string args = 5;
}
message SpawnKernelResponse {
string kernel_id = 1;
string connection_file = 2;
}
message KillKernel {
string kernel_id = 1;
uint64 project_id = 2;
}

256
crates/proto/src/error.rs Normal file
View File

@@ -0,0 +1,256 @@
/// Some helpers for structured error handling.
///
/// The helpers defined here allow you to pass type-safe error codes from
/// the collab server to the client; and provide a mechanism for additional
/// structured data alongside the message.
///
/// When returning an error, it can be as simple as:
///
/// `return Err(Error::Forbidden.into())`
///
/// If you'd like to log more context, you can set a message. These messages
/// show up in our logs, but are not shown visibly to users.
///
/// `return Err(Error::Forbidden.message("not an admin").into())`
///
/// If you'd like to provide enough context that the UI can render a good error
/// message (or would be helpful to see in a structured format in the logs), you
/// can use .with_tag():
///
/// `return Err(Error::WrongReleaseChannel.with_tag("required", "stable").into())`
///
/// When handling an error you can use .error_code() to match which error it was
/// and .error_tag() to read any tags.
///
/// ```ignore
/// use proto::{ErrorCode, ErrorExt};
///
/// match err.error_code() {
/// ErrorCode::Forbidden => alert("I'm sorry I can't do that."),
/// ErrorCode::WrongReleaseChannel =>
/// alert(format!("You need to be on the {} release channel.", err.error_tag("required").unwrap())),
/// ErrorCode::Internal => alert("Sorry, something went wrong"),
/// }
/// ```
///
pub use crate::ErrorCode;
/// ErrorCodeExt provides some helpers for structured error handling.
///
/// The primary implementation is on the proto::ErrorCode to easily convert
/// that into an anyhow::Error, which we use pervasively.
///
/// The RpcError struct provides support for further metadata if needed.
pub trait ErrorCodeExt {
/// Return an anyhow::Error containing this.
/// (useful in places where .into() doesn't have enough type information)
fn anyhow(self) -> anyhow::Error;
/// Add a message to the error (by default the error code is used)
fn message(self, msg: String) -> RpcError;
/// Add a tag to the error. Tags are key value pairs that can be used
/// to send semi-structured data along with the error.
fn with_tag(self, k: &str, v: &str) -> RpcError;
}
impl ErrorCodeExt for ErrorCode {
fn anyhow(self) -> anyhow::Error {
self.into()
}
fn message(self, msg: String) -> RpcError {
let err: RpcError = self.into();
err.message(msg)
}
fn with_tag(self, k: &str, v: &str) -> RpcError {
let err: RpcError = self.into();
err.with_tag(k, v)
}
}
/// ErrorExt provides helpers for structured error handling.
///
/// The primary implementation is on the anyhow::Error, which is
/// what we use throughout our codebase. Though under the hood this
pub trait ErrorExt {
/// error_code() returns the ErrorCode (or ErrorCode::Internal if there is none)
fn error_code(&self) -> ErrorCode;
/// error_tag() returns the value of the tag with the given key, if any.
fn error_tag(&self, k: &str) -> Option<&str>;
/// to_proto() converts the error into a crate::Error
fn to_proto(&self) -> crate::Error;
/// Clones the error and turns into an [anyhow::Error].
fn cloned(&self) -> anyhow::Error;
}
impl ErrorExt for anyhow::Error {
fn error_code(&self) -> ErrorCode {
if let Some(rpc_error) = self.downcast_ref::<RpcError>() {
rpc_error.code
} else {
ErrorCode::Internal
}
}
fn error_tag(&self, k: &str) -> Option<&str> {
if let Some(rpc_error) = self.downcast_ref::<RpcError>() {
rpc_error.error_tag(k)
} else {
None
}
}
fn to_proto(&self) -> crate::Error {
if let Some(rpc_error) = self.downcast_ref::<RpcError>() {
rpc_error.to_proto()
} else {
ErrorCode::Internal
.message(
format!("{self:#}")
.lines()
.fold(String::new(), |mut message, line| {
if !message.is_empty() {
message.push(' ');
}
message.push_str(line);
message
}),
)
.to_proto()
}
}
fn cloned(&self) -> anyhow::Error {
if let Some(rpc_error) = self.downcast_ref::<RpcError>() {
rpc_error.cloned()
} else {
anyhow::anyhow!("{self:#}")
}
}
}
impl From<ErrorCode> for anyhow::Error {
fn from(value: ErrorCode) -> Self {
RpcError {
request: None,
code: value,
msg: format!("{:?}", value),
tags: Default::default(),
}
.into()
}
}
#[derive(Clone, Debug)]
pub struct RpcError {
request: Option<String>,
msg: String,
code: ErrorCode,
tags: Vec<String>,
}
/// RpcError is a structured error type that is returned by the collab server.
/// In addition to a message, it lets you set a specific ErrorCode, and attach
/// small amounts of metadata to help the client handle the error appropriately.
///
/// This struct is not typically used directly, as we pass anyhow::Error around
/// in the app; however it is useful for chaining .message() and .with_tag() on
/// ErrorCode.
impl RpcError {
/// Returns the raw server-provided error message without any RPC framing
/// (e.g. without the "RPC request X failed: " prefix that `Display` adds).
pub fn raw_message(&self) -> &str {
&self.msg
}
/// from_proto converts a crate::Error into an anyhow::Error containing
/// an RpcError.
pub fn from_proto(error: &crate::Error, request: &str) -> anyhow::Error {
RpcError {
request: Some(request.to_string()),
code: error.code(),
msg: error.message.clone(),
tags: error.tags.clone(),
}
.into()
}
}
impl ErrorCodeExt for RpcError {
fn message(mut self, msg: String) -> RpcError {
self.msg = msg;
self
}
fn with_tag(mut self, k: &str, v: &str) -> RpcError {
self.tags.push(format!("{}={}", k, v));
self
}
fn anyhow(self) -> anyhow::Error {
self.into()
}
}
impl ErrorExt for RpcError {
fn error_tag(&self, k: &str) -> Option<&str> {
for tag in &self.tags {
let mut parts = tag.split('=');
if let Some(key) = parts.next()
&& key == k
{
return parts.next();
}
}
None
}
fn error_code(&self) -> ErrorCode {
self.code
}
fn to_proto(&self) -> crate::Error {
crate::Error {
code: self.code as i32,
message: self.msg.clone(),
tags: self.tags.clone(),
}
}
fn cloned(&self) -> anyhow::Error {
self.clone().into()
}
}
impl std::error::Error for RpcError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
None
}
}
impl std::fmt::Display for RpcError {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
if let Some(request) = &self.request {
write!(f, "RPC request {} failed: {}", request, self.msg)?
} else {
write!(f, "{}", self.msg)?
}
for tag in &self.tags {
write!(f, " {}", tag)?
}
Ok(())
}
}
impl From<ErrorCode> for RpcError {
fn from(code: ErrorCode) -> Self {
RpcError {
request: None,
code,
msg: format!("{:?}", code),
tags: Default::default(),
}
}
}

100
crates/proto/src/macros.rs Normal file
View File

@@ -0,0 +1,100 @@
#[macro_export]
macro_rules! messages {
($(($name:ident, $priority:ident)),* $(,)?) => {
pub fn build_typed_envelope(sender_id: PeerId, received_at: std::time::Instant, envelope: Envelope) -> Option<Box<dyn AnyTypedEnvelope>> {
match envelope.payload {
$(Some(envelope::Payload::$name(payload)) => {
Some(Box::new(TypedEnvelope {
sender_id,
original_sender_id: envelope.original_sender_id,
message_id: envelope.id,
payload,
received_at,
}))
}, )*
_ => None
}
}
$(
impl EnvelopedMessage for $name {
const NAME: &'static str = std::stringify!($name);
const PRIORITY: MessagePriority = MessagePriority::$priority;
fn into_envelope(
self,
id: u32,
responding_to: Option<u32>,
original_sender_id: Option<PeerId>,
) -> Envelope {
Envelope {
id,
responding_to,
original_sender_id,
payload: Some(envelope::Payload::$name(self)),
ack_id: None,
}
}
fn from_envelope(envelope: Envelope) -> Option<Self> {
if let Some(envelope::Payload::$name(msg)) = envelope.payload {
Some(msg)
} else {
None
}
}
}
)*
};
}
#[macro_export]
macro_rules! request_messages {
($(($request_name:ident, $response_name:ident)),* $(,)?) => {
$(impl RequestMessage for $request_name {
type Response = $response_name;
})*
};
}
#[macro_export]
macro_rules! entity_messages {
({$id_field:ident, $entity_type:ty}, $($name:ident),* $(,)?) => {
$(impl EntityMessage for $name {
type Entity = $entity_type;
fn remote_entity_id(&self) -> u64 {
self.$id_field
}
})*
};
}
#[macro_export]
macro_rules! lsp_messages {
($(($request_name:ident, $response_name:ident, $stop_previous_requests:expr)),* $(,)?) => {
$(impl LspRequestMessage for $request_name {
type Response = $response_name;
fn to_proto_query(self) -> $crate::lsp_query::Request {
$crate::lsp_query::Request::$request_name(self)
}
fn response_to_proto_query(response: Self::Response) -> $crate::lsp_response::Response {
$crate::lsp_response::Response::$response_name(response)
}
fn buffer_id(&self) -> u64 {
self.buffer_id
}
fn buffer_version(&self) -> &[$crate::VectorClockEntry] {
&self.version
}
fn stop_previous_requests() -> bool {
$stop_previous_requests
}
})*
};
}

1040
crates/proto/src/proto.rs Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,210 @@
use crate::{Envelope, PeerId};
use anyhow::{Context as _, Result};
use serde::Serialize;
use std::{
any::{Any, TypeId},
cmp,
fmt::{self, Debug},
};
use std::{marker::PhantomData, time::Instant};
pub trait EnvelopedMessage: Clone + Debug + Serialize + Sized + Send + Sync + 'static {
const NAME: &'static str;
const PRIORITY: MessagePriority;
fn into_envelope(
self,
id: u32,
responding_to: Option<u32>,
original_sender_id: Option<PeerId>,
) -> Envelope;
fn from_envelope(envelope: Envelope) -> Option<Self>;
}
pub trait EntityMessage: EnvelopedMessage {
type Entity;
fn remote_entity_id(&self) -> u64;
}
pub trait RequestMessage: EnvelopedMessage {
type Response: EnvelopedMessage;
}
/// A trait to bind LSP request and responses for the proto layer.
/// Should be used for every LSP request that has to traverse through the proto layer.
///
/// `lsp_messages` macro in the same crate provides a convenient way to implement this.
pub trait LspRequestMessage: EnvelopedMessage {
type Response: EnvelopedMessage;
fn to_proto_query(self) -> crate::lsp_query::Request;
fn response_to_proto_query(response: Self::Response) -> crate::lsp_response::Response;
fn buffer_id(&self) -> u64;
fn buffer_version(&self) -> &[crate::VectorClockEntry];
/// Whether to deduplicate the requests, or keep the previous ones running when another
/// request of the same kind is processed.
fn stop_previous_requests() -> bool;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct LspRequestId(pub u64);
/// A response from a single language server.
/// There could be multiple responses for a single LSP request,
/// from different servers.
pub struct ProtoLspResponse<R> {
pub server_id: u64,
pub response: R,
}
impl ProtoLspResponse<Box<dyn AnyTypedEnvelope>> {
pub fn into_response<T: LspRequestMessage>(self) -> Result<ProtoLspResponse<T::Response>> {
let envelope = self
.response
.into_any()
.downcast::<TypedEnvelope<T::Response>>()
.map_err(|_| {
anyhow::anyhow!(
"cannot downcast LspResponse to {} for message {}",
T::Response::NAME,
T::NAME,
)
})?;
Ok(ProtoLspResponse {
server_id: self.server_id,
response: envelope.payload,
})
}
}
pub trait AnyTypedEnvelope: Any + Send + Sync {
fn payload_type_id(&self) -> TypeId;
fn payload_type_name(&self) -> &'static str;
fn into_any(self: Box<Self>) -> Box<dyn Any + Send + Sync>;
fn is_background(&self) -> bool;
fn original_sender_id(&self) -> Option<PeerId>;
fn sender_id(&self) -> PeerId;
fn message_id(&self) -> u32;
}
pub enum MessagePriority {
Foreground,
Background,
}
impl<T: EnvelopedMessage> AnyTypedEnvelope for TypedEnvelope<T> {
fn payload_type_id(&self) -> TypeId {
TypeId::of::<T>()
}
fn payload_type_name(&self) -> &'static str {
T::NAME
}
fn into_any(self: Box<Self>) -> Box<dyn Any + Send + Sync> {
self
}
fn is_background(&self) -> bool {
matches!(T::PRIORITY, MessagePriority::Background)
}
fn original_sender_id(&self) -> Option<PeerId> {
self.original_sender_id
}
fn sender_id(&self) -> PeerId {
self.sender_id
}
fn message_id(&self) -> u32 {
self.message_id
}
}
impl PeerId {
pub fn from_u64(peer_id: u64) -> Self {
let owner_id = (peer_id >> 32) as u32;
let id = peer_id as u32;
Self { owner_id, id }
}
pub fn as_u64(self) -> u64 {
((self.owner_id as u64) << 32) | (self.id as u64)
}
}
impl Copy for PeerId {}
impl Eq for PeerId {}
impl Ord for PeerId {
fn cmp(&self, other: &Self) -> cmp::Ordering {
self.owner_id
.cmp(&other.owner_id)
.then_with(|| self.id.cmp(&other.id))
}
}
impl PartialOrd for PeerId {
fn partial_cmp(&self, other: &Self) -> Option<cmp::Ordering> {
Some(self.cmp(other))
}
}
impl std::hash::Hash for PeerId {
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
self.owner_id.hash(state);
self.id.hash(state);
}
}
impl fmt::Display for PeerId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}/{}", self.owner_id, self.id)
}
}
pub struct Receipt<T> {
pub sender_id: PeerId,
pub message_id: u32,
payload_type: PhantomData<T>,
}
impl<T> Clone for Receipt<T> {
fn clone(&self) -> Self {
*self
}
}
impl<T> Copy for Receipt<T> {}
#[derive(Clone, Debug)]
pub struct TypedEnvelope<T> {
pub sender_id: PeerId,
pub original_sender_id: Option<PeerId>,
pub message_id: u32,
pub payload: T,
pub received_at: Instant,
}
impl<T> TypedEnvelope<T> {
pub fn original_sender_id(&self) -> Result<PeerId> {
self.original_sender_id
.context("missing original_sender_id")
}
}
impl<T: RequestMessage> TypedEnvelope<T> {
pub fn receipt(&self) -> Receipt<T> {
Receipt {
sender_id: self.sender_id,
message_id: self.message_id,
payload_type: PhantomData,
}
}
}