zed.proto

  1syntax = "proto3";
  2package zed.messages;
  3
  4message Envelope {
  5    uint32 id = 1;
  6    optional uint32 responding_to = 2;
  7    optional uint32 original_sender_id = 3;
  8    oneof payload {
  9        Ack ack = 4;
 10        Error error = 5;
 11        Ping ping = 6;
 12        Test test = 7;
 13
 14        RegisterProject register_project = 8;
 15        RegisterProjectResponse register_project_response = 9;
 16        UnregisterProject unregister_project = 10;
 17        RequestJoinProject request_join_project = 11;
 18        RespondToJoinProjectRequest respond_to_join_project_request = 12;
 19        JoinProjectRequestCancelled join_project_request_cancelled = 13;
 20        JoinProject join_project = 14;
 21        JoinProjectResponse join_project_response = 15;
 22        LeaveProject leave_project = 16;
 23        AddProjectCollaborator add_project_collaborator = 17;
 24        RemoveProjectCollaborator remove_project_collaborator = 18;
 25        ProjectUnshared project_unshared = 19;
 26
 27        GetDefinition get_definition = 20;
 28        GetDefinitionResponse get_definition_response = 21;
 29        GetTypeDefinition get_type_definition = 22;
 30        GetTypeDefinitionResponse get_type_definition_response = 23;
 31        GetReferences get_references = 24;
 32        GetReferencesResponse get_references_response = 25;
 33        GetDocumentHighlights get_document_highlights = 26;
 34        GetDocumentHighlightsResponse get_document_highlights_response = 27;
 35        GetProjectSymbols get_project_symbols = 28;
 36        GetProjectSymbolsResponse get_project_symbols_response = 29;
 37        OpenBufferForSymbol open_buffer_for_symbol = 30;
 38        OpenBufferForSymbolResponse open_buffer_for_symbol_response = 31;
 39
 40        UpdateProject update_project = 32;
 41        RegisterProjectActivity register_project_activity = 33;
 42        UpdateWorktree update_worktree = 34;
 43        UpdateWorktreeExtensions update_worktree_extensions = 35;
 44
 45        CreateProjectEntry create_project_entry = 36;
 46        RenameProjectEntry rename_project_entry = 37;
 47        CopyProjectEntry copy_project_entry = 38;
 48        DeleteProjectEntry delete_project_entry = 39;
 49        ProjectEntryResponse project_entry_response = 40;
 50
 51        UpdateDiagnosticSummary update_diagnostic_summary = 41;
 52        StartLanguageServer start_language_server = 42;
 53        UpdateLanguageServer update_language_server = 43;
 54
 55        OpenBufferById open_buffer_by_id = 44;
 56        OpenBufferByPath open_buffer_by_path = 45;
 57        OpenBufferResponse open_buffer_response = 46;
 58        CreateBufferForPeer create_buffer_for_peer = 47;
 59        UpdateBuffer update_buffer = 48;
 60        UpdateBufferFile update_buffer_file = 49;
 61        SaveBuffer save_buffer = 50;
 62        BufferSaved buffer_saved = 51;
 63        BufferReloaded buffer_reloaded = 52;
 64        ReloadBuffers reload_buffers = 53;
 65        ReloadBuffersResponse reload_buffers_response = 54;
 66        FormatBuffers format_buffers = 55;
 67        FormatBuffersResponse format_buffers_response = 56;
 68        GetCompletions get_completions = 57;
 69        GetCompletionsResponse get_completions_response = 58;
 70        ApplyCompletionAdditionalEdits apply_completion_additional_edits = 59;
 71        ApplyCompletionAdditionalEditsResponse apply_completion_additional_edits_response = 60;
 72        GetCodeActions get_code_actions = 61;
 73        GetCodeActionsResponse get_code_actions_response = 62;
 74        GetHover get_hover = 63;
 75        GetHoverResponse get_hover_response = 64;
 76        ApplyCodeAction apply_code_action = 65;
 77        ApplyCodeActionResponse apply_code_action_response = 66;
 78        PrepareRename prepare_rename = 67;
 79        PrepareRenameResponse prepare_rename_response = 68;
 80        PerformRename perform_rename = 69;
 81        PerformRenameResponse perform_rename_response = 70;
 82        SearchProject search_project = 71;
 83        SearchProjectResponse search_project_response = 72;
 84
 85        GetChannels get_channels = 73;
 86        GetChannelsResponse get_channels_response = 74;
 87        JoinChannel join_channel = 75;
 88        JoinChannelResponse join_channel_response = 76;
 89        LeaveChannel leave_channel = 77;
 90        SendChannelMessage send_channel_message = 78;
 91        SendChannelMessageResponse send_channel_message_response = 79;
 92        ChannelMessageSent channel_message_sent = 80;
 93        GetChannelMessages get_channel_messages = 81;
 94        GetChannelMessagesResponse get_channel_messages_response = 82;
 95
 96        UpdateContacts update_contacts = 83;
 97        UpdateInviteInfo update_invite_info = 84;
 98        ShowContacts show_contacts = 85;
 99
100        GetUsers get_users = 86;
101        FuzzySearchUsers fuzzy_search_users = 87;
102        UsersResponse users_response = 88;
103        RequestContact request_contact = 89;
104        RespondToContactRequest respond_to_contact_request = 90;
105        RemoveContact remove_contact = 91;
106
107        Follow follow = 92;
108        FollowResponse follow_response = 93;
109        UpdateFollowers update_followers = 94;
110        Unfollow unfollow = 95;
111    }
112}
113
114// Messages
115
116message Ping {}
117
118message Ack {}
119
120message Error {
121    string message = 1;
122}
123
124message Test {
125    uint64 id = 1;
126}
127
128message RegisterProject {
129    bool online = 1;
130}
131
132message RegisterProjectResponse {
133    uint64 project_id = 1;
134}
135
136message UnregisterProject {
137    uint64 project_id = 1;
138}
139
140message UpdateProject {
141    uint64 project_id = 1;
142    repeated WorktreeMetadata worktrees = 2;
143    bool online = 3;
144}
145
146message RegisterProjectActivity {
147    uint64 project_id = 1;
148}
149
150message RequestJoinProject {
151    uint64 requester_id = 1;
152    uint64 project_id = 2;
153}
154
155message RespondToJoinProjectRequest {
156    uint64 requester_id = 1;
157    uint64 project_id = 2;
158    bool allow = 3;
159}
160
161message JoinProjectRequestCancelled {
162    uint64 requester_id = 1;
163    uint64 project_id = 2;
164}
165
166message JoinProject {
167    uint64 project_id = 1;
168}
169
170message JoinProjectResponse {
171    oneof variant {
172        Accept accept = 1;
173        Decline decline = 2;
174    }
175
176    message Accept {
177        uint32 replica_id = 1;
178        repeated WorktreeMetadata worktrees = 2;
179        repeated Collaborator collaborators = 3;
180        repeated LanguageServer language_servers = 4;        
181    }
182    
183    message Decline {
184        Reason reason = 1;
185
186        enum Reason {
187            Declined = 0;
188            Closed = 1;
189            WentOffline = 2;
190        }
191    }
192}
193
194message LeaveProject {
195    uint64 project_id = 1;
196}
197
198message UpdateWorktree {
199    uint64 project_id = 1;
200    uint64 worktree_id = 2;
201    string root_name = 3;
202    repeated Entry updated_entries = 4;
203    repeated uint64 removed_entries = 5;
204    uint64 scan_id = 6;
205    bool is_last_update = 7;
206}
207
208message UpdateWorktreeExtensions {
209    uint64 project_id = 1;
210    uint64 worktree_id = 2;
211    repeated string extensions = 3;
212    repeated uint32 counts = 4;
213}
214
215message CreateProjectEntry {
216    uint64 project_id = 1;
217    uint64 worktree_id = 2;
218    bytes path = 3;
219    bool is_directory = 4;
220}
221
222message RenameProjectEntry {
223    uint64 project_id = 1;
224    uint64 entry_id = 2;
225    bytes new_path = 3;
226}
227
228message CopyProjectEntry {
229    uint64 project_id = 1;
230    uint64 entry_id = 2;
231    bytes new_path = 3;
232}
233
234message DeleteProjectEntry {
235    uint64 project_id = 1;
236    uint64 entry_id = 2;
237}
238
239message ProjectEntryResponse {
240    Entry entry = 1;
241    uint64 worktree_scan_id = 2;
242}
243
244message AddProjectCollaborator {
245    uint64 project_id = 1;
246    Collaborator collaborator = 2;
247}
248
249message RemoveProjectCollaborator {
250    uint64 project_id = 1;
251    uint32 peer_id = 2;
252}
253
254message ProjectUnshared {
255    uint64 project_id = 1;
256}
257
258message GetDefinition {
259     uint64 project_id = 1;
260     uint64 buffer_id = 2;
261     Anchor position = 3;
262     repeated VectorClockEntry version = 4;
263 }
264
265message GetDefinitionResponse {
266    repeated LocationLink links = 1;
267}
268
269message GetTypeDefinition {
270     uint64 project_id = 1;
271     uint64 buffer_id = 2;
272     Anchor position = 3;
273     repeated VectorClockEntry version = 4;
274 }
275
276message GetTypeDefinitionResponse {
277    repeated LocationLink links = 1;
278}
279
280message GetReferences {
281     uint64 project_id = 1;
282     uint64 buffer_id = 2;
283     Anchor position = 3;
284     repeated VectorClockEntry version = 4;
285 }
286
287message GetReferencesResponse {
288    repeated Location locations = 1;
289}
290
291message GetDocumentHighlights {
292     uint64 project_id = 1;
293     uint64 buffer_id = 2;
294     Anchor position = 3;
295     repeated VectorClockEntry version = 4;
296 }
297
298message GetDocumentHighlightsResponse {
299    repeated DocumentHighlight highlights = 1;
300}
301
302message Location {
303    uint64 buffer_id = 1;
304    Anchor start = 2;
305    Anchor end = 3;
306}
307
308message LocationLink {
309    optional Location origin = 1;
310    Location target = 2;
311}
312
313message DocumentHighlight {
314    Kind kind = 1;
315    Anchor start = 2;
316    Anchor end = 3;
317
318    enum Kind {
319        Text = 0;
320        Read = 1;
321        Write = 2;
322    }
323}
324
325message GetProjectSymbols {
326    uint64 project_id = 1;
327    string query = 2;
328}
329
330message GetProjectSymbolsResponse {
331    repeated Symbol symbols = 4;
332}
333
334message Symbol {
335    uint64 source_worktree_id = 1;
336    uint64 worktree_id = 2;
337    string language_server_name = 3;
338    string name = 4;
339    int32 kind = 5;
340    string path = 6;
341    Point start = 7;
342    Point end = 8;
343    bytes signature = 9;
344}
345
346message OpenBufferForSymbol {
347    uint64 project_id = 1;
348    Symbol symbol = 2;
349}
350
351message OpenBufferForSymbolResponse {
352    uint64 buffer_id = 1;
353}
354
355message OpenBufferByPath {
356    uint64 project_id = 1;
357    uint64 worktree_id = 2;
358    string path = 3;
359}
360
361message OpenBufferById {
362    uint64 project_id = 1;
363    uint64 id = 2;
364}
365
366message OpenBufferResponse {
367    uint64 buffer_id = 1;
368}
369
370message CreateBufferForPeer {
371    uint64 project_id = 1;
372    uint32 peer_id = 2;
373    Buffer buffer = 3;
374}
375
376message UpdateBuffer {
377    uint64 project_id = 1;
378    uint64 buffer_id = 2;
379    repeated Operation operations = 3;
380}
381
382message UpdateBufferFile {
383    uint64 project_id = 1;
384    uint64 buffer_id = 2;
385    File file = 3;
386}
387
388message SaveBuffer {
389    uint64 project_id = 1;
390    uint64 buffer_id = 2;
391    repeated VectorClockEntry version = 3;
392}
393
394message BufferSaved {
395    uint64 project_id = 1;
396    uint64 buffer_id = 2;
397    repeated VectorClockEntry version = 3;
398    Timestamp mtime = 4;
399    string fingerprint = 5;
400}
401
402message BufferReloaded {
403    uint64 project_id = 1;
404    uint64 buffer_id = 2;
405    repeated VectorClockEntry version = 3;
406    Timestamp mtime = 4;
407    string fingerprint = 5;
408    LineEnding line_ending = 6;
409}
410
411message ReloadBuffers {
412    uint64 project_id = 1;
413    repeated uint64 buffer_ids = 2;
414}
415
416message ReloadBuffersResponse {
417    ProjectTransaction transaction = 1;
418}
419
420message FormatBuffers {
421    uint64 project_id = 1;
422    repeated uint64 buffer_ids = 2;
423}
424
425message FormatBuffersResponse {
426    ProjectTransaction transaction = 1;
427}
428
429message GetCompletions {
430    uint64 project_id = 1;
431    uint64 buffer_id = 2;
432    Anchor position = 3;
433    repeated VectorClockEntry version = 4;
434}
435
436message GetCompletionsResponse {
437    repeated Completion completions = 1;
438    repeated VectorClockEntry version = 2;
439}
440
441message ApplyCompletionAdditionalEdits {
442    uint64 project_id = 1;
443    uint64 buffer_id = 2;
444    Completion completion = 3;
445}
446
447message ApplyCompletionAdditionalEditsResponse {
448    Transaction transaction = 1;
449}
450
451message Completion {
452    Anchor old_start = 1;
453    Anchor old_end = 2;
454    string new_text = 3;
455    bytes lsp_completion = 4;
456}
457
458message GetCodeActions {
459    uint64 project_id = 1;
460    uint64 buffer_id = 2;
461    Anchor start = 3;
462    Anchor end = 4;
463    repeated VectorClockEntry version = 5;
464}
465
466message GetCodeActionsResponse {
467    repeated CodeAction actions = 1;
468    repeated VectorClockEntry version = 2;
469}
470
471message GetHover {
472    uint64 project_id = 1;
473    uint64 buffer_id = 2;
474    Anchor position = 3;
475    repeated VectorClockEntry version = 5;
476}
477
478message GetHoverResponse {
479    optional Anchor start = 1;
480    optional Anchor end = 2;
481    repeated HoverBlock contents = 3;
482}
483
484message HoverBlock {
485    string text = 1;
486    optional string language = 2;
487}
488
489message ApplyCodeAction {
490    uint64 project_id = 1;
491    uint64 buffer_id = 2;
492    CodeAction action = 3;
493}
494
495message ApplyCodeActionResponse {
496    ProjectTransaction transaction = 1;
497}
498
499message PrepareRename {
500    uint64 project_id = 1;
501    uint64 buffer_id = 2;
502    Anchor position = 3;
503    repeated VectorClockEntry version = 4;
504}
505
506message PrepareRenameResponse {
507    bool can_rename = 1;
508    Anchor start = 2;
509    Anchor end = 3;
510    repeated VectorClockEntry version = 4;
511}
512
513message PerformRename {
514    uint64 project_id = 1;
515    uint64 buffer_id = 2;
516    Anchor position = 3;
517    string new_name = 4;
518    repeated VectorClockEntry version = 5;
519}
520
521message PerformRenameResponse {
522    ProjectTransaction transaction = 2;
523}
524
525message SearchProject {
526    uint64 project_id = 1;
527    string query = 2;
528    bool regex = 3;
529    bool whole_word = 4;
530    bool case_sensitive = 5;
531}
532
533message SearchProjectResponse {
534    repeated Location locations = 1;
535}
536
537message CodeAction {
538    Anchor start = 1;
539    Anchor end = 2;
540    bytes lsp_action = 3;
541}
542
543message ProjectTransaction {
544    repeated uint64 buffer_ids = 1;
545    repeated Transaction transactions = 2;
546}
547
548message Transaction {
549    LocalTimestamp id = 1;
550    repeated LocalTimestamp edit_ids = 2;
551    repeated VectorClockEntry start = 3;
552}
553
554message LocalTimestamp {
555    uint32 replica_id = 1;
556    uint32 value = 2;
557}
558
559message LanguageServer {
560    uint64 id = 1;
561    string name = 2;
562}
563
564message StartLanguageServer {
565    uint64 project_id = 1;
566    LanguageServer server = 2;
567}
568
569message UpdateDiagnosticSummary {
570    uint64 project_id = 1;
571    uint64 worktree_id = 2;
572    DiagnosticSummary summary = 3;
573}
574
575message DiagnosticSummary {
576    string path = 1;
577    uint64 language_server_id = 2;
578    uint32 error_count = 3;
579    uint32 warning_count = 4;
580}
581
582message UpdateLanguageServer {
583    uint64 project_id = 1;
584    uint64 language_server_id = 2;
585    oneof variant {
586        LspWorkStart work_start = 3;
587        LspWorkProgress work_progress = 4;
588        LspWorkEnd work_end = 5;
589        LspDiskBasedDiagnosticsUpdating disk_based_diagnostics_updating = 6;
590        LspDiskBasedDiagnosticsUpdated disk_based_diagnostics_updated = 7;
591    }
592}
593
594message LspWorkStart {
595    string token = 1;
596    optional string message = 2;
597    optional uint32 percentage = 3;
598}
599
600message LspWorkProgress {
601    string token = 1;
602    optional string message = 2;
603    optional uint32 percentage = 3;
604}
605
606message LspWorkEnd {
607    string token = 1;
608}
609
610message LspDiskBasedDiagnosticsUpdating {}
611
612message LspDiskBasedDiagnosticsUpdated {}
613
614message GetChannels {}
615
616message GetChannelsResponse {
617    repeated Channel channels = 1;
618}
619
620message JoinChannel {
621    uint64 channel_id = 1;
622}
623
624message JoinChannelResponse {
625    repeated ChannelMessage messages = 1;
626    bool done = 2;
627}
628
629message LeaveChannel {
630    uint64 channel_id = 1;
631}
632
633message GetUsers {
634    repeated uint64 user_ids = 1;
635}
636
637message FuzzySearchUsers {
638    string query = 1;
639}
640
641message UsersResponse {
642    repeated User users = 1;
643}
644
645message RequestContact {
646    uint64 responder_id = 1;
647}
648
649message RemoveContact {
650    uint64 user_id = 1;
651}
652
653message RespondToContactRequest {
654    uint64 requester_id = 1;
655    ContactRequestResponse response = 2;
656}
657
658enum ContactRequestResponse {
659    Accept = 0;
660    Decline = 1;
661    Block = 2;
662    Dismiss = 3;
663}
664
665message SendChannelMessage {
666    uint64 channel_id = 1;
667    string body = 2;
668    Nonce nonce = 3;
669}
670
671message SendChannelMessageResponse {
672    ChannelMessage message = 1;
673}
674
675message ChannelMessageSent {
676    uint64 channel_id = 1;
677    ChannelMessage message = 2;
678}
679
680message GetChannelMessages {
681    uint64 channel_id = 1;
682    uint64 before_message_id = 2;
683}
684
685message GetChannelMessagesResponse {
686    repeated ChannelMessage messages = 1;
687    bool done = 2;
688}
689
690message UpdateContacts {
691    repeated Contact contacts = 1;
692    repeated uint64 remove_contacts = 2;
693    repeated IncomingContactRequest incoming_requests = 3;
694    repeated uint64 remove_incoming_requests = 4;
695    repeated uint64 outgoing_requests = 5;
696    repeated uint64 remove_outgoing_requests = 6;
697}
698
699message UpdateInviteInfo {
700    string url = 1;
701    uint32 count = 2;
702}
703
704message ShowContacts {}
705
706message IncomingContactRequest {
707    uint64 requester_id = 1;
708    bool should_notify = 2;
709}
710
711message UpdateDiagnostics {
712    uint32 replica_id = 1;
713    uint32 lamport_timestamp = 2;
714    repeated Diagnostic diagnostics = 3;
715}
716
717message Follow {
718    uint64 project_id = 1;
719    uint32 leader_id = 2;
720}
721
722message FollowResponse {
723    optional uint64 active_view_id = 1;
724    repeated View views = 2;
725}
726
727message UpdateFollowers {
728    uint64 project_id = 1;
729    repeated uint32 follower_ids = 2;
730    oneof variant {
731        UpdateActiveView update_active_view = 3;
732        View create_view = 4;
733        UpdateView update_view = 5;
734    }
735}
736
737message Unfollow {
738    uint64 project_id = 1;
739    uint32 leader_id = 2;
740}
741
742// Entities
743
744message UpdateActiveView {
745    optional uint64 id = 1;
746    optional uint32 leader_id = 2;
747}
748
749message UpdateView {
750    uint64 id = 1;
751    optional uint32 leader_id = 2;
752
753    oneof variant {
754        Editor editor = 3;
755    }
756
757    message Editor {
758        repeated Selection selections = 1;
759        Anchor scroll_top_anchor = 2;
760        float scroll_x = 3;
761        float scroll_y = 4;
762    }
763}
764
765message View {
766    uint64 id = 1;
767    optional uint32 leader_id = 2;
768
769    oneof variant {
770        Editor editor = 3;
771    }
772
773    message Editor {
774        uint64 buffer_id = 1;
775        repeated Selection selections = 2;
776        Anchor scroll_top_anchor = 3;
777        float scroll_x = 4;
778        float scroll_y = 5;
779    }
780}
781
782message Collaborator {
783    uint32 peer_id = 1;
784    uint32 replica_id = 2;
785    uint64 user_id = 3;
786}
787
788message User {
789    uint64 id = 1;
790    string github_login = 2;
791    string avatar_url = 3;
792}
793
794message File {
795    uint64 worktree_id = 1;
796    optional uint64 entry_id = 2;
797    string path = 3;
798    Timestamp mtime = 4;
799}
800
801message Entry {
802    uint64 id = 1;
803    bool is_dir = 2;
804    bytes path = 3;
805    uint64 inode = 4;
806    Timestamp mtime = 5;
807    bool is_symlink = 6;
808    bool is_ignored = 7;
809}
810
811message Buffer {
812    uint64 id = 1;
813    optional File file = 2;
814    string base_text = 3;
815    repeated Operation operations = 4;
816    repeated SelectionSet selections = 5;
817    repeated Diagnostic diagnostics = 6;
818    uint32 diagnostics_timestamp = 7;
819    repeated string completion_triggers = 8;
820    LineEnding line_ending = 9;
821}
822
823enum LineEnding {
824    Unix = 0;
825    Windows = 1;
826}
827
828message SelectionSet {
829    uint32 replica_id = 1;
830    repeated Selection selections = 2;
831    uint32 lamport_timestamp = 3;
832    bool line_mode = 4;
833}
834
835message Selection {
836    uint64 id = 1;
837    Anchor start = 2;
838    Anchor end = 3;
839    bool reversed = 4;
840}
841
842message Anchor {
843    uint32 replica_id = 1;
844    uint32 local_timestamp = 2;
845    uint64 offset = 3;
846    Bias bias = 4;
847    optional uint64 buffer_id = 5;
848}
849
850enum Bias {
851    Left = 0;
852    Right = 1;
853}
854
855message Diagnostic {
856    Anchor start = 1;
857    Anchor end = 2;
858    Severity severity = 3;
859    string message = 4;
860    optional string code = 5;
861    uint64 group_id = 6;
862    bool is_primary = 7;
863    bool is_valid = 8;
864    bool is_disk_based = 9;
865    bool is_unnecessary = 10;
866
867    enum Severity {
868        None = 0;
869        Error = 1;
870        Warning = 2;
871        Information = 3;
872        Hint = 4;
873    }
874}
875
876message Operation {
877    oneof variant {
878        Edit edit = 1;
879        Undo undo = 2;
880        UpdateSelections update_selections = 3;
881        UpdateDiagnostics update_diagnostics = 4;
882        UpdateCompletionTriggers update_completion_triggers = 5;
883    }
884
885    message Edit {
886        uint32 replica_id = 1;
887        uint32 local_timestamp = 2;
888        uint32 lamport_timestamp = 3;
889        repeated VectorClockEntry version = 4;
890        repeated Range ranges = 5;
891        repeated string new_text = 6;
892    }
893
894    message Undo {
895        uint32 replica_id = 1;
896        uint32 local_timestamp = 2;
897        uint32 lamport_timestamp = 3;
898        repeated VectorClockEntry version = 4;
899        repeated UndoCount counts = 5;
900    }
901
902    message UpdateSelections {
903        uint32 replica_id = 1;
904        uint32 lamport_timestamp = 2;
905        repeated Selection selections = 3;
906        bool line_mode = 4;
907    }
908
909    message UpdateCompletionTriggers {
910        uint32 replica_id = 1;
911        uint32 lamport_timestamp = 2;
912        repeated string triggers = 3;
913    }
914}
915
916message UndoMapEntry {
917    uint32 replica_id = 1;
918    uint32 local_timestamp = 2;
919    repeated UndoCount counts = 3;
920}
921
922message UndoCount {
923    uint32 replica_id = 1;
924    uint32 local_timestamp = 2;
925    uint32 count = 3;
926}
927
928message VectorClockEntry {
929    uint32 replica_id = 1;
930    uint32 timestamp = 2;
931}
932
933message Timestamp {
934    uint64 seconds = 1;
935    uint32 nanos = 2;
936}
937
938message Range {
939    uint64 start = 1;
940    uint64 end = 2;
941}
942
943message Point {
944    uint32 row = 1;
945    uint32 column = 2;
946}
947
948message Nonce {
949    uint64 upper_half = 1;
950    uint64 lower_half = 2;
951}
952
953message Channel {
954    uint64 id = 1;
955    string name = 2;
956}
957
958message ChannelMessage {
959    uint64 id = 1;
960    string body = 2;
961    uint64 timestamp = 3;
962    uint64 sender_id = 4;
963    Nonce nonce = 5;
964}
965
966message Contact {
967    uint64 user_id = 1;
968    repeated ProjectMetadata projects = 2;
969    bool online = 3;
970    bool should_notify = 4;
971}
972
973message ProjectMetadata {
974    uint64 id = 1;
975    repeated string visible_worktree_root_names = 3;
976    repeated uint64 guests = 4;
977}
978
979message WorktreeMetadata {
980    uint64 id = 1;
981    string root_name = 2;
982    bool visible = 3;
983}