diff --git a/go/gen/compass/v1/comms.pb.go b/go/gen/compass/v1/comms.pb.go index 3a69f8e7..f0a4d2df 100644 --- a/go/gen/compass/v1/comms.pb.go +++ b/go/gen/compass/v1/comms.pb.go @@ -187,13 +187,20 @@ func (ChannelPostPolicy) EnumDescriptor() ([]byte, []int) { } // A channel's kind. A plain channel is the default; a DM is a direct -// conversation (human↔human, human↔agent, or agent↔agent) that widens into a -// GROUP_DM as members are added — an agent's primary surface is a channel/DM. +// conversation (human↔human, human↔agent, or agent↔agent) between exactly two +// parties — an agent's primary surface is a channel/DM. A DM never widens: a +// third party converts it to a named CHANNEL (UpdateChannelMembers with +// convert_channel_name), which frees the DM's deterministic name so a future +// open_dm mints a fresh pair DM. type ChannelKind int32 const ( - ChannelKind_CHANNEL_KIND_CHANNEL ChannelKind = 0 - ChannelKind_CHANNEL_KIND_DM ChannelKind = 1 + ChannelKind_CHANNEL_KIND_CHANNEL ChannelKind = 0 + ChannelKind_CHANNEL_KIND_DM ChannelKind = 1 + // Retired: never produced. A DM converts to a named CHANNEL on third-party + // add rather than widening. The number is not reusable. + // + // Deprecated: Marked as deprecated in compass/v1/comms.proto. ChannelKind_CHANNEL_KIND_GROUP_DM ChannelKind = 2 ) @@ -3042,6 +3049,13 @@ type UpdateChannelMembersRequest struct { // Members to mark unsubscribed (read-only). Each is a `@handle`; the server // resolves it to an account id; unknown → NOT_FOUND. UnsubscribeHandles []string `protobuf:"bytes,5,rep,name=unsubscribe_handles,json=unsubscribeHandles,proto3" json:"unsubscribe_handles,omitempty"` + // Non-empty converts a two-party DM into a named CHANNEL as part of the same + // member update: required to add a third party to a kind=DM channel (a bare + // add on a DM is INVALID_ARGUMENT). The convert sets kind=CHANNEL, renames + // the channel to this value, and detaches it from the reserved DM group — + // freeing the DM's deterministic name so a future open_dm mints a fresh pair + // DM. Ignored (no-op) for non-DM channels. + ConvertChannelName string `protobuf:"bytes,6,opt,name=convert_channel_name,json=convertChannelName,proto3" json:"convert_channel_name,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -3111,6 +3125,13 @@ func (x *UpdateChannelMembersRequest) GetUnsubscribeHandles() []string { return nil } +func (x *UpdateChannelMembersRequest) GetConvertChannelName() string { + if x != nil { + return x.ConvertChannelName + } + return "" +} + type UpdateChannelMembersResponse struct { state protoimpl.MessageState `protogen:"open.v1"` Channel *Channel `protobuf:"bytes,1,opt,name=channel,proto3" json:"channel,omitempty"` @@ -3155,6 +3176,107 @@ func (x *UpdateChannelMembersResponse) GetChannel() *Channel { return nil } +type OpenDMRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The peer agent's handle (owner-namespaced per DL-271). The server resolves + // it and enforces same-owner; unknown and cross-owner both return NOT_FOUND. + // A self-handle is INVALID_ARGUMENT. + PeerHandle string `protobuf:"bytes,1,opt,name=peer_handle,json=peerHandle,proto3" json:"peer_handle,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *OpenDMRequest) Reset() { + *x = OpenDMRequest{} + mi := &file_compass_v1_comms_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *OpenDMRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OpenDMRequest) ProtoMessage() {} + +func (x *OpenDMRequest) ProtoReflect() protoreflect.Message { + mi := &file_compass_v1_comms_proto_msgTypes[41] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OpenDMRequest.ProtoReflect.Descriptor instead. +func (*OpenDMRequest) Descriptor() ([]byte, []int) { + return file_compass_v1_comms_proto_rawDescGZIP(), []int{41} +} + +func (x *OpenDMRequest) GetPeerHandle() string { + if x != nil { + return x.PeerHandle + } + return "" +} + +type OpenDMResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The resolved DM channel; id-typed wire per DL-270, tools render its name. + Channel *Channel `protobuf:"bytes,1,opt,name=channel,proto3" json:"channel,omitempty"` + // True when this call minted the channel; false on a resume. + Created bool `protobuf:"varint,2,opt,name=created,proto3" json:"created,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *OpenDMResponse) Reset() { + *x = OpenDMResponse{} + mi := &file_compass_v1_comms_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *OpenDMResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OpenDMResponse) ProtoMessage() {} + +func (x *OpenDMResponse) ProtoReflect() protoreflect.Message { + mi := &file_compass_v1_comms_proto_msgTypes[42] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OpenDMResponse.ProtoReflect.Descriptor instead. +func (*OpenDMResponse) Descriptor() ([]byte, []int) { + return file_compass_v1_comms_proto_rawDescGZIP(), []int{42} +} + +func (x *OpenDMResponse) GetChannel() *Channel { + if x != nil { + return x.Channel + } + return nil +} + +func (x *OpenDMResponse) GetCreated() bool { + if x != nil { + return x.Created + } + return false +} + type ReparentAgentRequest struct { state protoimpl.MessageState `protogen:"open.v1"` // The agent to move. A `@handle`; the server resolves it to an account id; @@ -3169,7 +3291,7 @@ type ReparentAgentRequest struct { func (x *ReparentAgentRequest) Reset() { *x = ReparentAgentRequest{} - mi := &file_compass_v1_comms_proto_msgTypes[41] + mi := &file_compass_v1_comms_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3181,7 +3303,7 @@ func (x *ReparentAgentRequest) String() string { func (*ReparentAgentRequest) ProtoMessage() {} func (x *ReparentAgentRequest) ProtoReflect() protoreflect.Message { - mi := &file_compass_v1_comms_proto_msgTypes[41] + mi := &file_compass_v1_comms_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3194,7 +3316,7 @@ func (x *ReparentAgentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReparentAgentRequest.ProtoReflect.Descriptor instead. func (*ReparentAgentRequest) Descriptor() ([]byte, []int) { - return file_compass_v1_comms_proto_rawDescGZIP(), []int{41} + return file_compass_v1_comms_proto_rawDescGZIP(), []int{43} } func (x *ReparentAgentRequest) GetAgentHandle() string { @@ -3220,7 +3342,7 @@ type ReparentAgentResponse struct { func (x *ReparentAgentResponse) Reset() { *x = ReparentAgentResponse{} - mi := &file_compass_v1_comms_proto_msgTypes[42] + mi := &file_compass_v1_comms_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3232,7 +3354,7 @@ func (x *ReparentAgentResponse) String() string { func (*ReparentAgentResponse) ProtoMessage() {} func (x *ReparentAgentResponse) ProtoReflect() protoreflect.Message { - mi := &file_compass_v1_comms_proto_msgTypes[42] + mi := &file_compass_v1_comms_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3245,7 +3367,7 @@ func (x *ReparentAgentResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReparentAgentResponse.ProtoReflect.Descriptor instead. func (*ReparentAgentResponse) Descriptor() ([]byte, []int) { - return file_compass_v1_comms_proto_rawDescGZIP(), []int{42} + return file_compass_v1_comms_proto_rawDescGZIP(), []int{44} } func (x *ReparentAgentResponse) GetAccount() *Account { @@ -3272,7 +3394,7 @@ type SetChannelPolicyRequest struct { func (x *SetChannelPolicyRequest) Reset() { *x = SetChannelPolicyRequest{} - mi := &file_compass_v1_comms_proto_msgTypes[43] + mi := &file_compass_v1_comms_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3284,7 +3406,7 @@ func (x *SetChannelPolicyRequest) String() string { func (*SetChannelPolicyRequest) ProtoMessage() {} func (x *SetChannelPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_compass_v1_comms_proto_msgTypes[43] + mi := &file_compass_v1_comms_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3297,7 +3419,7 @@ func (x *SetChannelPolicyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetChannelPolicyRequest.ProtoReflect.Descriptor instead. func (*SetChannelPolicyRequest) Descriptor() ([]byte, []int) { - return file_compass_v1_comms_proto_rawDescGZIP(), []int{43} + return file_compass_v1_comms_proto_rawDescGZIP(), []int{45} } func (x *SetChannelPolicyRequest) GetChannelId() string { @@ -3338,7 +3460,7 @@ type SetChannelPolicyResponse struct { func (x *SetChannelPolicyResponse) Reset() { *x = SetChannelPolicyResponse{} - mi := &file_compass_v1_comms_proto_msgTypes[44] + mi := &file_compass_v1_comms_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3350,7 +3472,7 @@ func (x *SetChannelPolicyResponse) String() string { func (*SetChannelPolicyResponse) ProtoMessage() {} func (x *SetChannelPolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_compass_v1_comms_proto_msgTypes[44] + mi := &file_compass_v1_comms_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3363,7 +3485,7 @@ func (x *SetChannelPolicyResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetChannelPolicyResponse.ProtoReflect.Descriptor instead. func (*SetChannelPolicyResponse) Descriptor() ([]byte, []int) { - return file_compass_v1_comms_proto_rawDescGZIP(), []int{44} + return file_compass_v1_comms_proto_rawDescGZIP(), []int{46} } func (x *SetChannelPolicyResponse) GetChannel() *Channel { @@ -3387,7 +3509,7 @@ type GetRosterRequest struct { func (x *GetRosterRequest) Reset() { *x = GetRosterRequest{} - mi := &file_compass_v1_comms_proto_msgTypes[45] + mi := &file_compass_v1_comms_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3399,7 +3521,7 @@ func (x *GetRosterRequest) String() string { func (*GetRosterRequest) ProtoMessage() {} func (x *GetRosterRequest) ProtoReflect() protoreflect.Message { - mi := &file_compass_v1_comms_proto_msgTypes[45] + mi := &file_compass_v1_comms_proto_msgTypes[47] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3412,7 +3534,7 @@ func (x *GetRosterRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRosterRequest.ProtoReflect.Descriptor instead. func (*GetRosterRequest) Descriptor() ([]byte, []int) { - return file_compass_v1_comms_proto_rawDescGZIP(), []int{45} + return file_compass_v1_comms_proto_rawDescGZIP(), []int{47} } func (x *GetRosterRequest) GetScope() RosterScope { @@ -3438,7 +3560,7 @@ type GetRosterResponse struct { func (x *GetRosterResponse) Reset() { *x = GetRosterResponse{} - mi := &file_compass_v1_comms_proto_msgTypes[46] + mi := &file_compass_v1_comms_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3450,7 +3572,7 @@ func (x *GetRosterResponse) String() string { func (*GetRosterResponse) ProtoMessage() {} func (x *GetRosterResponse) ProtoReflect() protoreflect.Message { - mi := &file_compass_v1_comms_proto_msgTypes[46] + mi := &file_compass_v1_comms_proto_msgTypes[48] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3463,7 +3585,7 @@ func (x *GetRosterResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRosterResponse.ProtoReflect.Descriptor instead. func (*GetRosterResponse) Descriptor() ([]byte, []int) { - return file_compass_v1_comms_proto_rawDescGZIP(), []int{46} + return file_compass_v1_comms_proto_rawDescGZIP(), []int{48} } func (x *GetRosterResponse) GetEntries() []*RosterEntry { @@ -3490,7 +3612,7 @@ type RosterEntry struct { func (x *RosterEntry) Reset() { *x = RosterEntry{} - mi := &file_compass_v1_comms_proto_msgTypes[47] + mi := &file_compass_v1_comms_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3502,7 +3624,7 @@ func (x *RosterEntry) String() string { func (*RosterEntry) ProtoMessage() {} func (x *RosterEntry) ProtoReflect() protoreflect.Message { - mi := &file_compass_v1_comms_proto_msgTypes[47] + mi := &file_compass_v1_comms_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3515,7 +3637,7 @@ func (x *RosterEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use RosterEntry.ProtoReflect.Descriptor instead. func (*RosterEntry) Descriptor() ([]byte, []int) { - return file_compass_v1_comms_proto_rawDescGZIP(), []int{47} + return file_compass_v1_comms_proto_rawDescGZIP(), []int{49} } func (x *RosterEntry) GetAgentAccountId() string { @@ -3582,7 +3704,7 @@ type UpdatePinnedBoardRequest struct { func (x *UpdatePinnedBoardRequest) Reset() { *x = UpdatePinnedBoardRequest{} - mi := &file_compass_v1_comms_proto_msgTypes[48] + mi := &file_compass_v1_comms_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3594,7 +3716,7 @@ func (x *UpdatePinnedBoardRequest) String() string { func (*UpdatePinnedBoardRequest) ProtoMessage() {} func (x *UpdatePinnedBoardRequest) ProtoReflect() protoreflect.Message { - mi := &file_compass_v1_comms_proto_msgTypes[48] + mi := &file_compass_v1_comms_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3607,7 +3729,7 @@ func (x *UpdatePinnedBoardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdatePinnedBoardRequest.ProtoReflect.Descriptor instead. func (*UpdatePinnedBoardRequest) Descriptor() ([]byte, []int) { - return file_compass_v1_comms_proto_rawDescGZIP(), []int{48} + return file_compass_v1_comms_proto_rawDescGZIP(), []int{50} } func (x *UpdatePinnedBoardRequest) GetChannelId() string { @@ -3673,7 +3795,7 @@ type PinMessage struct { func (x *PinMessage) Reset() { *x = PinMessage{} - mi := &file_compass_v1_comms_proto_msgTypes[49] + mi := &file_compass_v1_comms_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3685,7 +3807,7 @@ func (x *PinMessage) String() string { func (*PinMessage) ProtoMessage() {} func (x *PinMessage) ProtoReflect() protoreflect.Message { - mi := &file_compass_v1_comms_proto_msgTypes[49] + mi := &file_compass_v1_comms_proto_msgTypes[51] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3698,7 +3820,7 @@ func (x *PinMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use PinMessage.ProtoReflect.Descriptor instead. func (*PinMessage) Descriptor() ([]byte, []int) { - return file_compass_v1_comms_proto_rawDescGZIP(), []int{49} + return file_compass_v1_comms_proto_rawDescGZIP(), []int{51} } func (x *PinMessage) GetMessageId() string { @@ -3725,7 +3847,7 @@ type UpdatePinnedBoardResponse struct { func (x *UpdatePinnedBoardResponse) Reset() { *x = UpdatePinnedBoardResponse{} - mi := &file_compass_v1_comms_proto_msgTypes[50] + mi := &file_compass_v1_comms_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3737,7 +3859,7 @@ func (x *UpdatePinnedBoardResponse) String() string { func (*UpdatePinnedBoardResponse) ProtoMessage() {} func (x *UpdatePinnedBoardResponse) ProtoReflect() protoreflect.Message { - mi := &file_compass_v1_comms_proto_msgTypes[50] + mi := &file_compass_v1_comms_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3750,7 +3872,7 @@ func (x *UpdatePinnedBoardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdatePinnedBoardResponse.ProtoReflect.Descriptor instead. func (*UpdatePinnedBoardResponse) Descriptor() ([]byte, []int) { - return file_compass_v1_comms_proto_rawDescGZIP(), []int{50} + return file_compass_v1_comms_proto_rawDescGZIP(), []int{52} } func (x *UpdatePinnedBoardResponse) GetChannel() *Channel { @@ -3771,7 +3893,7 @@ type OpenAgentWorkspaceRequest struct { func (x *OpenAgentWorkspaceRequest) Reset() { *x = OpenAgentWorkspaceRequest{} - mi := &file_compass_v1_comms_proto_msgTypes[51] + mi := &file_compass_v1_comms_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3783,7 +3905,7 @@ func (x *OpenAgentWorkspaceRequest) String() string { func (*OpenAgentWorkspaceRequest) ProtoMessage() {} func (x *OpenAgentWorkspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_compass_v1_comms_proto_msgTypes[51] + mi := &file_compass_v1_comms_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3796,7 +3918,7 @@ func (x *OpenAgentWorkspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenAgentWorkspaceRequest.ProtoReflect.Descriptor instead. func (*OpenAgentWorkspaceRequest) Descriptor() ([]byte, []int) { - return file_compass_v1_comms_proto_rawDescGZIP(), []int{51} + return file_compass_v1_comms_proto_rawDescGZIP(), []int{53} } func (x *OpenAgentWorkspaceRequest) GetAgentHandle() string { @@ -3815,7 +3937,7 @@ type OpenAgentWorkspaceResponse struct { func (x *OpenAgentWorkspaceResponse) Reset() { *x = OpenAgentWorkspaceResponse{} - mi := &file_compass_v1_comms_proto_msgTypes[52] + mi := &file_compass_v1_comms_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3827,7 +3949,7 @@ func (x *OpenAgentWorkspaceResponse) String() string { func (*OpenAgentWorkspaceResponse) ProtoMessage() {} func (x *OpenAgentWorkspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_compass_v1_comms_proto_msgTypes[52] + mi := &file_compass_v1_comms_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3840,7 +3962,7 @@ func (x *OpenAgentWorkspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenAgentWorkspaceResponse.ProtoReflect.Descriptor instead. func (*OpenAgentWorkspaceResponse) Descriptor() ([]byte, []int) { - return file_compass_v1_comms_proto_rawDescGZIP(), []int{52} + return file_compass_v1_comms_proto_rawDescGZIP(), []int{54} } func (x *OpenAgentWorkspaceResponse) GetWorkspace() *AgentWorkspace { @@ -3875,7 +3997,7 @@ type ListMessagesRequest struct { func (x *ListMessagesRequest) Reset() { *x = ListMessagesRequest{} - mi := &file_compass_v1_comms_proto_msgTypes[53] + mi := &file_compass_v1_comms_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3887,7 +4009,7 @@ func (x *ListMessagesRequest) String() string { func (*ListMessagesRequest) ProtoMessage() {} func (x *ListMessagesRequest) ProtoReflect() protoreflect.Message { - mi := &file_compass_v1_comms_proto_msgTypes[53] + mi := &file_compass_v1_comms_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3900,7 +4022,7 @@ func (x *ListMessagesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListMessagesRequest.ProtoReflect.Descriptor instead. func (*ListMessagesRequest) Descriptor() ([]byte, []int) { - return file_compass_v1_comms_proto_rawDescGZIP(), []int{53} + return file_compass_v1_comms_proto_rawDescGZIP(), []int{55} } func (x *ListMessagesRequest) GetContainer() isListMessagesRequest_Container { @@ -3967,7 +4089,7 @@ type ListMessagesResponse struct { func (x *ListMessagesResponse) Reset() { *x = ListMessagesResponse{} - mi := &file_compass_v1_comms_proto_msgTypes[54] + mi := &file_compass_v1_comms_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3979,7 +4101,7 @@ func (x *ListMessagesResponse) String() string { func (*ListMessagesResponse) ProtoMessage() {} func (x *ListMessagesResponse) ProtoReflect() protoreflect.Message { - mi := &file_compass_v1_comms_proto_msgTypes[54] + mi := &file_compass_v1_comms_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3992,7 +4114,7 @@ func (x *ListMessagesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListMessagesResponse.ProtoReflect.Descriptor instead. func (*ListMessagesResponse) Descriptor() ([]byte, []int) { - return file_compass_v1_comms_proto_rawDescGZIP(), []int{54} + return file_compass_v1_comms_proto_rawDescGZIP(), []int{56} } func (x *ListMessagesResponse) GetMessages() []*Message { @@ -4043,7 +4165,7 @@ type PostMessageRequest struct { func (x *PostMessageRequest) Reset() { *x = PostMessageRequest{} - mi := &file_compass_v1_comms_proto_msgTypes[55] + mi := &file_compass_v1_comms_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4055,7 +4177,7 @@ func (x *PostMessageRequest) String() string { func (*PostMessageRequest) ProtoMessage() {} func (x *PostMessageRequest) ProtoReflect() protoreflect.Message { - mi := &file_compass_v1_comms_proto_msgTypes[55] + mi := &file_compass_v1_comms_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4068,7 +4190,7 @@ func (x *PostMessageRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PostMessageRequest.ProtoReflect.Descriptor instead. func (*PostMessageRequest) Descriptor() ([]byte, []int) { - return file_compass_v1_comms_proto_rawDescGZIP(), []int{55} + return file_compass_v1_comms_proto_rawDescGZIP(), []int{57} } func (x *PostMessageRequest) GetContainer() isPostMessageRequest_Container { @@ -4168,7 +4290,7 @@ type PostMessageResponse struct { func (x *PostMessageResponse) Reset() { *x = PostMessageResponse{} - mi := &file_compass_v1_comms_proto_msgTypes[56] + mi := &file_compass_v1_comms_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4180,7 +4302,7 @@ func (x *PostMessageResponse) String() string { func (*PostMessageResponse) ProtoMessage() {} func (x *PostMessageResponse) ProtoReflect() protoreflect.Message { - mi := &file_compass_v1_comms_proto_msgTypes[56] + mi := &file_compass_v1_comms_proto_msgTypes[58] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4193,7 +4315,7 @@ func (x *PostMessageResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PostMessageResponse.ProtoReflect.Descriptor instead. func (*PostMessageResponse) Descriptor() ([]byte, []int) { - return file_compass_v1_comms_proto_rawDescGZIP(), []int{56} + return file_compass_v1_comms_proto_rawDescGZIP(), []int{58} } func (x *PostMessageResponse) GetMessage() *Message { @@ -4215,7 +4337,7 @@ type ListTopicsRequest struct { func (x *ListTopicsRequest) Reset() { *x = ListTopicsRequest{} - mi := &file_compass_v1_comms_proto_msgTypes[57] + mi := &file_compass_v1_comms_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4227,7 +4349,7 @@ func (x *ListTopicsRequest) String() string { func (*ListTopicsRequest) ProtoMessage() {} func (x *ListTopicsRequest) ProtoReflect() protoreflect.Message { - mi := &file_compass_v1_comms_proto_msgTypes[57] + mi := &file_compass_v1_comms_proto_msgTypes[59] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4240,7 +4362,7 @@ func (x *ListTopicsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTopicsRequest.ProtoReflect.Descriptor instead. func (*ListTopicsRequest) Descriptor() ([]byte, []int) { - return file_compass_v1_comms_proto_rawDescGZIP(), []int{57} + return file_compass_v1_comms_proto_rawDescGZIP(), []int{59} } func (x *ListTopicsRequest) GetChannelId() string { @@ -4266,7 +4388,7 @@ type ListTopicsResponse struct { func (x *ListTopicsResponse) Reset() { *x = ListTopicsResponse{} - mi := &file_compass_v1_comms_proto_msgTypes[58] + mi := &file_compass_v1_comms_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4278,7 +4400,7 @@ func (x *ListTopicsResponse) String() string { func (*ListTopicsResponse) ProtoMessage() {} func (x *ListTopicsResponse) ProtoReflect() protoreflect.Message { - mi := &file_compass_v1_comms_proto_msgTypes[58] + mi := &file_compass_v1_comms_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4291,7 +4413,7 @@ func (x *ListTopicsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTopicsResponse.ProtoReflect.Descriptor instead. func (*ListTopicsResponse) Descriptor() ([]byte, []int) { - return file_compass_v1_comms_proto_rawDescGZIP(), []int{58} + return file_compass_v1_comms_proto_rawDescGZIP(), []int{60} } func (x *ListTopicsResponse) GetTopics() []*Topic { @@ -4316,7 +4438,7 @@ type UpdateTopicRequest struct { func (x *UpdateTopicRequest) Reset() { *x = UpdateTopicRequest{} - mi := &file_compass_v1_comms_proto_msgTypes[59] + mi := &file_compass_v1_comms_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4328,7 +4450,7 @@ func (x *UpdateTopicRequest) String() string { func (*UpdateTopicRequest) ProtoMessage() {} func (x *UpdateTopicRequest) ProtoReflect() protoreflect.Message { - mi := &file_compass_v1_comms_proto_msgTypes[59] + mi := &file_compass_v1_comms_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4341,7 +4463,7 @@ func (x *UpdateTopicRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateTopicRequest.ProtoReflect.Descriptor instead. func (*UpdateTopicRequest) Descriptor() ([]byte, []int) { - return file_compass_v1_comms_proto_rawDescGZIP(), []int{59} + return file_compass_v1_comms_proto_rawDescGZIP(), []int{61} } func (x *UpdateTopicRequest) GetTopicId() string { @@ -4374,7 +4496,7 @@ type UpdateTopicResponse struct { func (x *UpdateTopicResponse) Reset() { *x = UpdateTopicResponse{} - mi := &file_compass_v1_comms_proto_msgTypes[60] + mi := &file_compass_v1_comms_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4386,7 +4508,7 @@ func (x *UpdateTopicResponse) String() string { func (*UpdateTopicResponse) ProtoMessage() {} func (x *UpdateTopicResponse) ProtoReflect() protoreflect.Message { - mi := &file_compass_v1_comms_proto_msgTypes[60] + mi := &file_compass_v1_comms_proto_msgTypes[62] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4399,7 +4521,7 @@ func (x *UpdateTopicResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateTopicResponse.ProtoReflect.Descriptor instead. func (*UpdateTopicResponse) Descriptor() ([]byte, []int) { - return file_compass_v1_comms_proto_rawDescGZIP(), []int{60} + return file_compass_v1_comms_proto_rawDescGZIP(), []int{62} } func (x *UpdateTopicResponse) GetTopic() *Topic { @@ -4422,7 +4544,7 @@ type RespondToAskRequest struct { func (x *RespondToAskRequest) Reset() { *x = RespondToAskRequest{} - mi := &file_compass_v1_comms_proto_msgTypes[61] + mi := &file_compass_v1_comms_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4434,7 +4556,7 @@ func (x *RespondToAskRequest) String() string { func (*RespondToAskRequest) ProtoMessage() {} func (x *RespondToAskRequest) ProtoReflect() protoreflect.Message { - mi := &file_compass_v1_comms_proto_msgTypes[61] + mi := &file_compass_v1_comms_proto_msgTypes[63] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4447,7 +4569,7 @@ func (x *RespondToAskRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RespondToAskRequest.ProtoReflect.Descriptor instead. func (*RespondToAskRequest) Descriptor() ([]byte, []int) { - return file_compass_v1_comms_proto_rawDescGZIP(), []int{61} + return file_compass_v1_comms_proto_rawDescGZIP(), []int{63} } func (x *RespondToAskRequest) GetAskId() string { @@ -4479,7 +4601,7 @@ type AskQuestionAnswer struct { func (x *AskQuestionAnswer) Reset() { *x = AskQuestionAnswer{} - mi := &file_compass_v1_comms_proto_msgTypes[62] + mi := &file_compass_v1_comms_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4491,7 +4613,7 @@ func (x *AskQuestionAnswer) String() string { func (*AskQuestionAnswer) ProtoMessage() {} func (x *AskQuestionAnswer) ProtoReflect() protoreflect.Message { - mi := &file_compass_v1_comms_proto_msgTypes[62] + mi := &file_compass_v1_comms_proto_msgTypes[64] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4504,7 +4626,7 @@ func (x *AskQuestionAnswer) ProtoReflect() protoreflect.Message { // Deprecated: Use AskQuestionAnswer.ProtoReflect.Descriptor instead. func (*AskQuestionAnswer) Descriptor() ([]byte, []int) { - return file_compass_v1_comms_proto_rawDescGZIP(), []int{62} + return file_compass_v1_comms_proto_rawDescGZIP(), []int{64} } func (x *AskQuestionAnswer) GetQuestionId() string { @@ -4536,7 +4658,7 @@ type RespondToAskResponse struct { func (x *RespondToAskResponse) Reset() { *x = RespondToAskResponse{} - mi := &file_compass_v1_comms_proto_msgTypes[63] + mi := &file_compass_v1_comms_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4548,7 +4670,7 @@ func (x *RespondToAskResponse) String() string { func (*RespondToAskResponse) ProtoMessage() {} func (x *RespondToAskResponse) ProtoReflect() protoreflect.Message { - mi := &file_compass_v1_comms_proto_msgTypes[63] + mi := &file_compass_v1_comms_proto_msgTypes[65] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4561,7 +4683,7 @@ func (x *RespondToAskResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RespondToAskResponse.ProtoReflect.Descriptor instead. func (*RespondToAskResponse) Descriptor() ([]byte, []int) { - return file_compass_v1_comms_proto_rawDescGZIP(), []int{63} + return file_compass_v1_comms_proto_rawDescGZIP(), []int{65} } type SearchMessagesRequest struct { @@ -4585,7 +4707,7 @@ type SearchMessagesRequest struct { func (x *SearchMessagesRequest) Reset() { *x = SearchMessagesRequest{} - mi := &file_compass_v1_comms_proto_msgTypes[64] + mi := &file_compass_v1_comms_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4597,7 +4719,7 @@ func (x *SearchMessagesRequest) String() string { func (*SearchMessagesRequest) ProtoMessage() {} func (x *SearchMessagesRequest) ProtoReflect() protoreflect.Message { - mi := &file_compass_v1_comms_proto_msgTypes[64] + mi := &file_compass_v1_comms_proto_msgTypes[66] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4610,7 +4732,7 @@ func (x *SearchMessagesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchMessagesRequest.ProtoReflect.Descriptor instead. func (*SearchMessagesRequest) Descriptor() ([]byte, []int) { - return file_compass_v1_comms_proto_rawDescGZIP(), []int{64} + return file_compass_v1_comms_proto_rawDescGZIP(), []int{66} } func (x *SearchMessagesRequest) GetQuery() string { @@ -4670,7 +4792,7 @@ type SearchMessagesResponse struct { func (x *SearchMessagesResponse) Reset() { *x = SearchMessagesResponse{} - mi := &file_compass_v1_comms_proto_msgTypes[65] + mi := &file_compass_v1_comms_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4682,7 +4804,7 @@ func (x *SearchMessagesResponse) String() string { func (*SearchMessagesResponse) ProtoMessage() {} func (x *SearchMessagesResponse) ProtoReflect() protoreflect.Message { - mi := &file_compass_v1_comms_proto_msgTypes[65] + mi := &file_compass_v1_comms_proto_msgTypes[67] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4695,7 +4817,7 @@ func (x *SearchMessagesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchMessagesResponse.ProtoReflect.Descriptor instead. func (*SearchMessagesResponse) Descriptor() ([]byte, []int) { - return file_compass_v1_comms_proto_rawDescGZIP(), []int{65} + return file_compass_v1_comms_proto_rawDescGZIP(), []int{67} } func (x *SearchMessagesResponse) GetMessages() []*Message { @@ -4719,7 +4841,7 @@ type SubscribeCommsRequest struct { func (x *SubscribeCommsRequest) Reset() { *x = SubscribeCommsRequest{} - mi := &file_compass_v1_comms_proto_msgTypes[66] + mi := &file_compass_v1_comms_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4731,7 +4853,7 @@ func (x *SubscribeCommsRequest) String() string { func (*SubscribeCommsRequest) ProtoMessage() {} func (x *SubscribeCommsRequest) ProtoReflect() protoreflect.Message { - mi := &file_compass_v1_comms_proto_msgTypes[66] + mi := &file_compass_v1_comms_proto_msgTypes[68] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4744,7 +4866,7 @@ func (x *SubscribeCommsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeCommsRequest.ProtoReflect.Descriptor instead. func (*SubscribeCommsRequest) Descriptor() ([]byte, []int) { - return file_compass_v1_comms_proto_rawDescGZIP(), []int{66} + return file_compass_v1_comms_proto_rawDescGZIP(), []int{68} } func (x *SubscribeCommsRequest) GetSinceSeq() uint64 { @@ -4933,16 +5055,23 @@ const file_compass_v1_comms_proto_rawDesc = "" + "\x04kind\x18\x03 \x01(\x0e2\x17.compass.v1.ChannelKindR\x04kind\x12%\n" + "\x0emember_handles\x18\x04 \x03(\tR\rmemberHandles\"F\n" + "\x15CreateChannelResponse\x12-\n" + - "\achannel\x18\x01 \x01(\v2\x13.compass.v1.ChannelR\achannel\"\xfc\x01\n" + + "\achannel\x18\x01 \x01(\v2\x13.compass.v1.ChannelR\achannel\"\xae\x02\n" + "\x1bUpdateChannelMembersRequest\x12\x1d\n" + "\n" + "channel_id\x18\x01 \x01(\tR\tchannelId\x12,\n" + "\x12add_member_handles\x18\x02 \x03(\tR\x10addMemberHandles\x122\n" + "\x15remove_member_handles\x18\x03 \x03(\tR\x13removeMemberHandles\x12+\n" + "\x11subscribe_handles\x18\x04 \x03(\tR\x10subscribeHandles\x12/\n" + - "\x13unsubscribe_handles\x18\x05 \x03(\tR\x12unsubscribeHandles\"M\n" + + "\x13unsubscribe_handles\x18\x05 \x03(\tR\x12unsubscribeHandles\x120\n" + + "\x14convert_channel_name\x18\x06 \x01(\tR\x12convertChannelName\"M\n" + "\x1cUpdateChannelMembersResponse\x12-\n" + - "\achannel\x18\x01 \x01(\v2\x13.compass.v1.ChannelR\achannel\"e\n" + + "\achannel\x18\x01 \x01(\v2\x13.compass.v1.ChannelR\achannel\"0\n" + + "\rOpenDMRequest\x12\x1f\n" + + "\vpeer_handle\x18\x01 \x01(\tR\n" + + "peerHandle\"Y\n" + + "\x0eOpenDMResponse\x12-\n" + + "\achannel\x18\x01 \x01(\v2\x13.compass.v1.ChannelR\achannel\x12\x18\n" + + "\acreated\x18\x02 \x01(\bR\acreated\"e\n" + "\x14ReparentAgentRequest\x12!\n" + "\fagent_handle\x18\x01 \x01(\tR\vagentHandle\x12*\n" + "\x11new_parent_handle\x18\x02 \x01(\tR\x0fnewParentHandle\"F\n" + @@ -5054,11 +5183,11 @@ const file_compass_v1_comms_proto_rawDesc = "" + "\x1fCHANNEL_GROUP_VISIBILITY_SHARED\x10\x01*U\n" + "\x11ChannelPostPolicy\x12\x1c\n" + "\x18CHANNEL_POST_POLICY_OPEN\x10\x00\x12\"\n" + - "\x1eCHANNEL_POST_POLICY_OWNER_ONLY\x10\x01*W\n" + + "\x1eCHANNEL_POST_POLICY_OWNER_ONLY\x10\x01*[\n" + "\vChannelKind\x12\x18\n" + "\x14CHANNEL_KIND_CHANNEL\x10\x00\x12\x13\n" + - "\x0fCHANNEL_KIND_DM\x10\x01\x12\x19\n" + - "\x15CHANNEL_KIND_GROUP_DM\x10\x02*\x9c\x01\n" + + "\x0fCHANNEL_KIND_DM\x10\x01\x12\x1d\n" + + "\x15CHANNEL_KIND_GROUP_DM\x10\x02\x1a\x02\b\x01*\x9c\x01\n" + "\rAgentPresence\x12\x1e\n" + "\x1aAGENT_PRESENCE_UNSPECIFIED\x10\x00\x12\x17\n" + "\x13AGENT_PRESENCE_IDLE\x10\x01\x12\x1a\n" + @@ -5068,7 +5197,7 @@ const file_compass_v1_comms_proto_rawDesc = "" + "\vRosterScope\x12\x1d\n" + "\x19ROSTER_SCOPE_NEIGHBORHOOD\x10\x00\x12\x18\n" + "\x14ROSTER_SCOPE_SUBTREE\x10\x01\x12\x16\n" + - "\x12ROSTER_SCOPE_OWNER\x10\x022\xe6\r\n" + + "\x12ROSTER_SCOPE_OWNER\x10\x022\xa7\x0e\n" + "\fCommsService\x12K\n" + "\n" + "CreateUser\x12\x1d.compass.v1.CreateUserRequest\x1a\x1e.compass.v1.CreateUserResponse\x12N\n" + @@ -5078,7 +5207,8 @@ const file_compass_v1_comms_proto_rawDesc = "" + "\x11ListChannelGroups\x12$.compass.v1.ListChannelGroupsRequest\x1a%.compass.v1.ListChannelGroupsResponse\x12Q\n" + "\fListChannels\x12\x1f.compass.v1.ListChannelsRequest\x1a .compass.v1.ListChannelsResponse\x12T\n" + "\rCreateChannel\x12 .compass.v1.CreateChannelRequest\x1a!.compass.v1.CreateChannelResponse\x12i\n" + - "\x14UpdateChannelMembers\x12'.compass.v1.UpdateChannelMembersRequest\x1a(.compass.v1.UpdateChannelMembersResponse\x12T\n" + + "\x14UpdateChannelMembers\x12'.compass.v1.UpdateChannelMembersRequest\x1a(.compass.v1.UpdateChannelMembersResponse\x12?\n" + + "\x06OpenDM\x12\x19.compass.v1.OpenDMRequest\x1a\x1a.compass.v1.OpenDMResponse\x12T\n" + "\rReparentAgent\x12 .compass.v1.ReparentAgentRequest\x1a!.compass.v1.ReparentAgentResponse\x12c\n" + "\x12OpenAgentWorkspace\x12%.compass.v1.OpenAgentWorkspaceRequest\x1a&.compass.v1.OpenAgentWorkspaceResponse\x12Q\n" + "\fListMessages\x12\x1f.compass.v1.ListMessagesRequest\x1a .compass.v1.ListMessagesResponse\x12N\n" + @@ -5106,7 +5236,7 @@ func file_compass_v1_comms_proto_rawDescGZIP() []byte { } var file_compass_v1_comms_proto_enumTypes = make([]protoimpl.EnumInfo, 6) -var file_compass_v1_comms_proto_msgTypes = make([]protoimpl.MessageInfo, 67) +var file_compass_v1_comms_proto_msgTypes = make([]protoimpl.MessageInfo, 69) var file_compass_v1_comms_proto_goTypes = []any{ (UserRole)(0), // 0: compass.v1.UserRole (ChannelGroupVisibility)(0), // 1: compass.v1.ChannelGroupVisibility @@ -5155,32 +5285,34 @@ var file_compass_v1_comms_proto_goTypes = []any{ (*CreateChannelResponse)(nil), // 44: compass.v1.CreateChannelResponse (*UpdateChannelMembersRequest)(nil), // 45: compass.v1.UpdateChannelMembersRequest (*UpdateChannelMembersResponse)(nil), // 46: compass.v1.UpdateChannelMembersResponse - (*ReparentAgentRequest)(nil), // 47: compass.v1.ReparentAgentRequest - (*ReparentAgentResponse)(nil), // 48: compass.v1.ReparentAgentResponse - (*SetChannelPolicyRequest)(nil), // 49: compass.v1.SetChannelPolicyRequest - (*SetChannelPolicyResponse)(nil), // 50: compass.v1.SetChannelPolicyResponse - (*GetRosterRequest)(nil), // 51: compass.v1.GetRosterRequest - (*GetRosterResponse)(nil), // 52: compass.v1.GetRosterResponse - (*RosterEntry)(nil), // 53: compass.v1.RosterEntry - (*UpdatePinnedBoardRequest)(nil), // 54: compass.v1.UpdatePinnedBoardRequest - (*PinMessage)(nil), // 55: compass.v1.PinMessage - (*UpdatePinnedBoardResponse)(nil), // 56: compass.v1.UpdatePinnedBoardResponse - (*OpenAgentWorkspaceRequest)(nil), // 57: compass.v1.OpenAgentWorkspaceRequest - (*OpenAgentWorkspaceResponse)(nil), // 58: compass.v1.OpenAgentWorkspaceResponse - (*ListMessagesRequest)(nil), // 59: compass.v1.ListMessagesRequest - (*ListMessagesResponse)(nil), // 60: compass.v1.ListMessagesResponse - (*PostMessageRequest)(nil), // 61: compass.v1.PostMessageRequest - (*PostMessageResponse)(nil), // 62: compass.v1.PostMessageResponse - (*ListTopicsRequest)(nil), // 63: compass.v1.ListTopicsRequest - (*ListTopicsResponse)(nil), // 64: compass.v1.ListTopicsResponse - (*UpdateTopicRequest)(nil), // 65: compass.v1.UpdateTopicRequest - (*UpdateTopicResponse)(nil), // 66: compass.v1.UpdateTopicResponse - (*RespondToAskRequest)(nil), // 67: compass.v1.RespondToAskRequest - (*AskQuestionAnswer)(nil), // 68: compass.v1.AskQuestionAnswer - (*RespondToAskResponse)(nil), // 69: compass.v1.RespondToAskResponse - (*SearchMessagesRequest)(nil), // 70: compass.v1.SearchMessagesRequest - (*SearchMessagesResponse)(nil), // 71: compass.v1.SearchMessagesResponse - (*SubscribeCommsRequest)(nil), // 72: compass.v1.SubscribeCommsRequest + (*OpenDMRequest)(nil), // 47: compass.v1.OpenDMRequest + (*OpenDMResponse)(nil), // 48: compass.v1.OpenDMResponse + (*ReparentAgentRequest)(nil), // 49: compass.v1.ReparentAgentRequest + (*ReparentAgentResponse)(nil), // 50: compass.v1.ReparentAgentResponse + (*SetChannelPolicyRequest)(nil), // 51: compass.v1.SetChannelPolicyRequest + (*SetChannelPolicyResponse)(nil), // 52: compass.v1.SetChannelPolicyResponse + (*GetRosterRequest)(nil), // 53: compass.v1.GetRosterRequest + (*GetRosterResponse)(nil), // 54: compass.v1.GetRosterResponse + (*RosterEntry)(nil), // 55: compass.v1.RosterEntry + (*UpdatePinnedBoardRequest)(nil), // 56: compass.v1.UpdatePinnedBoardRequest + (*PinMessage)(nil), // 57: compass.v1.PinMessage + (*UpdatePinnedBoardResponse)(nil), // 58: compass.v1.UpdatePinnedBoardResponse + (*OpenAgentWorkspaceRequest)(nil), // 59: compass.v1.OpenAgentWorkspaceRequest + (*OpenAgentWorkspaceResponse)(nil), // 60: compass.v1.OpenAgentWorkspaceResponse + (*ListMessagesRequest)(nil), // 61: compass.v1.ListMessagesRequest + (*ListMessagesResponse)(nil), // 62: compass.v1.ListMessagesResponse + (*PostMessageRequest)(nil), // 63: compass.v1.PostMessageRequest + (*PostMessageResponse)(nil), // 64: compass.v1.PostMessageResponse + (*ListTopicsRequest)(nil), // 65: compass.v1.ListTopicsRequest + (*ListTopicsResponse)(nil), // 66: compass.v1.ListTopicsResponse + (*UpdateTopicRequest)(nil), // 67: compass.v1.UpdateTopicRequest + (*UpdateTopicResponse)(nil), // 68: compass.v1.UpdateTopicResponse + (*RespondToAskRequest)(nil), // 69: compass.v1.RespondToAskRequest + (*AskQuestionAnswer)(nil), // 70: compass.v1.AskQuestionAnswer + (*RespondToAskResponse)(nil), // 71: compass.v1.RespondToAskResponse + (*SearchMessagesRequest)(nil), // 72: compass.v1.SearchMessagesRequest + (*SearchMessagesResponse)(nil), // 73: compass.v1.SearchMessagesResponse + (*SubscribeCommsRequest)(nil), // 74: compass.v1.SubscribeCommsRequest } var file_compass_v1_comms_proto_depIdxs = []int32{ 8, // 0: compass.v1.Account.user:type_name -> compass.v1.UserAccount @@ -5224,67 +5356,70 @@ var file_compass_v1_comms_proto_depIdxs = []int32{ 3, // 38: compass.v1.CreateChannelRequest.kind:type_name -> compass.v1.ChannelKind 11, // 39: compass.v1.CreateChannelResponse.channel:type_name -> compass.v1.Channel 11, // 40: compass.v1.UpdateChannelMembersResponse.channel:type_name -> compass.v1.Channel - 6, // 41: compass.v1.ReparentAgentResponse.account:type_name -> compass.v1.Account - 2, // 42: compass.v1.SetChannelPolicyRequest.post_policy:type_name -> compass.v1.ChannelPostPolicy - 11, // 43: compass.v1.SetChannelPolicyResponse.channel:type_name -> compass.v1.Channel - 5, // 44: compass.v1.GetRosterRequest.scope:type_name -> compass.v1.RosterScope - 53, // 45: compass.v1.GetRosterResponse.entries:type_name -> compass.v1.RosterEntry - 4, // 46: compass.v1.RosterEntry.presence:type_name -> compass.v1.AgentPresence - 55, // 47: compass.v1.UpdatePinnedBoardRequest.pin:type_name -> compass.v1.PinMessage - 11, // 48: compass.v1.UpdatePinnedBoardResponse.channel:type_name -> compass.v1.Channel - 13, // 49: compass.v1.OpenAgentWorkspaceResponse.workspace:type_name -> compass.v1.AgentWorkspace - 15, // 50: compass.v1.ListMessagesResponse.messages:type_name -> compass.v1.Message - 16, // 51: compass.v1.PostMessageRequest.blocks:type_name -> compass.v1.MessageBlock - 15, // 52: compass.v1.PostMessageResponse.message:type_name -> compass.v1.Message - 14, // 53: compass.v1.ListTopicsResponse.topics:type_name -> compass.v1.Topic - 14, // 54: compass.v1.UpdateTopicResponse.topic:type_name -> compass.v1.Topic - 68, // 55: compass.v1.RespondToAskRequest.answers:type_name -> compass.v1.AskQuestionAnswer - 15, // 56: compass.v1.SearchMessagesResponse.messages:type_name -> compass.v1.Message - 31, // 57: compass.v1.CommsService.CreateUser:input_type -> compass.v1.CreateUserRequest - 33, // 58: compass.v1.CommsService.CreateAgent:input_type -> compass.v1.CreateAgentRequest - 35, // 59: compass.v1.CommsService.ListAccounts:input_type -> compass.v1.ListAccountsRequest - 37, // 60: compass.v1.CommsService.CreateChannelGroup:input_type -> compass.v1.CreateChannelGroupRequest - 39, // 61: compass.v1.CommsService.ListChannelGroups:input_type -> compass.v1.ListChannelGroupsRequest - 41, // 62: compass.v1.CommsService.ListChannels:input_type -> compass.v1.ListChannelsRequest - 43, // 63: compass.v1.CommsService.CreateChannel:input_type -> compass.v1.CreateChannelRequest - 45, // 64: compass.v1.CommsService.UpdateChannelMembers:input_type -> compass.v1.UpdateChannelMembersRequest - 47, // 65: compass.v1.CommsService.ReparentAgent:input_type -> compass.v1.ReparentAgentRequest - 57, // 66: compass.v1.CommsService.OpenAgentWorkspace:input_type -> compass.v1.OpenAgentWorkspaceRequest - 59, // 67: compass.v1.CommsService.ListMessages:input_type -> compass.v1.ListMessagesRequest - 61, // 68: compass.v1.CommsService.PostMessage:input_type -> compass.v1.PostMessageRequest - 63, // 69: compass.v1.CommsService.ListTopics:input_type -> compass.v1.ListTopicsRequest - 65, // 70: compass.v1.CommsService.UpdateTopic:input_type -> compass.v1.UpdateTopicRequest - 67, // 71: compass.v1.CommsService.RespondToAsk:input_type -> compass.v1.RespondToAskRequest - 70, // 72: compass.v1.CommsService.SearchMessages:input_type -> compass.v1.SearchMessagesRequest - 49, // 73: compass.v1.CommsService.SetChannelPolicy:input_type -> compass.v1.SetChannelPolicyRequest - 51, // 74: compass.v1.CommsService.GetRoster:input_type -> compass.v1.GetRosterRequest - 54, // 75: compass.v1.CommsService.UpdatePinnedBoard:input_type -> compass.v1.UpdatePinnedBoardRequest - 72, // 76: compass.v1.CommsService.SubscribeComms:input_type -> compass.v1.SubscribeCommsRequest - 32, // 77: compass.v1.CommsService.CreateUser:output_type -> compass.v1.CreateUserResponse - 34, // 78: compass.v1.CommsService.CreateAgent:output_type -> compass.v1.CreateAgentResponse - 36, // 79: compass.v1.CommsService.ListAccounts:output_type -> compass.v1.ListAccountsResponse - 38, // 80: compass.v1.CommsService.CreateChannelGroup:output_type -> compass.v1.CreateChannelGroupResponse - 40, // 81: compass.v1.CommsService.ListChannelGroups:output_type -> compass.v1.ListChannelGroupsResponse - 42, // 82: compass.v1.CommsService.ListChannels:output_type -> compass.v1.ListChannelsResponse - 44, // 83: compass.v1.CommsService.CreateChannel:output_type -> compass.v1.CreateChannelResponse - 46, // 84: compass.v1.CommsService.UpdateChannelMembers:output_type -> compass.v1.UpdateChannelMembersResponse - 48, // 85: compass.v1.CommsService.ReparentAgent:output_type -> compass.v1.ReparentAgentResponse - 58, // 86: compass.v1.CommsService.OpenAgentWorkspace:output_type -> compass.v1.OpenAgentWorkspaceResponse - 60, // 87: compass.v1.CommsService.ListMessages:output_type -> compass.v1.ListMessagesResponse - 62, // 88: compass.v1.CommsService.PostMessage:output_type -> compass.v1.PostMessageResponse - 64, // 89: compass.v1.CommsService.ListTopics:output_type -> compass.v1.ListTopicsResponse - 66, // 90: compass.v1.CommsService.UpdateTopic:output_type -> compass.v1.UpdateTopicResponse - 69, // 91: compass.v1.CommsService.RespondToAsk:output_type -> compass.v1.RespondToAskResponse - 71, // 92: compass.v1.CommsService.SearchMessages:output_type -> compass.v1.SearchMessagesResponse - 50, // 93: compass.v1.CommsService.SetChannelPolicy:output_type -> compass.v1.SetChannelPolicyResponse - 52, // 94: compass.v1.CommsService.GetRoster:output_type -> compass.v1.GetRosterResponse - 56, // 95: compass.v1.CommsService.UpdatePinnedBoard:output_type -> compass.v1.UpdatePinnedBoardResponse - 21, // 96: compass.v1.CommsService.SubscribeComms:output_type -> compass.v1.SubscribeCommsResponse - 77, // [77:97] is the sub-list for method output_type - 57, // [57:77] is the sub-list for method input_type - 57, // [57:57] is the sub-list for extension type_name - 57, // [57:57] is the sub-list for extension extendee - 0, // [0:57] is the sub-list for field type_name + 11, // 41: compass.v1.OpenDMResponse.channel:type_name -> compass.v1.Channel + 6, // 42: compass.v1.ReparentAgentResponse.account:type_name -> compass.v1.Account + 2, // 43: compass.v1.SetChannelPolicyRequest.post_policy:type_name -> compass.v1.ChannelPostPolicy + 11, // 44: compass.v1.SetChannelPolicyResponse.channel:type_name -> compass.v1.Channel + 5, // 45: compass.v1.GetRosterRequest.scope:type_name -> compass.v1.RosterScope + 55, // 46: compass.v1.GetRosterResponse.entries:type_name -> compass.v1.RosterEntry + 4, // 47: compass.v1.RosterEntry.presence:type_name -> compass.v1.AgentPresence + 57, // 48: compass.v1.UpdatePinnedBoardRequest.pin:type_name -> compass.v1.PinMessage + 11, // 49: compass.v1.UpdatePinnedBoardResponse.channel:type_name -> compass.v1.Channel + 13, // 50: compass.v1.OpenAgentWorkspaceResponse.workspace:type_name -> compass.v1.AgentWorkspace + 15, // 51: compass.v1.ListMessagesResponse.messages:type_name -> compass.v1.Message + 16, // 52: compass.v1.PostMessageRequest.blocks:type_name -> compass.v1.MessageBlock + 15, // 53: compass.v1.PostMessageResponse.message:type_name -> compass.v1.Message + 14, // 54: compass.v1.ListTopicsResponse.topics:type_name -> compass.v1.Topic + 14, // 55: compass.v1.UpdateTopicResponse.topic:type_name -> compass.v1.Topic + 70, // 56: compass.v1.RespondToAskRequest.answers:type_name -> compass.v1.AskQuestionAnswer + 15, // 57: compass.v1.SearchMessagesResponse.messages:type_name -> compass.v1.Message + 31, // 58: compass.v1.CommsService.CreateUser:input_type -> compass.v1.CreateUserRequest + 33, // 59: compass.v1.CommsService.CreateAgent:input_type -> compass.v1.CreateAgentRequest + 35, // 60: compass.v1.CommsService.ListAccounts:input_type -> compass.v1.ListAccountsRequest + 37, // 61: compass.v1.CommsService.CreateChannelGroup:input_type -> compass.v1.CreateChannelGroupRequest + 39, // 62: compass.v1.CommsService.ListChannelGroups:input_type -> compass.v1.ListChannelGroupsRequest + 41, // 63: compass.v1.CommsService.ListChannels:input_type -> compass.v1.ListChannelsRequest + 43, // 64: compass.v1.CommsService.CreateChannel:input_type -> compass.v1.CreateChannelRequest + 45, // 65: compass.v1.CommsService.UpdateChannelMembers:input_type -> compass.v1.UpdateChannelMembersRequest + 47, // 66: compass.v1.CommsService.OpenDM:input_type -> compass.v1.OpenDMRequest + 49, // 67: compass.v1.CommsService.ReparentAgent:input_type -> compass.v1.ReparentAgentRequest + 59, // 68: compass.v1.CommsService.OpenAgentWorkspace:input_type -> compass.v1.OpenAgentWorkspaceRequest + 61, // 69: compass.v1.CommsService.ListMessages:input_type -> compass.v1.ListMessagesRequest + 63, // 70: compass.v1.CommsService.PostMessage:input_type -> compass.v1.PostMessageRequest + 65, // 71: compass.v1.CommsService.ListTopics:input_type -> compass.v1.ListTopicsRequest + 67, // 72: compass.v1.CommsService.UpdateTopic:input_type -> compass.v1.UpdateTopicRequest + 69, // 73: compass.v1.CommsService.RespondToAsk:input_type -> compass.v1.RespondToAskRequest + 72, // 74: compass.v1.CommsService.SearchMessages:input_type -> compass.v1.SearchMessagesRequest + 51, // 75: compass.v1.CommsService.SetChannelPolicy:input_type -> compass.v1.SetChannelPolicyRequest + 53, // 76: compass.v1.CommsService.GetRoster:input_type -> compass.v1.GetRosterRequest + 56, // 77: compass.v1.CommsService.UpdatePinnedBoard:input_type -> compass.v1.UpdatePinnedBoardRequest + 74, // 78: compass.v1.CommsService.SubscribeComms:input_type -> compass.v1.SubscribeCommsRequest + 32, // 79: compass.v1.CommsService.CreateUser:output_type -> compass.v1.CreateUserResponse + 34, // 80: compass.v1.CommsService.CreateAgent:output_type -> compass.v1.CreateAgentResponse + 36, // 81: compass.v1.CommsService.ListAccounts:output_type -> compass.v1.ListAccountsResponse + 38, // 82: compass.v1.CommsService.CreateChannelGroup:output_type -> compass.v1.CreateChannelGroupResponse + 40, // 83: compass.v1.CommsService.ListChannelGroups:output_type -> compass.v1.ListChannelGroupsResponse + 42, // 84: compass.v1.CommsService.ListChannels:output_type -> compass.v1.ListChannelsResponse + 44, // 85: compass.v1.CommsService.CreateChannel:output_type -> compass.v1.CreateChannelResponse + 46, // 86: compass.v1.CommsService.UpdateChannelMembers:output_type -> compass.v1.UpdateChannelMembersResponse + 48, // 87: compass.v1.CommsService.OpenDM:output_type -> compass.v1.OpenDMResponse + 50, // 88: compass.v1.CommsService.ReparentAgent:output_type -> compass.v1.ReparentAgentResponse + 60, // 89: compass.v1.CommsService.OpenAgentWorkspace:output_type -> compass.v1.OpenAgentWorkspaceResponse + 62, // 90: compass.v1.CommsService.ListMessages:output_type -> compass.v1.ListMessagesResponse + 64, // 91: compass.v1.CommsService.PostMessage:output_type -> compass.v1.PostMessageResponse + 66, // 92: compass.v1.CommsService.ListTopics:output_type -> compass.v1.ListTopicsResponse + 68, // 93: compass.v1.CommsService.UpdateTopic:output_type -> compass.v1.UpdateTopicResponse + 71, // 94: compass.v1.CommsService.RespondToAsk:output_type -> compass.v1.RespondToAskResponse + 73, // 95: compass.v1.CommsService.SearchMessages:output_type -> compass.v1.SearchMessagesResponse + 52, // 96: compass.v1.CommsService.SetChannelPolicy:output_type -> compass.v1.SetChannelPolicyResponse + 54, // 97: compass.v1.CommsService.GetRoster:output_type -> compass.v1.GetRosterResponse + 58, // 98: compass.v1.CommsService.UpdatePinnedBoard:output_type -> compass.v1.UpdatePinnedBoardResponse + 21, // 99: compass.v1.CommsService.SubscribeComms:output_type -> compass.v1.SubscribeCommsResponse + 79, // [79:100] is the sub-list for method output_type + 58, // [58:79] is the sub-list for method input_type + 58, // [58:58] is the sub-list for extension type_name + 58, // [58:58] is the sub-list for extension extendee + 0, // [0:58] is the sub-list for field type_name } func init() { file_compass_v1_comms_proto_init() } @@ -5314,20 +5449,20 @@ func file_compass_v1_comms_proto_init() { (*SubscribeCommsResponse_AgentPresenceChanged)(nil), (*SubscribeCommsResponse_TopicUpserted)(nil), } - file_compass_v1_comms_proto_msgTypes[48].OneofWrappers = []any{ + file_compass_v1_comms_proto_msgTypes[50].OneofWrappers = []any{ (*UpdatePinnedBoardRequest_Pin)(nil), (*UpdatePinnedBoardRequest_UnpinMessageId)(nil), } - file_compass_v1_comms_proto_msgTypes[53].OneofWrappers = []any{ + file_compass_v1_comms_proto_msgTypes[55].OneofWrappers = []any{ (*ListMessagesRequest_ChannelId)(nil), } - file_compass_v1_comms_proto_msgTypes[55].OneofWrappers = []any{ + file_compass_v1_comms_proto_msgTypes[57].OneofWrappers = []any{ (*PostMessageRequest_ChannelId)(nil), (*PostMessageRequest_TopicId)(nil), (*PostMessageRequest_TopicName)(nil), } - file_compass_v1_comms_proto_msgTypes[59].OneofWrappers = []any{} - file_compass_v1_comms_proto_msgTypes[64].OneofWrappers = []any{ + file_compass_v1_comms_proto_msgTypes[61].OneofWrappers = []any{} + file_compass_v1_comms_proto_msgTypes[66].OneofWrappers = []any{ (*SearchMessagesRequest_ChannelId)(nil), } type x struct{} @@ -5336,7 +5471,7 @@ func file_compass_v1_comms_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_compass_v1_comms_proto_rawDesc), len(file_compass_v1_comms_proto_rawDesc)), NumEnums: 6, - NumMessages: 67, + NumMessages: 69, NumExtensions: 0, NumServices: 1, }, diff --git a/go/gen/compass/v1/compassv1connect/comms.connect.go b/go/gen/compass/v1/compassv1connect/comms.connect.go index 2fc808c3..586f47b2 100644 --- a/go/gen/compass/v1/compassv1connect/comms.connect.go +++ b/go/gen/compass/v1/compassv1connect/comms.connect.go @@ -73,6 +73,8 @@ const ( // CommsServiceUpdateChannelMembersProcedure is the fully-qualified name of the CommsService's // UpdateChannelMembers RPC. CommsServiceUpdateChannelMembersProcedure = "/compass.v1.CommsService/UpdateChannelMembers" + // CommsServiceOpenDMProcedure is the fully-qualified name of the CommsService's OpenDM RPC. + CommsServiceOpenDMProcedure = "/compass.v1.CommsService/OpenDM" // CommsServiceReparentAgentProcedure is the fully-qualified name of the CommsService's // ReparentAgent RPC. CommsServiceReparentAgentProcedure = "/compass.v1.CommsService/ReparentAgent" @@ -133,8 +135,17 @@ type CommsServiceClient interface { CreateChannel(context.Context, *connect.Request[v1.CreateChannelRequest]) (*connect.Response[v1.CreateChannelResponse], error) // Add or remove channel members and flip a member's subscribe opt-in — // caller-authorized against channel visibility. Emits ChannelChanged. One RPC - // covers join, subscribe-toggle, DM-expansion, and share-replacement. + // covers join, subscribe-toggle, DM-to-channel conversion (convert_channel_name), + // and share-replacement. UpdateChannelMembers(context.Context, *connect.Request[v1.UpdateChannelMembersRequest]) (*connect.Response[v1.UpdateChannelMembersResponse], error) + // Open (or fetch) the two-party DM channel between the caller and a peer, + // addressed by the peer's owner-namespaced handle. Resolve-or-create and + // idempotent: the channel is minted on first open in the caller-owner's + // reserved DM group under a deterministic sorted-handle name, and returned + // on every subsequent open. Same-owner only — unknown and cross-owner both + // return NOT_FOUND; a self-open is INVALID_ARGUMENT. Emits ChannelChanged on + // create. + OpenDM(context.Context, *connect.Request[v1.OpenDMRequest]) (*connect.Response[v1.OpenDMResponse], error) // Re-parent an agent in the agent tree, or promote it to a root (empty // new_parent_agent_id) — caller-authorized against the agent's owner. The // server validates the move (caller authority, same-owner, no cycle) and @@ -244,6 +255,12 @@ func NewCommsServiceClient(httpClient connect.HTTPClient, baseURL string, opts . connect.WithSchema(commsServiceMethods.ByName("UpdateChannelMembers")), connect.WithClientOptions(opts...), ), + openDM: connect.NewClient[v1.OpenDMRequest, v1.OpenDMResponse]( + httpClient, + baseURL+CommsServiceOpenDMProcedure, + connect.WithSchema(commsServiceMethods.ByName("OpenDM")), + connect.WithClientOptions(opts...), + ), reparentAgent: connect.NewClient[v1.ReparentAgentRequest, v1.ReparentAgentResponse]( httpClient, baseURL+CommsServiceReparentAgentProcedure, @@ -329,6 +346,7 @@ type commsServiceClient struct { listChannels *connect.Client[v1.ListChannelsRequest, v1.ListChannelsResponse] createChannel *connect.Client[v1.CreateChannelRequest, v1.CreateChannelResponse] updateChannelMembers *connect.Client[v1.UpdateChannelMembersRequest, v1.UpdateChannelMembersResponse] + openDM *connect.Client[v1.OpenDMRequest, v1.OpenDMResponse] reparentAgent *connect.Client[v1.ReparentAgentRequest, v1.ReparentAgentResponse] openAgentWorkspace *connect.Client[v1.OpenAgentWorkspaceRequest, v1.OpenAgentWorkspaceResponse] listMessages *connect.Client[v1.ListMessagesRequest, v1.ListMessagesResponse] @@ -383,6 +401,11 @@ func (c *commsServiceClient) UpdateChannelMembers(ctx context.Context, req *conn return c.updateChannelMembers.CallUnary(ctx, req) } +// OpenDM calls compass.v1.CommsService.OpenDM. +func (c *commsServiceClient) OpenDM(ctx context.Context, req *connect.Request[v1.OpenDMRequest]) (*connect.Response[v1.OpenDMResponse], error) { + return c.openDM.CallUnary(ctx, req) +} + // ReparentAgent calls compass.v1.CommsService.ReparentAgent. func (c *commsServiceClient) ReparentAgent(ctx context.Context, req *connect.Request[v1.ReparentAgentRequest]) (*connect.Response[v1.ReparentAgentResponse], error) { return c.reparentAgent.CallUnary(ctx, req) @@ -467,8 +490,17 @@ type CommsServiceHandler interface { CreateChannel(context.Context, *connect.Request[v1.CreateChannelRequest]) (*connect.Response[v1.CreateChannelResponse], error) // Add or remove channel members and flip a member's subscribe opt-in — // caller-authorized against channel visibility. Emits ChannelChanged. One RPC - // covers join, subscribe-toggle, DM-expansion, and share-replacement. + // covers join, subscribe-toggle, DM-to-channel conversion (convert_channel_name), + // and share-replacement. UpdateChannelMembers(context.Context, *connect.Request[v1.UpdateChannelMembersRequest]) (*connect.Response[v1.UpdateChannelMembersResponse], error) + // Open (or fetch) the two-party DM channel between the caller and a peer, + // addressed by the peer's owner-namespaced handle. Resolve-or-create and + // idempotent: the channel is minted on first open in the caller-owner's + // reserved DM group under a deterministic sorted-handle name, and returned + // on every subsequent open. Same-owner only — unknown and cross-owner both + // return NOT_FOUND; a self-open is INVALID_ARGUMENT. Emits ChannelChanged on + // create. + OpenDM(context.Context, *connect.Request[v1.OpenDMRequest]) (*connect.Response[v1.OpenDMResponse], error) // Re-parent an agent in the agent tree, or promote it to a root (empty // new_parent_agent_id) — caller-authorized against the agent's owner. The // server validates the move (caller authority, same-owner, no cycle) and @@ -574,6 +606,12 @@ func NewCommsServiceHandler(svc CommsServiceHandler, opts ...connect.HandlerOpti connect.WithSchema(commsServiceMethods.ByName("UpdateChannelMembers")), connect.WithHandlerOptions(opts...), ) + commsServiceOpenDMHandler := connect.NewUnaryHandler( + CommsServiceOpenDMProcedure, + svc.OpenDM, + connect.WithSchema(commsServiceMethods.ByName("OpenDM")), + connect.WithHandlerOptions(opts...), + ) commsServiceReparentAgentHandler := connect.NewUnaryHandler( CommsServiceReparentAgentProcedure, svc.ReparentAgent, @@ -664,6 +702,8 @@ func NewCommsServiceHandler(svc CommsServiceHandler, opts ...connect.HandlerOpti commsServiceCreateChannelHandler.ServeHTTP(w, r) case CommsServiceUpdateChannelMembersProcedure: commsServiceUpdateChannelMembersHandler.ServeHTTP(w, r) + case CommsServiceOpenDMProcedure: + commsServiceOpenDMHandler.ServeHTTP(w, r) case CommsServiceReparentAgentProcedure: commsServiceReparentAgentHandler.ServeHTTP(w, r) case CommsServiceOpenAgentWorkspaceProcedure: @@ -729,6 +769,10 @@ func (UnimplementedCommsServiceHandler) UpdateChannelMembers(context.Context, *c return nil, connect.NewError(connect.CodeUnimplemented, errors.New("compass.v1.CommsService.UpdateChannelMembers is not implemented")) } +func (UnimplementedCommsServiceHandler) OpenDM(context.Context, *connect.Request[v1.OpenDMRequest]) (*connect.Response[v1.OpenDMResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("compass.v1.CommsService.OpenDM is not implemented")) +} + func (UnimplementedCommsServiceHandler) ReparentAgent(context.Context, *connect.Request[v1.ReparentAgentRequest]) (*connect.Response[v1.ReparentAgentResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("compass.v1.CommsService.ReparentAgent is not implemented")) } diff --git a/go/internal/auth/admin_gate.go b/go/internal/auth/admin_gate.go index 94cf6db1..e51c798d 100644 --- a/go/internal/auth/admin_gate.go +++ b/go/internal/auth/admin_gate.go @@ -109,6 +109,7 @@ func classifyProcedure(procedure string) (privilege, bool) { compassv1connect.CommsServiceSetChannelPolicyProcedure, compassv1connect.CommsServiceGetRosterProcedure, compassv1connect.CommsServiceUpdatePinnedBoardProcedure, + compassv1connect.CommsServiceOpenDMProcedure, compassv1connect.CommsServiceSubscribeCommsProcedure: return authenticatedOpen{}, true diff --git a/go/internal/comms/channel_mapping_test.go b/go/internal/comms/channel_mapping_test.go new file mode 100644 index 00000000..59a06a36 --- /dev/null +++ b/go/internal/comms/channel_mapping_test.go @@ -0,0 +1,65 @@ +// The channel-kind discriminant at the store <-> proto edge (mapping.go +// channelKindToWire / channelKindFromWire). Both are pure functions of their +// argument, so the contract is fully observable with NO database — this file is +// untagged and runs on the default `go test` lane. +// +// GROUP_DM retirement (RIG-2962 T1): the kind is deprecated in place — never +// PRODUCED on either side. A DM widens by converting to a named CHANNEL, so no +// mapping arm may mint a GROUP_DM. The number stays reserved (tombstone), but a +// legacy or hostile GROUP_DM input collapses to a plain channel rather than +// round-tripping the retired kind. + +package comms + +import ( + "testing" + + compassv1 "github.com/RigelBuild/compass/go/gen/compass/v1" + "github.com/RigelBuild/compass/go/internal/store" +) + +func TestChannelKindToWireNeverProducesGroupDM(t *testing.T) { + tests := []struct { + name string + kind store.ChannelKind + want compassv1.ChannelKind + }{ + {"channel", store.ChannelKindChannel, compassv1.ChannelKind_CHANNEL_KIND_CHANNEL}, + {"dm", store.ChannelKindDM, compassv1.ChannelKind_CHANNEL_KIND_DM}, + {"retired group_dm collapses to channel", store.ChannelKindGroupDM, compassv1.ChannelKind_CHANNEL_KIND_CHANNEL}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := channelKindToWire(tt.kind) + if got != tt.want { + t.Fatalf("channelKindToWire(%v) = %v, want %v", tt.kind, got, tt.want) + } + if got == compassv1.ChannelKind_CHANNEL_KIND_GROUP_DM { //nolint:staticcheck // SA1019: deliberately references the retired GROUP_DM to assert it is never produced. + t.Fatalf("channelKindToWire produced retired GROUP_DM for %v", tt.kind) + } + }) + } +} + +func TestChannelKindFromWireNeverProducesGroupDM(t *testing.T) { + tests := []struct { + name string + kind compassv1.ChannelKind + want store.ChannelKind + }{ + {"channel", compassv1.ChannelKind_CHANNEL_KIND_CHANNEL, store.ChannelKindChannel}, + {"dm", compassv1.ChannelKind_CHANNEL_KIND_DM, store.ChannelKindDM}, + {"retired group_dm collapses to channel", compassv1.ChannelKind_CHANNEL_KIND_GROUP_DM, store.ChannelKindChannel}, //nolint:staticcheck // SA1019: deliberately exercises the retired GROUP_DM input path. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := channelKindFromWire(tt.kind) + if got != tt.want { + t.Fatalf("channelKindFromWire(%v) = %v, want %v", tt.kind, got, tt.want) + } + if got == store.ChannelKindGroupDM { + t.Fatalf("channelKindFromWire produced retired GROUP_DM for %v", tt.kind) + } + }) + } +} diff --git a/go/internal/comms/comms.go b/go/internal/comms/comms.go index 8b31a467..4adecbb2 100644 --- a/go/internal/comms/comms.go +++ b/go/internal/comms/comms.go @@ -635,6 +635,21 @@ func (c *Comms) UpdatePinnedBoard( return connect.NewResponse(&compassv1.UpdatePinnedBoardResponse{Channel: wire}), nil } +// OpenDM resolves-or-creates the two-party DM channel between the caller and a +// peer, addressed by handle (RIG-2962). T1 lands the contract (proto + regen) +// proto-first; the real handler — caller/peer resolve, same-owner authz, the +// reserved-DM-group upsert, and the post-commit ChannelChanged emit — is the +// T3 leg (compass-agent-peer-dm design.md T3), which replaces this stub. Until +// then it returns CodeUnimplemented so *Comms satisfies the generated +// CommsServiceHandler (asserted with no Unimplemented embed) without pretending +// to serve a surface whose store legs (T2 dm.go) do not exist yet. +func (c *Comms) OpenDM( + _ context.Context, + _ *connect.Request[compassv1.OpenDMRequest], +) (*connect.Response[compassv1.OpenDMResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("comms: OpenDM not implemented until RIG-2962 T3")) +} + // applyBoardOp maps the request's op oneof to its store call: a plain pin // (PinMessage, replace ""), a compare-and-swap repoint (PinMessage, replace set), // or an unpin (UnpinMessage). An unset oneof is a malformed request diff --git a/go/internal/comms/mapping.go b/go/internal/comms/mapping.go index 788775cc..81dbbafc 100644 --- a/go/internal/comms/mapping.go +++ b/go/internal/comms/mapping.go @@ -82,9 +82,9 @@ func channelKindToWire(k store.ChannelKind) compassv1.ChannelKind { switch k { case store.ChannelKindDM: return compassv1.ChannelKind_CHANNEL_KIND_DM - case store.ChannelKindGroupDM: - return compassv1.ChannelKind_CHANNEL_KIND_GROUP_DM default: + // GROUP_DM is retired (never produced; a DM converts to a named + // CHANNEL). A legacy kind=2 row renders as a plain channel. return compassv1.ChannelKind_CHANNEL_KIND_CHANNEL } } @@ -256,9 +256,11 @@ func channelKindFromWire(k compassv1.ChannelKind) store.ChannelKind { switch k { case compassv1.ChannelKind_CHANNEL_KIND_DM: return store.ChannelKindDM - case compassv1.ChannelKind_CHANNEL_KIND_GROUP_DM: - return store.ChannelKindGroupDM default: + // GROUP_DM is retired: a wire GROUP_DM (only a legacy/hostile input, + // never freshly produced) maps to a plain channel. The collapse itself + // is the sole retirement mechanism at this edge — the retired kind can + // never round-trip into the store. return store.ChannelKindChannel } } diff --git a/go/internal/gen/compass/v1/agent_gateway.pb.go b/go/internal/gen/compass/v1/agent_gateway.pb.go index 701a50ec..782c602a 100644 --- a/go/internal/gen/compass/v1/agent_gateway.pb.go +++ b/go/internal/gen/compass/v1/agent_gateway.pb.go @@ -124,6 +124,7 @@ type CommsCallRequest struct { // *CommsCallRequest_CreateChannel // *CommsCallRequest_UpdateMembers // *CommsCallRequest_CreateChannelGroup + // *CommsCallRequest_OpenDm Call isCommsCallRequest_Call `protobuf_oneof:"call"` // The W3C `traceparent` of the delivered message that triggered this outbound // call, re-attached by the agent so the Server can LINK the reply's fresh @@ -256,6 +257,15 @@ func (x *CommsCallRequest) GetCreateChannelGroup() *v1.CreateChannelGroupRequest return nil } +func (x *CommsCallRequest) GetOpenDm() *v1.OpenDMRequest { + if x != nil { + if x, ok := x.Call.(*CommsCallRequest_OpenDm); ok { + return x.OpenDm + } + } + return nil +} + func (x *CommsCallRequest) GetTriggerTraceparent() string { if x != nil { return x.TriggerTraceparent @@ -299,6 +309,13 @@ type CommsCallRequest_CreateChannelGroup struct { CreateChannelGroup *v1.CreateChannelGroupRequest `protobuf:"bytes,9,opt,name=create_channel_group,json=createChannelGroup,proto3,oneof"` } +type CommsCallRequest_OpenDm struct { + // 10 is trigger_traceparent (message-level, below); open_dm takes the + // next-free arm above it (design Global Constraints: never renumber down + // into an org-management slot). + OpenDm *v1.OpenDMRequest `protobuf:"bytes,11,opt,name=open_dm,json=openDm,proto3,oneof"` +} + func (*CommsCallRequest_Post) isCommsCallRequest_Call() {} func (*CommsCallRequest_List) isCommsCallRequest_Call() {} @@ -315,10 +332,12 @@ func (*CommsCallRequest_UpdateMembers) isCommsCallRequest_Call() {} func (*CommsCallRequest_CreateChannelGroup) isCommsCallRequest_Call() {} +func (*CommsCallRequest_OpenDm) isCommsCallRequest_Call() {} + // The result of one comms call, correlated by `call_id`. A successful call sets // the response arm matching the request's operation (`post`, `list`, `roster`, // `set_status`, `pin`, `create_channel`, `update_members`, -// `create_channel_group`); an in-band failure (a tool error — non-member +// `create_channel_group`, `open_dm`); an in-band failure (a tool error — non-member // channel, bad input) sets `error`, which is NOT a transport teardown. The same // message is the `RelayCommsCallResponse.result` payload on the Runner->Server // leg. @@ -336,6 +355,7 @@ type CommsCallResult struct { // *CommsCallResult_CreateChannel // *CommsCallResult_UpdateMembers // *CommsCallResult_CreateChannelGroup + // *CommsCallResult_OpenDm Result isCommsCallResult_Result `protobuf_oneof:"result"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -466,6 +486,15 @@ func (x *CommsCallResult) GetCreateChannelGroup() *v1.CreateChannelGroupResponse return nil } +func (x *CommsCallResult) GetOpenDm() *v1.OpenDMResponse { + if x != nil { + if x, ok := x.Result.(*CommsCallResult_OpenDm); ok { + return x.OpenDm + } + } + return nil +} + type isCommsCallResult_Result interface { isCommsCallResult_Result() } @@ -506,6 +535,10 @@ type CommsCallResult_CreateChannelGroup struct { CreateChannelGroup *v1.CreateChannelGroupResponse `protobuf:"bytes,10,opt,name=create_channel_group,json=createChannelGroup,proto3,oneof"` } +type CommsCallResult_OpenDm struct { + OpenDm *v1.OpenDMResponse `protobuf:"bytes,11,opt,name=open_dm,json=openDm,proto3,oneof"` +} + func (*CommsCallResult_Post) isCommsCallResult_Result() {} func (*CommsCallResult_List) isCommsCallResult_Result() {} @@ -524,6 +557,8 @@ func (*CommsCallResult_UpdateMembers) isCommsCallResult_Result() {} func (*CommsCallResult_CreateChannelGroup) isCommsCallResult_Result() {} +func (*CommsCallResult_OpenDm) isCommsCallResult_Result() {} + // An in-band comms-call failure: a tool error the agent renders to the model, // never a stream teardown. `code` is a short stable token (e.g. "not_found"); // `message` is human-readable detail. @@ -845,8 +880,12 @@ type SpawnPeerResponse struct { AgentAccountId string `protobuf:"bytes,1,opt,name=agent_account_id,json=agentAccountId,proto3" json:"agent_account_id,omitempty"` ContainerName string `protobuf:"bytes,2,opt,name=container_name,json=containerName,proto3" json:"container_name,omitempty"` SessionId string `protobuf:"bytes,3,opt,name=session_id,json=sessionId,proto3" json:"session_id,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // The name of the manager↔peer DM channel auto-opened at spawn (R8). Set on + // both the fresh-spawn and resume paths; EMPTY when the post-spawn open + // failed (recoverable next turn via comms_open_dm — never a spawn rollback). + DmChannelName string `protobuf:"bytes,4,opt,name=dm_channel_name,json=dmChannelName,proto3" json:"dm_channel_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SpawnPeerResponse) Reset() { @@ -900,6 +939,13 @@ func (x *SpawnPeerResponse) GetSessionId() string { return "" } +func (x *SpawnPeerResponse) GetDmChannelName() string { + if x != nil { + return x.DmChannelName + } + return "" +} + // Despawn a peer: tear down its container and release its durable placement. // Same-owner authority (F2); the account row, home channel, and history survive // (despawn tears down compute, not identity). @@ -3068,7 +3114,7 @@ var File_compass_v1_agent_gateway_proto protoreflect.FileDescriptor const file_compass_v1_agent_gateway_proto_rawDesc = "" + "\n" + "\x1ecompass/v1/agent_gateway.proto\x12\n" + - "compass.v1\x1a\x16compass/v1/comms.proto\x1a\x16compass/v1/agent.proto\x1a\x18compass/v1/compass.proto\x1a\x16compass/v1/forge.proto\"\xff\x04\n" + + "compass.v1\x1a\x16compass/v1/comms.proto\x1a\x16compass/v1/agent.proto\x1a\x18compass/v1/compass.proto\x1a\x16compass/v1/forge.proto\"\xb5\x05\n" + "\x10CommsCallRequest\x12\x17\n" + "\acall_id\x18\x01 \x01(\tR\x06callId\x124\n" + "\x04post\x18\x02 \x01(\v2\x1e.compass.v1.PostMessageRequestH\x00R\x04post\x125\n" + @@ -3079,10 +3125,11 @@ const file_compass_v1_agent_gateway_proto_rawDesc = "" + "\x03pin\x18\x06 \x01(\v2$.compass.v1.UpdatePinnedBoardRequestH\x00R\x03pin\x12I\n" + "\x0ecreate_channel\x18\a \x01(\v2 .compass.v1.CreateChannelRequestH\x00R\rcreateChannel\x12P\n" + "\x0eupdate_members\x18\b \x01(\v2'.compass.v1.UpdateChannelMembersRequestH\x00R\rupdateMembers\x12Y\n" + - "\x14create_channel_group\x18\t \x01(\v2%.compass.v1.CreateChannelGroupRequestH\x00R\x12createChannelGroup\x12/\n" + + "\x14create_channel_group\x18\t \x01(\v2%.compass.v1.CreateChannelGroupRequestH\x00R\x12createChannelGroup\x124\n" + + "\aopen_dm\x18\v \x01(\v2\x19.compass.v1.OpenDMRequestH\x00R\x06openDm\x12/\n" + "\x13trigger_traceparent\x18\n" + " \x01(\tR\x12triggerTraceparentB\x06\n" + - "\x04call\"\x8b\x05\n" + + "\x04call\"\xc2\x05\n" + "\x0fCommsCallResult\x12\x17\n" + "\acall_id\x18\x01 \x01(\tR\x06callId\x125\n" + "\x04post\x18\x02 \x01(\v2\x1f.compass.v1.PostMessageResponseH\x00R\x04post\x126\n" + @@ -3095,7 +3142,8 @@ const file_compass_v1_agent_gateway_proto_rawDesc = "" + "\x0ecreate_channel\x18\b \x01(\v2!.compass.v1.CreateChannelResponseH\x00R\rcreateChannel\x12Q\n" + "\x0eupdate_members\x18\t \x01(\v2(.compass.v1.UpdateChannelMembersResponseH\x00R\rupdateMembers\x12Z\n" + "\x14create_channel_group\x18\n" + - " \x01(\v2&.compass.v1.CreateChannelGroupResponseH\x00R\x12createChannelGroupB\b\n" + + " \x01(\v2&.compass.v1.CreateChannelGroupResponseH\x00R\x12createChannelGroup\x125\n" + + "\aopen_dm\x18\v \x01(\v2\x1a.compass.v1.OpenDMResponseH\x00R\x06openDmB\b\n" + "\x06result\">\n" + "\x0eCommsCallError\x12\x12\n" + "\x04code\x18\x01 \x01(\tR\x04code\x12\x18\n" + @@ -3113,12 +3161,13 @@ const file_compass_v1_agent_gateway_proto_rawDesc = "" + "\fdisplay_name\x18\x02 \x01(\tR\vdisplayName\x12*\n" + "\x11client_request_id\x18\x04 \x01(\tR\x0fclientRequestId\x12\x12\n" + "\x04role\x18\x05 \x01(\tR\x04role\x12\x18\n" + - "\apersona\x18\x06 \x01(\tR\apersonaJ\x04\b\x03\x10\x04R\x0einitial_prompt\"\x83\x01\n" + + "\apersona\x18\x06 \x01(\tR\apersonaJ\x04\b\x03\x10\x04R\x0einitial_prompt\"\xab\x01\n" + "\x11SpawnPeerResponse\x12(\n" + "\x10agent_account_id\x18\x01 \x01(\tR\x0eagentAccountId\x12%\n" + "\x0econtainer_name\x18\x02 \x01(\tR\rcontainerName\x12\x1d\n" + "\n" + - "session_id\x18\x03 \x01(\tR\tsessionId\"7\n" + + "session_id\x18\x03 \x01(\tR\tsessionId\x12&\n" + + "\x0fdm_channel_name\x18\x04 \x01(\tR\rdmChannelName\"7\n" + "\x12DespawnPeerRequest\x12!\n" + "\fagent_handle\x18\x01 \x01(\tR\vagentHandle\"\x15\n" + "\x13DespawnPeerResponse\"\xe4\x01\n" + @@ -3326,22 +3375,24 @@ var file_compass_v1_agent_gateway_proto_goTypes = []any{ (*v1.CreateChannelRequest)(nil), // 44: compass.v1.CreateChannelRequest (*v1.UpdateChannelMembersRequest)(nil), // 45: compass.v1.UpdateChannelMembersRequest (*v1.CreateChannelGroupRequest)(nil), // 46: compass.v1.CreateChannelGroupRequest - (*v1.PostMessageResponse)(nil), // 47: compass.v1.PostMessageResponse - (*v1.ListMessagesResponse)(nil), // 48: compass.v1.ListMessagesResponse - (*v1.GetRosterResponse)(nil), // 49: compass.v1.GetRosterResponse - (*v1.UpdatePinnedBoardResponse)(nil), // 50: compass.v1.UpdatePinnedBoardResponse - (*v1.CreateChannelResponse)(nil), // 51: compass.v1.CreateChannelResponse - (*v1.UpdateChannelMembersResponse)(nil), // 52: compass.v1.UpdateChannelMembersResponse - (*v1.CreateChannelGroupResponse)(nil), // 53: compass.v1.CreateChannelGroupResponse - (*v1.ForgeRef)(nil), // 54: compass.v1.ForgeRef - (*v1.Issue)(nil), // 55: compass.v1.Issue - (*CommentRef)(nil), // 56: compass.v1.CommentRef - (*v1.PullRequest)(nil), // 57: compass.v1.PullRequest - (*ReviewRef)(nil), // 58: compass.v1.ReviewRef - (ForgeArtifactKind)(0), // 59: compass.v1.ForgeArtifactKind - (v1.IssueState)(0), // 60: compass.v1.IssueState - (*AgentFrame)(nil), // 61: compass.v1.AgentFrame - (*AgentControl)(nil), // 62: compass.v1.AgentControl + (*v1.OpenDMRequest)(nil), // 47: compass.v1.OpenDMRequest + (*v1.PostMessageResponse)(nil), // 48: compass.v1.PostMessageResponse + (*v1.ListMessagesResponse)(nil), // 49: compass.v1.ListMessagesResponse + (*v1.GetRosterResponse)(nil), // 50: compass.v1.GetRosterResponse + (*v1.UpdatePinnedBoardResponse)(nil), // 51: compass.v1.UpdatePinnedBoardResponse + (*v1.CreateChannelResponse)(nil), // 52: compass.v1.CreateChannelResponse + (*v1.UpdateChannelMembersResponse)(nil), // 53: compass.v1.UpdateChannelMembersResponse + (*v1.CreateChannelGroupResponse)(nil), // 54: compass.v1.CreateChannelGroupResponse + (*v1.OpenDMResponse)(nil), // 55: compass.v1.OpenDMResponse + (*v1.ForgeRef)(nil), // 56: compass.v1.ForgeRef + (*v1.Issue)(nil), // 57: compass.v1.Issue + (*CommentRef)(nil), // 58: compass.v1.CommentRef + (*v1.PullRequest)(nil), // 59: compass.v1.PullRequest + (*ReviewRef)(nil), // 60: compass.v1.ReviewRef + (ForgeArtifactKind)(0), // 61: compass.v1.ForgeArtifactKind + (v1.IssueState)(0), // 62: compass.v1.IssueState + (*AgentFrame)(nil), // 63: compass.v1.AgentFrame + (*AgentControl)(nil), // 64: compass.v1.AgentControl } var file_compass_v1_agent_gateway_proto_depIdxs = []int32{ 40, // 0: compass.v1.CommsCallRequest.post:type_name -> compass.v1.PostMessageRequest @@ -3352,70 +3403,72 @@ var file_compass_v1_agent_gateway_proto_depIdxs = []int32{ 44, // 5: compass.v1.CommsCallRequest.create_channel:type_name -> compass.v1.CreateChannelRequest 45, // 6: compass.v1.CommsCallRequest.update_members:type_name -> compass.v1.UpdateChannelMembersRequest 46, // 7: compass.v1.CommsCallRequest.create_channel_group:type_name -> compass.v1.CreateChannelGroupRequest - 47, // 8: compass.v1.CommsCallResult.post:type_name -> compass.v1.PostMessageResponse - 48, // 9: compass.v1.CommsCallResult.list:type_name -> compass.v1.ListMessagesResponse - 3, // 10: compass.v1.CommsCallResult.error:type_name -> compass.v1.CommsCallError - 49, // 11: compass.v1.CommsCallResult.roster:type_name -> compass.v1.GetRosterResponse - 5, // 12: compass.v1.CommsCallResult.set_status:type_name -> compass.v1.SetAgentStatusResponse - 50, // 13: compass.v1.CommsCallResult.pin:type_name -> compass.v1.UpdatePinnedBoardResponse - 51, // 14: compass.v1.CommsCallResult.create_channel:type_name -> compass.v1.CreateChannelResponse - 52, // 15: compass.v1.CommsCallResult.update_members:type_name -> compass.v1.UpdateChannelMembersResponse - 53, // 16: compass.v1.CommsCallResult.create_channel_group:type_name -> compass.v1.CreateChannelGroupResponse - 7, // 17: compass.v1.LifecycleCallRequest.spawn:type_name -> compass.v1.SpawnPeerRequest - 9, // 18: compass.v1.LifecycleCallRequest.despawn:type_name -> compass.v1.DespawnPeerRequest - 8, // 19: compass.v1.LifecycleCallResult.spawn:type_name -> compass.v1.SpawnPeerResponse - 10, // 20: compass.v1.LifecycleCallResult.despawn:type_name -> compass.v1.DespawnPeerResponse - 12, // 21: compass.v1.LifecycleCallResult.error:type_name -> compass.v1.LifecycleCallError - 16, // 22: compass.v1.ForgeCallRequest.create_issue:type_name -> compass.v1.CreateIssueRequest - 17, // 23: compass.v1.ForgeCallRequest.comment_on_issue:type_name -> compass.v1.CommentOnIssueRequest - 18, // 24: compass.v1.ForgeCallRequest.get_issue:type_name -> compass.v1.GetIssueRequest - 19, // 25: compass.v1.ForgeCallRequest.list_issues:type_name -> compass.v1.ListIssuesRequest - 21, // 26: compass.v1.ForgeCallRequest.create_pull_request:type_name -> compass.v1.CreatePullRequestRequest - 22, // 27: compass.v1.ForgeCallRequest.comment_on_pull_request:type_name -> compass.v1.CommentOnPullRequestRequest - 23, // 28: compass.v1.ForgeCallRequest.get_pull_request:type_name -> compass.v1.GetPullRequestRequest - 26, // 29: compass.v1.ForgeCallRequest.subscribe:type_name -> compass.v1.SubscribeForgeRequest - 28, // 30: compass.v1.ForgeCallRequest.unsubscribe:type_name -> compass.v1.UnsubscribeForgeRequest - 24, // 31: compass.v1.ForgeCallRequest.submit_review:type_name -> compass.v1.SubmitReviewRequest - 54, // 32: compass.v1.ForgeCallRequest.forge:type_name -> compass.v1.ForgeRef - 55, // 33: compass.v1.ForgeCallResult.issue:type_name -> compass.v1.Issue - 56, // 34: compass.v1.ForgeCallResult.issue_comment:type_name -> compass.v1.CommentRef - 20, // 35: compass.v1.ForgeCallResult.issues:type_name -> compass.v1.ListIssuesResponse - 57, // 36: compass.v1.ForgeCallResult.pull_request:type_name -> compass.v1.PullRequest - 56, // 37: compass.v1.ForgeCallResult.pr_comment:type_name -> compass.v1.CommentRef - 27, // 38: compass.v1.ForgeCallResult.subscribed:type_name -> compass.v1.SubscribeForgeResponse - 29, // 39: compass.v1.ForgeCallResult.unsubscribed:type_name -> compass.v1.UnsubscribeForgeResponse - 15, // 40: compass.v1.ForgeCallResult.error:type_name -> compass.v1.ForgeCallError - 58, // 41: compass.v1.ForgeCallResult.review:type_name -> compass.v1.ReviewRef - 55, // 42: compass.v1.ListIssuesResponse.issues:type_name -> compass.v1.Issue - 25, // 43: compass.v1.SubmitReviewRequest.comments:type_name -> compass.v1.ReviewCommentInput - 59, // 44: compass.v1.SubscribeForgeRequest.kind:type_name -> compass.v1.ForgeArtifactKind - 0, // 45: compass.v1.SubscribeForgeRequest.scope:type_name -> compass.v1.ForgeSubscriptionScope - 31, // 46: compass.v1.BoardCallRequest.set_issue_state:type_name -> compass.v1.SetIssueStateRequest - 60, // 47: compass.v1.SetIssueStateRequest.state:type_name -> compass.v1.IssueState - 55, // 48: compass.v1.SetIssueStateResponse.issue:type_name -> compass.v1.Issue - 32, // 49: compass.v1.BoardCallResult.set_issue_state:type_name -> compass.v1.SetIssueStateResponse - 34, // 50: compass.v1.BoardCallResult.error:type_name -> compass.v1.BoardCallError - 61, // 51: compass.v1.PublishFrameRequest.frame:type_name -> compass.v1.AgentFrame - 61, // 52: compass.v1.PostConversationFrameRequest.frame:type_name -> compass.v1.AgentFrame - 1, // 53: compass.v1.AgentGateway.Comms:input_type -> compass.v1.CommsCallRequest - 6, // 54: compass.v1.AgentGateway.Lifecycle:input_type -> compass.v1.LifecycleCallRequest - 35, // 55: compass.v1.AgentGateway.Publish:input_type -> compass.v1.PublishFrameRequest - 37, // 56: compass.v1.AgentGateway.PostConversationFrame:input_type -> compass.v1.PostConversationFrameRequest - 39, // 57: compass.v1.AgentGateway.Control:input_type -> compass.v1.ControlSubscribeRequest - 13, // 58: compass.v1.AgentGateway.Forge:input_type -> compass.v1.ForgeCallRequest - 30, // 59: compass.v1.AgentGateway.Board:input_type -> compass.v1.BoardCallRequest - 2, // 60: compass.v1.AgentGateway.Comms:output_type -> compass.v1.CommsCallResult - 11, // 61: compass.v1.AgentGateway.Lifecycle:output_type -> compass.v1.LifecycleCallResult - 36, // 62: compass.v1.AgentGateway.Publish:output_type -> compass.v1.PublishFrameResponse - 38, // 63: compass.v1.AgentGateway.PostConversationFrame:output_type -> compass.v1.PostConversationFrameResponse - 62, // 64: compass.v1.AgentGateway.Control:output_type -> compass.v1.AgentControl - 14, // 65: compass.v1.AgentGateway.Forge:output_type -> compass.v1.ForgeCallResult - 33, // 66: compass.v1.AgentGateway.Board:output_type -> compass.v1.BoardCallResult - 60, // [60:67] is the sub-list for method output_type - 53, // [53:60] is the sub-list for method input_type - 53, // [53:53] is the sub-list for extension type_name - 53, // [53:53] is the sub-list for extension extendee - 0, // [0:53] is the sub-list for field type_name + 47, // 8: compass.v1.CommsCallRequest.open_dm:type_name -> compass.v1.OpenDMRequest + 48, // 9: compass.v1.CommsCallResult.post:type_name -> compass.v1.PostMessageResponse + 49, // 10: compass.v1.CommsCallResult.list:type_name -> compass.v1.ListMessagesResponse + 3, // 11: compass.v1.CommsCallResult.error:type_name -> compass.v1.CommsCallError + 50, // 12: compass.v1.CommsCallResult.roster:type_name -> compass.v1.GetRosterResponse + 5, // 13: compass.v1.CommsCallResult.set_status:type_name -> compass.v1.SetAgentStatusResponse + 51, // 14: compass.v1.CommsCallResult.pin:type_name -> compass.v1.UpdatePinnedBoardResponse + 52, // 15: compass.v1.CommsCallResult.create_channel:type_name -> compass.v1.CreateChannelResponse + 53, // 16: compass.v1.CommsCallResult.update_members:type_name -> compass.v1.UpdateChannelMembersResponse + 54, // 17: compass.v1.CommsCallResult.create_channel_group:type_name -> compass.v1.CreateChannelGroupResponse + 55, // 18: compass.v1.CommsCallResult.open_dm:type_name -> compass.v1.OpenDMResponse + 7, // 19: compass.v1.LifecycleCallRequest.spawn:type_name -> compass.v1.SpawnPeerRequest + 9, // 20: compass.v1.LifecycleCallRequest.despawn:type_name -> compass.v1.DespawnPeerRequest + 8, // 21: compass.v1.LifecycleCallResult.spawn:type_name -> compass.v1.SpawnPeerResponse + 10, // 22: compass.v1.LifecycleCallResult.despawn:type_name -> compass.v1.DespawnPeerResponse + 12, // 23: compass.v1.LifecycleCallResult.error:type_name -> compass.v1.LifecycleCallError + 16, // 24: compass.v1.ForgeCallRequest.create_issue:type_name -> compass.v1.CreateIssueRequest + 17, // 25: compass.v1.ForgeCallRequest.comment_on_issue:type_name -> compass.v1.CommentOnIssueRequest + 18, // 26: compass.v1.ForgeCallRequest.get_issue:type_name -> compass.v1.GetIssueRequest + 19, // 27: compass.v1.ForgeCallRequest.list_issues:type_name -> compass.v1.ListIssuesRequest + 21, // 28: compass.v1.ForgeCallRequest.create_pull_request:type_name -> compass.v1.CreatePullRequestRequest + 22, // 29: compass.v1.ForgeCallRequest.comment_on_pull_request:type_name -> compass.v1.CommentOnPullRequestRequest + 23, // 30: compass.v1.ForgeCallRequest.get_pull_request:type_name -> compass.v1.GetPullRequestRequest + 26, // 31: compass.v1.ForgeCallRequest.subscribe:type_name -> compass.v1.SubscribeForgeRequest + 28, // 32: compass.v1.ForgeCallRequest.unsubscribe:type_name -> compass.v1.UnsubscribeForgeRequest + 24, // 33: compass.v1.ForgeCallRequest.submit_review:type_name -> compass.v1.SubmitReviewRequest + 56, // 34: compass.v1.ForgeCallRequest.forge:type_name -> compass.v1.ForgeRef + 57, // 35: compass.v1.ForgeCallResult.issue:type_name -> compass.v1.Issue + 58, // 36: compass.v1.ForgeCallResult.issue_comment:type_name -> compass.v1.CommentRef + 20, // 37: compass.v1.ForgeCallResult.issues:type_name -> compass.v1.ListIssuesResponse + 59, // 38: compass.v1.ForgeCallResult.pull_request:type_name -> compass.v1.PullRequest + 58, // 39: compass.v1.ForgeCallResult.pr_comment:type_name -> compass.v1.CommentRef + 27, // 40: compass.v1.ForgeCallResult.subscribed:type_name -> compass.v1.SubscribeForgeResponse + 29, // 41: compass.v1.ForgeCallResult.unsubscribed:type_name -> compass.v1.UnsubscribeForgeResponse + 15, // 42: compass.v1.ForgeCallResult.error:type_name -> compass.v1.ForgeCallError + 60, // 43: compass.v1.ForgeCallResult.review:type_name -> compass.v1.ReviewRef + 57, // 44: compass.v1.ListIssuesResponse.issues:type_name -> compass.v1.Issue + 25, // 45: compass.v1.SubmitReviewRequest.comments:type_name -> compass.v1.ReviewCommentInput + 61, // 46: compass.v1.SubscribeForgeRequest.kind:type_name -> compass.v1.ForgeArtifactKind + 0, // 47: compass.v1.SubscribeForgeRequest.scope:type_name -> compass.v1.ForgeSubscriptionScope + 31, // 48: compass.v1.BoardCallRequest.set_issue_state:type_name -> compass.v1.SetIssueStateRequest + 62, // 49: compass.v1.SetIssueStateRequest.state:type_name -> compass.v1.IssueState + 57, // 50: compass.v1.SetIssueStateResponse.issue:type_name -> compass.v1.Issue + 32, // 51: compass.v1.BoardCallResult.set_issue_state:type_name -> compass.v1.SetIssueStateResponse + 34, // 52: compass.v1.BoardCallResult.error:type_name -> compass.v1.BoardCallError + 63, // 53: compass.v1.PublishFrameRequest.frame:type_name -> compass.v1.AgentFrame + 63, // 54: compass.v1.PostConversationFrameRequest.frame:type_name -> compass.v1.AgentFrame + 1, // 55: compass.v1.AgentGateway.Comms:input_type -> compass.v1.CommsCallRequest + 6, // 56: compass.v1.AgentGateway.Lifecycle:input_type -> compass.v1.LifecycleCallRequest + 35, // 57: compass.v1.AgentGateway.Publish:input_type -> compass.v1.PublishFrameRequest + 37, // 58: compass.v1.AgentGateway.PostConversationFrame:input_type -> compass.v1.PostConversationFrameRequest + 39, // 59: compass.v1.AgentGateway.Control:input_type -> compass.v1.ControlSubscribeRequest + 13, // 60: compass.v1.AgentGateway.Forge:input_type -> compass.v1.ForgeCallRequest + 30, // 61: compass.v1.AgentGateway.Board:input_type -> compass.v1.BoardCallRequest + 2, // 62: compass.v1.AgentGateway.Comms:output_type -> compass.v1.CommsCallResult + 11, // 63: compass.v1.AgentGateway.Lifecycle:output_type -> compass.v1.LifecycleCallResult + 36, // 64: compass.v1.AgentGateway.Publish:output_type -> compass.v1.PublishFrameResponse + 38, // 65: compass.v1.AgentGateway.PostConversationFrame:output_type -> compass.v1.PostConversationFrameResponse + 64, // 66: compass.v1.AgentGateway.Control:output_type -> compass.v1.AgentControl + 14, // 67: compass.v1.AgentGateway.Forge:output_type -> compass.v1.ForgeCallResult + 33, // 68: compass.v1.AgentGateway.Board:output_type -> compass.v1.BoardCallResult + 62, // [62:69] is the sub-list for method output_type + 55, // [55:62] is the sub-list for method input_type + 55, // [55:55] is the sub-list for extension type_name + 55, // [55:55] is the sub-list for extension extendee + 0, // [0:55] is the sub-list for field type_name } func init() { file_compass_v1_agent_gateway_proto_init() } @@ -3434,6 +3487,7 @@ func file_compass_v1_agent_gateway_proto_init() { (*CommsCallRequest_CreateChannel)(nil), (*CommsCallRequest_UpdateMembers)(nil), (*CommsCallRequest_CreateChannelGroup)(nil), + (*CommsCallRequest_OpenDm)(nil), } file_compass_v1_agent_gateway_proto_msgTypes[1].OneofWrappers = []any{ (*CommsCallResult_Post)(nil), @@ -3445,6 +3499,7 @@ func file_compass_v1_agent_gateway_proto_init() { (*CommsCallResult_CreateChannel)(nil), (*CommsCallResult_UpdateMembers)(nil), (*CommsCallResult_CreateChannelGroup)(nil), + (*CommsCallResult_OpenDm)(nil), } file_compass_v1_agent_gateway_proto_msgTypes[5].OneofWrappers = []any{ (*LifecycleCallRequest_Spawn)(nil), diff --git a/go/internal/store/types.go b/go/internal/store/types.go index bbb7087a..cd8369dd 100644 --- a/go/internal/store/types.go +++ b/go/internal/store/types.go @@ -77,7 +77,9 @@ const ( ChannelKindChannel ChannelKind = 0 // ChannelKindDM is a direct conversation between two accounts. ChannelKindDM ChannelKind = 1 - // ChannelKindGroupDM is a multi-party direct conversation. + // ChannelKindGroupDM is RETIRED: never produced (a DM converts to a named + // CHANNEL rather than widening). Kept as a tombstone — the number is not + // reusable; the wire mirror is deprecated in place (comms.proto ChannelKind). ChannelKindGroupDM ChannelKind = 2 ) diff --git a/packages/compass-agent/src/gen/compass/v1/agent_gateway_pb.ts b/packages/compass-agent/src/gen/compass/v1/agent_gateway_pb.ts index c373cf85..58d80db3 100644 --- a/packages/compass-agent/src/gen/compass/v1/agent_gateway_pb.ts +++ b/packages/compass-agent/src/gen/compass/v1/agent_gateway_pb.ts @@ -34,7 +34,7 @@ import type { GenEnum, GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2"; import { enumDesc, fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2"; -import type { CreateChannelGroupRequest, CreateChannelGroupResponse, CreateChannelRequest, CreateChannelResponse, GetRosterRequest, GetRosterResponse, ListMessagesRequest, ListMessagesResponse, PostMessageRequest, PostMessageResponse, UpdateChannelMembersRequest, UpdateChannelMembersResponse, UpdatePinnedBoardRequest, UpdatePinnedBoardResponse } from "./comms_pb"; +import type { CreateChannelGroupRequest, CreateChannelGroupResponse, CreateChannelRequest, CreateChannelResponse, GetRosterRequest, GetRosterResponse, ListMessagesRequest, ListMessagesResponse, OpenDMRequest, OpenDMResponse, PostMessageRequest, PostMessageResponse, UpdateChannelMembersRequest, UpdateChannelMembersResponse, UpdatePinnedBoardRequest, UpdatePinnedBoardResponse } from "./comms_pb"; import { file_compass_v1_comms } from "./comms_pb"; import type { AgentControlSchema, AgentFrame } from "./agent_pb"; import { file_compass_v1_agent } from "./agent_pb"; @@ -48,7 +48,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file compass/v1/agent_gateway.proto. */ export const file_compass_v1_agent_gateway: GenFile = /*@__PURE__*/ - fileDesc("Ch5jb21wYXNzL3YxL2FnZW50X2dhdGV3YXkucHJvdG8SCmNvbXBhc3MudjEijQQKEENvbW1zQ2FsbFJlcXVlc3QSDwoHY2FsbF9pZBgBIAEoCRIuCgRwb3N0GAIgASgLMh4uY29tcGFzcy52MS5Qb3N0TWVzc2FnZVJlcXVlc3RIABIvCgRsaXN0GAMgASgLMh8uY29tcGFzcy52MS5MaXN0TWVzc2FnZXNSZXF1ZXN0SAASLgoGcm9zdGVyGAQgASgLMhwuY29tcGFzcy52MS5HZXRSb3N0ZXJSZXF1ZXN0SAASNwoKc2V0X3N0YXR1cxgFIAEoCzIhLmNvbXBhc3MudjEuU2V0QWdlbnRTdGF0dXNSZXF1ZXN0SAASMwoDcGluGAYgASgLMiQuY29tcGFzcy52MS5VcGRhdGVQaW5uZWRCb2FyZFJlcXVlc3RIABI6Cg5jcmVhdGVfY2hhbm5lbBgHIAEoCzIgLmNvbXBhc3MudjEuQ3JlYXRlQ2hhbm5lbFJlcXVlc3RIABJBCg51cGRhdGVfbWVtYmVycxgIIAEoCzInLmNvbXBhc3MudjEuVXBkYXRlQ2hhbm5lbE1lbWJlcnNSZXF1ZXN0SAASRQoUY3JlYXRlX2NoYW5uZWxfZ3JvdXAYCSABKAsyJS5jb21wYXNzLnYxLkNyZWF0ZUNoYW5uZWxHcm91cFJlcXVlc3RIABIbChN0cmlnZ2VyX3RyYWNlcGFyZW50GAogASgJQgYKBGNhbGwipgQKD0NvbW1zQ2FsbFJlc3VsdBIPCgdjYWxsX2lkGAEgASgJEi8KBHBvc3QYAiABKAsyHy5jb21wYXNzLnYxLlBvc3RNZXNzYWdlUmVzcG9uc2VIABIwCgRsaXN0GAMgASgLMiAuY29tcGFzcy52MS5MaXN0TWVzc2FnZXNSZXNwb25zZUgAEisKBWVycm9yGAQgASgLMhouY29tcGFzcy52MS5Db21tc0NhbGxFcnJvckgAEi8KBnJvc3RlchgFIAEoCzIdLmNvbXBhc3MudjEuR2V0Um9zdGVyUmVzcG9uc2VIABI4CgpzZXRfc3RhdHVzGAYgASgLMiIuY29tcGFzcy52MS5TZXRBZ2VudFN0YXR1c1Jlc3BvbnNlSAASNAoDcGluGAcgASgLMiUuY29tcGFzcy52MS5VcGRhdGVQaW5uZWRCb2FyZFJlc3BvbnNlSAASOwoOY3JlYXRlX2NoYW5uZWwYCCABKAsyIS5jb21wYXNzLnYxLkNyZWF0ZUNoYW5uZWxSZXNwb25zZUgAEkIKDnVwZGF0ZV9tZW1iZXJzGAkgASgLMiguY29tcGFzcy52MS5VcGRhdGVDaGFubmVsTWVtYmVyc1Jlc3BvbnNlSAASRgoUY3JlYXRlX2NoYW5uZWxfZ3JvdXAYCiABKAsyJi5jb21wYXNzLnYxLkNyZWF0ZUNoYW5uZWxHcm91cFJlc3BvbnNlSABCCAoGcmVzdWx0Ii8KDkNvbW1zQ2FsbEVycm9yEgwKBGNvZGUYASABKAkSDwoHbWVzc2FnZRgCIAEoCSIpChVTZXRBZ2VudFN0YXR1c1JlcXVlc3QSEAoIYWN0aXZpdHkYASABKAkiGAoWU2V0QWdlbnRTdGF0dXNSZXNwb25zZSKRAQoUTGlmZWN5Y2xlQ2FsbFJlcXVlc3QSDwoHY2FsbF9pZBgBIAEoCRItCgVzcGF3bhgCIAEoCzIcLmNvbXBhc3MudjEuU3Bhd25QZWVyUmVxdWVzdEgAEjEKB2Rlc3Bhd24YAyABKAsyHi5jb21wYXNzLnYxLkRlc3Bhd25QZWVyUmVxdWVzdEgAQgYKBGNhbGwiiAEKEFNwYXduUGVlclJlcXVlc3QSDgoGaGFuZGxlGAEgASgJEhQKDGRpc3BsYXlfbmFtZRgCIAEoCRIZChFjbGllbnRfcmVxdWVzdF9pZBgEIAEoCRIMCgRyb2xlGAUgASgJEg8KB3BlcnNvbmEYBiABKAlKBAgDEARSDmluaXRpYWxfcHJvbXB0IlkKEVNwYXduUGVlclJlc3BvbnNlEhgKEGFnZW50X2FjY291bnRfaWQYASABKAkSFgoOY29udGFpbmVyX25hbWUYAiABKAkSEgoKc2Vzc2lvbl9pZBgDIAEoCSIqChJEZXNwYXduUGVlclJlcXVlc3QSFAoMYWdlbnRfaGFuZGxlGAEgASgJIhUKE0Rlc3Bhd25QZWVyUmVzcG9uc2UixQEKE0xpZmVjeWNsZUNhbGxSZXN1bHQSDwoHY2FsbF9pZBgBIAEoCRIuCgVzcGF3bhgCIAEoCzIdLmNvbXBhc3MudjEuU3Bhd25QZWVyUmVzcG9uc2VIABIyCgdkZXNwYXduGAMgASgLMh8uY29tcGFzcy52MS5EZXNwYXduUGVlclJlc3BvbnNlSAASLwoFZXJyb3IYBCABKAsyHi5jb21wYXNzLnYxLkxpZmVjeWNsZUNhbGxFcnJvckgAQggKBnJlc3VsdCIzChJMaWZlY3ljbGVDYWxsRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJIsgFChBGb3JnZUNhbGxSZXF1ZXN0Eg8KB2NhbGxfaWQYASABKAkSNgoMY3JlYXRlX2lzc3VlGAIgASgLMh4uY29tcGFzcy52MS5DcmVhdGVJc3N1ZVJlcXVlc3RIABI9ChBjb21tZW50X29uX2lzc3VlGAMgASgLMiEuY29tcGFzcy52MS5Db21tZW50T25Jc3N1ZVJlcXVlc3RIABIwCglnZXRfaXNzdWUYBCABKAsyGy5jb21wYXNzLnYxLkdldElzc3VlUmVxdWVzdEgAEjQKC2xpc3RfaXNzdWVzGAUgASgLMh0uY29tcGFzcy52MS5MaXN0SXNzdWVzUmVxdWVzdEgAEkMKE2NyZWF0ZV9wdWxsX3JlcXVlc3QYBiABKAsyJC5jb21wYXNzLnYxLkNyZWF0ZVB1bGxSZXF1ZXN0UmVxdWVzdEgAEkoKF2NvbW1lbnRfb25fcHVsbF9yZXF1ZXN0GAcgASgLMicuY29tcGFzcy52MS5Db21tZW50T25QdWxsUmVxdWVzdFJlcXVlc3RIABI9ChBnZXRfcHVsbF9yZXF1ZXN0GAggASgLMiEuY29tcGFzcy52MS5HZXRQdWxsUmVxdWVzdFJlcXVlc3RIABI2CglzdWJzY3JpYmUYCSABKAsyIS5jb21wYXNzLnYxLlN1YnNjcmliZUZvcmdlUmVxdWVzdEgAEjoKC3Vuc3Vic2NyaWJlGAogASgLMiMuY29tcGFzcy52MS5VbnN1YnNjcmliZUZvcmdlUmVxdWVzdEgAEjgKDXN1Ym1pdF9yZXZpZXcYCyABKAsyHy5jb21wYXNzLnYxLlN1Ym1pdFJldmlld1JlcXVlc3RIABIjCgVmb3JnZRgMIAEoCzIULmNvbXBhc3MudjEuRm9yZ2VSZWYSGQoRY2xpZW50X3JlcXVlc3RfaWQYDSABKAlCBgoEY2FsbCLgAwoPRm9yZ2VDYWxsUmVzdWx0Eg8KB2NhbGxfaWQYASABKAkSIgoFaXNzdWUYAiABKAsyES5jb21wYXNzLnYxLklzc3VlSAASLwoNaXNzdWVfY29tbWVudBgDIAEoCzIWLmNvbXBhc3MudjEuQ29tbWVudFJlZkgAEjAKBmlzc3VlcxgEIAEoCzIeLmNvbXBhc3MudjEuTGlzdElzc3Vlc1Jlc3BvbnNlSAASLwoMcHVsbF9yZXF1ZXN0GAUgASgLMhcuY29tcGFzcy52MS5QdWxsUmVxdWVzdEgAEiwKCnByX2NvbW1lbnQYBiABKAsyFi5jb21wYXNzLnYxLkNvbW1lbnRSZWZIABI4CgpzdWJzY3JpYmVkGAcgASgLMiIuY29tcGFzcy52MS5TdWJzY3JpYmVGb3JnZVJlc3BvbnNlSAASPAoMdW5zdWJzY3JpYmVkGAggASgLMiQuY29tcGFzcy52MS5VbnN1YnNjcmliZUZvcmdlUmVzcG9uc2VIABIrCgVlcnJvchgJIAEoCzIaLmNvbXBhc3MudjEuRm9yZ2VDYWxsRXJyb3JIABInCgZyZXZpZXcYCiABKAsyFS5jb21wYXNzLnYxLlJldmlld1JlZkgAQggKBnJlc3VsdCJHCg5Gb3JnZUNhbGxFcnJvchIMCgRjb2RlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSFgoOcmV0cnlfYWZ0ZXJfbXMYAyABKA0iTwoSQ3JlYXRlSXNzdWVSZXF1ZXN0EgwKBHJlcG8YASABKAkSDQoFdGl0bGUYAiABKAkSDAoEYm9keRgDIAEoCRIOCgZsYWJlbHMYBCADKAkiSQoVQ29tbWVudE9uSXNzdWVSZXF1ZXN0EgwKBHJlcG8YASABKAkSFAoMaXNzdWVfbnVtYmVyGAIgASgEEgwKBGJvZHkYAyABKAkiNQoPR2V0SXNzdWVSZXF1ZXN0EgwKBHJlcG8YASABKAkSFAoMaXNzdWVfbnVtYmVyGAIgASgEIk8KEUxpc3RJc3N1ZXNSZXF1ZXN0EgwKBHJlcG8YASABKAkSDQoFc3RhdGUYAiABKAkSDgoGbGFiZWxzGAMgAygJEg0KBWxpbWl0GAQgASgNIjcKEkxpc3RJc3N1ZXNSZXNwb25zZRIhCgZpc3N1ZXMYASADKAsyES5jb21wYXNzLnYxLklzc3VlIngKGENyZWF0ZVB1bGxSZXF1ZXN0UmVxdWVzdBIMCgRyZXBvGAEgASgJEg0KBXRpdGxlGAIgASgJEgwKBGJvZHkYAyABKAkSEAoIaGVhZF9yZWYYBCABKAkSEAoIYmFzZV9yZWYYBSABKAkSDQoFZHJhZnQYBiABKAgiTgobQ29tbWVudE9uUHVsbFJlcXVlc3RSZXF1ZXN0EgwKBHJlcG8YASABKAkSEwoLcHVsbF9udW1iZXIYAiABKAQSDAoEYm9keRgDIAEoCSI6ChVHZXRQdWxsUmVxdWVzdFJlcXVlc3QSDAoEcmVwbxgBIAEoCRITCgtwdWxsX251bWJlchgCIAEoBCKJAQoTU3VibWl0UmV2aWV3UmVxdWVzdBIMCgRyZXBvGAEgASgJEhMKC3B1bGxfbnVtYmVyGAIgASgEEg8KB3ZlcmRpY3QYAyABKAkSDAoEYm9keRgEIAEoCRIwCghjb21tZW50cxgFIAMoCzIeLmNvbXBhc3MudjEuUmV2aWV3Q29tbWVudElucHV0IkwKElJldmlld0NvbW1lbnRJbnB1dBIMCgRwYXRoGAEgASgJEgwKBGxpbmUYAiABKA0SDAoEc2lkZRgDIAEoCRIMCgRib2R5GAQgASgJIqYBChVTdWJzY3JpYmVGb3JnZVJlcXVlc3QSDAoEcmVwbxgBIAEoCRIrCgRraW5kGAIgASgOMh0uY29tcGFzcy52MS5Gb3JnZUFydGlmYWN0S2luZBIOCgZudW1iZXIYAyABKAQSMQoFc2NvcGUYBCABKA4yIi5jb21wYXNzLnYxLkZvcmdlU3Vic2NyaXB0aW9uU2NvcGUSDwoHcHJvamVjdBgFIAEoCSIxChZTdWJzY3JpYmVGb3JnZVJlc3BvbnNlEhcKD3N1YnNjcmlwdGlvbl9pZBgBIAEoCSIyChdVbnN1YnNjcmliZUZvcmdlUmVxdWVzdBIXCg9zdWJzY3JpcHRpb25faWQYASABKAkiGgoYVW5zdWJzY3JpYmVGb3JnZVJlc3BvbnNlImgKEEJvYXJkQ2FsbFJlcXVlc3QSDwoHY2FsbF9pZBgBIAEoCRI7Cg9zZXRfaXNzdWVfc3RhdGUYAiABKAsyIC5jb21wYXNzLnYxLlNldElzc3VlU3RhdGVSZXF1ZXN0SABCBgoEY2FsbCJPChRTZXRJc3N1ZVN0YXRlUmVxdWVzdBIQCghpc3N1ZV9pZBgBIAEoCRIlCgVzdGF0ZRgCIAEoDjIWLmNvbXBhc3MudjEuSXNzdWVTdGF0ZSI5ChVTZXRJc3N1ZVN0YXRlUmVzcG9uc2USIAoFaXNzdWUYASABKAsyES5jb21wYXNzLnYxLklzc3VlIpcBCg9Cb2FyZENhbGxSZXN1bHQSDwoHY2FsbF9pZBgBIAEoCRI8Cg9zZXRfaXNzdWVfc3RhdGUYAiABKAsyIS5jb21wYXNzLnYxLlNldElzc3VlU3RhdGVSZXNwb25zZUgAEisKBWVycm9yGAMgASgLMhouY29tcGFzcy52MS5Cb2FyZENhbGxFcnJvckgAQggKBnJlc3VsdCIvCg5Cb2FyZENhbGxFcnJvchIMCgRjb2RlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkiPAoTUHVibGlzaEZyYW1lUmVxdWVzdBIlCgVmcmFtZRgBIAEoCzIWLmNvbXBhc3MudjEuQWdlbnRGcmFtZSIWChRQdWJsaXNoRnJhbWVSZXNwb25zZSJeChxQb3N0Q29udmVyc2F0aW9uRnJhbWVSZXF1ZXN0EiUKBWZyYW1lGAEgASgLMhYuY29tcGFzcy52MS5BZ2VudEZyYW1lEhcKD2lkZW1wb3RlbmN5X2tleRgCIAEoCSIfCh1Qb3N0Q29udmVyc2F0aW9uRnJhbWVSZXNwb25zZSIZChdDb250cm9sU3Vic2NyaWJlUmVxdWVzdCqRAQoWRm9yZ2VTdWJzY3JpcHRpb25TY29wZRIoCiRGT1JHRV9TVUJTQ1JJUFRJT05fU0NPUEVfVU5TUEVDSUZJRUQQABIlCiFGT1JHRV9TVUJTQ1JJUFRJT05fU0NPUEVfQVJUSUZBQ1QQARImCiJGT1JHRV9TVUJTQ1JJUFRJT05fU0NPUEVfQ09OVEFJTkVSEAIytAQKDEFnZW50R2F0ZXdheRJCCgVDb21tcxIcLmNvbXBhc3MudjEuQ29tbXNDYWxsUmVxdWVzdBobLmNvbXBhc3MudjEuQ29tbXNDYWxsUmVzdWx0Ek4KCUxpZmVjeWNsZRIgLmNvbXBhc3MudjEuTGlmZWN5Y2xlQ2FsbFJlcXVlc3QaHy5jb21wYXNzLnYxLkxpZmVjeWNsZUNhbGxSZXN1bHQSTgoHUHVibGlzaBIfLmNvbXBhc3MudjEuUHVibGlzaEZyYW1lUmVxdWVzdBogLmNvbXBhc3MudjEuUHVibGlzaEZyYW1lUmVzcG9uc2UoARJsChVQb3N0Q29udmVyc2F0aW9uRnJhbWUSKC5jb21wYXNzLnYxLlBvc3RDb252ZXJzYXRpb25GcmFtZVJlcXVlc3QaKS5jb21wYXNzLnYxLlBvc3RDb252ZXJzYXRpb25GcmFtZVJlc3BvbnNlEkoKB0NvbnRyb2wSIy5jb21wYXNzLnYxLkNvbnRyb2xTdWJzY3JpYmVSZXF1ZXN0GhguY29tcGFzcy52MS5BZ2VudENvbnRyb2wwARJCCgVGb3JnZRIcLmNvbXBhc3MudjEuRm9yZ2VDYWxsUmVxdWVzdBobLmNvbXBhc3MudjEuRm9yZ2VDYWxsUmVzdWx0EkIKBUJvYXJkEhwuY29tcGFzcy52MS5Cb2FyZENhbGxSZXF1ZXN0GhsuY29tcGFzcy52MS5Cb2FyZENhbGxSZXN1bHRiBnByb3RvMw", [file_compass_v1_comms, file_compass_v1_agent, file_compass_v1_compass, file_compass_v1_forge]); + fileDesc("Ch5jb21wYXNzL3YxL2FnZW50X2dhdGV3YXkucHJvdG8SCmNvbXBhc3MudjEiuwQKEENvbW1zQ2FsbFJlcXVlc3QSDwoHY2FsbF9pZBgBIAEoCRIuCgRwb3N0GAIgASgLMh4uY29tcGFzcy52MS5Qb3N0TWVzc2FnZVJlcXVlc3RIABIvCgRsaXN0GAMgASgLMh8uY29tcGFzcy52MS5MaXN0TWVzc2FnZXNSZXF1ZXN0SAASLgoGcm9zdGVyGAQgASgLMhwuY29tcGFzcy52MS5HZXRSb3N0ZXJSZXF1ZXN0SAASNwoKc2V0X3N0YXR1cxgFIAEoCzIhLmNvbXBhc3MudjEuU2V0QWdlbnRTdGF0dXNSZXF1ZXN0SAASMwoDcGluGAYgASgLMiQuY29tcGFzcy52MS5VcGRhdGVQaW5uZWRCb2FyZFJlcXVlc3RIABI6Cg5jcmVhdGVfY2hhbm5lbBgHIAEoCzIgLmNvbXBhc3MudjEuQ3JlYXRlQ2hhbm5lbFJlcXVlc3RIABJBCg51cGRhdGVfbWVtYmVycxgIIAEoCzInLmNvbXBhc3MudjEuVXBkYXRlQ2hhbm5lbE1lbWJlcnNSZXF1ZXN0SAASRQoUY3JlYXRlX2NoYW5uZWxfZ3JvdXAYCSABKAsyJS5jb21wYXNzLnYxLkNyZWF0ZUNoYW5uZWxHcm91cFJlcXVlc3RIABIsCgdvcGVuX2RtGAsgASgLMhkuY29tcGFzcy52MS5PcGVuRE1SZXF1ZXN0SAASGwoTdHJpZ2dlcl90cmFjZXBhcmVudBgKIAEoCUIGCgRjYWxsItUECg9Db21tc0NhbGxSZXN1bHQSDwoHY2FsbF9pZBgBIAEoCRIvCgRwb3N0GAIgASgLMh8uY29tcGFzcy52MS5Qb3N0TWVzc2FnZVJlc3BvbnNlSAASMAoEbGlzdBgDIAEoCzIgLmNvbXBhc3MudjEuTGlzdE1lc3NhZ2VzUmVzcG9uc2VIABIrCgVlcnJvchgEIAEoCzIaLmNvbXBhc3MudjEuQ29tbXNDYWxsRXJyb3JIABIvCgZyb3N0ZXIYBSABKAsyHS5jb21wYXNzLnYxLkdldFJvc3RlclJlc3BvbnNlSAASOAoKc2V0X3N0YXR1cxgGIAEoCzIiLmNvbXBhc3MudjEuU2V0QWdlbnRTdGF0dXNSZXNwb25zZUgAEjQKA3BpbhgHIAEoCzIlLmNvbXBhc3MudjEuVXBkYXRlUGlubmVkQm9hcmRSZXNwb25zZUgAEjsKDmNyZWF0ZV9jaGFubmVsGAggASgLMiEuY29tcGFzcy52MS5DcmVhdGVDaGFubmVsUmVzcG9uc2VIABJCCg51cGRhdGVfbWVtYmVycxgJIAEoCzIoLmNvbXBhc3MudjEuVXBkYXRlQ2hhbm5lbE1lbWJlcnNSZXNwb25zZUgAEkYKFGNyZWF0ZV9jaGFubmVsX2dyb3VwGAogASgLMiYuY29tcGFzcy52MS5DcmVhdGVDaGFubmVsR3JvdXBSZXNwb25zZUgAEi0KB29wZW5fZG0YCyABKAsyGi5jb21wYXNzLnYxLk9wZW5ETVJlc3BvbnNlSABCCAoGcmVzdWx0Ii8KDkNvbW1zQ2FsbEVycm9yEgwKBGNvZGUYASABKAkSDwoHbWVzc2FnZRgCIAEoCSIpChVTZXRBZ2VudFN0YXR1c1JlcXVlc3QSEAoIYWN0aXZpdHkYASABKAkiGAoWU2V0QWdlbnRTdGF0dXNSZXNwb25zZSKRAQoUTGlmZWN5Y2xlQ2FsbFJlcXVlc3QSDwoHY2FsbF9pZBgBIAEoCRItCgVzcGF3bhgCIAEoCzIcLmNvbXBhc3MudjEuU3Bhd25QZWVyUmVxdWVzdEgAEjEKB2Rlc3Bhd24YAyABKAsyHi5jb21wYXNzLnYxLkRlc3Bhd25QZWVyUmVxdWVzdEgAQgYKBGNhbGwiiAEKEFNwYXduUGVlclJlcXVlc3QSDgoGaGFuZGxlGAEgASgJEhQKDGRpc3BsYXlfbmFtZRgCIAEoCRIZChFjbGllbnRfcmVxdWVzdF9pZBgEIAEoCRIMCgRyb2xlGAUgASgJEg8KB3BlcnNvbmEYBiABKAlKBAgDEARSDmluaXRpYWxfcHJvbXB0InIKEVNwYXduUGVlclJlc3BvbnNlEhgKEGFnZW50X2FjY291bnRfaWQYASABKAkSFgoOY29udGFpbmVyX25hbWUYAiABKAkSEgoKc2Vzc2lvbl9pZBgDIAEoCRIXCg9kbV9jaGFubmVsX25hbWUYBCABKAkiKgoSRGVzcGF3blBlZXJSZXF1ZXN0EhQKDGFnZW50X2hhbmRsZRgBIAEoCSIVChNEZXNwYXduUGVlclJlc3BvbnNlIsUBChNMaWZlY3ljbGVDYWxsUmVzdWx0Eg8KB2NhbGxfaWQYASABKAkSLgoFc3Bhd24YAiABKAsyHS5jb21wYXNzLnYxLlNwYXduUGVlclJlc3BvbnNlSAASMgoHZGVzcGF3bhgDIAEoCzIfLmNvbXBhc3MudjEuRGVzcGF3blBlZXJSZXNwb25zZUgAEi8KBWVycm9yGAQgASgLMh4uY29tcGFzcy52MS5MaWZlY3ljbGVDYWxsRXJyb3JIAEIICgZyZXN1bHQiMwoSTGlmZWN5Y2xlQ2FsbEVycm9yEgwKBGNvZGUYASABKAkSDwoHbWVzc2FnZRgCIAEoCSLIBQoQRm9yZ2VDYWxsUmVxdWVzdBIPCgdjYWxsX2lkGAEgASgJEjYKDGNyZWF0ZV9pc3N1ZRgCIAEoCzIeLmNvbXBhc3MudjEuQ3JlYXRlSXNzdWVSZXF1ZXN0SAASPQoQY29tbWVudF9vbl9pc3N1ZRgDIAEoCzIhLmNvbXBhc3MudjEuQ29tbWVudE9uSXNzdWVSZXF1ZXN0SAASMAoJZ2V0X2lzc3VlGAQgASgLMhsuY29tcGFzcy52MS5HZXRJc3N1ZVJlcXVlc3RIABI0CgtsaXN0X2lzc3VlcxgFIAEoCzIdLmNvbXBhc3MudjEuTGlzdElzc3Vlc1JlcXVlc3RIABJDChNjcmVhdGVfcHVsbF9yZXF1ZXN0GAYgASgLMiQuY29tcGFzcy52MS5DcmVhdGVQdWxsUmVxdWVzdFJlcXVlc3RIABJKChdjb21tZW50X29uX3B1bGxfcmVxdWVzdBgHIAEoCzInLmNvbXBhc3MudjEuQ29tbWVudE9uUHVsbFJlcXVlc3RSZXF1ZXN0SAASPQoQZ2V0X3B1bGxfcmVxdWVzdBgIIAEoCzIhLmNvbXBhc3MudjEuR2V0UHVsbFJlcXVlc3RSZXF1ZXN0SAASNgoJc3Vic2NyaWJlGAkgASgLMiEuY29tcGFzcy52MS5TdWJzY3JpYmVGb3JnZVJlcXVlc3RIABI6Cgt1bnN1YnNjcmliZRgKIAEoCzIjLmNvbXBhc3MudjEuVW5zdWJzY3JpYmVGb3JnZVJlcXVlc3RIABI4Cg1zdWJtaXRfcmV2aWV3GAsgASgLMh8uY29tcGFzcy52MS5TdWJtaXRSZXZpZXdSZXF1ZXN0SAASIwoFZm9yZ2UYDCABKAsyFC5jb21wYXNzLnYxLkZvcmdlUmVmEhkKEWNsaWVudF9yZXF1ZXN0X2lkGA0gASgJQgYKBGNhbGwi4AMKD0ZvcmdlQ2FsbFJlc3VsdBIPCgdjYWxsX2lkGAEgASgJEiIKBWlzc3VlGAIgASgLMhEuY29tcGFzcy52MS5Jc3N1ZUgAEi8KDWlzc3VlX2NvbW1lbnQYAyABKAsyFi5jb21wYXNzLnYxLkNvbW1lbnRSZWZIABIwCgZpc3N1ZXMYBCABKAsyHi5jb21wYXNzLnYxLkxpc3RJc3N1ZXNSZXNwb25zZUgAEi8KDHB1bGxfcmVxdWVzdBgFIAEoCzIXLmNvbXBhc3MudjEuUHVsbFJlcXVlc3RIABIsCgpwcl9jb21tZW50GAYgASgLMhYuY29tcGFzcy52MS5Db21tZW50UmVmSAASOAoKc3Vic2NyaWJlZBgHIAEoCzIiLmNvbXBhc3MudjEuU3Vic2NyaWJlRm9yZ2VSZXNwb25zZUgAEjwKDHVuc3Vic2NyaWJlZBgIIAEoCzIkLmNvbXBhc3MudjEuVW5zdWJzY3JpYmVGb3JnZVJlc3BvbnNlSAASKwoFZXJyb3IYCSABKAsyGi5jb21wYXNzLnYxLkZvcmdlQ2FsbEVycm9ySAASJwoGcmV2aWV3GAogASgLMhUuY29tcGFzcy52MS5SZXZpZXdSZWZIAEIICgZyZXN1bHQiRwoORm9yZ2VDYWxsRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEhYKDnJldHJ5X2FmdGVyX21zGAMgASgNIk8KEkNyZWF0ZUlzc3VlUmVxdWVzdBIMCgRyZXBvGAEgASgJEg0KBXRpdGxlGAIgASgJEgwKBGJvZHkYAyABKAkSDgoGbGFiZWxzGAQgAygJIkkKFUNvbW1lbnRPbklzc3VlUmVxdWVzdBIMCgRyZXBvGAEgASgJEhQKDGlzc3VlX251bWJlchgCIAEoBBIMCgRib2R5GAMgASgJIjUKD0dldElzc3VlUmVxdWVzdBIMCgRyZXBvGAEgASgJEhQKDGlzc3VlX251bWJlchgCIAEoBCJPChFMaXN0SXNzdWVzUmVxdWVzdBIMCgRyZXBvGAEgASgJEg0KBXN0YXRlGAIgASgJEg4KBmxhYmVscxgDIAMoCRINCgVsaW1pdBgEIAEoDSI3ChJMaXN0SXNzdWVzUmVzcG9uc2USIQoGaXNzdWVzGAEgAygLMhEuY29tcGFzcy52MS5Jc3N1ZSJ4ChhDcmVhdGVQdWxsUmVxdWVzdFJlcXVlc3QSDAoEcmVwbxgBIAEoCRINCgV0aXRsZRgCIAEoCRIMCgRib2R5GAMgASgJEhAKCGhlYWRfcmVmGAQgASgJEhAKCGJhc2VfcmVmGAUgASgJEg0KBWRyYWZ0GAYgASgIIk4KG0NvbW1lbnRPblB1bGxSZXF1ZXN0UmVxdWVzdBIMCgRyZXBvGAEgASgJEhMKC3B1bGxfbnVtYmVyGAIgASgEEgwKBGJvZHkYAyABKAkiOgoVR2V0UHVsbFJlcXVlc3RSZXF1ZXN0EgwKBHJlcG8YASABKAkSEwoLcHVsbF9udW1iZXIYAiABKAQiiQEKE1N1Ym1pdFJldmlld1JlcXVlc3QSDAoEcmVwbxgBIAEoCRITCgtwdWxsX251bWJlchgCIAEoBBIPCgd2ZXJkaWN0GAMgASgJEgwKBGJvZHkYBCABKAkSMAoIY29tbWVudHMYBSADKAsyHi5jb21wYXNzLnYxLlJldmlld0NvbW1lbnRJbnB1dCJMChJSZXZpZXdDb21tZW50SW5wdXQSDAoEcGF0aBgBIAEoCRIMCgRsaW5lGAIgASgNEgwKBHNpZGUYAyABKAkSDAoEYm9keRgEIAEoCSKmAQoVU3Vic2NyaWJlRm9yZ2VSZXF1ZXN0EgwKBHJlcG8YASABKAkSKwoEa2luZBgCIAEoDjIdLmNvbXBhc3MudjEuRm9yZ2VBcnRpZmFjdEtpbmQSDgoGbnVtYmVyGAMgASgEEjEKBXNjb3BlGAQgASgOMiIuY29tcGFzcy52MS5Gb3JnZVN1YnNjcmlwdGlvblNjb3BlEg8KB3Byb2plY3QYBSABKAkiMQoWU3Vic2NyaWJlRm9yZ2VSZXNwb25zZRIXCg9zdWJzY3JpcHRpb25faWQYASABKAkiMgoXVW5zdWJzY3JpYmVGb3JnZVJlcXVlc3QSFwoPc3Vic2NyaXB0aW9uX2lkGAEgASgJIhoKGFVuc3Vic2NyaWJlRm9yZ2VSZXNwb25zZSJoChBCb2FyZENhbGxSZXF1ZXN0Eg8KB2NhbGxfaWQYASABKAkSOwoPc2V0X2lzc3VlX3N0YXRlGAIgASgLMiAuY29tcGFzcy52MS5TZXRJc3N1ZVN0YXRlUmVxdWVzdEgAQgYKBGNhbGwiTwoUU2V0SXNzdWVTdGF0ZVJlcXVlc3QSEAoIaXNzdWVfaWQYASABKAkSJQoFc3RhdGUYAiABKA4yFi5jb21wYXNzLnYxLklzc3VlU3RhdGUiOQoVU2V0SXNzdWVTdGF0ZVJlc3BvbnNlEiAKBWlzc3VlGAEgASgLMhEuY29tcGFzcy52MS5Jc3N1ZSKXAQoPQm9hcmRDYWxsUmVzdWx0Eg8KB2NhbGxfaWQYASABKAkSPAoPc2V0X2lzc3VlX3N0YXRlGAIgASgLMiEuY29tcGFzcy52MS5TZXRJc3N1ZVN0YXRlUmVzcG9uc2VIABIrCgVlcnJvchgDIAEoCzIaLmNvbXBhc3MudjEuQm9hcmRDYWxsRXJyb3JIAEIICgZyZXN1bHQiLwoOQm9hcmRDYWxsRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJIjwKE1B1Ymxpc2hGcmFtZVJlcXVlc3QSJQoFZnJhbWUYASABKAsyFi5jb21wYXNzLnYxLkFnZW50RnJhbWUiFgoUUHVibGlzaEZyYW1lUmVzcG9uc2UiXgocUG9zdENvbnZlcnNhdGlvbkZyYW1lUmVxdWVzdBIlCgVmcmFtZRgBIAEoCzIWLmNvbXBhc3MudjEuQWdlbnRGcmFtZRIXCg9pZGVtcG90ZW5jeV9rZXkYAiABKAkiHwodUG9zdENvbnZlcnNhdGlvbkZyYW1lUmVzcG9uc2UiGQoXQ29udHJvbFN1YnNjcmliZVJlcXVlc3QqkQEKFkZvcmdlU3Vic2NyaXB0aW9uU2NvcGUSKAokRk9SR0VfU1VCU0NSSVBUSU9OX1NDT1BFX1VOU1BFQ0lGSUVEEAASJQohRk9SR0VfU1VCU0NSSVBUSU9OX1NDT1BFX0FSVElGQUNUEAESJgoiRk9SR0VfU1VCU0NSSVBUSU9OX1NDT1BFX0NPTlRBSU5FUhACMrQECgxBZ2VudEdhdGV3YXkSQgoFQ29tbXMSHC5jb21wYXNzLnYxLkNvbW1zQ2FsbFJlcXVlc3QaGy5jb21wYXNzLnYxLkNvbW1zQ2FsbFJlc3VsdBJOCglMaWZlY3ljbGUSIC5jb21wYXNzLnYxLkxpZmVjeWNsZUNhbGxSZXF1ZXN0Gh8uY29tcGFzcy52MS5MaWZlY3ljbGVDYWxsUmVzdWx0Ek4KB1B1Ymxpc2gSHy5jb21wYXNzLnYxLlB1Ymxpc2hGcmFtZVJlcXVlc3QaIC5jb21wYXNzLnYxLlB1Ymxpc2hGcmFtZVJlc3BvbnNlKAESbAoVUG9zdENvbnZlcnNhdGlvbkZyYW1lEiguY29tcGFzcy52MS5Qb3N0Q29udmVyc2F0aW9uRnJhbWVSZXF1ZXN0GikuY29tcGFzcy52MS5Qb3N0Q29udmVyc2F0aW9uRnJhbWVSZXNwb25zZRJKCgdDb250cm9sEiMuY29tcGFzcy52MS5Db250cm9sU3Vic2NyaWJlUmVxdWVzdBoYLmNvbXBhc3MudjEuQWdlbnRDb250cm9sMAESQgoFRm9yZ2USHC5jb21wYXNzLnYxLkZvcmdlQ2FsbFJlcXVlc3QaGy5jb21wYXNzLnYxLkZvcmdlQ2FsbFJlc3VsdBJCCgVCb2FyZBIcLmNvbXBhc3MudjEuQm9hcmRDYWxsUmVxdWVzdBobLmNvbXBhc3MudjEuQm9hcmRDYWxsUmVzdWx0YgZwcm90bzM", [file_compass_v1_comms, file_compass_v1_agent, file_compass_v1_compass, file_compass_v1_forge]); /** * One agent-initiated comms call. `call_id` is the agent-minted correlation id @@ -114,6 +114,16 @@ export type CommsCallRequest = Message<"compass.v1.CommsCallRequest"> & { */ value: CreateChannelGroupRequest; case: "createChannelGroup"; + } | { + /** + * 10 is trigger_traceparent (message-level, below); open_dm takes the + * next-free arm above it (design Global Constraints: never renumber down + * into an org-management slot). + * + * @generated from field: compass.v1.OpenDMRequest open_dm = 11; + */ + value: OpenDMRequest; + case: "openDm"; } | { case: undefined; value?: undefined }; /** @@ -144,7 +154,7 @@ export const CommsCallRequestSchema: GenMessage = /*@__PURE__* * The result of one comms call, correlated by `call_id`. A successful call sets * the response arm matching the request's operation (`post`, `list`, `roster`, * `set_status`, `pin`, `create_channel`, `update_members`, - * `create_channel_group`); an in-band failure (a tool error — non-member + * `create_channel_group`, `open_dm`); an in-band failure (a tool error — non-member * channel, bad input) sets `error`, which is NOT a transport teardown. The same * message is the `RelayCommsCallResponse.result` payload on the Runner->Server * leg. @@ -214,6 +224,12 @@ export type CommsCallResult = Message<"compass.v1.CommsCallResult"> & { */ value: CreateChannelGroupResponse; case: "createChannelGroup"; + } | { + /** + * @generated from field: compass.v1.OpenDMResponse open_dm = 11; + */ + value: OpenDMResponse; + case: "openDm"; } | { case: undefined; value?: undefined }; }; @@ -393,6 +409,15 @@ export type SpawnPeerResponse = Message<"compass.v1.SpawnPeerResponse"> & { * @generated from field: string session_id = 3; */ sessionId: string; + + /** + * The name of the manager↔peer DM channel auto-opened at spawn (R8). Set on + * both the fresh-spawn and resume paths; EMPTY when the post-spawn open + * failed (recoverable next turn via comms_open_dm — never a spawn rollback). + * + * @generated from field: string dm_channel_name = 4; + */ + dmChannelName: string; }; /** diff --git a/packages/compass-agent/src/gen/compass/v1/comms_pb.ts b/packages/compass-agent/src/gen/compass/v1/comms_pb.ts index 71fcb63d..94567dca 100644 --- a/packages/compass-agent/src/gen/compass/v1/comms_pb.ts +++ b/packages/compass-agent/src/gen/compass/v1/comms_pb.ts @@ -27,7 +27,7 @@ import type { Message as Message$1 } from "@bufbuild/protobuf"; * Describes the file compass/v1/comms.proto. */ export const file_compass_v1_comms: GenFile = /*@__PURE__*/ - fileDesc("ChZjb21wYXNzL3YxL2NvbW1zLnByb3RvEgpjb21wYXNzLnYxIsQBCgdBY2NvdW50EgoKAmlkGAEgASgJEg4KBmhhbmRsZRgCIAEoCRIUCgxkaXNwbGF5X25hbWUYAyABKAkSJwoEdXNlchgKIAEoCzIXLmNvbXBhc3MudjEuVXNlckFjY291bnRIABIpCgVhZ2VudBgLIAEoCzIYLmNvbXBhc3MudjEuQWdlbnRBY2NvdW50SAASKwoGc3lzdGVtGAwgASgLMhkuY29tcGFzcy52MS5TeXN0ZW1BY2NvdW50SABCBgoEa2luZCIPCg1TeXN0ZW1BY2NvdW50IjEKC1VzZXJBY2NvdW50EiIKBHJvbGUYASABKA4yFC5jb21wYXNzLnYxLlVzZXJSb2xlIlcKDEFnZW50QWNjb3VudBIVCg1vd25lcl91c2VyX2lkGAEgASgJEhcKD2hvbWVfY2hhbm5lbF9pZBgCIAEoCRIXCg9wYXJlbnRfYWdlbnRfaWQYAyABKAkikAEKDENoYW5uZWxHcm91cBIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEhcKD3BhcmVudF9ncm91cF9pZBgDIAEoCRIVCg1vd25lcl91c2VyX2lkGAQgASgJEjYKCnZpc2liaWxpdHkYBSABKA4yIi5jb21wYXNzLnYxLkNoYW5uZWxHcm91cFZpc2liaWxpdHkitwIKB0NoYW5uZWwSCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCRIQCghncm91cF9pZBgDIAEoCRIlCgRraW5kGAQgASgOMhcuY29tcGFzcy52MS5DaGFubmVsS2luZBIaChJtZW1iZXJfYWNjb3VudF9pZHMYBSADKAkSHgoWc3Vic2NyaWJlcl9hY2NvdW50X2lkcxgGIAMoCRIyCgtwb3N0X3BvbGljeRgHIAEoDjIdLmNvbXBhc3MudjEuQ2hhbm5lbFBvc3RQb2xpY3kSGAoQb3duZXJfYWNjb3VudF9pZBgIIAEoCRIeChZtYW5kYXRvcnlfc3Vic2NyaXB0aW9uGAkgASgIEi8KDnBpbm5lZF9lbnRyaWVzGAogAygLMhcuY29tcGFzcy52MS5QaW5uZWRFbnRyeSJsCgtQaW5uZWRFbnRyeRISCgptZXNzYWdlX2lkGAEgASgJEhAKCHBvc2l0aW9uGAIgASgFEhkKEXBpbm5lZF9hdF91bml4X21zGAMgASgDEhwKFHBpbm5lZF9ieV9hY2NvdW50X2lkGAQgASgJIjYKDkFnZW50V29ya3NwYWNlEgoKAmlkGAEgASgJEhgKEGFnZW50X2FjY291bnRfaWQYAiABKAkiggEKBVRvcGljEgoKAmlkGAEgASgJEhIKCmNoYW5uZWxfaWQYAiABKAkSDAoEbmFtZRgDIAEoCRIaChJjcmVhdGVkX2F0X3VuaXhfbXMYBCABKAMSHQoVY3JlYXRlZF9ieV9hY2NvdW50X2lkGAUgASgJEhAKCGFyY2hpdmVkGAYgASgIIoABCgdNZXNzYWdlEgoKAmlkGAEgASgJEhAKCHRvcGljX2lkGAIgASgJEhkKEWF1dGhvcl9hY2NvdW50X2lkGAMgASgJEhIKCmF0X3VuaXhfbXMYBCABKAMSKAoGYmxvY2tzGAUgAygLMhguY29tcGFzcy52MS5NZXNzYWdlQmxvY2sieQoMTWVzc2FnZUJsb2NrEg4KBHRleHQYASABKAlIABIeCgNhc2sYAiABKAsyDy5jb21wYXNzLnYxLkFza0gAEjAKCmFza19hbnN3ZXIYAyABKAsyGi5jb21wYXNzLnYxLkFza0Fuc3dlckJsb2NrSABCBwoFYmxvY2siSAoOQXNrQW5zd2VyQmxvY2sSHAoDYXNrGAEgASgLMg8uY29tcGFzcy52MS5Bc2sSGAoQYXNrZXJfYWNjb3VudF9pZBgCIAEoCSJTCgNBc2sSDgoGYXNrX2lkGAEgASgJEioKCXF1ZXN0aW9ucxgCIAMoCzIXLmNvbXBhc3MudjEuQXNrUXVlc3Rpb24SEAoIYW5zd2VyZWQYAyABKAgi8QEKC0Fza1F1ZXN0aW9uEhMKC3F1ZXN0aW9uX2lkGAEgASgJEhAKCHF1ZXN0aW9uGAIgASgJEg4KBmhlYWRlchgDIAEoCRImCgdvcHRpb25zGAQgAygLMhUuY29tcGFzcy52MS5Bc2tPcHRpb24SFgoOYWxsb3dfbXVsdGlwbGUYBSABKAgSGAoLcmVjb21tZW5kZWQYBiABKAVIAIgBARIZChFjaG9zZW5fb3B0aW9uX2lkcxgHIAMoCRITCgtjdXN0b21fdGV4dBgIIAEoCRIRCgl0aW1lZF9vdXQYCSABKAhCDgoMX3JlY29tbWVuZGVkIkwKCUFza09wdGlvbhIKCgJpZBgBIAEoCRINCgVsYWJlbBgCIAEoCRITCgtkZXNjcmlwdGlvbhgDIAEoCRIPCgdwcmV2aWV3GAQgASgJIokFChZTdWJzY3JpYmVDb21tc1Jlc3BvbnNlEgsKA3NlcRgBIAEoBBISCgphdF91bml4X21zGAIgASgDEhYKDmluc3RhbmNlX2Vwb2NoGAMgASgEEhQKDHNuYXBzaG90X3NlcRgEIAEoBBIzCg5tZXNzYWdlX3Bvc3RlZBgKIAEoCzIZLmNvbXBhc3MudjEuTWVzc2FnZVBvc3RlZEgAEjUKD21lc3NhZ2VfdXBkYXRlZBgLIAEoCzIaLmNvbXBhc3MudjEuTWVzc2FnZVVwZGF0ZWRIABI1Cg9jaGFubmVsX2NoYW5nZWQYDCABKAsyGi5jb21wYXNzLnYxLkNoYW5uZWxDaGFuZ2VkSAASQAoVY2hhbm5lbF9ncm91cF9jaGFuZ2VkGA0gASgLMh8uY29tcGFzcy52MS5DaGFubmVsR3JvdXBDaGFuZ2VkSAASNQoPYWNjb3VudF9jaGFuZ2VkGA4gASgLMhouY29tcGFzcy52MS5BY2NvdW50Q2hhbmdlZEgAEkQKF2FnZW50X3dvcmtzcGFjZV9jaGFuZ2VkGA8gASgLMiEuY29tcGFzcy52MS5BZ2VudFdvcmtzcGFjZUNoYW5nZWRIABI6Cg9yZXN5bmNfcmVxdWlyZWQYECABKAsyHy5jb21wYXNzLnYxLkNvbW1zUmVzeW5jUmVxdWlyZWRIABJCChZhZ2VudF9wcmVzZW5jZV9jaGFuZ2VkGBEgASgLMiAuY29tcGFzcy52MS5BZ2VudFByZXNlbmNlQ2hhbmdlZEgAEjMKDnRvcGljX3Vwc2VydGVkGBIgASgLMhkuY29tcGFzcy52MS5Ub3BpY1Vwc2VydGVkSABCCQoHcGF5bG9hZCI1Cg1NZXNzYWdlUG9zdGVkEiQKB21lc3NhZ2UYASABKAsyEy5jb21wYXNzLnYxLk1lc3NhZ2UiNgoOTWVzc2FnZVVwZGF0ZWQSJAoHbWVzc2FnZRgBIAEoCzITLmNvbXBhc3MudjEuTWVzc2FnZSIxCg1Ub3BpY1Vwc2VydGVkEiAKBXRvcGljGAEgASgLMhEuY29tcGFzcy52MS5Ub3BpYyJTCg5DaGFubmVsQ2hhbmdlZBIkCgdjaGFubmVsGAEgASgLMhMuY29tcGFzcy52MS5DaGFubmVsEhsKE3JlbW92ZWRfYWNjb3VudF9pZHMYAiADKAkiPgoTQ2hhbm5lbEdyb3VwQ2hhbmdlZBInCgVncm91cBgBIAEoCzIYLmNvbXBhc3MudjEuQ2hhbm5lbEdyb3VwIjYKDkFjY291bnRDaGFuZ2VkEiQKB2FjY291bnQYASABKAsyEy5jb21wYXNzLnYxLkFjY291bnQiRgoVQWdlbnRXb3Jrc3BhY2VDaGFuZ2VkEi0KCXdvcmtzcGFjZRgBIAEoCzIaLmNvbXBhc3MudjEuQWdlbnRXb3Jrc3BhY2UiFQoTQ29tbXNSZXN5bmNSZXF1aXJlZCJvChRBZ2VudFByZXNlbmNlQ2hhbmdlZBIYChBhZ2VudF9hY2NvdW50X2lkGAEgASgJEisKCHByZXNlbmNlGAIgASgOMhkuY29tcGFzcy52MS5BZ2VudFByZXNlbmNlEhAKCGFjdGl2aXR5GAMgASgJIjkKEUNyZWF0ZVVzZXJSZXF1ZXN0Eg4KBmhhbmRsZRgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkiOgoSQ3JlYXRlVXNlclJlc3BvbnNlEiQKB2FjY291bnQYASABKAsyEy5jb21wYXNzLnYxLkFjY291bnQiUQoSQ3JlYXRlQWdlbnRSZXF1ZXN0Eg4KBmhhbmRsZRgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSFQoNcGFyZW50X2hhbmRsZRgDIAEoCSI7ChNDcmVhdGVBZ2VudFJlc3BvbnNlEiQKB2FjY291bnQYASABKAsyEy5jb21wYXNzLnYxLkFjY291bnQiKwoTTGlzdEFjY291bnRzUmVxdWVzdBIUCgxzbmFwc2hvdF9zZXEYASABKAQiPQoUTGlzdEFjY291bnRzUmVzcG9uc2USJQoIYWNjb3VudHMYASADKAsyEy5jb21wYXNzLnYxLkFjY291bnQiegoZQ3JlYXRlQ2hhbm5lbEdyb3VwUmVxdWVzdBIMCgRuYW1lGAEgASgJEhcKD3BhcmVudF9ncm91cF9pZBgCIAEoCRI2Cgp2aXNpYmlsaXR5GAMgASgOMiIuY29tcGFzcy52MS5DaGFubmVsR3JvdXBWaXNpYmlsaXR5IkUKGkNyZWF0ZUNoYW5uZWxHcm91cFJlc3BvbnNlEicKBWdyb3VwGAEgASgLMhguY29tcGFzcy52MS5DaGFubmVsR3JvdXAiMAoYTGlzdENoYW5uZWxHcm91cHNSZXF1ZXN0EhQKDHNuYXBzaG90X3NlcRgBIAEoBCJFChlMaXN0Q2hhbm5lbEdyb3Vwc1Jlc3BvbnNlEigKBmdyb3VwcxgBIAMoCzIYLmNvbXBhc3MudjEuQ2hhbm5lbEdyb3VwIisKE0xpc3RDaGFubmVsc1JlcXVlc3QSFAoMc25hcHNob3Rfc2VxGAEgASgEIj0KFExpc3RDaGFubmVsc1Jlc3BvbnNlEiUKCGNoYW5uZWxzGAEgAygLMhMuY29tcGFzcy52MS5DaGFubmVsInUKFENyZWF0ZUNoYW5uZWxSZXF1ZXN0EgwKBG5hbWUYASABKAkSEAoIZ3JvdXBfaWQYAiABKAkSJQoEa2luZBgDIAEoDjIXLmNvbXBhc3MudjEuQ2hhbm5lbEtpbmQSFgoObWVtYmVyX2hhbmRsZXMYBCADKAkiPQoVQ3JlYXRlQ2hhbm5lbFJlc3BvbnNlEiQKB2NoYW5uZWwYASABKAsyEy5jb21wYXNzLnYxLkNoYW5uZWwipAEKG1VwZGF0ZUNoYW5uZWxNZW1iZXJzUmVxdWVzdBISCgpjaGFubmVsX2lkGAEgASgJEhoKEmFkZF9tZW1iZXJfaGFuZGxlcxgCIAMoCRIdChVyZW1vdmVfbWVtYmVyX2hhbmRsZXMYAyADKAkSGQoRc3Vic2NyaWJlX2hhbmRsZXMYBCADKAkSGwoTdW5zdWJzY3JpYmVfaGFuZGxlcxgFIAMoCSJEChxVcGRhdGVDaGFubmVsTWVtYmVyc1Jlc3BvbnNlEiQKB2NoYW5uZWwYASABKAsyEy5jb21wYXNzLnYxLkNoYW5uZWwiRwoUUmVwYXJlbnRBZ2VudFJlcXVlc3QSFAoMYWdlbnRfaGFuZGxlGAEgASgJEhkKEW5ld19wYXJlbnRfaGFuZGxlGAIgASgJIj0KFVJlcGFyZW50QWdlbnRSZXNwb25zZRIkCgdhY2NvdW50GAEgASgLMhMuY29tcGFzcy52MS5BY2NvdW50IpcBChdTZXRDaGFubmVsUG9saWN5UmVxdWVzdBISCgpjaGFubmVsX2lkGAEgASgJEjIKC3Bvc3RfcG9saWN5GAIgASgOMh0uY29tcGFzcy52MS5DaGFubmVsUG9zdFBvbGljeRIUCgxvd25lcl9oYW5kbGUYAyABKAkSHgoWbWFuZGF0b3J5X3N1YnNjcmlwdGlvbhgEIAEoCCJAChhTZXRDaGFubmVsUG9saWN5UmVzcG9uc2USJAoHY2hhbm5lbBgBIAEoCzITLmNvbXBhc3MudjEuQ2hhbm5lbCJSChBHZXRSb3N0ZXJSZXF1ZXN0EiYKBXNjb3BlGAEgASgOMhcuY29tcGFzcy52MS5Sb3N0ZXJTY29wZRIWCg52YW50YWdlX2hhbmRsZRgCIAEoCSI9ChFHZXRSb3N0ZXJSZXNwb25zZRIoCgdlbnRyaWVzGAEgAygLMhcuY29tcGFzcy52MS5Sb3N0ZXJFbnRyeSLCAQoLUm9zdGVyRW50cnkSGAoQYWdlbnRfYWNjb3VudF9pZBgBIAEoCRIOCgZoYW5kbGUYAiABKAkSFAoMZGlzcGxheV9uYW1lGAMgASgJEhcKD3BhcmVudF9hZ2VudF9pZBgEIAEoCRIrCghwcmVzZW5jZRgFIAEoDjIZLmNvbXBhc3MudjEuQWdlbnRQcmVzZW5jZRIQCghhY3Rpdml0eRgGIAEoCRIbChNhY3Rpdml0eV9hdF91bml4X21zGAcgASgDIncKGFVwZGF0ZVBpbm5lZEJvYXJkUmVxdWVzdBISCgpjaGFubmVsX2lkGAEgASgJEiUKA3BpbhgCIAEoCzIWLmNvbXBhc3MudjEuUGluTWVzc2FnZUgAEhoKEHVucGluX21lc3NhZ2VfaWQYAyABKAlIAEIECgJvcCI8CgpQaW5NZXNzYWdlEhIKCm1lc3NhZ2VfaWQYASABKAkSGgoScmVwbGFjZV9tZXNzYWdlX2lkGAIgASgJIkEKGVVwZGF0ZVBpbm5lZEJvYXJkUmVzcG9uc2USJAoHY2hhbm5lbBgBIAEoCzITLmNvbXBhc3MudjEuQ2hhbm5lbCIxChlPcGVuQWdlbnRXb3Jrc3BhY2VSZXF1ZXN0EhQKDGFnZW50X2hhbmRsZRgBIAEoCSJLChpPcGVuQWdlbnRXb3Jrc3BhY2VSZXNwb25zZRItCgl3b3Jrc3BhY2UYASABKAsyGi5jb21wYXNzLnYxLkFnZW50V29ya3NwYWNlIooBChNMaXN0TWVzc2FnZXNSZXF1ZXN0EhQKCmNoYW5uZWxfaWQYASABKAlIABINCgVsaW1pdBgCIAEoDRIZChFiZWZvcmVfbWVzc2FnZV9pZBgDIAEoCRIUCgxzbmFwc2hvdF9zZXEYBCABKAQSEAoIdG9waWNfaWQYBSABKAlCCwoJY29udGFpbmVyIj0KFExpc3RNZXNzYWdlc1Jlc3BvbnNlEiUKCG1lc3NhZ2VzGAEgAygLMhMuY29tcGFzcy52MS5NZXNzYWdlIsUBChJQb3N0TWVzc2FnZVJlcXVlc3QSFAoKY2hhbm5lbF9pZBgBIAEoCUgAEigKBmJsb2NrcxgCIAMoCzIYLmNvbXBhc3MudjEuTWVzc2FnZUJsb2NrEhIKCHRvcGljX2lkGAMgASgJSAESFAoKdG9waWNfbmFtZRgEIAEoCUgBEhkKEWNsaWVudF9yZXF1ZXN0X2lkGAUgASgJEhQKDGNyZWF0ZV90b3BpYxgGIAEoCEILCgljb250YWluZXJCBwoFdG9waWMiOwoTUG9zdE1lc3NhZ2VSZXNwb25zZRIkCgdtZXNzYWdlGAEgASgLMhMuY29tcGFzcy52MS5NZXNzYWdlIkEKEUxpc3RUb3BpY3NSZXF1ZXN0EhIKCmNoYW5uZWxfaWQYASABKAkSGAoQaW5jbHVkZV9hcmNoaXZlZBgCIAEoCCI3ChJMaXN0VG9waWNzUmVzcG9uc2USIQoGdG9waWNzGAEgAygLMhEuY29tcGFzcy52MS5Ub3BpYyJmChJVcGRhdGVUb3BpY1JlcXVlc3QSEAoIdG9waWNfaWQYASABKAkSEQoEbmFtZRgCIAEoCUgAiAEBEhUKCGFyY2hpdmVkGAMgASgISAGIAQFCBwoFX25hbWVCCwoJX2FyY2hpdmVkIjcKE1VwZGF0ZVRvcGljUmVzcG9uc2USIAoFdG9waWMYASABKAsyES5jb21wYXNzLnYxLlRvcGljIlUKE1Jlc3BvbmRUb0Fza1JlcXVlc3QSDgoGYXNrX2lkGAEgASgJEi4KB2Fuc3dlcnMYAiADKAsyHS5jb21wYXNzLnYxLkFza1F1ZXN0aW9uQW5zd2VyIlgKEUFza1F1ZXN0aW9uQW5zd2VyEhMKC3F1ZXN0aW9uX2lkGAEgASgJEhkKEWNob3Nlbl9vcHRpb25faWRzGAIgAygJEhMKC2N1c3RvbV90ZXh0GAMgASgJIhYKFFJlc3BvbmRUb0Fza1Jlc3BvbnNlImoKFVNlYXJjaE1lc3NhZ2VzUmVxdWVzdBINCgVxdWVyeRgBIAEoCRIUCgpjaGFubmVsX2lkGAIgASgJSAASDQoFbGltaXQYAyABKA0SFAoMc25hcHNob3Rfc2VxGAQgASgEQgcKBXNjb3BlIj8KFlNlYXJjaE1lc3NhZ2VzUmVzcG9uc2USJQoIbWVzc2FnZXMYASADKAsyEy5jb21wYXNzLnYxLk1lc3NhZ2UiQgoVU3Vic2NyaWJlQ29tbXNSZXF1ZXN0EhEKCXNpbmNlX3NlcRgBIAEoBBIWCg5pbnN0YW5jZV9lcG9jaBgCIAEoBCo1CghVc2VyUm9sZRIUChBVU0VSX1JPTEVfTUVNQkVSEAASEwoPVVNFUl9ST0xFX0FETUlOEAEqYQoWQ2hhbm5lbEdyb3VwVmlzaWJpbGl0eRIiCh5DSEFOTkVMX0dST1VQX1ZJU0lCSUxJVFlfT1dORVIQABIjCh9DSEFOTkVMX0dST1VQX1ZJU0lCSUxJVFlfU0hBUkVEEAEqVQoRQ2hhbm5lbFBvc3RQb2xpY3kSHAoYQ0hBTk5FTF9QT1NUX1BPTElDWV9PUEVOEAASIgoeQ0hBTk5FTF9QT1NUX1BPTElDWV9PV05FUl9PTkxZEAEqVwoLQ2hhbm5lbEtpbmQSGAoUQ0hBTk5FTF9LSU5EX0NIQU5ORUwQABITCg9DSEFOTkVMX0tJTkRfRE0QARIZChVDSEFOTkVMX0tJTkRfR1JPVVBfRE0QAiqcAQoNQWdlbnRQcmVzZW5jZRIeChpBR0VOVF9QUkVTRU5DRV9VTlNQRUNJRklFRBAAEhcKE0FHRU5UX1BSRVNFTkNFX0lETEUQARIaChZBR0VOVF9QUkVTRU5DRV9XT1JLSU5HEAISGgoWQUdFTlRfUFJFU0VOQ0VfV0FJVElORxADEhoKFkFHRU5UX1BSRVNFTkNFX09GRkxJTkUQBCpeCgtSb3N0ZXJTY29wZRIdChlST1NURVJfU0NPUEVfTkVJR0hCT1JIT09EEAASGAoUUk9TVEVSX1NDT1BFX1NVQlRSRUUQARIWChJST1NURVJfU0NPUEVfT1dORVIQAjLmDQoMQ29tbXNTZXJ2aWNlEksKCkNyZWF0ZVVzZXISHS5jb21wYXNzLnYxLkNyZWF0ZVVzZXJSZXF1ZXN0Gh4uY29tcGFzcy52MS5DcmVhdGVVc2VyUmVzcG9uc2USTgoLQ3JlYXRlQWdlbnQSHi5jb21wYXNzLnYxLkNyZWF0ZUFnZW50UmVxdWVzdBofLmNvbXBhc3MudjEuQ3JlYXRlQWdlbnRSZXNwb25zZRJRCgxMaXN0QWNjb3VudHMSHy5jb21wYXNzLnYxLkxpc3RBY2NvdW50c1JlcXVlc3QaIC5jb21wYXNzLnYxLkxpc3RBY2NvdW50c1Jlc3BvbnNlEmMKEkNyZWF0ZUNoYW5uZWxHcm91cBIlLmNvbXBhc3MudjEuQ3JlYXRlQ2hhbm5lbEdyb3VwUmVxdWVzdBomLmNvbXBhc3MudjEuQ3JlYXRlQ2hhbm5lbEdyb3VwUmVzcG9uc2USYAoRTGlzdENoYW5uZWxHcm91cHMSJC5jb21wYXNzLnYxLkxpc3RDaGFubmVsR3JvdXBzUmVxdWVzdBolLmNvbXBhc3MudjEuTGlzdENoYW5uZWxHcm91cHNSZXNwb25zZRJRCgxMaXN0Q2hhbm5lbHMSHy5jb21wYXNzLnYxLkxpc3RDaGFubmVsc1JlcXVlc3QaIC5jb21wYXNzLnYxLkxpc3RDaGFubmVsc1Jlc3BvbnNlElQKDUNyZWF0ZUNoYW5uZWwSIC5jb21wYXNzLnYxLkNyZWF0ZUNoYW5uZWxSZXF1ZXN0GiEuY29tcGFzcy52MS5DcmVhdGVDaGFubmVsUmVzcG9uc2USaQoUVXBkYXRlQ2hhbm5lbE1lbWJlcnMSJy5jb21wYXNzLnYxLlVwZGF0ZUNoYW5uZWxNZW1iZXJzUmVxdWVzdBooLmNvbXBhc3MudjEuVXBkYXRlQ2hhbm5lbE1lbWJlcnNSZXNwb25zZRJUCg1SZXBhcmVudEFnZW50EiAuY29tcGFzcy52MS5SZXBhcmVudEFnZW50UmVxdWVzdBohLmNvbXBhc3MudjEuUmVwYXJlbnRBZ2VudFJlc3BvbnNlEmMKEk9wZW5BZ2VudFdvcmtzcGFjZRIlLmNvbXBhc3MudjEuT3BlbkFnZW50V29ya3NwYWNlUmVxdWVzdBomLmNvbXBhc3MudjEuT3BlbkFnZW50V29ya3NwYWNlUmVzcG9uc2USUQoMTGlzdE1lc3NhZ2VzEh8uY29tcGFzcy52MS5MaXN0TWVzc2FnZXNSZXF1ZXN0GiAuY29tcGFzcy52MS5MaXN0TWVzc2FnZXNSZXNwb25zZRJOCgtQb3N0TWVzc2FnZRIeLmNvbXBhc3MudjEuUG9zdE1lc3NhZ2VSZXF1ZXN0Gh8uY29tcGFzcy52MS5Qb3N0TWVzc2FnZVJlc3BvbnNlEksKCkxpc3RUb3BpY3MSHS5jb21wYXNzLnYxLkxpc3RUb3BpY3NSZXF1ZXN0Gh4uY29tcGFzcy52MS5MaXN0VG9waWNzUmVzcG9uc2USTgoLVXBkYXRlVG9waWMSHi5jb21wYXNzLnYxLlVwZGF0ZVRvcGljUmVxdWVzdBofLmNvbXBhc3MudjEuVXBkYXRlVG9waWNSZXNwb25zZRJRCgxSZXNwb25kVG9Bc2sSHy5jb21wYXNzLnYxLlJlc3BvbmRUb0Fza1JlcXVlc3QaIC5jb21wYXNzLnYxLlJlc3BvbmRUb0Fza1Jlc3BvbnNlElcKDlNlYXJjaE1lc3NhZ2VzEiEuY29tcGFzcy52MS5TZWFyY2hNZXNzYWdlc1JlcXVlc3QaIi5jb21wYXNzLnYxLlNlYXJjaE1lc3NhZ2VzUmVzcG9uc2USXQoQU2V0Q2hhbm5lbFBvbGljeRIjLmNvbXBhc3MudjEuU2V0Q2hhbm5lbFBvbGljeVJlcXVlc3QaJC5jb21wYXNzLnYxLlNldENoYW5uZWxQb2xpY3lSZXNwb25zZRJICglHZXRSb3N0ZXISHC5jb21wYXNzLnYxLkdldFJvc3RlclJlcXVlc3QaHS5jb21wYXNzLnYxLkdldFJvc3RlclJlc3BvbnNlEmAKEVVwZGF0ZVBpbm5lZEJvYXJkEiQuY29tcGFzcy52MS5VcGRhdGVQaW5uZWRCb2FyZFJlcXVlc3QaJS5jb21wYXNzLnYxLlVwZGF0ZVBpbm5lZEJvYXJkUmVzcG9uc2USWQoOU3Vic2NyaWJlQ29tbXMSIS5jb21wYXNzLnYxLlN1YnNjcmliZUNvbW1zUmVxdWVzdBoiLmNvbXBhc3MudjEuU3Vic2NyaWJlQ29tbXNSZXNwb25zZTABYgZwcm90bzM"); + fileDesc("ChZjb21wYXNzL3YxL2NvbW1zLnByb3RvEgpjb21wYXNzLnYxIsQBCgdBY2NvdW50EgoKAmlkGAEgASgJEg4KBmhhbmRsZRgCIAEoCRIUCgxkaXNwbGF5X25hbWUYAyABKAkSJwoEdXNlchgKIAEoCzIXLmNvbXBhc3MudjEuVXNlckFjY291bnRIABIpCgVhZ2VudBgLIAEoCzIYLmNvbXBhc3MudjEuQWdlbnRBY2NvdW50SAASKwoGc3lzdGVtGAwgASgLMhkuY29tcGFzcy52MS5TeXN0ZW1BY2NvdW50SABCBgoEa2luZCIPCg1TeXN0ZW1BY2NvdW50IjEKC1VzZXJBY2NvdW50EiIKBHJvbGUYASABKA4yFC5jb21wYXNzLnYxLlVzZXJSb2xlIlcKDEFnZW50QWNjb3VudBIVCg1vd25lcl91c2VyX2lkGAEgASgJEhcKD2hvbWVfY2hhbm5lbF9pZBgCIAEoCRIXCg9wYXJlbnRfYWdlbnRfaWQYAyABKAkikAEKDENoYW5uZWxHcm91cBIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEhcKD3BhcmVudF9ncm91cF9pZBgDIAEoCRIVCg1vd25lcl91c2VyX2lkGAQgASgJEjYKCnZpc2liaWxpdHkYBSABKA4yIi5jb21wYXNzLnYxLkNoYW5uZWxHcm91cFZpc2liaWxpdHkitwIKB0NoYW5uZWwSCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCRIQCghncm91cF9pZBgDIAEoCRIlCgRraW5kGAQgASgOMhcuY29tcGFzcy52MS5DaGFubmVsS2luZBIaChJtZW1iZXJfYWNjb3VudF9pZHMYBSADKAkSHgoWc3Vic2NyaWJlcl9hY2NvdW50X2lkcxgGIAMoCRIyCgtwb3N0X3BvbGljeRgHIAEoDjIdLmNvbXBhc3MudjEuQ2hhbm5lbFBvc3RQb2xpY3kSGAoQb3duZXJfYWNjb3VudF9pZBgIIAEoCRIeChZtYW5kYXRvcnlfc3Vic2NyaXB0aW9uGAkgASgIEi8KDnBpbm5lZF9lbnRyaWVzGAogAygLMhcuY29tcGFzcy52MS5QaW5uZWRFbnRyeSJsCgtQaW5uZWRFbnRyeRISCgptZXNzYWdlX2lkGAEgASgJEhAKCHBvc2l0aW9uGAIgASgFEhkKEXBpbm5lZF9hdF91bml4X21zGAMgASgDEhwKFHBpbm5lZF9ieV9hY2NvdW50X2lkGAQgASgJIjYKDkFnZW50V29ya3NwYWNlEgoKAmlkGAEgASgJEhgKEGFnZW50X2FjY291bnRfaWQYAiABKAkiggEKBVRvcGljEgoKAmlkGAEgASgJEhIKCmNoYW5uZWxfaWQYAiABKAkSDAoEbmFtZRgDIAEoCRIaChJjcmVhdGVkX2F0X3VuaXhfbXMYBCABKAMSHQoVY3JlYXRlZF9ieV9hY2NvdW50X2lkGAUgASgJEhAKCGFyY2hpdmVkGAYgASgIIoABCgdNZXNzYWdlEgoKAmlkGAEgASgJEhAKCHRvcGljX2lkGAIgASgJEhkKEWF1dGhvcl9hY2NvdW50X2lkGAMgASgJEhIKCmF0X3VuaXhfbXMYBCABKAMSKAoGYmxvY2tzGAUgAygLMhguY29tcGFzcy52MS5NZXNzYWdlQmxvY2sieQoMTWVzc2FnZUJsb2NrEg4KBHRleHQYASABKAlIABIeCgNhc2sYAiABKAsyDy5jb21wYXNzLnYxLkFza0gAEjAKCmFza19hbnN3ZXIYAyABKAsyGi5jb21wYXNzLnYxLkFza0Fuc3dlckJsb2NrSABCBwoFYmxvY2siSAoOQXNrQW5zd2VyQmxvY2sSHAoDYXNrGAEgASgLMg8uY29tcGFzcy52MS5Bc2sSGAoQYXNrZXJfYWNjb3VudF9pZBgCIAEoCSJTCgNBc2sSDgoGYXNrX2lkGAEgASgJEioKCXF1ZXN0aW9ucxgCIAMoCzIXLmNvbXBhc3MudjEuQXNrUXVlc3Rpb24SEAoIYW5zd2VyZWQYAyABKAgi8QEKC0Fza1F1ZXN0aW9uEhMKC3F1ZXN0aW9uX2lkGAEgASgJEhAKCHF1ZXN0aW9uGAIgASgJEg4KBmhlYWRlchgDIAEoCRImCgdvcHRpb25zGAQgAygLMhUuY29tcGFzcy52MS5Bc2tPcHRpb24SFgoOYWxsb3dfbXVsdGlwbGUYBSABKAgSGAoLcmVjb21tZW5kZWQYBiABKAVIAIgBARIZChFjaG9zZW5fb3B0aW9uX2lkcxgHIAMoCRITCgtjdXN0b21fdGV4dBgIIAEoCRIRCgl0aW1lZF9vdXQYCSABKAhCDgoMX3JlY29tbWVuZGVkIkwKCUFza09wdGlvbhIKCgJpZBgBIAEoCRINCgVsYWJlbBgCIAEoCRITCgtkZXNjcmlwdGlvbhgDIAEoCRIPCgdwcmV2aWV3GAQgASgJIokFChZTdWJzY3JpYmVDb21tc1Jlc3BvbnNlEgsKA3NlcRgBIAEoBBISCgphdF91bml4X21zGAIgASgDEhYKDmluc3RhbmNlX2Vwb2NoGAMgASgEEhQKDHNuYXBzaG90X3NlcRgEIAEoBBIzCg5tZXNzYWdlX3Bvc3RlZBgKIAEoCzIZLmNvbXBhc3MudjEuTWVzc2FnZVBvc3RlZEgAEjUKD21lc3NhZ2VfdXBkYXRlZBgLIAEoCzIaLmNvbXBhc3MudjEuTWVzc2FnZVVwZGF0ZWRIABI1Cg9jaGFubmVsX2NoYW5nZWQYDCABKAsyGi5jb21wYXNzLnYxLkNoYW5uZWxDaGFuZ2VkSAASQAoVY2hhbm5lbF9ncm91cF9jaGFuZ2VkGA0gASgLMh8uY29tcGFzcy52MS5DaGFubmVsR3JvdXBDaGFuZ2VkSAASNQoPYWNjb3VudF9jaGFuZ2VkGA4gASgLMhouY29tcGFzcy52MS5BY2NvdW50Q2hhbmdlZEgAEkQKF2FnZW50X3dvcmtzcGFjZV9jaGFuZ2VkGA8gASgLMiEuY29tcGFzcy52MS5BZ2VudFdvcmtzcGFjZUNoYW5nZWRIABI6Cg9yZXN5bmNfcmVxdWlyZWQYECABKAsyHy5jb21wYXNzLnYxLkNvbW1zUmVzeW5jUmVxdWlyZWRIABJCChZhZ2VudF9wcmVzZW5jZV9jaGFuZ2VkGBEgASgLMiAuY29tcGFzcy52MS5BZ2VudFByZXNlbmNlQ2hhbmdlZEgAEjMKDnRvcGljX3Vwc2VydGVkGBIgASgLMhkuY29tcGFzcy52MS5Ub3BpY1Vwc2VydGVkSABCCQoHcGF5bG9hZCI1Cg1NZXNzYWdlUG9zdGVkEiQKB21lc3NhZ2UYASABKAsyEy5jb21wYXNzLnYxLk1lc3NhZ2UiNgoOTWVzc2FnZVVwZGF0ZWQSJAoHbWVzc2FnZRgBIAEoCzITLmNvbXBhc3MudjEuTWVzc2FnZSIxCg1Ub3BpY1Vwc2VydGVkEiAKBXRvcGljGAEgASgLMhEuY29tcGFzcy52MS5Ub3BpYyJTCg5DaGFubmVsQ2hhbmdlZBIkCgdjaGFubmVsGAEgASgLMhMuY29tcGFzcy52MS5DaGFubmVsEhsKE3JlbW92ZWRfYWNjb3VudF9pZHMYAiADKAkiPgoTQ2hhbm5lbEdyb3VwQ2hhbmdlZBInCgVncm91cBgBIAEoCzIYLmNvbXBhc3MudjEuQ2hhbm5lbEdyb3VwIjYKDkFjY291bnRDaGFuZ2VkEiQKB2FjY291bnQYASABKAsyEy5jb21wYXNzLnYxLkFjY291bnQiRgoVQWdlbnRXb3Jrc3BhY2VDaGFuZ2VkEi0KCXdvcmtzcGFjZRgBIAEoCzIaLmNvbXBhc3MudjEuQWdlbnRXb3Jrc3BhY2UiFQoTQ29tbXNSZXN5bmNSZXF1aXJlZCJvChRBZ2VudFByZXNlbmNlQ2hhbmdlZBIYChBhZ2VudF9hY2NvdW50X2lkGAEgASgJEisKCHByZXNlbmNlGAIgASgOMhkuY29tcGFzcy52MS5BZ2VudFByZXNlbmNlEhAKCGFjdGl2aXR5GAMgASgJIjkKEUNyZWF0ZVVzZXJSZXF1ZXN0Eg4KBmhhbmRsZRgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkiOgoSQ3JlYXRlVXNlclJlc3BvbnNlEiQKB2FjY291bnQYASABKAsyEy5jb21wYXNzLnYxLkFjY291bnQiUQoSQ3JlYXRlQWdlbnRSZXF1ZXN0Eg4KBmhhbmRsZRgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSFQoNcGFyZW50X2hhbmRsZRgDIAEoCSI7ChNDcmVhdGVBZ2VudFJlc3BvbnNlEiQKB2FjY291bnQYASABKAsyEy5jb21wYXNzLnYxLkFjY291bnQiKwoTTGlzdEFjY291bnRzUmVxdWVzdBIUCgxzbmFwc2hvdF9zZXEYASABKAQiPQoUTGlzdEFjY291bnRzUmVzcG9uc2USJQoIYWNjb3VudHMYASADKAsyEy5jb21wYXNzLnYxLkFjY291bnQiegoZQ3JlYXRlQ2hhbm5lbEdyb3VwUmVxdWVzdBIMCgRuYW1lGAEgASgJEhcKD3BhcmVudF9ncm91cF9pZBgCIAEoCRI2Cgp2aXNpYmlsaXR5GAMgASgOMiIuY29tcGFzcy52MS5DaGFubmVsR3JvdXBWaXNpYmlsaXR5IkUKGkNyZWF0ZUNoYW5uZWxHcm91cFJlc3BvbnNlEicKBWdyb3VwGAEgASgLMhguY29tcGFzcy52MS5DaGFubmVsR3JvdXAiMAoYTGlzdENoYW5uZWxHcm91cHNSZXF1ZXN0EhQKDHNuYXBzaG90X3NlcRgBIAEoBCJFChlMaXN0Q2hhbm5lbEdyb3Vwc1Jlc3BvbnNlEigKBmdyb3VwcxgBIAMoCzIYLmNvbXBhc3MudjEuQ2hhbm5lbEdyb3VwIisKE0xpc3RDaGFubmVsc1JlcXVlc3QSFAoMc25hcHNob3Rfc2VxGAEgASgEIj0KFExpc3RDaGFubmVsc1Jlc3BvbnNlEiUKCGNoYW5uZWxzGAEgAygLMhMuY29tcGFzcy52MS5DaGFubmVsInUKFENyZWF0ZUNoYW5uZWxSZXF1ZXN0EgwKBG5hbWUYASABKAkSEAoIZ3JvdXBfaWQYAiABKAkSJQoEa2luZBgDIAEoDjIXLmNvbXBhc3MudjEuQ2hhbm5lbEtpbmQSFgoObWVtYmVyX2hhbmRsZXMYBCADKAkiPQoVQ3JlYXRlQ2hhbm5lbFJlc3BvbnNlEiQKB2NoYW5uZWwYASABKAsyEy5jb21wYXNzLnYxLkNoYW5uZWwiwgEKG1VwZGF0ZUNoYW5uZWxNZW1iZXJzUmVxdWVzdBISCgpjaGFubmVsX2lkGAEgASgJEhoKEmFkZF9tZW1iZXJfaGFuZGxlcxgCIAMoCRIdChVyZW1vdmVfbWVtYmVyX2hhbmRsZXMYAyADKAkSGQoRc3Vic2NyaWJlX2hhbmRsZXMYBCADKAkSGwoTdW5zdWJzY3JpYmVfaGFuZGxlcxgFIAMoCRIcChRjb252ZXJ0X2NoYW5uZWxfbmFtZRgGIAEoCSJEChxVcGRhdGVDaGFubmVsTWVtYmVyc1Jlc3BvbnNlEiQKB2NoYW5uZWwYASABKAsyEy5jb21wYXNzLnYxLkNoYW5uZWwiJAoNT3BlbkRNUmVxdWVzdBITCgtwZWVyX2hhbmRsZRgBIAEoCSJHCg5PcGVuRE1SZXNwb25zZRIkCgdjaGFubmVsGAEgASgLMhMuY29tcGFzcy52MS5DaGFubmVsEg8KB2NyZWF0ZWQYAiABKAgiRwoUUmVwYXJlbnRBZ2VudFJlcXVlc3QSFAoMYWdlbnRfaGFuZGxlGAEgASgJEhkKEW5ld19wYXJlbnRfaGFuZGxlGAIgASgJIj0KFVJlcGFyZW50QWdlbnRSZXNwb25zZRIkCgdhY2NvdW50GAEgASgLMhMuY29tcGFzcy52MS5BY2NvdW50IpcBChdTZXRDaGFubmVsUG9saWN5UmVxdWVzdBISCgpjaGFubmVsX2lkGAEgASgJEjIKC3Bvc3RfcG9saWN5GAIgASgOMh0uY29tcGFzcy52MS5DaGFubmVsUG9zdFBvbGljeRIUCgxvd25lcl9oYW5kbGUYAyABKAkSHgoWbWFuZGF0b3J5X3N1YnNjcmlwdGlvbhgEIAEoCCJAChhTZXRDaGFubmVsUG9saWN5UmVzcG9uc2USJAoHY2hhbm5lbBgBIAEoCzITLmNvbXBhc3MudjEuQ2hhbm5lbCJSChBHZXRSb3N0ZXJSZXF1ZXN0EiYKBXNjb3BlGAEgASgOMhcuY29tcGFzcy52MS5Sb3N0ZXJTY29wZRIWCg52YW50YWdlX2hhbmRsZRgCIAEoCSI9ChFHZXRSb3N0ZXJSZXNwb25zZRIoCgdlbnRyaWVzGAEgAygLMhcuY29tcGFzcy52MS5Sb3N0ZXJFbnRyeSLCAQoLUm9zdGVyRW50cnkSGAoQYWdlbnRfYWNjb3VudF9pZBgBIAEoCRIOCgZoYW5kbGUYAiABKAkSFAoMZGlzcGxheV9uYW1lGAMgASgJEhcKD3BhcmVudF9hZ2VudF9pZBgEIAEoCRIrCghwcmVzZW5jZRgFIAEoDjIZLmNvbXBhc3MudjEuQWdlbnRQcmVzZW5jZRIQCghhY3Rpdml0eRgGIAEoCRIbChNhY3Rpdml0eV9hdF91bml4X21zGAcgASgDIncKGFVwZGF0ZVBpbm5lZEJvYXJkUmVxdWVzdBISCgpjaGFubmVsX2lkGAEgASgJEiUKA3BpbhgCIAEoCzIWLmNvbXBhc3MudjEuUGluTWVzc2FnZUgAEhoKEHVucGluX21lc3NhZ2VfaWQYAyABKAlIAEIECgJvcCI8CgpQaW5NZXNzYWdlEhIKCm1lc3NhZ2VfaWQYASABKAkSGgoScmVwbGFjZV9tZXNzYWdlX2lkGAIgASgJIkEKGVVwZGF0ZVBpbm5lZEJvYXJkUmVzcG9uc2USJAoHY2hhbm5lbBgBIAEoCzITLmNvbXBhc3MudjEuQ2hhbm5lbCIxChlPcGVuQWdlbnRXb3Jrc3BhY2VSZXF1ZXN0EhQKDGFnZW50X2hhbmRsZRgBIAEoCSJLChpPcGVuQWdlbnRXb3Jrc3BhY2VSZXNwb25zZRItCgl3b3Jrc3BhY2UYASABKAsyGi5jb21wYXNzLnYxLkFnZW50V29ya3NwYWNlIooBChNMaXN0TWVzc2FnZXNSZXF1ZXN0EhQKCmNoYW5uZWxfaWQYASABKAlIABINCgVsaW1pdBgCIAEoDRIZChFiZWZvcmVfbWVzc2FnZV9pZBgDIAEoCRIUCgxzbmFwc2hvdF9zZXEYBCABKAQSEAoIdG9waWNfaWQYBSABKAlCCwoJY29udGFpbmVyIj0KFExpc3RNZXNzYWdlc1Jlc3BvbnNlEiUKCG1lc3NhZ2VzGAEgAygLMhMuY29tcGFzcy52MS5NZXNzYWdlIsUBChJQb3N0TWVzc2FnZVJlcXVlc3QSFAoKY2hhbm5lbF9pZBgBIAEoCUgAEigKBmJsb2NrcxgCIAMoCzIYLmNvbXBhc3MudjEuTWVzc2FnZUJsb2NrEhIKCHRvcGljX2lkGAMgASgJSAESFAoKdG9waWNfbmFtZRgEIAEoCUgBEhkKEWNsaWVudF9yZXF1ZXN0X2lkGAUgASgJEhQKDGNyZWF0ZV90b3BpYxgGIAEoCEILCgljb250YWluZXJCBwoFdG9waWMiOwoTUG9zdE1lc3NhZ2VSZXNwb25zZRIkCgdtZXNzYWdlGAEgASgLMhMuY29tcGFzcy52MS5NZXNzYWdlIkEKEUxpc3RUb3BpY3NSZXF1ZXN0EhIKCmNoYW5uZWxfaWQYASABKAkSGAoQaW5jbHVkZV9hcmNoaXZlZBgCIAEoCCI3ChJMaXN0VG9waWNzUmVzcG9uc2USIQoGdG9waWNzGAEgAygLMhEuY29tcGFzcy52MS5Ub3BpYyJmChJVcGRhdGVUb3BpY1JlcXVlc3QSEAoIdG9waWNfaWQYASABKAkSEQoEbmFtZRgCIAEoCUgAiAEBEhUKCGFyY2hpdmVkGAMgASgISAGIAQFCBwoFX25hbWVCCwoJX2FyY2hpdmVkIjcKE1VwZGF0ZVRvcGljUmVzcG9uc2USIAoFdG9waWMYASABKAsyES5jb21wYXNzLnYxLlRvcGljIlUKE1Jlc3BvbmRUb0Fza1JlcXVlc3QSDgoGYXNrX2lkGAEgASgJEi4KB2Fuc3dlcnMYAiADKAsyHS5jb21wYXNzLnYxLkFza1F1ZXN0aW9uQW5zd2VyIlgKEUFza1F1ZXN0aW9uQW5zd2VyEhMKC3F1ZXN0aW9uX2lkGAEgASgJEhkKEWNob3Nlbl9vcHRpb25faWRzGAIgAygJEhMKC2N1c3RvbV90ZXh0GAMgASgJIhYKFFJlc3BvbmRUb0Fza1Jlc3BvbnNlImoKFVNlYXJjaE1lc3NhZ2VzUmVxdWVzdBINCgVxdWVyeRgBIAEoCRIUCgpjaGFubmVsX2lkGAIgASgJSAASDQoFbGltaXQYAyABKA0SFAoMc25hcHNob3Rfc2VxGAQgASgEQgcKBXNjb3BlIj8KFlNlYXJjaE1lc3NhZ2VzUmVzcG9uc2USJQoIbWVzc2FnZXMYASADKAsyEy5jb21wYXNzLnYxLk1lc3NhZ2UiQgoVU3Vic2NyaWJlQ29tbXNSZXF1ZXN0EhEKCXNpbmNlX3NlcRgBIAEoBBIWCg5pbnN0YW5jZV9lcG9jaBgCIAEoBCo1CghVc2VyUm9sZRIUChBVU0VSX1JPTEVfTUVNQkVSEAASEwoPVVNFUl9ST0xFX0FETUlOEAEqYQoWQ2hhbm5lbEdyb3VwVmlzaWJpbGl0eRIiCh5DSEFOTkVMX0dST1VQX1ZJU0lCSUxJVFlfT1dORVIQABIjCh9DSEFOTkVMX0dST1VQX1ZJU0lCSUxJVFlfU0hBUkVEEAEqVQoRQ2hhbm5lbFBvc3RQb2xpY3kSHAoYQ0hBTk5FTF9QT1NUX1BPTElDWV9PUEVOEAASIgoeQ0hBTk5FTF9QT1NUX1BPTElDWV9PV05FUl9PTkxZEAEqWwoLQ2hhbm5lbEtpbmQSGAoUQ0hBTk5FTF9LSU5EX0NIQU5ORUwQABITCg9DSEFOTkVMX0tJTkRfRE0QARIdChVDSEFOTkVMX0tJTkRfR1JPVVBfRE0QAhoCCAEqnAEKDUFnZW50UHJlc2VuY2USHgoaQUdFTlRfUFJFU0VOQ0VfVU5TUEVDSUZJRUQQABIXChNBR0VOVF9QUkVTRU5DRV9JRExFEAESGgoWQUdFTlRfUFJFU0VOQ0VfV09SS0lORxACEhoKFkFHRU5UX1BSRVNFTkNFX1dBSVRJTkcQAxIaChZBR0VOVF9QUkVTRU5DRV9PRkZMSU5FEAQqXgoLUm9zdGVyU2NvcGUSHQoZUk9TVEVSX1NDT1BFX05FSUdIQk9SSE9PRBAAEhgKFFJPU1RFUl9TQ09QRV9TVUJUUkVFEAESFgoSUk9TVEVSX1NDT1BFX09XTkVSEAIypw4KDENvbW1zU2VydmljZRJLCgpDcmVhdGVVc2VyEh0uY29tcGFzcy52MS5DcmVhdGVVc2VyUmVxdWVzdBoeLmNvbXBhc3MudjEuQ3JlYXRlVXNlclJlc3BvbnNlEk4KC0NyZWF0ZUFnZW50Eh4uY29tcGFzcy52MS5DcmVhdGVBZ2VudFJlcXVlc3QaHy5jb21wYXNzLnYxLkNyZWF0ZUFnZW50UmVzcG9uc2USUQoMTGlzdEFjY291bnRzEh8uY29tcGFzcy52MS5MaXN0QWNjb3VudHNSZXF1ZXN0GiAuY29tcGFzcy52MS5MaXN0QWNjb3VudHNSZXNwb25zZRJjChJDcmVhdGVDaGFubmVsR3JvdXASJS5jb21wYXNzLnYxLkNyZWF0ZUNoYW5uZWxHcm91cFJlcXVlc3QaJi5jb21wYXNzLnYxLkNyZWF0ZUNoYW5uZWxHcm91cFJlc3BvbnNlEmAKEUxpc3RDaGFubmVsR3JvdXBzEiQuY29tcGFzcy52MS5MaXN0Q2hhbm5lbEdyb3Vwc1JlcXVlc3QaJS5jb21wYXNzLnYxLkxpc3RDaGFubmVsR3JvdXBzUmVzcG9uc2USUQoMTGlzdENoYW5uZWxzEh8uY29tcGFzcy52MS5MaXN0Q2hhbm5lbHNSZXF1ZXN0GiAuY29tcGFzcy52MS5MaXN0Q2hhbm5lbHNSZXNwb25zZRJUCg1DcmVhdGVDaGFubmVsEiAuY29tcGFzcy52MS5DcmVhdGVDaGFubmVsUmVxdWVzdBohLmNvbXBhc3MudjEuQ3JlYXRlQ2hhbm5lbFJlc3BvbnNlEmkKFFVwZGF0ZUNoYW5uZWxNZW1iZXJzEicuY29tcGFzcy52MS5VcGRhdGVDaGFubmVsTWVtYmVyc1JlcXVlc3QaKC5jb21wYXNzLnYxLlVwZGF0ZUNoYW5uZWxNZW1iZXJzUmVzcG9uc2USPwoGT3BlbkRNEhkuY29tcGFzcy52MS5PcGVuRE1SZXF1ZXN0GhouY29tcGFzcy52MS5PcGVuRE1SZXNwb25zZRJUCg1SZXBhcmVudEFnZW50EiAuY29tcGFzcy52MS5SZXBhcmVudEFnZW50UmVxdWVzdBohLmNvbXBhc3MudjEuUmVwYXJlbnRBZ2VudFJlc3BvbnNlEmMKEk9wZW5BZ2VudFdvcmtzcGFjZRIlLmNvbXBhc3MudjEuT3BlbkFnZW50V29ya3NwYWNlUmVxdWVzdBomLmNvbXBhc3MudjEuT3BlbkFnZW50V29ya3NwYWNlUmVzcG9uc2USUQoMTGlzdE1lc3NhZ2VzEh8uY29tcGFzcy52MS5MaXN0TWVzc2FnZXNSZXF1ZXN0GiAuY29tcGFzcy52MS5MaXN0TWVzc2FnZXNSZXNwb25zZRJOCgtQb3N0TWVzc2FnZRIeLmNvbXBhc3MudjEuUG9zdE1lc3NhZ2VSZXF1ZXN0Gh8uY29tcGFzcy52MS5Qb3N0TWVzc2FnZVJlc3BvbnNlEksKCkxpc3RUb3BpY3MSHS5jb21wYXNzLnYxLkxpc3RUb3BpY3NSZXF1ZXN0Gh4uY29tcGFzcy52MS5MaXN0VG9waWNzUmVzcG9uc2USTgoLVXBkYXRlVG9waWMSHi5jb21wYXNzLnYxLlVwZGF0ZVRvcGljUmVxdWVzdBofLmNvbXBhc3MudjEuVXBkYXRlVG9waWNSZXNwb25zZRJRCgxSZXNwb25kVG9Bc2sSHy5jb21wYXNzLnYxLlJlc3BvbmRUb0Fza1JlcXVlc3QaIC5jb21wYXNzLnYxLlJlc3BvbmRUb0Fza1Jlc3BvbnNlElcKDlNlYXJjaE1lc3NhZ2VzEiEuY29tcGFzcy52MS5TZWFyY2hNZXNzYWdlc1JlcXVlc3QaIi5jb21wYXNzLnYxLlNlYXJjaE1lc3NhZ2VzUmVzcG9uc2USXQoQU2V0Q2hhbm5lbFBvbGljeRIjLmNvbXBhc3MudjEuU2V0Q2hhbm5lbFBvbGljeVJlcXVlc3QaJC5jb21wYXNzLnYxLlNldENoYW5uZWxQb2xpY3lSZXNwb25zZRJICglHZXRSb3N0ZXISHC5jb21wYXNzLnYxLkdldFJvc3RlclJlcXVlc3QaHS5jb21wYXNzLnYxLkdldFJvc3RlclJlc3BvbnNlEmAKEVVwZGF0ZVBpbm5lZEJvYXJkEiQuY29tcGFzcy52MS5VcGRhdGVQaW5uZWRCb2FyZFJlcXVlc3QaJS5jb21wYXNzLnYxLlVwZGF0ZVBpbm5lZEJvYXJkUmVzcG9uc2USWQoOU3Vic2NyaWJlQ29tbXMSIS5jb21wYXNzLnYxLlN1YnNjcmliZUNvbW1zUmVxdWVzdBoiLmNvbXBhc3MudjEuU3Vic2NyaWJlQ29tbXNSZXNwb25zZTABYgZwcm90bzM"); /** * An account in the communication layer: a human user or an owned agent. Both @@ -1454,6 +1454,18 @@ export type UpdateChannelMembersRequest = Message$1<"compass.v1.UpdateChannelMem * @generated from field: repeated string unsubscribe_handles = 5; */ unsubscribeHandles: string[]; + + /** + * Non-empty converts a two-party DM into a named CHANNEL as part of the same + * member update: required to add a third party to a kind=DM channel (a bare + * add on a DM is INVALID_ARGUMENT). The convert sets kind=CHANNEL, renames + * the channel to this value, and detaches it from the reserved DM group — + * freeing the DM's deterministic name so a future open_dm mints a fresh pair + * DM. Ignored (no-op) for non-DM channels. + * + * @generated from field: string convert_channel_name = 6; + */ + convertChannelName: string; }; /** @@ -1480,6 +1492,53 @@ export type UpdateChannelMembersResponse = Message$1<"compass.v1.UpdateChannelMe export const UpdateChannelMembersResponseSchema: GenMessage = /*@__PURE__*/ messageDesc(file_compass_v1_comms, 40); +/** + * @generated from message compass.v1.OpenDMRequest + */ +export type OpenDMRequest = Message$1<"compass.v1.OpenDMRequest"> & { + /** + * The peer agent's handle (owner-namespaced per DL-271). The server resolves + * it and enforces same-owner; unknown and cross-owner both return NOT_FOUND. + * A self-handle is INVALID_ARGUMENT. + * + * @generated from field: string peer_handle = 1; + */ + peerHandle: string; +}; + +/** + * Describes the message compass.v1.OpenDMRequest. + * Use `create(OpenDMRequestSchema)` to create a new message. + */ +export const OpenDMRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_compass_v1_comms, 41); + +/** + * @generated from message compass.v1.OpenDMResponse + */ +export type OpenDMResponse = Message$1<"compass.v1.OpenDMResponse"> & { + /** + * The resolved DM channel; id-typed wire per DL-270, tools render its name. + * + * @generated from field: compass.v1.Channel channel = 1; + */ + channel?: Channel | undefined; + + /** + * True when this call minted the channel; false on a resume. + * + * @generated from field: bool created = 2; + */ + created: boolean; +}; + +/** + * Describes the message compass.v1.OpenDMResponse. + * Use `create(OpenDMResponseSchema)` to create a new message. + */ +export const OpenDMResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_compass_v1_comms, 42); + /** * @generated from message compass.v1.ReparentAgentRequest */ @@ -1506,7 +1565,7 @@ export type ReparentAgentRequest = Message$1<"compass.v1.ReparentAgentRequest"> * Use `create(ReparentAgentRequestSchema)` to create a new message. */ export const ReparentAgentRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 41); + messageDesc(file_compass_v1_comms, 43); /** * @generated from message compass.v1.ReparentAgentResponse @@ -1523,7 +1582,7 @@ export type ReparentAgentResponse = Message$1<"compass.v1.ReparentAgentResponse" * Use `create(ReparentAgentResponseSchema)` to create a new message. */ export const ReparentAgentResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 42); + messageDesc(file_compass_v1_comms, 44); /** * @generated from message compass.v1.SetChannelPolicyRequest @@ -1564,7 +1623,7 @@ export type SetChannelPolicyRequest = Message$1<"compass.v1.SetChannelPolicyRequ * Use `create(SetChannelPolicyRequestSchema)` to create a new message. */ export const SetChannelPolicyRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 43); + messageDesc(file_compass_v1_comms, 45); /** * @generated from message compass.v1.SetChannelPolicyResponse @@ -1583,7 +1642,7 @@ export type SetChannelPolicyResponse = Message$1<"compass.v1.SetChannelPolicyRes * Use `create(SetChannelPolicyResponseSchema)` to create a new message. */ export const SetChannelPolicyResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 44); + messageDesc(file_compass_v1_comms, 46); /** * @generated from message compass.v1.GetRosterRequest @@ -1611,7 +1670,7 @@ export type GetRosterRequest = Message$1<"compass.v1.GetRosterRequest"> & { * Use `create(GetRosterRequestSchema)` to create a new message. */ export const GetRosterRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 45); + messageDesc(file_compass_v1_comms, 47); /** * @generated from message compass.v1.GetRosterResponse @@ -1628,7 +1687,7 @@ export type GetRosterResponse = Message$1<"compass.v1.GetRosterResponse"> & { * Use `create(GetRosterResponseSchema)` to create a new message. */ export const GetRosterResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 46); + messageDesc(file_compass_v1_comms, 48); /** * One agent in a roster: its identity, tree position, and joined presence + @@ -1678,7 +1737,7 @@ export type RosterEntry = Message$1<"compass.v1.RosterEntry"> & { * Use `create(RosterEntrySchema)` to create a new message. */ export const RosterEntrySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 47); + messageDesc(file_compass_v1_comms, 49); /** * @generated from message compass.v1.UpdatePinnedBoardRequest @@ -1718,7 +1777,7 @@ export type UpdatePinnedBoardRequest = Message$1<"compass.v1.UpdatePinnedBoardRe * Use `create(UpdatePinnedBoardRequestSchema)` to create a new message. */ export const UpdatePinnedBoardRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 48); + messageDesc(file_compass_v1_comms, 50); /** * Pin an existing message. message_id must already live in a topic of the @@ -1744,7 +1803,7 @@ export type PinMessage = Message$1<"compass.v1.PinMessage"> & { * Use `create(PinMessageSchema)` to create a new message. */ export const PinMessageSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 49); + messageDesc(file_compass_v1_comms, 51); /** * @generated from message compass.v1.UpdatePinnedBoardResponse @@ -1763,7 +1822,7 @@ export type UpdatePinnedBoardResponse = Message$1<"compass.v1.UpdatePinnedBoardR * Use `create(UpdatePinnedBoardResponseSchema)` to create a new message. */ export const UpdatePinnedBoardResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 50); + messageDesc(file_compass_v1_comms, 52); /** * @generated from message compass.v1.OpenAgentWorkspaceRequest @@ -1783,7 +1842,7 @@ export type OpenAgentWorkspaceRequest = Message$1<"compass.v1.OpenAgentWorkspace * Use `create(OpenAgentWorkspaceRequestSchema)` to create a new message. */ export const OpenAgentWorkspaceRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 51); + messageDesc(file_compass_v1_comms, 53); /** * @generated from message compass.v1.OpenAgentWorkspaceResponse @@ -1800,7 +1859,7 @@ export type OpenAgentWorkspaceResponse = Message$1<"compass.v1.OpenAgentWorkspac * Use `create(OpenAgentWorkspaceResponseSchema)` to create a new message. */ export const OpenAgentWorkspaceResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 52); + messageDesc(file_compass_v1_comms, 54); /** * @generated from message compass.v1.ListMessagesRequest @@ -1856,7 +1915,7 @@ export type ListMessagesRequest = Message$1<"compass.v1.ListMessagesRequest"> & * Use `create(ListMessagesRequestSchema)` to create a new message. */ export const ListMessagesRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 53); + messageDesc(file_compass_v1_comms, 55); /** * @generated from message compass.v1.ListMessagesResponse @@ -1875,7 +1934,7 @@ export type ListMessagesResponse = Message$1<"compass.v1.ListMessagesResponse"> * Use `create(ListMessagesResponseSchema)` to create a new message. */ export const ListMessagesResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 54); + messageDesc(file_compass_v1_comms, 56); /** * @generated from message compass.v1.PostMessageRequest @@ -1953,7 +2012,7 @@ export type PostMessageRequest = Message$1<"compass.v1.PostMessageRequest"> & { * Use `create(PostMessageRequestSchema)` to create a new message. */ export const PostMessageRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 55); + messageDesc(file_compass_v1_comms, 57); /** * @generated from message compass.v1.PostMessageResponse @@ -1970,7 +2029,7 @@ export type PostMessageResponse = Message$1<"compass.v1.PostMessageResponse"> & * Use `create(PostMessageResponseSchema)` to create a new message. */ export const PostMessageResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 56); + messageDesc(file_compass_v1_comms, 58); /** * @generated from message compass.v1.ListTopicsRequest @@ -1996,7 +2055,7 @@ export type ListTopicsRequest = Message$1<"compass.v1.ListTopicsRequest"> & { * Use `create(ListTopicsRequestSchema)` to create a new message. */ export const ListTopicsRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 57); + messageDesc(file_compass_v1_comms, 59); /** * @generated from message compass.v1.ListTopicsResponse @@ -2013,7 +2072,7 @@ export type ListTopicsResponse = Message$1<"compass.v1.ListTopicsResponse"> & { * Use `create(ListTopicsResponseSchema)` to create a new message. */ export const ListTopicsResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 58); + messageDesc(file_compass_v1_comms, 60); /** * @generated from message compass.v1.UpdateTopicRequest @@ -2047,7 +2106,7 @@ export type UpdateTopicRequest = Message$1<"compass.v1.UpdateTopicRequest"> & { * Use `create(UpdateTopicRequestSchema)` to create a new message. */ export const UpdateTopicRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 59); + messageDesc(file_compass_v1_comms, 61); /** * @generated from message compass.v1.UpdateTopicResponse @@ -2064,7 +2123,7 @@ export type UpdateTopicResponse = Message$1<"compass.v1.UpdateTopicResponse"> & * Use `create(UpdateTopicResponseSchema)` to create a new message. */ export const UpdateTopicResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 60); + messageDesc(file_compass_v1_comms, 62); /** * @generated from message compass.v1.RespondToAskRequest @@ -2090,7 +2149,7 @@ export type RespondToAskRequest = Message$1<"compass.v1.RespondToAskRequest"> & * Use `create(RespondToAskRequestSchema)` to create a new message. */ export const RespondToAskRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 61); + messageDesc(file_compass_v1_comms, 63); /** * The answer to one AskQuestion. @@ -2124,7 +2183,7 @@ export type AskQuestionAnswer = Message$1<"compass.v1.AskQuestionAnswer"> & { * Use `create(AskQuestionAnswerSchema)` to create a new message. */ export const AskQuestionAnswerSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 62); + messageDesc(file_compass_v1_comms, 64); /** * @generated from message compass.v1.RespondToAskResponse @@ -2137,7 +2196,7 @@ export type RespondToAskResponse = Message$1<"compass.v1.RespondToAskResponse"> * Use `create(RespondToAskResponseSchema)` to create a new message. */ export const RespondToAskResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 63); + messageDesc(file_compass_v1_comms, 65); /** * @generated from message compass.v1.SearchMessagesRequest @@ -2183,7 +2242,7 @@ export type SearchMessagesRequest = Message$1<"compass.v1.SearchMessagesRequest" * Use `create(SearchMessagesRequestSchema)` to create a new message. */ export const SearchMessagesRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 64); + messageDesc(file_compass_v1_comms, 66); /** * @generated from message compass.v1.SearchMessagesResponse @@ -2202,7 +2261,7 @@ export type SearchMessagesResponse = Message$1<"compass.v1.SearchMessagesRespons * Use `create(SearchMessagesResponseSchema)` to create a new message. */ export const SearchMessagesResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 65); + messageDesc(file_compass_v1_comms, 67); /** * @generated from message compass.v1.SubscribeCommsRequest @@ -2230,7 +2289,7 @@ export type SubscribeCommsRequest = Message$1<"compass.v1.SubscribeCommsRequest" * Use `create(SubscribeCommsRequestSchema)` to create a new message. */ export const SubscribeCommsRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 66); + messageDesc(file_compass_v1_comms, 68); /** * The user permission roles, expandable later. A regular member is the default @@ -2312,8 +2371,11 @@ export const ChannelPostPolicySchema: GenEnum = /*@__PURE__*/ /** * A channel's kind. A plain channel is the default; a DM is a direct - * conversation (human↔human, human↔agent, or agent↔agent) that widens into a - * GROUP_DM as members are added — an agent's primary surface is a channel/DM. + * conversation (human↔human, human↔agent, or agent↔agent) between exactly two + * parties — an agent's primary surface is a channel/DM. A DM never widens: a + * third party converts it to a named CHANNEL (UpdateChannelMembers with + * convert_channel_name), which frees the DM's deterministic name so a future + * open_dm mints a fresh pair DM. * * @generated from enum compass.v1.ChannelKind */ @@ -2329,7 +2391,11 @@ export enum ChannelKind { DM = 1, /** - * @generated from enum value: CHANNEL_KIND_GROUP_DM = 2; + * Retired: never produced. A DM converts to a named CHANNEL on third-party + * add rather than widening. The number is not reusable. + * + * @generated from enum value: CHANNEL_KIND_GROUP_DM = 2 [deprecated = true]; + * @deprecated */ GROUP_DM = 2, } @@ -2509,7 +2575,8 @@ export const CommsService: GenService<{ /** * Add or remove channel members and flip a member's subscribe opt-in — * caller-authorized against channel visibility. Emits ChannelChanged. One RPC - * covers join, subscribe-toggle, DM-expansion, and share-replacement. + * covers join, subscribe-toggle, DM-to-channel conversion (convert_channel_name), + * and share-replacement. * * @generated from rpc compass.v1.CommsService.UpdateChannelMembers */ @@ -2518,6 +2585,22 @@ export const CommsService: GenService<{ input: typeof UpdateChannelMembersRequestSchema; output: typeof UpdateChannelMembersResponseSchema; }, + /** + * Open (or fetch) the two-party DM channel between the caller and a peer, + * addressed by the peer's owner-namespaced handle. Resolve-or-create and + * idempotent: the channel is minted on first open in the caller-owner's + * reserved DM group under a deterministic sorted-handle name, and returned + * on every subsequent open. Same-owner only — unknown and cross-owner both + * return NOT_FOUND; a self-open is INVALID_ARGUMENT. Emits ChannelChanged on + * create. + * + * @generated from rpc compass.v1.CommsService.OpenDM + */ + openDM: { + methodKind: "unary"; + input: typeof OpenDMRequestSchema; + output: typeof OpenDMResponseSchema; + }, /** * Re-parent an agent in the agent tree, or promote it to a root (empty * new_parent_agent_id) — caller-authorized against the agent's owner. The diff --git a/packages/compass-client/src/gen/compass/v1/comms_pb.ts b/packages/compass-client/src/gen/compass/v1/comms_pb.ts index 71fcb63d..94567dca 100644 --- a/packages/compass-client/src/gen/compass/v1/comms_pb.ts +++ b/packages/compass-client/src/gen/compass/v1/comms_pb.ts @@ -27,7 +27,7 @@ import type { Message as Message$1 } from "@bufbuild/protobuf"; * Describes the file compass/v1/comms.proto. */ export const file_compass_v1_comms: GenFile = /*@__PURE__*/ - fileDesc("ChZjb21wYXNzL3YxL2NvbW1zLnByb3RvEgpjb21wYXNzLnYxIsQBCgdBY2NvdW50EgoKAmlkGAEgASgJEg4KBmhhbmRsZRgCIAEoCRIUCgxkaXNwbGF5X25hbWUYAyABKAkSJwoEdXNlchgKIAEoCzIXLmNvbXBhc3MudjEuVXNlckFjY291bnRIABIpCgVhZ2VudBgLIAEoCzIYLmNvbXBhc3MudjEuQWdlbnRBY2NvdW50SAASKwoGc3lzdGVtGAwgASgLMhkuY29tcGFzcy52MS5TeXN0ZW1BY2NvdW50SABCBgoEa2luZCIPCg1TeXN0ZW1BY2NvdW50IjEKC1VzZXJBY2NvdW50EiIKBHJvbGUYASABKA4yFC5jb21wYXNzLnYxLlVzZXJSb2xlIlcKDEFnZW50QWNjb3VudBIVCg1vd25lcl91c2VyX2lkGAEgASgJEhcKD2hvbWVfY2hhbm5lbF9pZBgCIAEoCRIXCg9wYXJlbnRfYWdlbnRfaWQYAyABKAkikAEKDENoYW5uZWxHcm91cBIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEhcKD3BhcmVudF9ncm91cF9pZBgDIAEoCRIVCg1vd25lcl91c2VyX2lkGAQgASgJEjYKCnZpc2liaWxpdHkYBSABKA4yIi5jb21wYXNzLnYxLkNoYW5uZWxHcm91cFZpc2liaWxpdHkitwIKB0NoYW5uZWwSCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCRIQCghncm91cF9pZBgDIAEoCRIlCgRraW5kGAQgASgOMhcuY29tcGFzcy52MS5DaGFubmVsS2luZBIaChJtZW1iZXJfYWNjb3VudF9pZHMYBSADKAkSHgoWc3Vic2NyaWJlcl9hY2NvdW50X2lkcxgGIAMoCRIyCgtwb3N0X3BvbGljeRgHIAEoDjIdLmNvbXBhc3MudjEuQ2hhbm5lbFBvc3RQb2xpY3kSGAoQb3duZXJfYWNjb3VudF9pZBgIIAEoCRIeChZtYW5kYXRvcnlfc3Vic2NyaXB0aW9uGAkgASgIEi8KDnBpbm5lZF9lbnRyaWVzGAogAygLMhcuY29tcGFzcy52MS5QaW5uZWRFbnRyeSJsCgtQaW5uZWRFbnRyeRISCgptZXNzYWdlX2lkGAEgASgJEhAKCHBvc2l0aW9uGAIgASgFEhkKEXBpbm5lZF9hdF91bml4X21zGAMgASgDEhwKFHBpbm5lZF9ieV9hY2NvdW50X2lkGAQgASgJIjYKDkFnZW50V29ya3NwYWNlEgoKAmlkGAEgASgJEhgKEGFnZW50X2FjY291bnRfaWQYAiABKAkiggEKBVRvcGljEgoKAmlkGAEgASgJEhIKCmNoYW5uZWxfaWQYAiABKAkSDAoEbmFtZRgDIAEoCRIaChJjcmVhdGVkX2F0X3VuaXhfbXMYBCABKAMSHQoVY3JlYXRlZF9ieV9hY2NvdW50X2lkGAUgASgJEhAKCGFyY2hpdmVkGAYgASgIIoABCgdNZXNzYWdlEgoKAmlkGAEgASgJEhAKCHRvcGljX2lkGAIgASgJEhkKEWF1dGhvcl9hY2NvdW50X2lkGAMgASgJEhIKCmF0X3VuaXhfbXMYBCABKAMSKAoGYmxvY2tzGAUgAygLMhguY29tcGFzcy52MS5NZXNzYWdlQmxvY2sieQoMTWVzc2FnZUJsb2NrEg4KBHRleHQYASABKAlIABIeCgNhc2sYAiABKAsyDy5jb21wYXNzLnYxLkFza0gAEjAKCmFza19hbnN3ZXIYAyABKAsyGi5jb21wYXNzLnYxLkFza0Fuc3dlckJsb2NrSABCBwoFYmxvY2siSAoOQXNrQW5zd2VyQmxvY2sSHAoDYXNrGAEgASgLMg8uY29tcGFzcy52MS5Bc2sSGAoQYXNrZXJfYWNjb3VudF9pZBgCIAEoCSJTCgNBc2sSDgoGYXNrX2lkGAEgASgJEioKCXF1ZXN0aW9ucxgCIAMoCzIXLmNvbXBhc3MudjEuQXNrUXVlc3Rpb24SEAoIYW5zd2VyZWQYAyABKAgi8QEKC0Fza1F1ZXN0aW9uEhMKC3F1ZXN0aW9uX2lkGAEgASgJEhAKCHF1ZXN0aW9uGAIgASgJEg4KBmhlYWRlchgDIAEoCRImCgdvcHRpb25zGAQgAygLMhUuY29tcGFzcy52MS5Bc2tPcHRpb24SFgoOYWxsb3dfbXVsdGlwbGUYBSABKAgSGAoLcmVjb21tZW5kZWQYBiABKAVIAIgBARIZChFjaG9zZW5fb3B0aW9uX2lkcxgHIAMoCRITCgtjdXN0b21fdGV4dBgIIAEoCRIRCgl0aW1lZF9vdXQYCSABKAhCDgoMX3JlY29tbWVuZGVkIkwKCUFza09wdGlvbhIKCgJpZBgBIAEoCRINCgVsYWJlbBgCIAEoCRITCgtkZXNjcmlwdGlvbhgDIAEoCRIPCgdwcmV2aWV3GAQgASgJIokFChZTdWJzY3JpYmVDb21tc1Jlc3BvbnNlEgsKA3NlcRgBIAEoBBISCgphdF91bml4X21zGAIgASgDEhYKDmluc3RhbmNlX2Vwb2NoGAMgASgEEhQKDHNuYXBzaG90X3NlcRgEIAEoBBIzCg5tZXNzYWdlX3Bvc3RlZBgKIAEoCzIZLmNvbXBhc3MudjEuTWVzc2FnZVBvc3RlZEgAEjUKD21lc3NhZ2VfdXBkYXRlZBgLIAEoCzIaLmNvbXBhc3MudjEuTWVzc2FnZVVwZGF0ZWRIABI1Cg9jaGFubmVsX2NoYW5nZWQYDCABKAsyGi5jb21wYXNzLnYxLkNoYW5uZWxDaGFuZ2VkSAASQAoVY2hhbm5lbF9ncm91cF9jaGFuZ2VkGA0gASgLMh8uY29tcGFzcy52MS5DaGFubmVsR3JvdXBDaGFuZ2VkSAASNQoPYWNjb3VudF9jaGFuZ2VkGA4gASgLMhouY29tcGFzcy52MS5BY2NvdW50Q2hhbmdlZEgAEkQKF2FnZW50X3dvcmtzcGFjZV9jaGFuZ2VkGA8gASgLMiEuY29tcGFzcy52MS5BZ2VudFdvcmtzcGFjZUNoYW5nZWRIABI6Cg9yZXN5bmNfcmVxdWlyZWQYECABKAsyHy5jb21wYXNzLnYxLkNvbW1zUmVzeW5jUmVxdWlyZWRIABJCChZhZ2VudF9wcmVzZW5jZV9jaGFuZ2VkGBEgASgLMiAuY29tcGFzcy52MS5BZ2VudFByZXNlbmNlQ2hhbmdlZEgAEjMKDnRvcGljX3Vwc2VydGVkGBIgASgLMhkuY29tcGFzcy52MS5Ub3BpY1Vwc2VydGVkSABCCQoHcGF5bG9hZCI1Cg1NZXNzYWdlUG9zdGVkEiQKB21lc3NhZ2UYASABKAsyEy5jb21wYXNzLnYxLk1lc3NhZ2UiNgoOTWVzc2FnZVVwZGF0ZWQSJAoHbWVzc2FnZRgBIAEoCzITLmNvbXBhc3MudjEuTWVzc2FnZSIxCg1Ub3BpY1Vwc2VydGVkEiAKBXRvcGljGAEgASgLMhEuY29tcGFzcy52MS5Ub3BpYyJTCg5DaGFubmVsQ2hhbmdlZBIkCgdjaGFubmVsGAEgASgLMhMuY29tcGFzcy52MS5DaGFubmVsEhsKE3JlbW92ZWRfYWNjb3VudF9pZHMYAiADKAkiPgoTQ2hhbm5lbEdyb3VwQ2hhbmdlZBInCgVncm91cBgBIAEoCzIYLmNvbXBhc3MudjEuQ2hhbm5lbEdyb3VwIjYKDkFjY291bnRDaGFuZ2VkEiQKB2FjY291bnQYASABKAsyEy5jb21wYXNzLnYxLkFjY291bnQiRgoVQWdlbnRXb3Jrc3BhY2VDaGFuZ2VkEi0KCXdvcmtzcGFjZRgBIAEoCzIaLmNvbXBhc3MudjEuQWdlbnRXb3Jrc3BhY2UiFQoTQ29tbXNSZXN5bmNSZXF1aXJlZCJvChRBZ2VudFByZXNlbmNlQ2hhbmdlZBIYChBhZ2VudF9hY2NvdW50X2lkGAEgASgJEisKCHByZXNlbmNlGAIgASgOMhkuY29tcGFzcy52MS5BZ2VudFByZXNlbmNlEhAKCGFjdGl2aXR5GAMgASgJIjkKEUNyZWF0ZVVzZXJSZXF1ZXN0Eg4KBmhhbmRsZRgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkiOgoSQ3JlYXRlVXNlclJlc3BvbnNlEiQKB2FjY291bnQYASABKAsyEy5jb21wYXNzLnYxLkFjY291bnQiUQoSQ3JlYXRlQWdlbnRSZXF1ZXN0Eg4KBmhhbmRsZRgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSFQoNcGFyZW50X2hhbmRsZRgDIAEoCSI7ChNDcmVhdGVBZ2VudFJlc3BvbnNlEiQKB2FjY291bnQYASABKAsyEy5jb21wYXNzLnYxLkFjY291bnQiKwoTTGlzdEFjY291bnRzUmVxdWVzdBIUCgxzbmFwc2hvdF9zZXEYASABKAQiPQoUTGlzdEFjY291bnRzUmVzcG9uc2USJQoIYWNjb3VudHMYASADKAsyEy5jb21wYXNzLnYxLkFjY291bnQiegoZQ3JlYXRlQ2hhbm5lbEdyb3VwUmVxdWVzdBIMCgRuYW1lGAEgASgJEhcKD3BhcmVudF9ncm91cF9pZBgCIAEoCRI2Cgp2aXNpYmlsaXR5GAMgASgOMiIuY29tcGFzcy52MS5DaGFubmVsR3JvdXBWaXNpYmlsaXR5IkUKGkNyZWF0ZUNoYW5uZWxHcm91cFJlc3BvbnNlEicKBWdyb3VwGAEgASgLMhguY29tcGFzcy52MS5DaGFubmVsR3JvdXAiMAoYTGlzdENoYW5uZWxHcm91cHNSZXF1ZXN0EhQKDHNuYXBzaG90X3NlcRgBIAEoBCJFChlMaXN0Q2hhbm5lbEdyb3Vwc1Jlc3BvbnNlEigKBmdyb3VwcxgBIAMoCzIYLmNvbXBhc3MudjEuQ2hhbm5lbEdyb3VwIisKE0xpc3RDaGFubmVsc1JlcXVlc3QSFAoMc25hcHNob3Rfc2VxGAEgASgEIj0KFExpc3RDaGFubmVsc1Jlc3BvbnNlEiUKCGNoYW5uZWxzGAEgAygLMhMuY29tcGFzcy52MS5DaGFubmVsInUKFENyZWF0ZUNoYW5uZWxSZXF1ZXN0EgwKBG5hbWUYASABKAkSEAoIZ3JvdXBfaWQYAiABKAkSJQoEa2luZBgDIAEoDjIXLmNvbXBhc3MudjEuQ2hhbm5lbEtpbmQSFgoObWVtYmVyX2hhbmRsZXMYBCADKAkiPQoVQ3JlYXRlQ2hhbm5lbFJlc3BvbnNlEiQKB2NoYW5uZWwYASABKAsyEy5jb21wYXNzLnYxLkNoYW5uZWwipAEKG1VwZGF0ZUNoYW5uZWxNZW1iZXJzUmVxdWVzdBISCgpjaGFubmVsX2lkGAEgASgJEhoKEmFkZF9tZW1iZXJfaGFuZGxlcxgCIAMoCRIdChVyZW1vdmVfbWVtYmVyX2hhbmRsZXMYAyADKAkSGQoRc3Vic2NyaWJlX2hhbmRsZXMYBCADKAkSGwoTdW5zdWJzY3JpYmVfaGFuZGxlcxgFIAMoCSJEChxVcGRhdGVDaGFubmVsTWVtYmVyc1Jlc3BvbnNlEiQKB2NoYW5uZWwYASABKAsyEy5jb21wYXNzLnYxLkNoYW5uZWwiRwoUUmVwYXJlbnRBZ2VudFJlcXVlc3QSFAoMYWdlbnRfaGFuZGxlGAEgASgJEhkKEW5ld19wYXJlbnRfaGFuZGxlGAIgASgJIj0KFVJlcGFyZW50QWdlbnRSZXNwb25zZRIkCgdhY2NvdW50GAEgASgLMhMuY29tcGFzcy52MS5BY2NvdW50IpcBChdTZXRDaGFubmVsUG9saWN5UmVxdWVzdBISCgpjaGFubmVsX2lkGAEgASgJEjIKC3Bvc3RfcG9saWN5GAIgASgOMh0uY29tcGFzcy52MS5DaGFubmVsUG9zdFBvbGljeRIUCgxvd25lcl9oYW5kbGUYAyABKAkSHgoWbWFuZGF0b3J5X3N1YnNjcmlwdGlvbhgEIAEoCCJAChhTZXRDaGFubmVsUG9saWN5UmVzcG9uc2USJAoHY2hhbm5lbBgBIAEoCzITLmNvbXBhc3MudjEuQ2hhbm5lbCJSChBHZXRSb3N0ZXJSZXF1ZXN0EiYKBXNjb3BlGAEgASgOMhcuY29tcGFzcy52MS5Sb3N0ZXJTY29wZRIWCg52YW50YWdlX2hhbmRsZRgCIAEoCSI9ChFHZXRSb3N0ZXJSZXNwb25zZRIoCgdlbnRyaWVzGAEgAygLMhcuY29tcGFzcy52MS5Sb3N0ZXJFbnRyeSLCAQoLUm9zdGVyRW50cnkSGAoQYWdlbnRfYWNjb3VudF9pZBgBIAEoCRIOCgZoYW5kbGUYAiABKAkSFAoMZGlzcGxheV9uYW1lGAMgASgJEhcKD3BhcmVudF9hZ2VudF9pZBgEIAEoCRIrCghwcmVzZW5jZRgFIAEoDjIZLmNvbXBhc3MudjEuQWdlbnRQcmVzZW5jZRIQCghhY3Rpdml0eRgGIAEoCRIbChNhY3Rpdml0eV9hdF91bml4X21zGAcgASgDIncKGFVwZGF0ZVBpbm5lZEJvYXJkUmVxdWVzdBISCgpjaGFubmVsX2lkGAEgASgJEiUKA3BpbhgCIAEoCzIWLmNvbXBhc3MudjEuUGluTWVzc2FnZUgAEhoKEHVucGluX21lc3NhZ2VfaWQYAyABKAlIAEIECgJvcCI8CgpQaW5NZXNzYWdlEhIKCm1lc3NhZ2VfaWQYASABKAkSGgoScmVwbGFjZV9tZXNzYWdlX2lkGAIgASgJIkEKGVVwZGF0ZVBpbm5lZEJvYXJkUmVzcG9uc2USJAoHY2hhbm5lbBgBIAEoCzITLmNvbXBhc3MudjEuQ2hhbm5lbCIxChlPcGVuQWdlbnRXb3Jrc3BhY2VSZXF1ZXN0EhQKDGFnZW50X2hhbmRsZRgBIAEoCSJLChpPcGVuQWdlbnRXb3Jrc3BhY2VSZXNwb25zZRItCgl3b3Jrc3BhY2UYASABKAsyGi5jb21wYXNzLnYxLkFnZW50V29ya3NwYWNlIooBChNMaXN0TWVzc2FnZXNSZXF1ZXN0EhQKCmNoYW5uZWxfaWQYASABKAlIABINCgVsaW1pdBgCIAEoDRIZChFiZWZvcmVfbWVzc2FnZV9pZBgDIAEoCRIUCgxzbmFwc2hvdF9zZXEYBCABKAQSEAoIdG9waWNfaWQYBSABKAlCCwoJY29udGFpbmVyIj0KFExpc3RNZXNzYWdlc1Jlc3BvbnNlEiUKCG1lc3NhZ2VzGAEgAygLMhMuY29tcGFzcy52MS5NZXNzYWdlIsUBChJQb3N0TWVzc2FnZVJlcXVlc3QSFAoKY2hhbm5lbF9pZBgBIAEoCUgAEigKBmJsb2NrcxgCIAMoCzIYLmNvbXBhc3MudjEuTWVzc2FnZUJsb2NrEhIKCHRvcGljX2lkGAMgASgJSAESFAoKdG9waWNfbmFtZRgEIAEoCUgBEhkKEWNsaWVudF9yZXF1ZXN0X2lkGAUgASgJEhQKDGNyZWF0ZV90b3BpYxgGIAEoCEILCgljb250YWluZXJCBwoFdG9waWMiOwoTUG9zdE1lc3NhZ2VSZXNwb25zZRIkCgdtZXNzYWdlGAEgASgLMhMuY29tcGFzcy52MS5NZXNzYWdlIkEKEUxpc3RUb3BpY3NSZXF1ZXN0EhIKCmNoYW5uZWxfaWQYASABKAkSGAoQaW5jbHVkZV9hcmNoaXZlZBgCIAEoCCI3ChJMaXN0VG9waWNzUmVzcG9uc2USIQoGdG9waWNzGAEgAygLMhEuY29tcGFzcy52MS5Ub3BpYyJmChJVcGRhdGVUb3BpY1JlcXVlc3QSEAoIdG9waWNfaWQYASABKAkSEQoEbmFtZRgCIAEoCUgAiAEBEhUKCGFyY2hpdmVkGAMgASgISAGIAQFCBwoFX25hbWVCCwoJX2FyY2hpdmVkIjcKE1VwZGF0ZVRvcGljUmVzcG9uc2USIAoFdG9waWMYASABKAsyES5jb21wYXNzLnYxLlRvcGljIlUKE1Jlc3BvbmRUb0Fza1JlcXVlc3QSDgoGYXNrX2lkGAEgASgJEi4KB2Fuc3dlcnMYAiADKAsyHS5jb21wYXNzLnYxLkFza1F1ZXN0aW9uQW5zd2VyIlgKEUFza1F1ZXN0aW9uQW5zd2VyEhMKC3F1ZXN0aW9uX2lkGAEgASgJEhkKEWNob3Nlbl9vcHRpb25faWRzGAIgAygJEhMKC2N1c3RvbV90ZXh0GAMgASgJIhYKFFJlc3BvbmRUb0Fza1Jlc3BvbnNlImoKFVNlYXJjaE1lc3NhZ2VzUmVxdWVzdBINCgVxdWVyeRgBIAEoCRIUCgpjaGFubmVsX2lkGAIgASgJSAASDQoFbGltaXQYAyABKA0SFAoMc25hcHNob3Rfc2VxGAQgASgEQgcKBXNjb3BlIj8KFlNlYXJjaE1lc3NhZ2VzUmVzcG9uc2USJQoIbWVzc2FnZXMYASADKAsyEy5jb21wYXNzLnYxLk1lc3NhZ2UiQgoVU3Vic2NyaWJlQ29tbXNSZXF1ZXN0EhEKCXNpbmNlX3NlcRgBIAEoBBIWCg5pbnN0YW5jZV9lcG9jaBgCIAEoBCo1CghVc2VyUm9sZRIUChBVU0VSX1JPTEVfTUVNQkVSEAASEwoPVVNFUl9ST0xFX0FETUlOEAEqYQoWQ2hhbm5lbEdyb3VwVmlzaWJpbGl0eRIiCh5DSEFOTkVMX0dST1VQX1ZJU0lCSUxJVFlfT1dORVIQABIjCh9DSEFOTkVMX0dST1VQX1ZJU0lCSUxJVFlfU0hBUkVEEAEqVQoRQ2hhbm5lbFBvc3RQb2xpY3kSHAoYQ0hBTk5FTF9QT1NUX1BPTElDWV9PUEVOEAASIgoeQ0hBTk5FTF9QT1NUX1BPTElDWV9PV05FUl9PTkxZEAEqVwoLQ2hhbm5lbEtpbmQSGAoUQ0hBTk5FTF9LSU5EX0NIQU5ORUwQABITCg9DSEFOTkVMX0tJTkRfRE0QARIZChVDSEFOTkVMX0tJTkRfR1JPVVBfRE0QAiqcAQoNQWdlbnRQcmVzZW5jZRIeChpBR0VOVF9QUkVTRU5DRV9VTlNQRUNJRklFRBAAEhcKE0FHRU5UX1BSRVNFTkNFX0lETEUQARIaChZBR0VOVF9QUkVTRU5DRV9XT1JLSU5HEAISGgoWQUdFTlRfUFJFU0VOQ0VfV0FJVElORxADEhoKFkFHRU5UX1BSRVNFTkNFX09GRkxJTkUQBCpeCgtSb3N0ZXJTY29wZRIdChlST1NURVJfU0NPUEVfTkVJR0hCT1JIT09EEAASGAoUUk9TVEVSX1NDT1BFX1NVQlRSRUUQARIWChJST1NURVJfU0NPUEVfT1dORVIQAjLmDQoMQ29tbXNTZXJ2aWNlEksKCkNyZWF0ZVVzZXISHS5jb21wYXNzLnYxLkNyZWF0ZVVzZXJSZXF1ZXN0Gh4uY29tcGFzcy52MS5DcmVhdGVVc2VyUmVzcG9uc2USTgoLQ3JlYXRlQWdlbnQSHi5jb21wYXNzLnYxLkNyZWF0ZUFnZW50UmVxdWVzdBofLmNvbXBhc3MudjEuQ3JlYXRlQWdlbnRSZXNwb25zZRJRCgxMaXN0QWNjb3VudHMSHy5jb21wYXNzLnYxLkxpc3RBY2NvdW50c1JlcXVlc3QaIC5jb21wYXNzLnYxLkxpc3RBY2NvdW50c1Jlc3BvbnNlEmMKEkNyZWF0ZUNoYW5uZWxHcm91cBIlLmNvbXBhc3MudjEuQ3JlYXRlQ2hhbm5lbEdyb3VwUmVxdWVzdBomLmNvbXBhc3MudjEuQ3JlYXRlQ2hhbm5lbEdyb3VwUmVzcG9uc2USYAoRTGlzdENoYW5uZWxHcm91cHMSJC5jb21wYXNzLnYxLkxpc3RDaGFubmVsR3JvdXBzUmVxdWVzdBolLmNvbXBhc3MudjEuTGlzdENoYW5uZWxHcm91cHNSZXNwb25zZRJRCgxMaXN0Q2hhbm5lbHMSHy5jb21wYXNzLnYxLkxpc3RDaGFubmVsc1JlcXVlc3QaIC5jb21wYXNzLnYxLkxpc3RDaGFubmVsc1Jlc3BvbnNlElQKDUNyZWF0ZUNoYW5uZWwSIC5jb21wYXNzLnYxLkNyZWF0ZUNoYW5uZWxSZXF1ZXN0GiEuY29tcGFzcy52MS5DcmVhdGVDaGFubmVsUmVzcG9uc2USaQoUVXBkYXRlQ2hhbm5lbE1lbWJlcnMSJy5jb21wYXNzLnYxLlVwZGF0ZUNoYW5uZWxNZW1iZXJzUmVxdWVzdBooLmNvbXBhc3MudjEuVXBkYXRlQ2hhbm5lbE1lbWJlcnNSZXNwb25zZRJUCg1SZXBhcmVudEFnZW50EiAuY29tcGFzcy52MS5SZXBhcmVudEFnZW50UmVxdWVzdBohLmNvbXBhc3MudjEuUmVwYXJlbnRBZ2VudFJlc3BvbnNlEmMKEk9wZW5BZ2VudFdvcmtzcGFjZRIlLmNvbXBhc3MudjEuT3BlbkFnZW50V29ya3NwYWNlUmVxdWVzdBomLmNvbXBhc3MudjEuT3BlbkFnZW50V29ya3NwYWNlUmVzcG9uc2USUQoMTGlzdE1lc3NhZ2VzEh8uY29tcGFzcy52MS5MaXN0TWVzc2FnZXNSZXF1ZXN0GiAuY29tcGFzcy52MS5MaXN0TWVzc2FnZXNSZXNwb25zZRJOCgtQb3N0TWVzc2FnZRIeLmNvbXBhc3MudjEuUG9zdE1lc3NhZ2VSZXF1ZXN0Gh8uY29tcGFzcy52MS5Qb3N0TWVzc2FnZVJlc3BvbnNlEksKCkxpc3RUb3BpY3MSHS5jb21wYXNzLnYxLkxpc3RUb3BpY3NSZXF1ZXN0Gh4uY29tcGFzcy52MS5MaXN0VG9waWNzUmVzcG9uc2USTgoLVXBkYXRlVG9waWMSHi5jb21wYXNzLnYxLlVwZGF0ZVRvcGljUmVxdWVzdBofLmNvbXBhc3MudjEuVXBkYXRlVG9waWNSZXNwb25zZRJRCgxSZXNwb25kVG9Bc2sSHy5jb21wYXNzLnYxLlJlc3BvbmRUb0Fza1JlcXVlc3QaIC5jb21wYXNzLnYxLlJlc3BvbmRUb0Fza1Jlc3BvbnNlElcKDlNlYXJjaE1lc3NhZ2VzEiEuY29tcGFzcy52MS5TZWFyY2hNZXNzYWdlc1JlcXVlc3QaIi5jb21wYXNzLnYxLlNlYXJjaE1lc3NhZ2VzUmVzcG9uc2USXQoQU2V0Q2hhbm5lbFBvbGljeRIjLmNvbXBhc3MudjEuU2V0Q2hhbm5lbFBvbGljeVJlcXVlc3QaJC5jb21wYXNzLnYxLlNldENoYW5uZWxQb2xpY3lSZXNwb25zZRJICglHZXRSb3N0ZXISHC5jb21wYXNzLnYxLkdldFJvc3RlclJlcXVlc3QaHS5jb21wYXNzLnYxLkdldFJvc3RlclJlc3BvbnNlEmAKEVVwZGF0ZVBpbm5lZEJvYXJkEiQuY29tcGFzcy52MS5VcGRhdGVQaW5uZWRCb2FyZFJlcXVlc3QaJS5jb21wYXNzLnYxLlVwZGF0ZVBpbm5lZEJvYXJkUmVzcG9uc2USWQoOU3Vic2NyaWJlQ29tbXMSIS5jb21wYXNzLnYxLlN1YnNjcmliZUNvbW1zUmVxdWVzdBoiLmNvbXBhc3MudjEuU3Vic2NyaWJlQ29tbXNSZXNwb25zZTABYgZwcm90bzM"); + fileDesc("ChZjb21wYXNzL3YxL2NvbW1zLnByb3RvEgpjb21wYXNzLnYxIsQBCgdBY2NvdW50EgoKAmlkGAEgASgJEg4KBmhhbmRsZRgCIAEoCRIUCgxkaXNwbGF5X25hbWUYAyABKAkSJwoEdXNlchgKIAEoCzIXLmNvbXBhc3MudjEuVXNlckFjY291bnRIABIpCgVhZ2VudBgLIAEoCzIYLmNvbXBhc3MudjEuQWdlbnRBY2NvdW50SAASKwoGc3lzdGVtGAwgASgLMhkuY29tcGFzcy52MS5TeXN0ZW1BY2NvdW50SABCBgoEa2luZCIPCg1TeXN0ZW1BY2NvdW50IjEKC1VzZXJBY2NvdW50EiIKBHJvbGUYASABKA4yFC5jb21wYXNzLnYxLlVzZXJSb2xlIlcKDEFnZW50QWNjb3VudBIVCg1vd25lcl91c2VyX2lkGAEgASgJEhcKD2hvbWVfY2hhbm5lbF9pZBgCIAEoCRIXCg9wYXJlbnRfYWdlbnRfaWQYAyABKAkikAEKDENoYW5uZWxHcm91cBIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEhcKD3BhcmVudF9ncm91cF9pZBgDIAEoCRIVCg1vd25lcl91c2VyX2lkGAQgASgJEjYKCnZpc2liaWxpdHkYBSABKA4yIi5jb21wYXNzLnYxLkNoYW5uZWxHcm91cFZpc2liaWxpdHkitwIKB0NoYW5uZWwSCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCRIQCghncm91cF9pZBgDIAEoCRIlCgRraW5kGAQgASgOMhcuY29tcGFzcy52MS5DaGFubmVsS2luZBIaChJtZW1iZXJfYWNjb3VudF9pZHMYBSADKAkSHgoWc3Vic2NyaWJlcl9hY2NvdW50X2lkcxgGIAMoCRIyCgtwb3N0X3BvbGljeRgHIAEoDjIdLmNvbXBhc3MudjEuQ2hhbm5lbFBvc3RQb2xpY3kSGAoQb3duZXJfYWNjb3VudF9pZBgIIAEoCRIeChZtYW5kYXRvcnlfc3Vic2NyaXB0aW9uGAkgASgIEi8KDnBpbm5lZF9lbnRyaWVzGAogAygLMhcuY29tcGFzcy52MS5QaW5uZWRFbnRyeSJsCgtQaW5uZWRFbnRyeRISCgptZXNzYWdlX2lkGAEgASgJEhAKCHBvc2l0aW9uGAIgASgFEhkKEXBpbm5lZF9hdF91bml4X21zGAMgASgDEhwKFHBpbm5lZF9ieV9hY2NvdW50X2lkGAQgASgJIjYKDkFnZW50V29ya3NwYWNlEgoKAmlkGAEgASgJEhgKEGFnZW50X2FjY291bnRfaWQYAiABKAkiggEKBVRvcGljEgoKAmlkGAEgASgJEhIKCmNoYW5uZWxfaWQYAiABKAkSDAoEbmFtZRgDIAEoCRIaChJjcmVhdGVkX2F0X3VuaXhfbXMYBCABKAMSHQoVY3JlYXRlZF9ieV9hY2NvdW50X2lkGAUgASgJEhAKCGFyY2hpdmVkGAYgASgIIoABCgdNZXNzYWdlEgoKAmlkGAEgASgJEhAKCHRvcGljX2lkGAIgASgJEhkKEWF1dGhvcl9hY2NvdW50X2lkGAMgASgJEhIKCmF0X3VuaXhfbXMYBCABKAMSKAoGYmxvY2tzGAUgAygLMhguY29tcGFzcy52MS5NZXNzYWdlQmxvY2sieQoMTWVzc2FnZUJsb2NrEg4KBHRleHQYASABKAlIABIeCgNhc2sYAiABKAsyDy5jb21wYXNzLnYxLkFza0gAEjAKCmFza19hbnN3ZXIYAyABKAsyGi5jb21wYXNzLnYxLkFza0Fuc3dlckJsb2NrSABCBwoFYmxvY2siSAoOQXNrQW5zd2VyQmxvY2sSHAoDYXNrGAEgASgLMg8uY29tcGFzcy52MS5Bc2sSGAoQYXNrZXJfYWNjb3VudF9pZBgCIAEoCSJTCgNBc2sSDgoGYXNrX2lkGAEgASgJEioKCXF1ZXN0aW9ucxgCIAMoCzIXLmNvbXBhc3MudjEuQXNrUXVlc3Rpb24SEAoIYW5zd2VyZWQYAyABKAgi8QEKC0Fza1F1ZXN0aW9uEhMKC3F1ZXN0aW9uX2lkGAEgASgJEhAKCHF1ZXN0aW9uGAIgASgJEg4KBmhlYWRlchgDIAEoCRImCgdvcHRpb25zGAQgAygLMhUuY29tcGFzcy52MS5Bc2tPcHRpb24SFgoOYWxsb3dfbXVsdGlwbGUYBSABKAgSGAoLcmVjb21tZW5kZWQYBiABKAVIAIgBARIZChFjaG9zZW5fb3B0aW9uX2lkcxgHIAMoCRITCgtjdXN0b21fdGV4dBgIIAEoCRIRCgl0aW1lZF9vdXQYCSABKAhCDgoMX3JlY29tbWVuZGVkIkwKCUFza09wdGlvbhIKCgJpZBgBIAEoCRINCgVsYWJlbBgCIAEoCRITCgtkZXNjcmlwdGlvbhgDIAEoCRIPCgdwcmV2aWV3GAQgASgJIokFChZTdWJzY3JpYmVDb21tc1Jlc3BvbnNlEgsKA3NlcRgBIAEoBBISCgphdF91bml4X21zGAIgASgDEhYKDmluc3RhbmNlX2Vwb2NoGAMgASgEEhQKDHNuYXBzaG90X3NlcRgEIAEoBBIzCg5tZXNzYWdlX3Bvc3RlZBgKIAEoCzIZLmNvbXBhc3MudjEuTWVzc2FnZVBvc3RlZEgAEjUKD21lc3NhZ2VfdXBkYXRlZBgLIAEoCzIaLmNvbXBhc3MudjEuTWVzc2FnZVVwZGF0ZWRIABI1Cg9jaGFubmVsX2NoYW5nZWQYDCABKAsyGi5jb21wYXNzLnYxLkNoYW5uZWxDaGFuZ2VkSAASQAoVY2hhbm5lbF9ncm91cF9jaGFuZ2VkGA0gASgLMh8uY29tcGFzcy52MS5DaGFubmVsR3JvdXBDaGFuZ2VkSAASNQoPYWNjb3VudF9jaGFuZ2VkGA4gASgLMhouY29tcGFzcy52MS5BY2NvdW50Q2hhbmdlZEgAEkQKF2FnZW50X3dvcmtzcGFjZV9jaGFuZ2VkGA8gASgLMiEuY29tcGFzcy52MS5BZ2VudFdvcmtzcGFjZUNoYW5nZWRIABI6Cg9yZXN5bmNfcmVxdWlyZWQYECABKAsyHy5jb21wYXNzLnYxLkNvbW1zUmVzeW5jUmVxdWlyZWRIABJCChZhZ2VudF9wcmVzZW5jZV9jaGFuZ2VkGBEgASgLMiAuY29tcGFzcy52MS5BZ2VudFByZXNlbmNlQ2hhbmdlZEgAEjMKDnRvcGljX3Vwc2VydGVkGBIgASgLMhkuY29tcGFzcy52MS5Ub3BpY1Vwc2VydGVkSABCCQoHcGF5bG9hZCI1Cg1NZXNzYWdlUG9zdGVkEiQKB21lc3NhZ2UYASABKAsyEy5jb21wYXNzLnYxLk1lc3NhZ2UiNgoOTWVzc2FnZVVwZGF0ZWQSJAoHbWVzc2FnZRgBIAEoCzITLmNvbXBhc3MudjEuTWVzc2FnZSIxCg1Ub3BpY1Vwc2VydGVkEiAKBXRvcGljGAEgASgLMhEuY29tcGFzcy52MS5Ub3BpYyJTCg5DaGFubmVsQ2hhbmdlZBIkCgdjaGFubmVsGAEgASgLMhMuY29tcGFzcy52MS5DaGFubmVsEhsKE3JlbW92ZWRfYWNjb3VudF9pZHMYAiADKAkiPgoTQ2hhbm5lbEdyb3VwQ2hhbmdlZBInCgVncm91cBgBIAEoCzIYLmNvbXBhc3MudjEuQ2hhbm5lbEdyb3VwIjYKDkFjY291bnRDaGFuZ2VkEiQKB2FjY291bnQYASABKAsyEy5jb21wYXNzLnYxLkFjY291bnQiRgoVQWdlbnRXb3Jrc3BhY2VDaGFuZ2VkEi0KCXdvcmtzcGFjZRgBIAEoCzIaLmNvbXBhc3MudjEuQWdlbnRXb3Jrc3BhY2UiFQoTQ29tbXNSZXN5bmNSZXF1aXJlZCJvChRBZ2VudFByZXNlbmNlQ2hhbmdlZBIYChBhZ2VudF9hY2NvdW50X2lkGAEgASgJEisKCHByZXNlbmNlGAIgASgOMhkuY29tcGFzcy52MS5BZ2VudFByZXNlbmNlEhAKCGFjdGl2aXR5GAMgASgJIjkKEUNyZWF0ZVVzZXJSZXF1ZXN0Eg4KBmhhbmRsZRgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkiOgoSQ3JlYXRlVXNlclJlc3BvbnNlEiQKB2FjY291bnQYASABKAsyEy5jb21wYXNzLnYxLkFjY291bnQiUQoSQ3JlYXRlQWdlbnRSZXF1ZXN0Eg4KBmhhbmRsZRgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSFQoNcGFyZW50X2hhbmRsZRgDIAEoCSI7ChNDcmVhdGVBZ2VudFJlc3BvbnNlEiQKB2FjY291bnQYASABKAsyEy5jb21wYXNzLnYxLkFjY291bnQiKwoTTGlzdEFjY291bnRzUmVxdWVzdBIUCgxzbmFwc2hvdF9zZXEYASABKAQiPQoUTGlzdEFjY291bnRzUmVzcG9uc2USJQoIYWNjb3VudHMYASADKAsyEy5jb21wYXNzLnYxLkFjY291bnQiegoZQ3JlYXRlQ2hhbm5lbEdyb3VwUmVxdWVzdBIMCgRuYW1lGAEgASgJEhcKD3BhcmVudF9ncm91cF9pZBgCIAEoCRI2Cgp2aXNpYmlsaXR5GAMgASgOMiIuY29tcGFzcy52MS5DaGFubmVsR3JvdXBWaXNpYmlsaXR5IkUKGkNyZWF0ZUNoYW5uZWxHcm91cFJlc3BvbnNlEicKBWdyb3VwGAEgASgLMhguY29tcGFzcy52MS5DaGFubmVsR3JvdXAiMAoYTGlzdENoYW5uZWxHcm91cHNSZXF1ZXN0EhQKDHNuYXBzaG90X3NlcRgBIAEoBCJFChlMaXN0Q2hhbm5lbEdyb3Vwc1Jlc3BvbnNlEigKBmdyb3VwcxgBIAMoCzIYLmNvbXBhc3MudjEuQ2hhbm5lbEdyb3VwIisKE0xpc3RDaGFubmVsc1JlcXVlc3QSFAoMc25hcHNob3Rfc2VxGAEgASgEIj0KFExpc3RDaGFubmVsc1Jlc3BvbnNlEiUKCGNoYW5uZWxzGAEgAygLMhMuY29tcGFzcy52MS5DaGFubmVsInUKFENyZWF0ZUNoYW5uZWxSZXF1ZXN0EgwKBG5hbWUYASABKAkSEAoIZ3JvdXBfaWQYAiABKAkSJQoEa2luZBgDIAEoDjIXLmNvbXBhc3MudjEuQ2hhbm5lbEtpbmQSFgoObWVtYmVyX2hhbmRsZXMYBCADKAkiPQoVQ3JlYXRlQ2hhbm5lbFJlc3BvbnNlEiQKB2NoYW5uZWwYASABKAsyEy5jb21wYXNzLnYxLkNoYW5uZWwiwgEKG1VwZGF0ZUNoYW5uZWxNZW1iZXJzUmVxdWVzdBISCgpjaGFubmVsX2lkGAEgASgJEhoKEmFkZF9tZW1iZXJfaGFuZGxlcxgCIAMoCRIdChVyZW1vdmVfbWVtYmVyX2hhbmRsZXMYAyADKAkSGQoRc3Vic2NyaWJlX2hhbmRsZXMYBCADKAkSGwoTdW5zdWJzY3JpYmVfaGFuZGxlcxgFIAMoCRIcChRjb252ZXJ0X2NoYW5uZWxfbmFtZRgGIAEoCSJEChxVcGRhdGVDaGFubmVsTWVtYmVyc1Jlc3BvbnNlEiQKB2NoYW5uZWwYASABKAsyEy5jb21wYXNzLnYxLkNoYW5uZWwiJAoNT3BlbkRNUmVxdWVzdBITCgtwZWVyX2hhbmRsZRgBIAEoCSJHCg5PcGVuRE1SZXNwb25zZRIkCgdjaGFubmVsGAEgASgLMhMuY29tcGFzcy52MS5DaGFubmVsEg8KB2NyZWF0ZWQYAiABKAgiRwoUUmVwYXJlbnRBZ2VudFJlcXVlc3QSFAoMYWdlbnRfaGFuZGxlGAEgASgJEhkKEW5ld19wYXJlbnRfaGFuZGxlGAIgASgJIj0KFVJlcGFyZW50QWdlbnRSZXNwb25zZRIkCgdhY2NvdW50GAEgASgLMhMuY29tcGFzcy52MS5BY2NvdW50IpcBChdTZXRDaGFubmVsUG9saWN5UmVxdWVzdBISCgpjaGFubmVsX2lkGAEgASgJEjIKC3Bvc3RfcG9saWN5GAIgASgOMh0uY29tcGFzcy52MS5DaGFubmVsUG9zdFBvbGljeRIUCgxvd25lcl9oYW5kbGUYAyABKAkSHgoWbWFuZGF0b3J5X3N1YnNjcmlwdGlvbhgEIAEoCCJAChhTZXRDaGFubmVsUG9saWN5UmVzcG9uc2USJAoHY2hhbm5lbBgBIAEoCzITLmNvbXBhc3MudjEuQ2hhbm5lbCJSChBHZXRSb3N0ZXJSZXF1ZXN0EiYKBXNjb3BlGAEgASgOMhcuY29tcGFzcy52MS5Sb3N0ZXJTY29wZRIWCg52YW50YWdlX2hhbmRsZRgCIAEoCSI9ChFHZXRSb3N0ZXJSZXNwb25zZRIoCgdlbnRyaWVzGAEgAygLMhcuY29tcGFzcy52MS5Sb3N0ZXJFbnRyeSLCAQoLUm9zdGVyRW50cnkSGAoQYWdlbnRfYWNjb3VudF9pZBgBIAEoCRIOCgZoYW5kbGUYAiABKAkSFAoMZGlzcGxheV9uYW1lGAMgASgJEhcKD3BhcmVudF9hZ2VudF9pZBgEIAEoCRIrCghwcmVzZW5jZRgFIAEoDjIZLmNvbXBhc3MudjEuQWdlbnRQcmVzZW5jZRIQCghhY3Rpdml0eRgGIAEoCRIbChNhY3Rpdml0eV9hdF91bml4X21zGAcgASgDIncKGFVwZGF0ZVBpbm5lZEJvYXJkUmVxdWVzdBISCgpjaGFubmVsX2lkGAEgASgJEiUKA3BpbhgCIAEoCzIWLmNvbXBhc3MudjEuUGluTWVzc2FnZUgAEhoKEHVucGluX21lc3NhZ2VfaWQYAyABKAlIAEIECgJvcCI8CgpQaW5NZXNzYWdlEhIKCm1lc3NhZ2VfaWQYASABKAkSGgoScmVwbGFjZV9tZXNzYWdlX2lkGAIgASgJIkEKGVVwZGF0ZVBpbm5lZEJvYXJkUmVzcG9uc2USJAoHY2hhbm5lbBgBIAEoCzITLmNvbXBhc3MudjEuQ2hhbm5lbCIxChlPcGVuQWdlbnRXb3Jrc3BhY2VSZXF1ZXN0EhQKDGFnZW50X2hhbmRsZRgBIAEoCSJLChpPcGVuQWdlbnRXb3Jrc3BhY2VSZXNwb25zZRItCgl3b3Jrc3BhY2UYASABKAsyGi5jb21wYXNzLnYxLkFnZW50V29ya3NwYWNlIooBChNMaXN0TWVzc2FnZXNSZXF1ZXN0EhQKCmNoYW5uZWxfaWQYASABKAlIABINCgVsaW1pdBgCIAEoDRIZChFiZWZvcmVfbWVzc2FnZV9pZBgDIAEoCRIUCgxzbmFwc2hvdF9zZXEYBCABKAQSEAoIdG9waWNfaWQYBSABKAlCCwoJY29udGFpbmVyIj0KFExpc3RNZXNzYWdlc1Jlc3BvbnNlEiUKCG1lc3NhZ2VzGAEgAygLMhMuY29tcGFzcy52MS5NZXNzYWdlIsUBChJQb3N0TWVzc2FnZVJlcXVlc3QSFAoKY2hhbm5lbF9pZBgBIAEoCUgAEigKBmJsb2NrcxgCIAMoCzIYLmNvbXBhc3MudjEuTWVzc2FnZUJsb2NrEhIKCHRvcGljX2lkGAMgASgJSAESFAoKdG9waWNfbmFtZRgEIAEoCUgBEhkKEWNsaWVudF9yZXF1ZXN0X2lkGAUgASgJEhQKDGNyZWF0ZV90b3BpYxgGIAEoCEILCgljb250YWluZXJCBwoFdG9waWMiOwoTUG9zdE1lc3NhZ2VSZXNwb25zZRIkCgdtZXNzYWdlGAEgASgLMhMuY29tcGFzcy52MS5NZXNzYWdlIkEKEUxpc3RUb3BpY3NSZXF1ZXN0EhIKCmNoYW5uZWxfaWQYASABKAkSGAoQaW5jbHVkZV9hcmNoaXZlZBgCIAEoCCI3ChJMaXN0VG9waWNzUmVzcG9uc2USIQoGdG9waWNzGAEgAygLMhEuY29tcGFzcy52MS5Ub3BpYyJmChJVcGRhdGVUb3BpY1JlcXVlc3QSEAoIdG9waWNfaWQYASABKAkSEQoEbmFtZRgCIAEoCUgAiAEBEhUKCGFyY2hpdmVkGAMgASgISAGIAQFCBwoFX25hbWVCCwoJX2FyY2hpdmVkIjcKE1VwZGF0ZVRvcGljUmVzcG9uc2USIAoFdG9waWMYASABKAsyES5jb21wYXNzLnYxLlRvcGljIlUKE1Jlc3BvbmRUb0Fza1JlcXVlc3QSDgoGYXNrX2lkGAEgASgJEi4KB2Fuc3dlcnMYAiADKAsyHS5jb21wYXNzLnYxLkFza1F1ZXN0aW9uQW5zd2VyIlgKEUFza1F1ZXN0aW9uQW5zd2VyEhMKC3F1ZXN0aW9uX2lkGAEgASgJEhkKEWNob3Nlbl9vcHRpb25faWRzGAIgAygJEhMKC2N1c3RvbV90ZXh0GAMgASgJIhYKFFJlc3BvbmRUb0Fza1Jlc3BvbnNlImoKFVNlYXJjaE1lc3NhZ2VzUmVxdWVzdBINCgVxdWVyeRgBIAEoCRIUCgpjaGFubmVsX2lkGAIgASgJSAASDQoFbGltaXQYAyABKA0SFAoMc25hcHNob3Rfc2VxGAQgASgEQgcKBXNjb3BlIj8KFlNlYXJjaE1lc3NhZ2VzUmVzcG9uc2USJQoIbWVzc2FnZXMYASADKAsyEy5jb21wYXNzLnYxLk1lc3NhZ2UiQgoVU3Vic2NyaWJlQ29tbXNSZXF1ZXN0EhEKCXNpbmNlX3NlcRgBIAEoBBIWCg5pbnN0YW5jZV9lcG9jaBgCIAEoBCo1CghVc2VyUm9sZRIUChBVU0VSX1JPTEVfTUVNQkVSEAASEwoPVVNFUl9ST0xFX0FETUlOEAEqYQoWQ2hhbm5lbEdyb3VwVmlzaWJpbGl0eRIiCh5DSEFOTkVMX0dST1VQX1ZJU0lCSUxJVFlfT1dORVIQABIjCh9DSEFOTkVMX0dST1VQX1ZJU0lCSUxJVFlfU0hBUkVEEAEqVQoRQ2hhbm5lbFBvc3RQb2xpY3kSHAoYQ0hBTk5FTF9QT1NUX1BPTElDWV9PUEVOEAASIgoeQ0hBTk5FTF9QT1NUX1BPTElDWV9PV05FUl9PTkxZEAEqWwoLQ2hhbm5lbEtpbmQSGAoUQ0hBTk5FTF9LSU5EX0NIQU5ORUwQABITCg9DSEFOTkVMX0tJTkRfRE0QARIdChVDSEFOTkVMX0tJTkRfR1JPVVBfRE0QAhoCCAEqnAEKDUFnZW50UHJlc2VuY2USHgoaQUdFTlRfUFJFU0VOQ0VfVU5TUEVDSUZJRUQQABIXChNBR0VOVF9QUkVTRU5DRV9JRExFEAESGgoWQUdFTlRfUFJFU0VOQ0VfV09SS0lORxACEhoKFkFHRU5UX1BSRVNFTkNFX1dBSVRJTkcQAxIaChZBR0VOVF9QUkVTRU5DRV9PRkZMSU5FEAQqXgoLUm9zdGVyU2NvcGUSHQoZUk9TVEVSX1NDT1BFX05FSUdIQk9SSE9PRBAAEhgKFFJPU1RFUl9TQ09QRV9TVUJUUkVFEAESFgoSUk9TVEVSX1NDT1BFX09XTkVSEAIypw4KDENvbW1zU2VydmljZRJLCgpDcmVhdGVVc2VyEh0uY29tcGFzcy52MS5DcmVhdGVVc2VyUmVxdWVzdBoeLmNvbXBhc3MudjEuQ3JlYXRlVXNlclJlc3BvbnNlEk4KC0NyZWF0ZUFnZW50Eh4uY29tcGFzcy52MS5DcmVhdGVBZ2VudFJlcXVlc3QaHy5jb21wYXNzLnYxLkNyZWF0ZUFnZW50UmVzcG9uc2USUQoMTGlzdEFjY291bnRzEh8uY29tcGFzcy52MS5MaXN0QWNjb3VudHNSZXF1ZXN0GiAuY29tcGFzcy52MS5MaXN0QWNjb3VudHNSZXNwb25zZRJjChJDcmVhdGVDaGFubmVsR3JvdXASJS5jb21wYXNzLnYxLkNyZWF0ZUNoYW5uZWxHcm91cFJlcXVlc3QaJi5jb21wYXNzLnYxLkNyZWF0ZUNoYW5uZWxHcm91cFJlc3BvbnNlEmAKEUxpc3RDaGFubmVsR3JvdXBzEiQuY29tcGFzcy52MS5MaXN0Q2hhbm5lbEdyb3Vwc1JlcXVlc3QaJS5jb21wYXNzLnYxLkxpc3RDaGFubmVsR3JvdXBzUmVzcG9uc2USUQoMTGlzdENoYW5uZWxzEh8uY29tcGFzcy52MS5MaXN0Q2hhbm5lbHNSZXF1ZXN0GiAuY29tcGFzcy52MS5MaXN0Q2hhbm5lbHNSZXNwb25zZRJUCg1DcmVhdGVDaGFubmVsEiAuY29tcGFzcy52MS5DcmVhdGVDaGFubmVsUmVxdWVzdBohLmNvbXBhc3MudjEuQ3JlYXRlQ2hhbm5lbFJlc3BvbnNlEmkKFFVwZGF0ZUNoYW5uZWxNZW1iZXJzEicuY29tcGFzcy52MS5VcGRhdGVDaGFubmVsTWVtYmVyc1JlcXVlc3QaKC5jb21wYXNzLnYxLlVwZGF0ZUNoYW5uZWxNZW1iZXJzUmVzcG9uc2USPwoGT3BlbkRNEhkuY29tcGFzcy52MS5PcGVuRE1SZXF1ZXN0GhouY29tcGFzcy52MS5PcGVuRE1SZXNwb25zZRJUCg1SZXBhcmVudEFnZW50EiAuY29tcGFzcy52MS5SZXBhcmVudEFnZW50UmVxdWVzdBohLmNvbXBhc3MudjEuUmVwYXJlbnRBZ2VudFJlc3BvbnNlEmMKEk9wZW5BZ2VudFdvcmtzcGFjZRIlLmNvbXBhc3MudjEuT3BlbkFnZW50V29ya3NwYWNlUmVxdWVzdBomLmNvbXBhc3MudjEuT3BlbkFnZW50V29ya3NwYWNlUmVzcG9uc2USUQoMTGlzdE1lc3NhZ2VzEh8uY29tcGFzcy52MS5MaXN0TWVzc2FnZXNSZXF1ZXN0GiAuY29tcGFzcy52MS5MaXN0TWVzc2FnZXNSZXNwb25zZRJOCgtQb3N0TWVzc2FnZRIeLmNvbXBhc3MudjEuUG9zdE1lc3NhZ2VSZXF1ZXN0Gh8uY29tcGFzcy52MS5Qb3N0TWVzc2FnZVJlc3BvbnNlEksKCkxpc3RUb3BpY3MSHS5jb21wYXNzLnYxLkxpc3RUb3BpY3NSZXF1ZXN0Gh4uY29tcGFzcy52MS5MaXN0VG9waWNzUmVzcG9uc2USTgoLVXBkYXRlVG9waWMSHi5jb21wYXNzLnYxLlVwZGF0ZVRvcGljUmVxdWVzdBofLmNvbXBhc3MudjEuVXBkYXRlVG9waWNSZXNwb25zZRJRCgxSZXNwb25kVG9Bc2sSHy5jb21wYXNzLnYxLlJlc3BvbmRUb0Fza1JlcXVlc3QaIC5jb21wYXNzLnYxLlJlc3BvbmRUb0Fza1Jlc3BvbnNlElcKDlNlYXJjaE1lc3NhZ2VzEiEuY29tcGFzcy52MS5TZWFyY2hNZXNzYWdlc1JlcXVlc3QaIi5jb21wYXNzLnYxLlNlYXJjaE1lc3NhZ2VzUmVzcG9uc2USXQoQU2V0Q2hhbm5lbFBvbGljeRIjLmNvbXBhc3MudjEuU2V0Q2hhbm5lbFBvbGljeVJlcXVlc3QaJC5jb21wYXNzLnYxLlNldENoYW5uZWxQb2xpY3lSZXNwb25zZRJICglHZXRSb3N0ZXISHC5jb21wYXNzLnYxLkdldFJvc3RlclJlcXVlc3QaHS5jb21wYXNzLnYxLkdldFJvc3RlclJlc3BvbnNlEmAKEVVwZGF0ZVBpbm5lZEJvYXJkEiQuY29tcGFzcy52MS5VcGRhdGVQaW5uZWRCb2FyZFJlcXVlc3QaJS5jb21wYXNzLnYxLlVwZGF0ZVBpbm5lZEJvYXJkUmVzcG9uc2USWQoOU3Vic2NyaWJlQ29tbXMSIS5jb21wYXNzLnYxLlN1YnNjcmliZUNvbW1zUmVxdWVzdBoiLmNvbXBhc3MudjEuU3Vic2NyaWJlQ29tbXNSZXNwb25zZTABYgZwcm90bzM"); /** * An account in the communication layer: a human user or an owned agent. Both @@ -1454,6 +1454,18 @@ export type UpdateChannelMembersRequest = Message$1<"compass.v1.UpdateChannelMem * @generated from field: repeated string unsubscribe_handles = 5; */ unsubscribeHandles: string[]; + + /** + * Non-empty converts a two-party DM into a named CHANNEL as part of the same + * member update: required to add a third party to a kind=DM channel (a bare + * add on a DM is INVALID_ARGUMENT). The convert sets kind=CHANNEL, renames + * the channel to this value, and detaches it from the reserved DM group — + * freeing the DM's deterministic name so a future open_dm mints a fresh pair + * DM. Ignored (no-op) for non-DM channels. + * + * @generated from field: string convert_channel_name = 6; + */ + convertChannelName: string; }; /** @@ -1480,6 +1492,53 @@ export type UpdateChannelMembersResponse = Message$1<"compass.v1.UpdateChannelMe export const UpdateChannelMembersResponseSchema: GenMessage = /*@__PURE__*/ messageDesc(file_compass_v1_comms, 40); +/** + * @generated from message compass.v1.OpenDMRequest + */ +export type OpenDMRequest = Message$1<"compass.v1.OpenDMRequest"> & { + /** + * The peer agent's handle (owner-namespaced per DL-271). The server resolves + * it and enforces same-owner; unknown and cross-owner both return NOT_FOUND. + * A self-handle is INVALID_ARGUMENT. + * + * @generated from field: string peer_handle = 1; + */ + peerHandle: string; +}; + +/** + * Describes the message compass.v1.OpenDMRequest. + * Use `create(OpenDMRequestSchema)` to create a new message. + */ +export const OpenDMRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_compass_v1_comms, 41); + +/** + * @generated from message compass.v1.OpenDMResponse + */ +export type OpenDMResponse = Message$1<"compass.v1.OpenDMResponse"> & { + /** + * The resolved DM channel; id-typed wire per DL-270, tools render its name. + * + * @generated from field: compass.v1.Channel channel = 1; + */ + channel?: Channel | undefined; + + /** + * True when this call minted the channel; false on a resume. + * + * @generated from field: bool created = 2; + */ + created: boolean; +}; + +/** + * Describes the message compass.v1.OpenDMResponse. + * Use `create(OpenDMResponseSchema)` to create a new message. + */ +export const OpenDMResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_compass_v1_comms, 42); + /** * @generated from message compass.v1.ReparentAgentRequest */ @@ -1506,7 +1565,7 @@ export type ReparentAgentRequest = Message$1<"compass.v1.ReparentAgentRequest"> * Use `create(ReparentAgentRequestSchema)` to create a new message. */ export const ReparentAgentRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 41); + messageDesc(file_compass_v1_comms, 43); /** * @generated from message compass.v1.ReparentAgentResponse @@ -1523,7 +1582,7 @@ export type ReparentAgentResponse = Message$1<"compass.v1.ReparentAgentResponse" * Use `create(ReparentAgentResponseSchema)` to create a new message. */ export const ReparentAgentResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 42); + messageDesc(file_compass_v1_comms, 44); /** * @generated from message compass.v1.SetChannelPolicyRequest @@ -1564,7 +1623,7 @@ export type SetChannelPolicyRequest = Message$1<"compass.v1.SetChannelPolicyRequ * Use `create(SetChannelPolicyRequestSchema)` to create a new message. */ export const SetChannelPolicyRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 43); + messageDesc(file_compass_v1_comms, 45); /** * @generated from message compass.v1.SetChannelPolicyResponse @@ -1583,7 +1642,7 @@ export type SetChannelPolicyResponse = Message$1<"compass.v1.SetChannelPolicyRes * Use `create(SetChannelPolicyResponseSchema)` to create a new message. */ export const SetChannelPolicyResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 44); + messageDesc(file_compass_v1_comms, 46); /** * @generated from message compass.v1.GetRosterRequest @@ -1611,7 +1670,7 @@ export type GetRosterRequest = Message$1<"compass.v1.GetRosterRequest"> & { * Use `create(GetRosterRequestSchema)` to create a new message. */ export const GetRosterRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 45); + messageDesc(file_compass_v1_comms, 47); /** * @generated from message compass.v1.GetRosterResponse @@ -1628,7 +1687,7 @@ export type GetRosterResponse = Message$1<"compass.v1.GetRosterResponse"> & { * Use `create(GetRosterResponseSchema)` to create a new message. */ export const GetRosterResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 46); + messageDesc(file_compass_v1_comms, 48); /** * One agent in a roster: its identity, tree position, and joined presence + @@ -1678,7 +1737,7 @@ export type RosterEntry = Message$1<"compass.v1.RosterEntry"> & { * Use `create(RosterEntrySchema)` to create a new message. */ export const RosterEntrySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 47); + messageDesc(file_compass_v1_comms, 49); /** * @generated from message compass.v1.UpdatePinnedBoardRequest @@ -1718,7 +1777,7 @@ export type UpdatePinnedBoardRequest = Message$1<"compass.v1.UpdatePinnedBoardRe * Use `create(UpdatePinnedBoardRequestSchema)` to create a new message. */ export const UpdatePinnedBoardRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 48); + messageDesc(file_compass_v1_comms, 50); /** * Pin an existing message. message_id must already live in a topic of the @@ -1744,7 +1803,7 @@ export type PinMessage = Message$1<"compass.v1.PinMessage"> & { * Use `create(PinMessageSchema)` to create a new message. */ export const PinMessageSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 49); + messageDesc(file_compass_v1_comms, 51); /** * @generated from message compass.v1.UpdatePinnedBoardResponse @@ -1763,7 +1822,7 @@ export type UpdatePinnedBoardResponse = Message$1<"compass.v1.UpdatePinnedBoardR * Use `create(UpdatePinnedBoardResponseSchema)` to create a new message. */ export const UpdatePinnedBoardResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 50); + messageDesc(file_compass_v1_comms, 52); /** * @generated from message compass.v1.OpenAgentWorkspaceRequest @@ -1783,7 +1842,7 @@ export type OpenAgentWorkspaceRequest = Message$1<"compass.v1.OpenAgentWorkspace * Use `create(OpenAgentWorkspaceRequestSchema)` to create a new message. */ export const OpenAgentWorkspaceRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 51); + messageDesc(file_compass_v1_comms, 53); /** * @generated from message compass.v1.OpenAgentWorkspaceResponse @@ -1800,7 +1859,7 @@ export type OpenAgentWorkspaceResponse = Message$1<"compass.v1.OpenAgentWorkspac * Use `create(OpenAgentWorkspaceResponseSchema)` to create a new message. */ export const OpenAgentWorkspaceResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 52); + messageDesc(file_compass_v1_comms, 54); /** * @generated from message compass.v1.ListMessagesRequest @@ -1856,7 +1915,7 @@ export type ListMessagesRequest = Message$1<"compass.v1.ListMessagesRequest"> & * Use `create(ListMessagesRequestSchema)` to create a new message. */ export const ListMessagesRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 53); + messageDesc(file_compass_v1_comms, 55); /** * @generated from message compass.v1.ListMessagesResponse @@ -1875,7 +1934,7 @@ export type ListMessagesResponse = Message$1<"compass.v1.ListMessagesResponse"> * Use `create(ListMessagesResponseSchema)` to create a new message. */ export const ListMessagesResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 54); + messageDesc(file_compass_v1_comms, 56); /** * @generated from message compass.v1.PostMessageRequest @@ -1953,7 +2012,7 @@ export type PostMessageRequest = Message$1<"compass.v1.PostMessageRequest"> & { * Use `create(PostMessageRequestSchema)` to create a new message. */ export const PostMessageRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 55); + messageDesc(file_compass_v1_comms, 57); /** * @generated from message compass.v1.PostMessageResponse @@ -1970,7 +2029,7 @@ export type PostMessageResponse = Message$1<"compass.v1.PostMessageResponse"> & * Use `create(PostMessageResponseSchema)` to create a new message. */ export const PostMessageResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 56); + messageDesc(file_compass_v1_comms, 58); /** * @generated from message compass.v1.ListTopicsRequest @@ -1996,7 +2055,7 @@ export type ListTopicsRequest = Message$1<"compass.v1.ListTopicsRequest"> & { * Use `create(ListTopicsRequestSchema)` to create a new message. */ export const ListTopicsRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 57); + messageDesc(file_compass_v1_comms, 59); /** * @generated from message compass.v1.ListTopicsResponse @@ -2013,7 +2072,7 @@ export type ListTopicsResponse = Message$1<"compass.v1.ListTopicsResponse"> & { * Use `create(ListTopicsResponseSchema)` to create a new message. */ export const ListTopicsResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 58); + messageDesc(file_compass_v1_comms, 60); /** * @generated from message compass.v1.UpdateTopicRequest @@ -2047,7 +2106,7 @@ export type UpdateTopicRequest = Message$1<"compass.v1.UpdateTopicRequest"> & { * Use `create(UpdateTopicRequestSchema)` to create a new message. */ export const UpdateTopicRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 59); + messageDesc(file_compass_v1_comms, 61); /** * @generated from message compass.v1.UpdateTopicResponse @@ -2064,7 +2123,7 @@ export type UpdateTopicResponse = Message$1<"compass.v1.UpdateTopicResponse"> & * Use `create(UpdateTopicResponseSchema)` to create a new message. */ export const UpdateTopicResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 60); + messageDesc(file_compass_v1_comms, 62); /** * @generated from message compass.v1.RespondToAskRequest @@ -2090,7 +2149,7 @@ export type RespondToAskRequest = Message$1<"compass.v1.RespondToAskRequest"> & * Use `create(RespondToAskRequestSchema)` to create a new message. */ export const RespondToAskRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 61); + messageDesc(file_compass_v1_comms, 63); /** * The answer to one AskQuestion. @@ -2124,7 +2183,7 @@ export type AskQuestionAnswer = Message$1<"compass.v1.AskQuestionAnswer"> & { * Use `create(AskQuestionAnswerSchema)` to create a new message. */ export const AskQuestionAnswerSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 62); + messageDesc(file_compass_v1_comms, 64); /** * @generated from message compass.v1.RespondToAskResponse @@ -2137,7 +2196,7 @@ export type RespondToAskResponse = Message$1<"compass.v1.RespondToAskResponse"> * Use `create(RespondToAskResponseSchema)` to create a new message. */ export const RespondToAskResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 63); + messageDesc(file_compass_v1_comms, 65); /** * @generated from message compass.v1.SearchMessagesRequest @@ -2183,7 +2242,7 @@ export type SearchMessagesRequest = Message$1<"compass.v1.SearchMessagesRequest" * Use `create(SearchMessagesRequestSchema)` to create a new message. */ export const SearchMessagesRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 64); + messageDesc(file_compass_v1_comms, 66); /** * @generated from message compass.v1.SearchMessagesResponse @@ -2202,7 +2261,7 @@ export type SearchMessagesResponse = Message$1<"compass.v1.SearchMessagesRespons * Use `create(SearchMessagesResponseSchema)` to create a new message. */ export const SearchMessagesResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 65); + messageDesc(file_compass_v1_comms, 67); /** * @generated from message compass.v1.SubscribeCommsRequest @@ -2230,7 +2289,7 @@ export type SubscribeCommsRequest = Message$1<"compass.v1.SubscribeCommsRequest" * Use `create(SubscribeCommsRequestSchema)` to create a new message. */ export const SubscribeCommsRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_compass_v1_comms, 66); + messageDesc(file_compass_v1_comms, 68); /** * The user permission roles, expandable later. A regular member is the default @@ -2312,8 +2371,11 @@ export const ChannelPostPolicySchema: GenEnum = /*@__PURE__*/ /** * A channel's kind. A plain channel is the default; a DM is a direct - * conversation (human↔human, human↔agent, or agent↔agent) that widens into a - * GROUP_DM as members are added — an agent's primary surface is a channel/DM. + * conversation (human↔human, human↔agent, or agent↔agent) between exactly two + * parties — an agent's primary surface is a channel/DM. A DM never widens: a + * third party converts it to a named CHANNEL (UpdateChannelMembers with + * convert_channel_name), which frees the DM's deterministic name so a future + * open_dm mints a fresh pair DM. * * @generated from enum compass.v1.ChannelKind */ @@ -2329,7 +2391,11 @@ export enum ChannelKind { DM = 1, /** - * @generated from enum value: CHANNEL_KIND_GROUP_DM = 2; + * Retired: never produced. A DM converts to a named CHANNEL on third-party + * add rather than widening. The number is not reusable. + * + * @generated from enum value: CHANNEL_KIND_GROUP_DM = 2 [deprecated = true]; + * @deprecated */ GROUP_DM = 2, } @@ -2509,7 +2575,8 @@ export const CommsService: GenService<{ /** * Add or remove channel members and flip a member's subscribe opt-in — * caller-authorized against channel visibility. Emits ChannelChanged. One RPC - * covers join, subscribe-toggle, DM-expansion, and share-replacement. + * covers join, subscribe-toggle, DM-to-channel conversion (convert_channel_name), + * and share-replacement. * * @generated from rpc compass.v1.CommsService.UpdateChannelMembers */ @@ -2518,6 +2585,22 @@ export const CommsService: GenService<{ input: typeof UpdateChannelMembersRequestSchema; output: typeof UpdateChannelMembersResponseSchema; }, + /** + * Open (or fetch) the two-party DM channel between the caller and a peer, + * addressed by the peer's owner-namespaced handle. Resolve-or-create and + * idempotent: the channel is minted on first open in the caller-owner's + * reserved DM group under a deterministic sorted-handle name, and returned + * on every subsequent open. Same-owner only — unknown and cross-owner both + * return NOT_FOUND; a self-open is INVALID_ARGUMENT. Emits ChannelChanged on + * create. + * + * @generated from rpc compass.v1.CommsService.OpenDM + */ + openDM: { + methodKind: "unary"; + input: typeof OpenDMRequestSchema; + output: typeof OpenDMResponseSchema; + }, /** * Re-parent an agent in the agent tree, or promote it to a root (empty * new_parent_agent_id) — caller-authorized against the agent's owner. The diff --git a/proto/compass/v1/agent_gateway.proto b/proto/compass/v1/agent_gateway.proto index 2e041952..b798a338 100644 --- a/proto/compass/v1/agent_gateway.proto +++ b/proto/compass/v1/agent_gateway.proto @@ -114,6 +114,10 @@ message CommsCallRequest { CreateChannelRequest create_channel = 7; UpdateChannelMembersRequest update_members = 8; CreateChannelGroupRequest create_channel_group = 9; + // 10 is trigger_traceparent (message-level, below); open_dm takes the + // next-free arm above it (design Global Constraints: never renumber down + // into an org-management slot). + OpenDMRequest open_dm = 11; } // The W3C `traceparent` of the delivered message that triggered this outbound // call, re-attached by the agent so the Server can LINK the reply's fresh @@ -131,7 +135,7 @@ message CommsCallRequest { // The result of one comms call, correlated by `call_id`. A successful call sets // the response arm matching the request's operation (`post`, `list`, `roster`, // `set_status`, `pin`, `create_channel`, `update_members`, -// `create_channel_group`); an in-band failure (a tool error — non-member +// `create_channel_group`, `open_dm`); an in-band failure (a tool error — non-member // channel, bad input) sets `error`, which is NOT a transport teardown. The same // message is the `RelayCommsCallResponse.result` payload on the Runner->Server // leg. @@ -147,6 +151,7 @@ message CommsCallResult { CreateChannelResponse create_channel = 8; UpdateChannelMembersResponse update_members = 9; CreateChannelGroupResponse create_channel_group = 10; + OpenDMResponse open_dm = 11; } } @@ -200,6 +205,10 @@ message SpawnPeerResponse { string agent_account_id = 1; string container_name = 2; string session_id = 3; + // The name of the manager↔peer DM channel auto-opened at spawn (R8). Set on + // both the fresh-spawn and resume paths; EMPTY when the post-spawn open + // failed (recoverable next turn via comms_open_dm — never a spawn rollback). + string dm_channel_name = 4; } // Despawn a peer: tear down its container and release its durable placement. diff --git a/proto/compass/v1/comms.proto b/proto/compass/v1/comms.proto index 2663de1b..e9d57c5d 100644 --- a/proto/compass/v1/comms.proto +++ b/proto/compass/v1/comms.proto @@ -61,9 +61,19 @@ service CommsService { // Add or remove channel members and flip a member's subscribe opt-in — // caller-authorized against channel visibility. Emits ChannelChanged. One RPC - // covers join, subscribe-toggle, DM-expansion, and share-replacement. + // covers join, subscribe-toggle, DM-to-channel conversion (convert_channel_name), + // and share-replacement. rpc UpdateChannelMembers(UpdateChannelMembersRequest) returns (UpdateChannelMembersResponse); + // Open (or fetch) the two-party DM channel between the caller and a peer, + // addressed by the peer's owner-namespaced handle. Resolve-or-create and + // idempotent: the channel is minted on first open in the caller-owner's + // reserved DM group under a deterministic sorted-handle name, and returned + // on every subsequent open. Same-owner only — unknown and cross-owner both + // return NOT_FOUND; a self-open is INVALID_ARGUMENT. Emits ChannelChanged on + // create. + rpc OpenDM(OpenDMRequest) returns (OpenDMResponse); + // Re-parent an agent in the agent tree, or promote it to a root (empty // new_parent_agent_id) — caller-authorized against the agent's owner. The // server validates the move (caller authority, same-owner, no cycle) and @@ -271,12 +281,17 @@ message PinnedEntry { } // A channel's kind. A plain channel is the default; a DM is a direct -// conversation (human↔human, human↔agent, or agent↔agent) that widens into a -// GROUP_DM as members are added — an agent's primary surface is a channel/DM. +// conversation (human↔human, human↔agent, or agent↔agent) between exactly two +// parties — an agent's primary surface is a channel/DM. A DM never widens: a +// third party converts it to a named CHANNEL (UpdateChannelMembers with +// convert_channel_name), which frees the DM's deterministic name so a future +// open_dm mints a fresh pair DM. enum ChannelKind { CHANNEL_KIND_CHANNEL = 0; CHANNEL_KIND_DM = 1; - CHANNEL_KIND_GROUP_DM = 2; + // Retired: never produced. A DM converts to a named CHANNEL on third-party + // add rather than widening. The number is not reusable. + CHANNEL_KIND_GROUP_DM = 2 [deprecated = true]; } // ── Agent workspace (D5) ───────────────────────────────────────────────────── @@ -668,12 +683,33 @@ message UpdateChannelMembersRequest { // Members to mark unsubscribed (read-only). Each is a `@handle`; the server // resolves it to an account id; unknown → NOT_FOUND. repeated string unsubscribe_handles = 5; + // Non-empty converts a two-party DM into a named CHANNEL as part of the same + // member update: required to add a third party to a kind=DM channel (a bare + // add on a DM is INVALID_ARGUMENT). The convert sets kind=CHANNEL, renames + // the channel to this value, and detaches it from the reserved DM group — + // freeing the DM's deterministic name so a future open_dm mints a fresh pair + // DM. Ignored (no-op) for non-DM channels. + string convert_channel_name = 6; } message UpdateChannelMembersResponse { Channel channel = 1; } +message OpenDMRequest { + // The peer agent's handle (owner-namespaced per DL-271). The server resolves + // it and enforces same-owner; unknown and cross-owner both return NOT_FOUND. + // A self-handle is INVALID_ARGUMENT. + string peer_handle = 1; +} + +message OpenDMResponse { + // The resolved DM channel; id-typed wire per DL-270, tools render its name. + Channel channel = 1; + // True when this call minted the channel; false on a resume. + bool created = 2; +} + message ReparentAgentRequest { // The agent to move. A `@handle`; the server resolves it to an account id; // unknown → NOT_FOUND.