diff --git a/tools/generator.go b/tools/generator.go index 7690ead63..4bcc82bd3 100644 --- a/tools/generator.go +++ b/tools/generator.go @@ -300,16 +300,23 @@ func (g *Generator) generateEmbeddedActionLinks() { if input := g.Tools[toolId].getInput("$.where." + f.InverseFieldName.Value + ".id.equals"); input != nil { displayOrder++ // embed the tool - tool.Config.EmbeddedActions = append(tool.Config.EmbeddedActions, &toolsproto.ActionLink{ - ToolId: toolId, - Title: &toolsproto.StringTemplate{Template: f.Name}, // e.g. `orderItems` on a getOrder action - Data: []*toolsproto.DataMapping{ + tool.Config.EmbedGroups = append(tool.Config.EmbedGroups, &toolsproto.EmbedGroup{ + Title: &toolsproto.StringTemplate{Template: f.Name}, // e.g. `orderItems` on a getOrder action + DisplayOrder: int32(displayOrder), + Tools: []*toolsproto.EmbedGroup_EmbeddedActionLink{ { - Key: input.FieldLocation.Path, - Path: &toolsproto.JsonPath{Path: tool.getIDResponseFieldPath()}, + ActionLink: &toolsproto.ActionLink{ + ToolId: toolId, + Title: &toolsproto.StringTemplate{Template: f.Name}, // e.g. `orderItems` on a getOrder action + Data: []*toolsproto.DataMapping{ + { + Key: input.FieldLocation.Path, + Path: &toolsproto.JsonPath{Path: tool.getIDResponseFieldPath()}, + }, + }, + }, }, }, - DisplayOrder: int32(displayOrder), }) break diff --git a/tools/proto/tools.pb.go b/tools/proto/tools.pb.go index 1b5de009d..f218980bc 100644 --- a/tools/proto/tools.pb.go +++ b/tools/proto/tools.pb.go @@ -127,8 +127,9 @@ type ActionConfig struct { // All update, deletes, creates, read and write on the same model. // Only for List & Get; empty for mutations EntryActivityActions []*ActionLink `protobuf:"bytes,19,rep,name=entry_activity_actions,json=entryActivityActions,proto3" json:"entry_activity_actions,omitempty"` - // Tools that will be displayed inline (embedded) withing the one that we're defining. - EmbeddedActions []*ActionLink `protobuf:"bytes,20,rep,name=embedded_actions,json=embeddedActions,proto3" json:"embedded_actions,omitempty"` + // Embed groups are tools that will be displayed inline (embedded) withing the one that we're defining. + // These tools will be rendered within this action's configuration, and can have specific config overrides. + EmbedGroups []*EmbedGroup `protobuf:"bytes,20,rep,name=embed_groups,json=embedGroups,proto3" json:"embed_groups,omitempty"` // The action to use to get an entry on this model. Default to a get action on the same model // Used for: // - fetching the record for prefilling a mutation @@ -306,9 +307,9 @@ func (x *ActionConfig) GetEntryActivityActions() []*ActionLink { return nil } -func (x *ActionConfig) GetEmbeddedActions() []*ActionLink { +func (x *ActionConfig) GetEmbedGroups() []*EmbedGroup { if x != nil { - return x.EmbeddedActions + return x.EmbedGroups } return nil } @@ -1055,6 +1056,127 @@ func (x *ActionLink) GetDisplayOrder() int32 { return 0 } +type EmbedGroup struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Title of the group + Title *StringTemplate `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` + DisplayOrder int32 `protobuf:"varint,2,opt,name=display_order,json=displayOrder,proto3" json:"display_order,omitempty"` + // A list of decorated ActionLinks which will be embedded within this group + Tools []*EmbedGroup_EmbeddedActionLink `protobuf:"bytes,3,rep,name=tools,proto3" json:"tools,omitempty"` +} + +func (x *EmbedGroup) Reset() { + *x = EmbedGroup{} + if protoimpl.UnsafeEnabled { + mi := &file_tools_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EmbedGroup) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EmbedGroup) ProtoMessage() {} + +func (x *EmbedGroup) ProtoReflect() protoreflect.Message { + mi := &file_tools_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EmbedGroup.ProtoReflect.Descriptor instead. +func (*EmbedGroup) Descriptor() ([]byte, []int) { + return file_tools_proto_rawDescGZIP(), []int{9} +} + +func (x *EmbedGroup) GetTitle() *StringTemplate { + if x != nil { + return x.Title + } + return nil +} + +func (x *EmbedGroup) GetDisplayOrder() int32 { + if x != nil { + return x.DisplayOrder + } + return 0 +} + +func (x *EmbedGroup) GetTools() []*EmbedGroup_EmbeddedActionLink { + if x != nil { + return x.Tools + } + return nil +} + +type ResponseOverrides struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FieldLocation *JsonPath `protobuf:"bytes,1,opt,name=field_location,json=fieldLocation,proto3" json:"field_location,omitempty"` + // Controls the visibility of the response field + Visible bool `protobuf:"varint,2,opt,name=visible,proto3" json:"visible,omitempty"` +} + +func (x *ResponseOverrides) Reset() { + *x = ResponseOverrides{} + if protoimpl.UnsafeEnabled { + mi := &file_tools_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ResponseOverrides) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResponseOverrides) ProtoMessage() {} + +func (x *ResponseOverrides) ProtoReflect() protoreflect.Message { + mi := &file_tools_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResponseOverrides.ProtoReflect.Descriptor instead. +func (*ResponseOverrides) Descriptor() ([]byte, []int) { + return file_tools_proto_rawDescGZIP(), []int{10} +} + +func (x *ResponseOverrides) GetFieldLocation() *JsonPath { + if x != nil { + return x.FieldLocation + } + return nil +} + +func (x *ResponseOverrides) GetVisible() bool { + if x != nil { + return x.Visible + } + return false +} + type CursorPaginationConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1070,7 +1192,7 @@ type CursorPaginationConfig struct { func (x *CursorPaginationConfig) Reset() { *x = CursorPaginationConfig{} if protoimpl.UnsafeEnabled { - mi := &file_tools_proto_msgTypes[9] + mi := &file_tools_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1083,7 +1205,7 @@ func (x *CursorPaginationConfig) String() string { func (*CursorPaginationConfig) ProtoMessage() {} func (x *CursorPaginationConfig) ProtoReflect() protoreflect.Message { - mi := &file_tools_proto_msgTypes[9] + mi := &file_tools_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1096,7 +1218,7 @@ func (x *CursorPaginationConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use CursorPaginationConfig.ProtoReflect.Descriptor instead. func (*CursorPaginationConfig) Descriptor() ([]byte, []int) { - return file_tools_proto_rawDescGZIP(), []int{9} + return file_tools_proto_rawDescGZIP(), []int{11} } func (x *CursorPaginationConfig) GetStart() *CursorPaginationConfig_FieldConfig { @@ -1152,7 +1274,7 @@ type DataMapping struct { func (x *DataMapping) Reset() { *x = DataMapping{} if protoimpl.UnsafeEnabled { - mi := &file_tools_proto_msgTypes[10] + mi := &file_tools_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1165,7 +1287,7 @@ func (x *DataMapping) String() string { func (*DataMapping) ProtoMessage() {} func (x *DataMapping) ProtoReflect() protoreflect.Message { - mi := &file_tools_proto_msgTypes[10] + mi := &file_tools_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1178,7 +1300,7 @@ func (x *DataMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use DataMapping.ProtoReflect.Descriptor instead. func (*DataMapping) Descriptor() ([]byte, []int) { - return file_tools_proto_rawDescGZIP(), []int{10} + return file_tools_proto_rawDescGZIP(), []int{12} } func (x *DataMapping) GetKey() string { @@ -1209,6 +1331,65 @@ func (x *DataMapping) GetValue() *ScalarValue { return nil } +// When embedding ActionLinks, we need to provide extra-configuration that will override the +// link's target tool configuration +type EmbedGroup_EmbeddedActionLink struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ActionLink *ActionLink `protobuf:"bytes,1,opt,name=action_link,json=actionLink,proto3" json:"action_link,omitempty"` + // The config for responses of the target tool for this embedded action can be altered for + // this embed group + ResponseOverrides []*ResponseOverrides `protobuf:"bytes,2,rep,name=response_overrides,json=responseOverrides,proto3" json:"response_overrides,omitempty"` +} + +func (x *EmbedGroup_EmbeddedActionLink) Reset() { + *x = EmbedGroup_EmbeddedActionLink{} + if protoimpl.UnsafeEnabled { + mi := &file_tools_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EmbedGroup_EmbeddedActionLink) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EmbedGroup_EmbeddedActionLink) ProtoMessage() {} + +func (x *EmbedGroup_EmbeddedActionLink) ProtoReflect() protoreflect.Message { + mi := &file_tools_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EmbedGroup_EmbeddedActionLink.ProtoReflect.Descriptor instead. +func (*EmbedGroup_EmbeddedActionLink) Descriptor() ([]byte, []int) { + return file_tools_proto_rawDescGZIP(), []int{9, 0} +} + +func (x *EmbedGroup_EmbeddedActionLink) GetActionLink() *ActionLink { + if x != nil { + return x.ActionLink + } + return nil +} + +func (x *EmbedGroup_EmbeddedActionLink) GetResponseOverrides() []*ResponseOverrides { + if x != nil { + return x.ResponseOverrides + } + return nil +} + // TBD type CursorPaginationConfig_FieldConfig struct { state protoimpl.MessageState @@ -1222,7 +1403,7 @@ type CursorPaginationConfig_FieldConfig struct { func (x *CursorPaginationConfig_FieldConfig) Reset() { *x = CursorPaginationConfig_FieldConfig{} if protoimpl.UnsafeEnabled { - mi := &file_tools_proto_msgTypes[11] + mi := &file_tools_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1235,7 +1416,7 @@ func (x *CursorPaginationConfig_FieldConfig) String() string { func (*CursorPaginationConfig_FieldConfig) ProtoMessage() {} func (x *CursorPaginationConfig_FieldConfig) ProtoReflect() protoreflect.Message { - mi := &file_tools_proto_msgTypes[11] + mi := &file_tools_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1248,7 +1429,7 @@ func (x *CursorPaginationConfig_FieldConfig) ProtoReflect() protoreflect.Message // Deprecated: Use CursorPaginationConfig_FieldConfig.ProtoReflect.Descriptor instead. func (*CursorPaginationConfig_FieldConfig) Descriptor() ([]byte, []int) { - return file_tools_proto_rawDescGZIP(), []int{9, 0} + return file_tools_proto_rawDescGZIP(), []int{11, 0} } func (x *CursorPaginationConfig_FieldConfig) GetRequestInput() string { @@ -1278,7 +1459,7 @@ type CursorPaginationConfig_PageSizeConfig struct { func (x *CursorPaginationConfig_PageSizeConfig) Reset() { *x = CursorPaginationConfig_PageSizeConfig{} if protoimpl.UnsafeEnabled { - mi := &file_tools_proto_msgTypes[12] + mi := &file_tools_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1291,7 +1472,7 @@ func (x *CursorPaginationConfig_PageSizeConfig) String() string { func (*CursorPaginationConfig_PageSizeConfig) ProtoMessage() {} func (x *CursorPaginationConfig_PageSizeConfig) ProtoReflect() protoreflect.Message { - mi := &file_tools_proto_msgTypes[12] + mi := &file_tools_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1304,7 +1485,7 @@ func (x *CursorPaginationConfig_PageSizeConfig) ProtoReflect() protoreflect.Mess // Deprecated: Use CursorPaginationConfig_PageSizeConfig.ProtoReflect.Descriptor instead. func (*CursorPaginationConfig_PageSizeConfig) Descriptor() ([]byte, []int) { - return file_tools_proto_rawDescGZIP(), []int{9, 1} + return file_tools_proto_rawDescGZIP(), []int{11, 1} } func (x *CursorPaginationConfig_PageSizeConfig) GetRequestInput() string { @@ -1337,7 +1518,7 @@ var file_tools_proto_rawDesc = []byte{ 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, - 0x75, 0x64, 0x69, 0x74, 0x22, 0xa4, 0x09, 0x0a, 0x0c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x75, 0x64, 0x69, 0x74, 0x22, 0x9c, 0x09, 0x0a, 0x0c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x69, 0x63, 0x6f, @@ -1393,157 +1574,182 @@ var file_tools_proto_rawDesc = []byte{ 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x13, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x6e, 0x6b, 0x52, 0x14, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x10, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, - 0x65, 0x64, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, - 0x69, 0x6e, 0x6b, 0x52, 0x0f, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x41, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x40, 0x0a, 0x10, 0x67, 0x65, 0x74, 0x5f, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x6e, - 0x6b, 0x48, 0x04, 0x52, 0x0e, 0x67, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x41, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x13, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x16, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4c, 0x69, 0x6e, 0x6b, 0x48, 0x05, 0x52, 0x11, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x07, - 0x0a, 0x05, 0x5f, 0x69, 0x63, 0x6f, 0x6e, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x74, 0x69, 0x74, 0x6c, - 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x68, 0x65, 0x6c, 0x70, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x42, - 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x13, - 0x0a, 0x11, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xbf, 0x06, 0x0a, 0x12, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x36, 0x0a, 0x0e, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, 0x6f, - 0x6c, 0x73, 0x2e, 0x4a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x52, 0x0d, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x0a, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0b, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, - 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, - 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x64, 0x69, - 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x69, - 0x73, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x76, 0x69, 0x73, - 0x69, 0x62, 0x6c, 0x65, 0x12, 0x37, 0x0a, 0x09, 0x68, 0x65, 0x6c, 0x70, 0x5f, 0x74, 0x65, 0x78, - 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, - 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x48, 0x00, - 0x52, 0x08, 0x68, 0x65, 0x6c, 0x70, 0x54, 0x65, 0x78, 0x74, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, - 0x0d, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x41, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x6e, 0x6b, 0x48, 0x01, 0x52, 0x0c, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, - 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x10, 0x67, 0x65, - 0x74, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x41, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x6e, 0x6b, 0x48, 0x02, 0x52, 0x0e, 0x67, 0x65, 0x74, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x16, 0x0a, 0x06, - 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, - 0x63, 0x6b, 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, - 0x6f, 0x6c, 0x73, 0x2e, 0x53, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, - 0x03, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x88, - 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x0b, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, - 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, - 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x48, 0x04, - 0x52, 0x0b, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, - 0x12, 0x20, 0x0a, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x08, 0x65, 0x6e, 0x75, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x88, - 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x09, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, - 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x48, 0x07, 0x52, 0x09, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x68, - 0x65, 0x6c, 0x70, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6c, 0x6f, 0x6f, - 0x6b, 0x75, 0x70, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x67, - 0x65, 0x74, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, - 0x10, 0x0a, 0x0e, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, - 0x72, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, - 0x0d, 0x0a, 0x0b, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0d, - 0x0a, 0x0b, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xda, 0x04, - 0x0a, 0x13, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x36, 0x0a, 0x0e, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, - 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x4a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x52, 0x0d, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, - 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x70, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x70, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, - 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x70, - 0x6c, 0x61, 0x79, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x18, 0x0a, - 0x07, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x37, 0x0a, 0x09, 0x68, 0x65, 0x6c, 0x70, 0x5f, - 0x74, 0x65, 0x78, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x6f, - 0x6c, 0x73, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x48, 0x00, 0x52, 0x08, 0x68, 0x65, 0x6c, 0x70, 0x54, 0x65, 0x78, 0x74, 0x88, 0x01, 0x01, - 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x6f, 0x72, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x08, 0x73, 0x6f, 0x72, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x04, - 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x6f, 0x6f, - 0x6c, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x6e, 0x6b, 0x48, 0x01, 0x52, - 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x12, 0x20, 0x0a, - 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x02, 0x52, 0x08, 0x65, 0x6e, 0x75, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, - 0x22, 0x0a, 0x0a, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x09, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, - 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x68, 0x65, 0x6c, 0x70, - 0x5f, 0x74, 0x65, 0x78, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x42, 0x0c, - 0x0a, 0x0a, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0d, 0x0a, 0x0b, - 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x7a, 0x0a, 0x0b, 0x53, 0x63, - 0x61, 0x6c, 0x61, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x06, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x07, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x07, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x12, - 0x16, 0x0a, 0x05, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x48, 0x00, - 0x52, 0x05, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x12, 0x14, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x42, 0x07, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x48, 0x0a, 0x0e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, - 0x22, 0x1e, 0x0a, 0x08, 0x4a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, - 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, - 0x22, 0xad, 0x01, 0x0a, 0x0c, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x6e, - 0x6b, 0x12, 0x2b, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x29, - 0x0a, 0x04, 0x68, 0x72, 0x65, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, - 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x52, 0x04, 0x68, 0x72, 0x65, 0x66, 0x12, 0x17, 0x0a, 0x04, 0x69, 0x63, 0x6f, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x88, - 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6f, 0x72, - 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, - 0x61, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x69, 0x63, 0x6f, 0x6e, - 0x22, 0x8c, 0x02, 0x0a, 0x0a, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x6e, 0x6b, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x17, 0x0a, 0x07, 0x74, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x74, 0x6f, 0x6f, 0x6c, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x12, 0x30, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x0c, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x5f, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, + 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, + 0x0b, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x40, 0x0a, 0x10, + 0x67, 0x65, 0x74, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x41, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x6e, 0x6b, 0x48, 0x04, 0x52, 0x0e, 0x67, 0x65, 0x74, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x46, + 0x0a, 0x13, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x6f, + 0x6f, 0x6c, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x6e, 0x6b, 0x48, 0x05, + 0x52, 0x11, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x69, 0x63, 0x6f, 0x6e, 0x42, + 0x08, 0x0a, 0x06, 0x5f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x68, 0x65, + 0x6c, 0x70, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x16, 0x0a, 0x14, 0x5f, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0xbf, 0x06, 0x0a, 0x12, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x36, 0x0a, 0x0e, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x4a, 0x73, 0x6f, 0x6e, 0x50, + 0x61, 0x74, 0x68, 0x52, 0x0d, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, + 0x0d, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x37, 0x0a, 0x09, + 0x68, 0x65, 0x6c, 0x70, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x88, - 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, - 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x48, 0x01, - 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x08, 0x68, 0x65, 0x6c, 0x70, 0x54, 0x65, + 0x78, 0x74, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0d, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x5f, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, + 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x6e, 0x6b, 0x48, + 0x01, 0x52, 0x0c, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x88, + 0x01, 0x01, 0x12, 0x40, 0x0a, 0x10, 0x67, 0x65, 0x74, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, + 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x6e, 0x6b, 0x48, + 0x02, 0x52, 0x0e, 0x67, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x88, 0x01, 0x01, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x0d, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x53, 0x63, 0x61, 0x6c, + 0x61, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x03, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x0b, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x48, 0x04, 0x52, 0x0b, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, + 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x65, 0x6e, 0x75, 0x6d, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x08, 0x65, + 0x6e, 0x75, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, + 0x52, 0x09, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x22, + 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x07, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x88, + 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x68, 0x65, 0x6c, 0x70, 0x5f, 0x74, 0x65, 0x78, 0x74, + 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x5f, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, + 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x65, 0x6e, + 0x75, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xda, 0x04, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x36, 0x0a, + 0x0e, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x4a, 0x73, + 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x52, 0x0d, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x21, 0x0a, + 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, - 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x42, - 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x12, + 0x37, 0x0a, 0x09, 0x68, 0x65, 0x6c, 0x70, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x08, 0x68, 0x65, 0x6c, + 0x70, 0x54, 0x65, 0x78, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x6f, 0x72, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x73, 0x6f, 0x72, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4c, 0x69, 0x6e, 0x6b, 0x48, 0x01, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x88, 0x01, 0x01, + 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, + 0x77, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x50, 0x72, + 0x65, 0x76, 0x69, 0x65, 0x77, 0x12, 0x20, 0x0a, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x08, 0x65, 0x6e, 0x75, 0x6d, + 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x09, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x04, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, + 0x0c, 0x0a, 0x0a, 0x5f, 0x68, 0x65, 0x6c, 0x70, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x42, 0x07, 0x0a, + 0x05, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x7a, 0x0a, 0x0b, 0x53, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x18, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x07, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x07, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x05, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x48, 0x00, 0x52, 0x05, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x12, + 0x14, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, + 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x48, + 0x0a, 0x0e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, + 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x22, 0x1e, 0x0a, 0x08, 0x4a, 0x73, 0x6f, 0x6e, + 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0xad, 0x01, 0x0a, 0x0c, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x6e, 0x6b, 0x12, 0x2b, 0x0a, 0x05, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x6f, 0x6c, 0x73, + 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, + 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x29, 0x0a, 0x04, 0x68, 0x72, 0x65, 0x66, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x04, 0x68, 0x72, 0x65, + 0x66, 0x12, 0x17, 0x0a, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, + 0x07, 0x0a, 0x05, 0x5f, 0x69, 0x63, 0x6f, 0x6e, 0x22, 0x8c, 0x02, 0x0a, 0x0a, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x6e, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6f, 0x6f, 0x6c, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6f, 0x6f, 0x6c, 0x49, 0x64, + 0x12, 0x26, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x61, 0x70, 0x70, 0x69, + 0x6e, 0x67, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x30, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x48, 0x00, + 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x48, 0x01, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x08, 0x0a, + 0x06, 0x5f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xae, 0x02, 0x0a, 0x0a, 0x45, 0x6d, 0x62, 0x65, + 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x2b, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x05, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x3a, 0x0a, 0x05, 0x74, 0x6f, 0x6f, 0x6c, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, + 0x45, 0x6d, 0x62, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x45, 0x6d, 0x62, 0x65, 0x64, + 0x64, 0x65, 0x64, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x6e, 0x6b, 0x52, 0x05, 0x74, + 0x6f, 0x6f, 0x6c, 0x73, 0x1a, 0x91, 0x01, 0x0a, 0x12, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, + 0x64, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x6e, 0x6b, 0x12, 0x32, 0x0a, 0x0b, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, + 0x69, 0x6e, 0x6b, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x6e, 0x6b, 0x12, + 0x47, 0x0a, 0x12, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x6f, 0x76, 0x65, 0x72, + 0x72, 0x69, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x6f, + 0x6f, 0x6c, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4f, 0x76, 0x65, 0x72, + 0x72, 0x69, 0x64, 0x65, 0x73, 0x52, 0x11, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4f, + 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x22, 0x65, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x12, 0x36, 0x0a, + 0x0e, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x4a, 0x73, + 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x52, 0x0d, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0xc2, 0x04, 0x0a, 0x16, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3f, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, 0x6f, 0x6f, 0x6c, @@ -1609,7 +1815,7 @@ func file_tools_proto_rawDescGZIP() []byte { return file_tools_proto_rawDescData } -var file_tools_proto_msgTypes = make([]protoimpl.MessageInfo, 13) +var file_tools_proto_msgTypes = make([]protoimpl.MessageInfo, 16) var file_tools_proto_goTypes = []any{ (*Capabilities)(nil), // 0: tools.Capabilities (*ActionConfig)(nil), // 1: tools.ActionConfig @@ -1620,60 +1826,68 @@ var file_tools_proto_goTypes = []any{ (*JsonPath)(nil), // 6: tools.JsonPath (*ExternalLink)(nil), // 7: tools.ExternalLink (*ActionLink)(nil), // 8: tools.ActionLink - (*CursorPaginationConfig)(nil), // 9: tools.CursorPaginationConfig - (*DataMapping)(nil), // 10: tools.DataMapping - (*CursorPaginationConfig_FieldConfig)(nil), // 11: tools.CursorPaginationConfig.FieldConfig - (*CursorPaginationConfig_PageSizeConfig)(nil), // 12: tools.CursorPaginationConfig.PageSizeConfig - (proto.ActionType)(0), // 13: proto.ActionType - (proto.ActionImplementation)(0), // 14: proto.ActionImplementation - (proto.Type)(0), // 15: proto.Type + (*EmbedGroup)(nil), // 9: tools.EmbedGroup + (*ResponseOverrides)(nil), // 10: tools.ResponseOverrides + (*CursorPaginationConfig)(nil), // 11: tools.CursorPaginationConfig + (*DataMapping)(nil), // 12: tools.DataMapping + (*EmbedGroup_EmbeddedActionLink)(nil), // 13: tools.EmbedGroup.EmbeddedActionLink + (*CursorPaginationConfig_FieldConfig)(nil), // 14: tools.CursorPaginationConfig.FieldConfig + (*CursorPaginationConfig_PageSizeConfig)(nil), // 15: tools.CursorPaginationConfig.PageSizeConfig + (proto.ActionType)(0), // 16: proto.ActionType + (proto.ActionImplementation)(0), // 17: proto.ActionImplementation + (proto.Type)(0), // 18: proto.Type } var file_tools_proto_depIdxs = []int32{ - 13, // 0: tools.ActionConfig.action_type:type_name -> proto.ActionType - 14, // 1: tools.ActionConfig.implementation:type_name -> proto.ActionImplementation + 16, // 0: tools.ActionConfig.action_type:type_name -> proto.ActionType + 17, // 1: tools.ActionConfig.implementation:type_name -> proto.ActionImplementation 2, // 2: tools.ActionConfig.inputs:type_name -> tools.RequestFieldConfig 3, // 3: tools.ActionConfig.response:type_name -> tools.ResponseFieldConfig 5, // 4: tools.ActionConfig.title:type_name -> tools.StringTemplate 5, // 5: tools.ActionConfig.help_text:type_name -> tools.StringTemplate 0, // 6: tools.ActionConfig.capabilities:type_name -> tools.Capabilities 8, // 7: tools.ActionConfig.related_actions:type_name -> tools.ActionLink - 9, // 8: tools.ActionConfig.pagination:type_name -> tools.CursorPaginationConfig + 11, // 8: tools.ActionConfig.pagination:type_name -> tools.CursorPaginationConfig 7, // 9: tools.ActionConfig.external_links:type_name -> tools.ExternalLink 8, // 10: tools.ActionConfig.entry_activity_actions:type_name -> tools.ActionLink - 8, // 11: tools.ActionConfig.embedded_actions:type_name -> tools.ActionLink + 9, // 11: tools.ActionConfig.embed_groups:type_name -> tools.EmbedGroup 8, // 12: tools.ActionConfig.get_entry_action:type_name -> tools.ActionLink 8, // 13: tools.ActionConfig.create_entry_action:type_name -> tools.ActionLink 6, // 14: tools.RequestFieldConfig.field_location:type_name -> tools.JsonPath - 15, // 15: tools.RequestFieldConfig.field_type:type_name -> proto.Type + 18, // 15: tools.RequestFieldConfig.field_type:type_name -> proto.Type 5, // 16: tools.RequestFieldConfig.help_text:type_name -> tools.StringTemplate 8, // 17: tools.RequestFieldConfig.lookup_action:type_name -> tools.ActionLink 8, // 18: tools.RequestFieldConfig.get_entry_action:type_name -> tools.ActionLink 4, // 19: tools.RequestFieldConfig.default_value:type_name -> tools.ScalarValue 5, // 20: tools.RequestFieldConfig.placeholder:type_name -> tools.StringTemplate 6, // 21: tools.ResponseFieldConfig.field_location:type_name -> tools.JsonPath - 15, // 22: tools.ResponseFieldConfig.field_type:type_name -> proto.Type + 18, // 22: tools.ResponseFieldConfig.field_type:type_name -> proto.Type 5, // 23: tools.ResponseFieldConfig.help_text:type_name -> tools.StringTemplate 8, // 24: tools.ResponseFieldConfig.link:type_name -> tools.ActionLink 5, // 25: tools.ExternalLink.label:type_name -> tools.StringTemplate 5, // 26: tools.ExternalLink.href:type_name -> tools.StringTemplate - 10, // 27: tools.ActionLink.data:type_name -> tools.DataMapping + 12, // 27: tools.ActionLink.data:type_name -> tools.DataMapping 5, // 28: tools.ActionLink.title:type_name -> tools.StringTemplate 5, // 29: tools.ActionLink.description:type_name -> tools.StringTemplate - 11, // 30: tools.CursorPaginationConfig.start:type_name -> tools.CursorPaginationConfig.FieldConfig - 11, // 31: tools.CursorPaginationConfig.end:type_name -> tools.CursorPaginationConfig.FieldConfig - 12, // 32: tools.CursorPaginationConfig.page_size:type_name -> tools.CursorPaginationConfig.PageSizeConfig - 6, // 33: tools.CursorPaginationConfig.next_page:type_name -> tools.JsonPath - 6, // 34: tools.CursorPaginationConfig.total_count:type_name -> tools.JsonPath - 6, // 35: tools.DataMapping.path:type_name -> tools.JsonPath - 10, // 36: tools.DataMapping.object:type_name -> tools.DataMapping - 4, // 37: tools.DataMapping.value:type_name -> tools.ScalarValue - 6, // 38: tools.CursorPaginationConfig.FieldConfig.response_field:type_name -> tools.JsonPath - 6, // 39: tools.CursorPaginationConfig.PageSizeConfig.response_field:type_name -> tools.JsonPath - 40, // [40:40] is the sub-list for method output_type - 40, // [40:40] is the sub-list for method input_type - 40, // [40:40] is the sub-list for extension type_name - 40, // [40:40] is the sub-list for extension extendee - 0, // [0:40] is the sub-list for field type_name + 5, // 30: tools.EmbedGroup.title:type_name -> tools.StringTemplate + 13, // 31: tools.EmbedGroup.tools:type_name -> tools.EmbedGroup.EmbeddedActionLink + 6, // 32: tools.ResponseOverrides.field_location:type_name -> tools.JsonPath + 14, // 33: tools.CursorPaginationConfig.start:type_name -> tools.CursorPaginationConfig.FieldConfig + 14, // 34: tools.CursorPaginationConfig.end:type_name -> tools.CursorPaginationConfig.FieldConfig + 15, // 35: tools.CursorPaginationConfig.page_size:type_name -> tools.CursorPaginationConfig.PageSizeConfig + 6, // 36: tools.CursorPaginationConfig.next_page:type_name -> tools.JsonPath + 6, // 37: tools.CursorPaginationConfig.total_count:type_name -> tools.JsonPath + 6, // 38: tools.DataMapping.path:type_name -> tools.JsonPath + 12, // 39: tools.DataMapping.object:type_name -> tools.DataMapping + 4, // 40: tools.DataMapping.value:type_name -> tools.ScalarValue + 8, // 41: tools.EmbedGroup.EmbeddedActionLink.action_link:type_name -> tools.ActionLink + 10, // 42: tools.EmbedGroup.EmbeddedActionLink.response_overrides:type_name -> tools.ResponseOverrides + 6, // 43: tools.CursorPaginationConfig.FieldConfig.response_field:type_name -> tools.JsonPath + 6, // 44: tools.CursorPaginationConfig.PageSizeConfig.response_field:type_name -> tools.JsonPath + 45, // [45:45] is the sub-list for method output_type + 45, // [45:45] is the sub-list for method input_type + 45, // [45:45] is the sub-list for extension type_name + 45, // [45:45] is the sub-list for extension extendee + 0, // [0:45] is the sub-list for field type_name } func init() { file_tools_proto_init() } @@ -1791,7 +2005,7 @@ func file_tools_proto_init() { } } file_tools_proto_msgTypes[9].Exporter = func(v any, i int) any { - switch v := v.(*CursorPaginationConfig); i { + switch v := v.(*EmbedGroup); i { case 0: return &v.state case 1: @@ -1803,7 +2017,7 @@ func file_tools_proto_init() { } } file_tools_proto_msgTypes[10].Exporter = func(v any, i int) any { - switch v := v.(*DataMapping); i { + switch v := v.(*ResponseOverrides); i { case 0: return &v.state case 1: @@ -1815,7 +2029,7 @@ func file_tools_proto_init() { } } file_tools_proto_msgTypes[11].Exporter = func(v any, i int) any { - switch v := v.(*CursorPaginationConfig_FieldConfig); i { + switch v := v.(*CursorPaginationConfig); i { case 0: return &v.state case 1: @@ -1827,6 +2041,42 @@ func file_tools_proto_init() { } } file_tools_proto_msgTypes[12].Exporter = func(v any, i int) any { + switch v := v.(*DataMapping); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tools_proto_msgTypes[13].Exporter = func(v any, i int) any { + switch v := v.(*EmbedGroup_EmbeddedActionLink); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tools_proto_msgTypes[14].Exporter = func(v any, i int) any { + switch v := v.(*CursorPaginationConfig_FieldConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tools_proto_msgTypes[15].Exporter = func(v any, i int) any { switch v := v.(*CursorPaginationConfig_PageSizeConfig); i { case 0: return &v.state @@ -1850,14 +2100,14 @@ func file_tools_proto_init() { } file_tools_proto_msgTypes[7].OneofWrappers = []any{} file_tools_proto_msgTypes[8].OneofWrappers = []any{} - file_tools_proto_msgTypes[10].OneofWrappers = []any{} + file_tools_proto_msgTypes[12].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_tools_proto_rawDesc, NumEnums: 0, - NumMessages: 13, + NumMessages: 16, NumExtensions: 0, NumServices: 0, }, diff --git a/tools/proto/tools.proto b/tools/proto/tools.proto index 9da1c51f5..45659da70 100644 --- a/tools/proto/tools.proto +++ b/tools/proto/tools.proto @@ -75,9 +75,10 @@ message ActionConfig { // Only for List & Get; empty for mutations repeated ActionLink entry_activity_actions = 19; - // Tools that will be displayed inline (embedded) withing the one that we're defining. - repeated ActionLink embedded_actions = 20; - + // Embed groups are tools that will be displayed inline (embedded) withing the one that we're defining. + // These tools will be rendered within this action's configuration, and can have specific config overrides. + repeated EmbedGroup embed_groups = 20; + // The action to use to get an entry on this model. Default to a get action on the same model // Used for: // - fetching the record for prefilling a mutation @@ -215,6 +216,32 @@ message ActionLink { int32 display_order = 6; } +message EmbedGroup { + // When embedding ActionLinks, we need to provide extra-configuration that will override the + // link's target tool configuration + message EmbeddedActionLink { + ActionLink action_link = 1; + + // The config for responses of the target tool for this embedded action can be altered for + // this embed group + repeated ResponseOverrides response_overrides = 2; + } + // Title of the group + StringTemplate title = 1; + + int32 display_order = 2; + + // A list of decorated ActionLinks which will be embedded within this group + repeated EmbeddedActionLink tools = 3; +} + +message ResponseOverrides { + JsonPath field_location = 1; + + // Controls the visibility of the response field + bool visible = 2; +} + message CursorPaginationConfig { // TBD message FieldConfig { diff --git a/tools/testdata/blog/tools.json b/tools/testdata/blog/tools.json index 04b1b8ed6..1cee6037c 100644 --- a/tools/testdata/blog/tools.json +++ b/tools/testdata/blog/tools.json @@ -530,14 +530,24 @@ "displayOrder": 2 } ], - "embeddedActions": [ + "embedGroups": [ { - "toolId": "listComments", - "data": [ - { "key": "$.where.parent.id.equals", "path": { "path": "$.id" } } - ], "title": { "template": "comments" }, - "displayOrder": 1 + "displayOrder": 1, + "tools": [ + { + "actionLink": { + "toolId": "listComments", + "data": [ + { + "key": "$.where.parent.id.equals", + "path": { "path": "$.id" } + } + ], + "title": { "template": "comments" } + } + } + ] } ], "createEntryAction": { "toolId": "createPost" } diff --git a/tools/testdata/one_to_many_links/tools.json b/tools/testdata/one_to_many_links/tools.json index 016273d0b..b442ef499 100644 --- a/tools/testdata/one_to_many_links/tools.json +++ b/tools/testdata/one_to_many_links/tools.json @@ -67,14 +67,24 @@ "entitySingle": "order", "entityPlural": "orders", "capabilities": { "comments": true, "audit": true }, - "embeddedActions": [ + "embedGroups": [ { - "toolId": "listLineItems", - "data": [ - { "key": "$.where.order.id.equals", "path": { "path": "$.id" } } - ], "title": { "template": "items" }, - "displayOrder": 1 + "displayOrder": 1, + "tools": [ + { + "actionLink": { + "toolId": "listLineItems", + "data": [ + { + "key": "$.where.order.id.equals", + "path": { "path": "$.id" } + } + ], + "title": { "template": "items" } + } + } + ] } ] },