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