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}