// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.36.6
// 	protoc        v3.21.12
// source: anomalygroup_service.proto

package v1

import (
	reflect "reflect"
	sync "sync"
	unsafe "unsafe"

	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// The action to take on a certain group. It is defined in the Alert config.
type GroupActionType int32

const (
	// No action will be taken. It is used for backward compatibility
	// for the existing Alerts before grouping is introduced.
	GroupActionType_NOACTION GroupActionType = 0
	// File a bug with a list of anomalies.
	GroupActionType_REPORT GroupActionType = 1
	// Launch a bisection job on the most signification anomaly, in order to
	// find the culprit commit.
	GroupActionType_BISECT GroupActionType = 2
)

// Enum value maps for GroupActionType.
var (
	GroupActionType_name = map[int32]string{
		0: "NOACTION",
		1: "REPORT",
		2: "BISECT",
	}
	GroupActionType_value = map[string]int32{
		"NOACTION": 0,
		"REPORT":   1,
		"BISECT":   2,
	}
)

func (x GroupActionType) Enum() *GroupActionType {
	p := new(GroupActionType)
	*p = x
	return p
}

func (x GroupActionType) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (GroupActionType) Descriptor() protoreflect.EnumDescriptor {
	return file_anomalygroup_service_proto_enumTypes[0].Descriptor()
}

func (GroupActionType) Type() protoreflect.EnumType {
	return &file_anomalygroup_service_proto_enumTypes[0]
}

func (x GroupActionType) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use GroupActionType.Descriptor instead.
func (GroupActionType) EnumDescriptor() ([]byte, []int) {
	return file_anomalygroup_service_proto_rawDescGZIP(), []int{0}
}

// Request object for CreateNewAnomalyGroup
type CreateNewAnomalyGroupRequest struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// The name of the subscription in sheriff config
	SubscriptionName string `protobuf:"bytes,1,opt,name=subscription_name,json=subscriptionName,proto3" json:"subscription_name,omitempty"`
	// The revision of the subscription
	SubscriptionRevision string `protobuf:"bytes,2,opt,name=subscription_revision,json=subscriptionRevision,proto3" json:"subscription_revision,omitempty"`
	// The domain of the test to group (The value of 'master' in alert config.)
	Domain string `protobuf:"bytes,3,opt,name=domain,proto3" json:"domain,omitempty"`
	// The benchmark of the test to group
	Benchmark string `protobuf:"bytes,4,opt,name=benchmark,proto3" json:"benchmark,omitempty"`
	// The current start commit position of the group
	StartCommit int64 `protobuf:"varint,5,opt,name=start_commit,json=startCommit,proto3" json:"start_commit,omitempty"`
	// The current end commit position of the group
	EndCommit int64 `protobuf:"varint,6,opt,name=end_commit,json=endCommit,proto3" json:"end_commit,omitempty"`
	// The action of the group to take.
	Action        GroupActionType `protobuf:"varint,7,opt,name=action,proto3,enum=anomalygroup.v1.GroupActionType" json:"action,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *CreateNewAnomalyGroupRequest) Reset() {
	*x = CreateNewAnomalyGroupRequest{}
	mi := &file_anomalygroup_service_proto_msgTypes[0]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *CreateNewAnomalyGroupRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*CreateNewAnomalyGroupRequest) ProtoMessage() {}

func (x *CreateNewAnomalyGroupRequest) ProtoReflect() protoreflect.Message {
	mi := &file_anomalygroup_service_proto_msgTypes[0]
	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 CreateNewAnomalyGroupRequest.ProtoReflect.Descriptor instead.
func (*CreateNewAnomalyGroupRequest) Descriptor() ([]byte, []int) {
	return file_anomalygroup_service_proto_rawDescGZIP(), []int{0}
}

func (x *CreateNewAnomalyGroupRequest) GetSubscriptionName() string {
	if x != nil {
		return x.SubscriptionName
	}
	return ""
}

func (x *CreateNewAnomalyGroupRequest) GetSubscriptionRevision() string {
	if x != nil {
		return x.SubscriptionRevision
	}
	return ""
}

func (x *CreateNewAnomalyGroupRequest) GetDomain() string {
	if x != nil {
		return x.Domain
	}
	return ""
}

func (x *CreateNewAnomalyGroupRequest) GetBenchmark() string {
	if x != nil {
		return x.Benchmark
	}
	return ""
}

func (x *CreateNewAnomalyGroupRequest) GetStartCommit() int64 {
	if x != nil {
		return x.StartCommit
	}
	return 0
}

func (x *CreateNewAnomalyGroupRequest) GetEndCommit() int64 {
	if x != nil {
		return x.EndCommit
	}
	return 0
}

func (x *CreateNewAnomalyGroupRequest) GetAction() GroupActionType {
	if x != nil {
		return x.Action
	}
	return GroupActionType_NOACTION
}

// Response object for CreateNewAnomalyGroup
type CreateNewAnomalyGroupResponse struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// The newly created anomaly group ID.
	AnomalyGroupId string `protobuf:"bytes,1,opt,name=anomaly_group_id,json=anomalyGroupId,proto3" json:"anomaly_group_id,omitempty"`
	unknownFields  protoimpl.UnknownFields
	sizeCache      protoimpl.SizeCache
}

func (x *CreateNewAnomalyGroupResponse) Reset() {
	*x = CreateNewAnomalyGroupResponse{}
	mi := &file_anomalygroup_service_proto_msgTypes[1]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *CreateNewAnomalyGroupResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*CreateNewAnomalyGroupResponse) ProtoMessage() {}

func (x *CreateNewAnomalyGroupResponse) ProtoReflect() protoreflect.Message {
	mi := &file_anomalygroup_service_proto_msgTypes[1]
	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 CreateNewAnomalyGroupResponse.ProtoReflect.Descriptor instead.
func (*CreateNewAnomalyGroupResponse) Descriptor() ([]byte, []int) {
	return file_anomalygroup_service_proto_rawDescGZIP(), []int{1}
}

func (x *CreateNewAnomalyGroupResponse) GetAnomalyGroupId() string {
	if x != nil {
		return x.AnomalyGroupId
	}
	return ""
}

// Request object for LoadAnomalyGroupByID
type LoadAnomalyGroupByIDRequest struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// The ID of the anomaly group to read from
	AnomalyGroupId string `protobuf:"bytes,1,opt,name=anomaly_group_id,json=anomalyGroupId,proto3" json:"anomaly_group_id,omitempty"`
	unknownFields  protoimpl.UnknownFields
	sizeCache      protoimpl.SizeCache
}

func (x *LoadAnomalyGroupByIDRequest) Reset() {
	*x = LoadAnomalyGroupByIDRequest{}
	mi := &file_anomalygroup_service_proto_msgTypes[2]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *LoadAnomalyGroupByIDRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*LoadAnomalyGroupByIDRequest) ProtoMessage() {}

func (x *LoadAnomalyGroupByIDRequest) ProtoReflect() protoreflect.Message {
	mi := &file_anomalygroup_service_proto_msgTypes[2]
	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 LoadAnomalyGroupByIDRequest.ProtoReflect.Descriptor instead.
func (*LoadAnomalyGroupByIDRequest) Descriptor() ([]byte, []int) {
	return file_anomalygroup_service_proto_rawDescGZIP(), []int{2}
}

func (x *LoadAnomalyGroupByIDRequest) GetAnomalyGroupId() string {
	if x != nil {
		return x.AnomalyGroupId
	}
	return ""
}

// Response object for LoadAnomalyGroupByID
type LoadAnomalyGroupByIDResponse struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// The anomaly group object
	AnomalyGroup  *AnomalyGroup `protobuf:"bytes,1,opt,name=anomaly_group,json=anomalyGroup,proto3" json:"anomaly_group,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *LoadAnomalyGroupByIDResponse) Reset() {
	*x = LoadAnomalyGroupByIDResponse{}
	mi := &file_anomalygroup_service_proto_msgTypes[3]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *LoadAnomalyGroupByIDResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*LoadAnomalyGroupByIDResponse) ProtoMessage() {}

func (x *LoadAnomalyGroupByIDResponse) ProtoReflect() protoreflect.Message {
	mi := &file_anomalygroup_service_proto_msgTypes[3]
	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 LoadAnomalyGroupByIDResponse.ProtoReflect.Descriptor instead.
func (*LoadAnomalyGroupByIDResponse) Descriptor() ([]byte, []int) {
	return file_anomalygroup_service_proto_rawDescGZIP(), []int{3}
}

func (x *LoadAnomalyGroupByIDResponse) GetAnomalyGroup() *AnomalyGroup {
	if x != nil {
		return x.AnomalyGroup
	}
	return nil
}

// Request object for UpdateAnomalyGroup
type UpdateAnomalyGroupRequest struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// The ID of the anomaly group to update
	AnomalyGroupId string `protobuf:"bytes,1,opt,name=anomaly_group_id,json=anomalyGroupId,proto3" json:"anomaly_group_id,omitempty"`
	// The anomaly ID to append to the anomaly list.
	AnomalyId string `protobuf:"bytes,2,opt,name=anomaly_id,json=anomalyId,proto3" json:"anomaly_id,omitempty"`
	// The biesction ID to add to the anomaly group.
	// This should be populated only when the action value is BISECT.
	BisectionId string `protobuf:"bytes,3,opt,name=bisection_id,json=bisectionId,proto3" json:"bisection_id,omitempty"`
	// The issue ID to add to the anomaly group.
	// This should be populated only when the action value is REPORT.
	IssueId string `protobuf:"bytes,4,opt,name=issue_id,json=issueId,proto3" json:"issue_id,omitempty"`
	// The culprit IDs correlated to the group.
	// Culprits are found by a bisection job. This should be populated
	// only when the action value is BISECT and the bisection_id exists.
	CulpritIds    []string `protobuf:"bytes,5,rep,name=culprit_ids,json=culpritIds,proto3" json:"culprit_ids,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *UpdateAnomalyGroupRequest) Reset() {
	*x = UpdateAnomalyGroupRequest{}
	mi := &file_anomalygroup_service_proto_msgTypes[4]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *UpdateAnomalyGroupRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*UpdateAnomalyGroupRequest) ProtoMessage() {}

func (x *UpdateAnomalyGroupRequest) ProtoReflect() protoreflect.Message {
	mi := &file_anomalygroup_service_proto_msgTypes[4]
	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 UpdateAnomalyGroupRequest.ProtoReflect.Descriptor instead.
func (*UpdateAnomalyGroupRequest) Descriptor() ([]byte, []int) {
	return file_anomalygroup_service_proto_rawDescGZIP(), []int{4}
}

func (x *UpdateAnomalyGroupRequest) GetAnomalyGroupId() string {
	if x != nil {
		return x.AnomalyGroupId
	}
	return ""
}

func (x *UpdateAnomalyGroupRequest) GetAnomalyId() string {
	if x != nil {
		return x.AnomalyId
	}
	return ""
}

func (x *UpdateAnomalyGroupRequest) GetBisectionId() string {
	if x != nil {
		return x.BisectionId
	}
	return ""
}

func (x *UpdateAnomalyGroupRequest) GetIssueId() string {
	if x != nil {
		return x.IssueId
	}
	return ""
}

func (x *UpdateAnomalyGroupRequest) GetCulpritIds() []string {
	if x != nil {
		return x.CulpritIds
	}
	return nil
}

// Response object for UpdateAnomalyGroup
type UpdateAnomalyGroupResponse struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *UpdateAnomalyGroupResponse) Reset() {
	*x = UpdateAnomalyGroupResponse{}
	mi := &file_anomalygroup_service_proto_msgTypes[5]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *UpdateAnomalyGroupResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*UpdateAnomalyGroupResponse) ProtoMessage() {}

func (x *UpdateAnomalyGroupResponse) ProtoReflect() protoreflect.Message {
	mi := &file_anomalygroup_service_proto_msgTypes[5]
	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 UpdateAnomalyGroupResponse.ProtoReflect.Descriptor instead.
func (*UpdateAnomalyGroupResponse) Descriptor() ([]byte, []int) {
	return file_anomalygroup_service_proto_rawDescGZIP(), []int{5}
}

// Request object for FindExistingGroups
type FindExistingGroupsRequest struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// The subscription name from the alert config, from which the
	// anomaly is detected.
	SubscriptionName string `protobuf:"bytes,1,opt,name=subscription_name,json=subscriptionName,proto3" json:"subscription_name,omitempty"`
	// The revision of the subscription
	SubscriptionRevision string `protobuf:"bytes,2,opt,name=subscription_revision,json=subscriptionRevision,proto3" json:"subscription_revision,omitempty"`
	// The action value from the alert config.
	Action GroupActionType `protobuf:"varint,3,opt,name=action,proto3,enum=anomalygroup.v1.GroupActionType" json:"action,omitempty"`
	// The previous commit position before the anomaly's data point.
	StartCommit int64 `protobuf:"varint,4,opt,name=start_commit,json=startCommit,proto3" json:"start_commit,omitempty"`
	// The commit position before the anomaly's data point.
	EndCommit int64 `protobuf:"varint,5,opt,name=end_commit,json=endCommit,proto3" json:"end_commit,omitempty"`
	// The test path from the anomaly.
	TestPath      string `protobuf:"bytes,6,opt,name=test_path,json=testPath,proto3" json:"test_path,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *FindExistingGroupsRequest) Reset() {
	*x = FindExistingGroupsRequest{}
	mi := &file_anomalygroup_service_proto_msgTypes[6]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *FindExistingGroupsRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*FindExistingGroupsRequest) ProtoMessage() {}

func (x *FindExistingGroupsRequest) ProtoReflect() protoreflect.Message {
	mi := &file_anomalygroup_service_proto_msgTypes[6]
	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 FindExistingGroupsRequest.ProtoReflect.Descriptor instead.
func (*FindExistingGroupsRequest) Descriptor() ([]byte, []int) {
	return file_anomalygroup_service_proto_rawDescGZIP(), []int{6}
}

func (x *FindExistingGroupsRequest) GetSubscriptionName() string {
	if x != nil {
		return x.SubscriptionName
	}
	return ""
}

func (x *FindExistingGroupsRequest) GetSubscriptionRevision() string {
	if x != nil {
		return x.SubscriptionRevision
	}
	return ""
}

func (x *FindExistingGroupsRequest) GetAction() GroupActionType {
	if x != nil {
		return x.Action
	}
	return GroupActionType_NOACTION
}

func (x *FindExistingGroupsRequest) GetStartCommit() int64 {
	if x != nil {
		return x.StartCommit
	}
	return 0
}

func (x *FindExistingGroupsRequest) GetEndCommit() int64 {
	if x != nil {
		return x.EndCommit
	}
	return 0
}

func (x *FindExistingGroupsRequest) GetTestPath() string {
	if x != nil {
		return x.TestPath
	}
	return ""
}

// Response object for FindExistingGroups
type FindExistingGroupsResponse struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// A list of anomaly groups which an anomaly can be added to.
	AnomalyGroups []*AnomalyGroup `protobuf:"bytes,1,rep,name=anomaly_groups,json=anomalyGroups,proto3" json:"anomaly_groups,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *FindExistingGroupsResponse) Reset() {
	*x = FindExistingGroupsResponse{}
	mi := &file_anomalygroup_service_proto_msgTypes[7]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *FindExistingGroupsResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*FindExistingGroupsResponse) ProtoMessage() {}

func (x *FindExistingGroupsResponse) ProtoReflect() protoreflect.Message {
	mi := &file_anomalygroup_service_proto_msgTypes[7]
	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 FindExistingGroupsResponse.ProtoReflect.Descriptor instead.
func (*FindExistingGroupsResponse) Descriptor() ([]byte, []int) {
	return file_anomalygroup_service_proto_rawDescGZIP(), []int{7}
}

func (x *FindExistingGroupsResponse) GetAnomalyGroups() []*AnomalyGroup {
	if x != nil {
		return x.AnomalyGroups
	}
	return nil
}

// Request object for FindTopAnomaliesRequest
type FindTopAnomaliesRequest struct {
	state          protoimpl.MessageState `protogen:"open.v1"`
	AnomalyGroupId string                 `protobuf:"bytes,1,opt,name=anomaly_group_id,json=anomalyGroupId,proto3" json:"anomaly_group_id,omitempty"`
	Limit          int64                  `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"`
	unknownFields  protoimpl.UnknownFields
	sizeCache      protoimpl.SizeCache
}

func (x *FindTopAnomaliesRequest) Reset() {
	*x = FindTopAnomaliesRequest{}
	mi := &file_anomalygroup_service_proto_msgTypes[8]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *FindTopAnomaliesRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*FindTopAnomaliesRequest) ProtoMessage() {}

func (x *FindTopAnomaliesRequest) ProtoReflect() protoreflect.Message {
	mi := &file_anomalygroup_service_proto_msgTypes[8]
	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 FindTopAnomaliesRequest.ProtoReflect.Descriptor instead.
func (*FindTopAnomaliesRequest) Descriptor() ([]byte, []int) {
	return file_anomalygroup_service_proto_rawDescGZIP(), []int{8}
}

func (x *FindTopAnomaliesRequest) GetAnomalyGroupId() string {
	if x != nil {
		return x.AnomalyGroupId
	}
	return ""
}

func (x *FindTopAnomaliesRequest) GetLimit() int64 {
	if x != nil {
		return x.Limit
	}
	return 0
}

// Response object for FindTopAnomaliesResponse
type FindTopAnomaliesResponse struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Anomalies     []*Anomaly             `protobuf:"bytes,1,rep,name=anomalies,proto3" json:"anomalies,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *FindTopAnomaliesResponse) Reset() {
	*x = FindTopAnomaliesResponse{}
	mi := &file_anomalygroup_service_proto_msgTypes[9]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *FindTopAnomaliesResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*FindTopAnomaliesResponse) ProtoMessage() {}

func (x *FindTopAnomaliesResponse) ProtoReflect() protoreflect.Message {
	mi := &file_anomalygroup_service_proto_msgTypes[9]
	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 FindTopAnomaliesResponse.ProtoReflect.Descriptor instead.
func (*FindTopAnomaliesResponse) Descriptor() ([]byte, []int) {
	return file_anomalygroup_service_proto_rawDescGZIP(), []int{9}
}

func (x *FindTopAnomaliesResponse) GetAnomalies() []*Anomaly {
	if x != nil {
		return x.Anomalies
	}
	return nil
}

// Request object for FindIssuesFromCulpritsRequest
type FindIssuesFromCulpritsRequest struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// The ID of the anomaly group
	AnomalyGroupId string `protobuf:"bytes,1,opt,name=anomaly_group_id,json=anomalyGroupId,proto3" json:"anomaly_group_id,omitempty"`
	unknownFields  protoimpl.UnknownFields
	sizeCache      protoimpl.SizeCache
}

func (x *FindIssuesFromCulpritsRequest) Reset() {
	*x = FindIssuesFromCulpritsRequest{}
	mi := &file_anomalygroup_service_proto_msgTypes[10]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *FindIssuesFromCulpritsRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*FindIssuesFromCulpritsRequest) ProtoMessage() {}

func (x *FindIssuesFromCulpritsRequest) ProtoReflect() protoreflect.Message {
	mi := &file_anomalygroup_service_proto_msgTypes[10]
	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 FindIssuesFromCulpritsRequest.ProtoReflect.Descriptor instead.
func (*FindIssuesFromCulpritsRequest) Descriptor() ([]byte, []int) {
	return file_anomalygroup_service_proto_rawDescGZIP(), []int{10}
}

func (x *FindIssuesFromCulpritsRequest) GetAnomalyGroupId() string {
	if x != nil {
		return x.AnomalyGroupId
	}
	return ""
}

// Response object for FindIssuesFromCulpritsResponse
type FindIssuesFromCulpritsResponse struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// The issue IDs from the culprit IDs of the anomaly group
	IssueIds      []string `protobuf:"bytes,1,rep,name=issue_ids,json=issueIds,proto3" json:"issue_ids,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *FindIssuesFromCulpritsResponse) Reset() {
	*x = FindIssuesFromCulpritsResponse{}
	mi := &file_anomalygroup_service_proto_msgTypes[11]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *FindIssuesFromCulpritsResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*FindIssuesFromCulpritsResponse) ProtoMessage() {}

func (x *FindIssuesFromCulpritsResponse) ProtoReflect() protoreflect.Message {
	mi := &file_anomalygroup_service_proto_msgTypes[11]
	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 FindIssuesFromCulpritsResponse.ProtoReflect.Descriptor instead.
func (*FindIssuesFromCulpritsResponse) Descriptor() ([]byte, []int) {
	return file_anomalygroup_service_proto_rawDescGZIP(), []int{11}
}

func (x *FindIssuesFromCulpritsResponse) GetIssueIds() []string {
	if x != nil {
		return x.IssueIds
	}
	return nil
}

// Simplified format for an anomaly group, which should be sufficient
// in the following use cases:
//  1. provide a list of anomalies for filing a bug.
//  2. provide the most significant anomaly to launch a bisection.
//  3. for the new anomaly to be added in, and decide whether the new anomaly
//     needs to be added to an existing bug.
type AnomalyGroup struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// The ID of the anomaly group.
	GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"`
	// The action to take for the anomaly group.
	GroupAction GroupActionType `protobuf:"varint,2,opt,name=group_action,json=groupAction,proto3,enum=anomalygroup.v1.GroupActionType" json:"group_action,omitempty"`
	// The anomalies added to this group.
	AnomalyIds []string `protobuf:"bytes,3,rep,name=anomaly_ids,json=anomalyIds,proto3" json:"anomaly_ids,omitempty"`
	// The culprits associated to this group.
	CulpritIds []string `protobuf:"bytes,4,rep,name=culprit_ids,json=culpritIds,proto3" json:"culprit_ids,omitempty"`
	// The reported issue associated to this group.
	ReportedIssueId int64 `protobuf:"varint,5,opt,name=reported_issue_id,json=reportedIssueId,proto3" json:"reported_issue_id,omitempty"`
	// The subscription name this anomaly group belongs to. (from group metadata)
	SubsciptionName string `protobuf:"bytes,6,opt,name=subsciption_name,json=subsciptionName,proto3" json:"subsciption_name,omitempty"`
	// The subscription revision this anomaly group belongs to. (from group metadata)
	SubscriptionRevision string `protobuf:"bytes,7,opt,name=subscription_revision,json=subscriptionRevision,proto3" json:"subscription_revision,omitempty"`
	// The name of the benchmark this anomaly group is based on. (from group metadata)
	BenchmarkName string `protobuf:"bytes,8,opt,name=benchmark_name,json=benchmarkName,proto3" json:"benchmark_name,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *AnomalyGroup) Reset() {
	*x = AnomalyGroup{}
	mi := &file_anomalygroup_service_proto_msgTypes[12]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *AnomalyGroup) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AnomalyGroup) ProtoMessage() {}

func (x *AnomalyGroup) ProtoReflect() protoreflect.Message {
	mi := &file_anomalygroup_service_proto_msgTypes[12]
	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 AnomalyGroup.ProtoReflect.Descriptor instead.
func (*AnomalyGroup) Descriptor() ([]byte, []int) {
	return file_anomalygroup_service_proto_rawDescGZIP(), []int{12}
}

func (x *AnomalyGroup) GetGroupId() string {
	if x != nil {
		return x.GroupId
	}
	return ""
}

func (x *AnomalyGroup) GetGroupAction() GroupActionType {
	if x != nil {
		return x.GroupAction
	}
	return GroupActionType_NOACTION
}

func (x *AnomalyGroup) GetAnomalyIds() []string {
	if x != nil {
		return x.AnomalyIds
	}
	return nil
}

func (x *AnomalyGroup) GetCulpritIds() []string {
	if x != nil {
		return x.CulpritIds
	}
	return nil
}

func (x *AnomalyGroup) GetReportedIssueId() int64 {
	if x != nil {
		return x.ReportedIssueId
	}
	return 0
}

func (x *AnomalyGroup) GetSubsciptionName() string {
	if x != nil {
		return x.SubsciptionName
	}
	return ""
}

func (x *AnomalyGroup) GetSubscriptionRevision() string {
	if x != nil {
		return x.SubscriptionRevision
	}
	return ""
}

func (x *AnomalyGroup) GetBenchmarkName() string {
	if x != nil {
		return x.BenchmarkName
	}
	return ""
}

// Regression object in a format used for anomaly group actions,
// including filing a new bug and triggering a new bisection job.
type Anomaly struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// the start commit position of the detected anomaly
	StartCommit int64 `protobuf:"varint,1,opt,name=start_commit,json=startCommit,proto3" json:"start_commit,omitempty"`
	// the end commit position of the detected anomaly
	EndCommit int64 `protobuf:"varint,2,opt,name=end_commit,json=endCommit,proto3" json:"end_commit,omitempty"`
	// the paramset from the regression detected in Skia. The parameters
	// are used in Skia alerts to define which tests to apply the deteciton
	// rules.
	// In chromeperf's context, it should include the following keys:
	//   - bot:
	//     the name of the bot (a.k.a, 'builder' in waterfall, and
	//     'configuration' in pinpoint job page.)
	//   - benchmark:
	//     the name of the benchmark
	//   - story:
	//     the name of the story (a.k.a., test)
	//   - measurement:
	//     the metric to look at. (a.k.a., 'test' in skia query ui,
	//     and 'chart' in pinpoint job page)
	//   - stat:
	//     the aggregation method on the data points
	Paramset map[string]string `protobuf:"bytes,3,rep,name=paramset,proto3" json:"paramset,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
	// indicate the direction towards which the change should be
	// considered as regression.
	// The possible values are: UP, DOWN or UNKNOWN
	ImprovementDirection string `protobuf:"bytes,4,opt,name=improvement_direction,json=improvementDirection,proto3" json:"improvement_direction,omitempty"`
	// the median from the previous data point
	MedianBefore float32 `protobuf:"fixed32,5,opt,name=median_before,json=medianBefore,proto3" json:"median_before,omitempty"`
	// the median from the current data point
	MedianAfter   float32 `protobuf:"fixed32,6,opt,name=median_after,json=medianAfter,proto3" json:"median_after,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Anomaly) Reset() {
	*x = Anomaly{}
	mi := &file_anomalygroup_service_proto_msgTypes[13]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *Anomaly) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Anomaly) ProtoMessage() {}

func (x *Anomaly) ProtoReflect() protoreflect.Message {
	mi := &file_anomalygroup_service_proto_msgTypes[13]
	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 Anomaly.ProtoReflect.Descriptor instead.
func (*Anomaly) Descriptor() ([]byte, []int) {
	return file_anomalygroup_service_proto_rawDescGZIP(), []int{13}
}

func (x *Anomaly) GetStartCommit() int64 {
	if x != nil {
		return x.StartCommit
	}
	return 0
}

func (x *Anomaly) GetEndCommit() int64 {
	if x != nil {
		return x.EndCommit
	}
	return 0
}

func (x *Anomaly) GetParamset() map[string]string {
	if x != nil {
		return x.Paramset
	}
	return nil
}

func (x *Anomaly) GetImprovementDirection() string {
	if x != nil {
		return x.ImprovementDirection
	}
	return ""
}

func (x *Anomaly) GetMedianBefore() float32 {
	if x != nil {
		return x.MedianBefore
	}
	return 0
}

func (x *Anomaly) GetMedianAfter() float32 {
	if x != nil {
		return x.MedianAfter
	}
	return 0
}

var File_anomalygroup_service_proto protoreflect.FileDescriptor

const file_anomalygroup_service_proto_rawDesc = "" +
	"\n" +
	"\x1aanomalygroup_service.proto\x12\x0fanomalygroup.v1\"\xb2\x02\n" +
	"\x1cCreateNewAnomalyGroupRequest\x12+\n" +
	"\x11subscription_name\x18\x01 \x01(\tR\x10subscriptionName\x123\n" +
	"\x15subscription_revision\x18\x02 \x01(\tR\x14subscriptionRevision\x12\x16\n" +
	"\x06domain\x18\x03 \x01(\tR\x06domain\x12\x1c\n" +
	"\tbenchmark\x18\x04 \x01(\tR\tbenchmark\x12!\n" +
	"\fstart_commit\x18\x05 \x01(\x03R\vstartCommit\x12\x1d\n" +
	"\n" +
	"end_commit\x18\x06 \x01(\x03R\tendCommit\x128\n" +
	"\x06action\x18\a \x01(\x0e2 .anomalygroup.v1.GroupActionTypeR\x06action\"I\n" +
	"\x1dCreateNewAnomalyGroupResponse\x12(\n" +
	"\x10anomaly_group_id\x18\x01 \x01(\tR\x0eanomalyGroupId\"G\n" +
	"\x1bLoadAnomalyGroupByIDRequest\x12(\n" +
	"\x10anomaly_group_id\x18\x01 \x01(\tR\x0eanomalyGroupId\"b\n" +
	"\x1cLoadAnomalyGroupByIDResponse\x12B\n" +
	"\ranomaly_group\x18\x01 \x01(\v2\x1d.anomalygroup.v1.AnomalyGroupR\fanomalyGroup\"\xc3\x01\n" +
	"\x19UpdateAnomalyGroupRequest\x12(\n" +
	"\x10anomaly_group_id\x18\x01 \x01(\tR\x0eanomalyGroupId\x12\x1d\n" +
	"\n" +
	"anomaly_id\x18\x02 \x01(\tR\tanomalyId\x12!\n" +
	"\fbisection_id\x18\x03 \x01(\tR\vbisectionId\x12\x19\n" +
	"\bissue_id\x18\x04 \x01(\tR\aissueId\x12\x1f\n" +
	"\vculprit_ids\x18\x05 \x03(\tR\n" +
	"culpritIds\"\x1c\n" +
	"\x1aUpdateAnomalyGroupResponse\"\x96\x02\n" +
	"\x19FindExistingGroupsRequest\x12+\n" +
	"\x11subscription_name\x18\x01 \x01(\tR\x10subscriptionName\x123\n" +
	"\x15subscription_revision\x18\x02 \x01(\tR\x14subscriptionRevision\x128\n" +
	"\x06action\x18\x03 \x01(\x0e2 .anomalygroup.v1.GroupActionTypeR\x06action\x12!\n" +
	"\fstart_commit\x18\x04 \x01(\x03R\vstartCommit\x12\x1d\n" +
	"\n" +
	"end_commit\x18\x05 \x01(\x03R\tendCommit\x12\x1b\n" +
	"\ttest_path\x18\x06 \x01(\tR\btestPath\"b\n" +
	"\x1aFindExistingGroupsResponse\x12D\n" +
	"\x0eanomaly_groups\x18\x01 \x03(\v2\x1d.anomalygroup.v1.AnomalyGroupR\ranomalyGroups\"Y\n" +
	"\x17FindTopAnomaliesRequest\x12(\n" +
	"\x10anomaly_group_id\x18\x01 \x01(\tR\x0eanomalyGroupId\x12\x14\n" +
	"\x05limit\x18\x02 \x01(\x03R\x05limit\"R\n" +
	"\x18FindTopAnomaliesResponse\x126\n" +
	"\tanomalies\x18\x01 \x03(\v2\x18.anomalygroup.v1.AnomalyR\tanomalies\"I\n" +
	"\x1dFindIssuesFromCulpritsRequest\x12(\n" +
	"\x10anomaly_group_id\x18\x01 \x01(\tR\x0eanomalyGroupId\"=\n" +
	"\x1eFindIssuesFromCulpritsResponse\x12\x1b\n" +
	"\tissue_ids\x18\x01 \x03(\tR\bissueIds\"\xe3\x02\n" +
	"\fAnomalyGroup\x12\x19\n" +
	"\bgroup_id\x18\x01 \x01(\tR\agroupId\x12C\n" +
	"\fgroup_action\x18\x02 \x01(\x0e2 .anomalygroup.v1.GroupActionTypeR\vgroupAction\x12\x1f\n" +
	"\vanomaly_ids\x18\x03 \x03(\tR\n" +
	"anomalyIds\x12\x1f\n" +
	"\vculprit_ids\x18\x04 \x03(\tR\n" +
	"culpritIds\x12*\n" +
	"\x11reported_issue_id\x18\x05 \x01(\x03R\x0freportedIssueId\x12)\n" +
	"\x10subsciption_name\x18\x06 \x01(\tR\x0fsubsciptionName\x123\n" +
	"\x15subscription_revision\x18\a \x01(\tR\x14subscriptionRevision\x12%\n" +
	"\x0ebenchmark_name\x18\b \x01(\tR\rbenchmarkName\"\xc9\x02\n" +
	"\aAnomaly\x12!\n" +
	"\fstart_commit\x18\x01 \x01(\x03R\vstartCommit\x12\x1d\n" +
	"\n" +
	"end_commit\x18\x02 \x01(\x03R\tendCommit\x12B\n" +
	"\bparamset\x18\x03 \x03(\v2&.anomalygroup.v1.Anomaly.ParamsetEntryR\bparamset\x123\n" +
	"\x15improvement_direction\x18\x04 \x01(\tR\x14improvementDirection\x12#\n" +
	"\rmedian_before\x18\x05 \x01(\x02R\fmedianBefore\x12!\n" +
	"\fmedian_after\x18\x06 \x01(\x02R\vmedianAfter\x1a;\n" +
	"\rParamsetEntry\x12\x10\n" +
	"\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" +
	"\x05value\x18\x02 \x01(\tR\x05value:\x028\x01*7\n" +
	"\x0fGroupActionType\x12\f\n" +
	"\bNOACTION\x10\x00\x12\n" +
	"\n" +
	"\x06REPORT\x10\x01\x12\n" +
	"\n" +
	"\x06BISECT\x10\x022\xd0\x05\n" +
	"\x13AnomalyGroupService\x12x\n" +
	"\x15CreateNewAnomalyGroup\x12-.anomalygroup.v1.CreateNewAnomalyGroupRequest\x1a..anomalygroup.v1.CreateNewAnomalyGroupResponse\"\x00\x12u\n" +
	"\x14LoadAnomalyGroupByID\x12,.anomalygroup.v1.LoadAnomalyGroupByIDRequest\x1a-.anomalygroup.v1.LoadAnomalyGroupByIDResponse\"\x00\x12o\n" +
	"\x12UpdateAnomalyGroup\x12*.anomalygroup.v1.UpdateAnomalyGroupRequest\x1a+.anomalygroup.v1.UpdateAnomalyGroupResponse\"\x00\x12o\n" +
	"\x12FindExistingGroups\x12*.anomalygroup.v1.FindExistingGroupsRequest\x1a+.anomalygroup.v1.FindExistingGroupsResponse\"\x00\x12i\n" +
	"\x10FindTopAnomalies\x12(.anomalygroup.v1.FindTopAnomaliesRequest\x1a).anomalygroup.v1.FindTopAnomaliesResponse\"\x00\x12{\n" +
	"\x16FindIssuesFromCulprits\x12..anomalygroup.v1.FindIssuesFromCulpritsRequest\x1a/.anomalygroup.v1.FindIssuesFromCulpritsResponse\"\x00B1Z/go.skia.org/infra/perf/go/anomalygroup/proto/v1b\x06proto3"

var (
	file_anomalygroup_service_proto_rawDescOnce sync.Once
	file_anomalygroup_service_proto_rawDescData []byte
)

func file_anomalygroup_service_proto_rawDescGZIP() []byte {
	file_anomalygroup_service_proto_rawDescOnce.Do(func() {
		file_anomalygroup_service_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_anomalygroup_service_proto_rawDesc), len(file_anomalygroup_service_proto_rawDesc)))
	})
	return file_anomalygroup_service_proto_rawDescData
}

var file_anomalygroup_service_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_anomalygroup_service_proto_msgTypes = make([]protoimpl.MessageInfo, 15)
var file_anomalygroup_service_proto_goTypes = []any{
	(GroupActionType)(0),                   // 0: anomalygroup.v1.GroupActionType
	(*CreateNewAnomalyGroupRequest)(nil),   // 1: anomalygroup.v1.CreateNewAnomalyGroupRequest
	(*CreateNewAnomalyGroupResponse)(nil),  // 2: anomalygroup.v1.CreateNewAnomalyGroupResponse
	(*LoadAnomalyGroupByIDRequest)(nil),    // 3: anomalygroup.v1.LoadAnomalyGroupByIDRequest
	(*LoadAnomalyGroupByIDResponse)(nil),   // 4: anomalygroup.v1.LoadAnomalyGroupByIDResponse
	(*UpdateAnomalyGroupRequest)(nil),      // 5: anomalygroup.v1.UpdateAnomalyGroupRequest
	(*UpdateAnomalyGroupResponse)(nil),     // 6: anomalygroup.v1.UpdateAnomalyGroupResponse
	(*FindExistingGroupsRequest)(nil),      // 7: anomalygroup.v1.FindExistingGroupsRequest
	(*FindExistingGroupsResponse)(nil),     // 8: anomalygroup.v1.FindExistingGroupsResponse
	(*FindTopAnomaliesRequest)(nil),        // 9: anomalygroup.v1.FindTopAnomaliesRequest
	(*FindTopAnomaliesResponse)(nil),       // 10: anomalygroup.v1.FindTopAnomaliesResponse
	(*FindIssuesFromCulpritsRequest)(nil),  // 11: anomalygroup.v1.FindIssuesFromCulpritsRequest
	(*FindIssuesFromCulpritsResponse)(nil), // 12: anomalygroup.v1.FindIssuesFromCulpritsResponse
	(*AnomalyGroup)(nil),                   // 13: anomalygroup.v1.AnomalyGroup
	(*Anomaly)(nil),                        // 14: anomalygroup.v1.Anomaly
	nil,                                    // 15: anomalygroup.v1.Anomaly.ParamsetEntry
}
var file_anomalygroup_service_proto_depIdxs = []int32{
	0,  // 0: anomalygroup.v1.CreateNewAnomalyGroupRequest.action:type_name -> anomalygroup.v1.GroupActionType
	13, // 1: anomalygroup.v1.LoadAnomalyGroupByIDResponse.anomaly_group:type_name -> anomalygroup.v1.AnomalyGroup
	0,  // 2: anomalygroup.v1.FindExistingGroupsRequest.action:type_name -> anomalygroup.v1.GroupActionType
	13, // 3: anomalygroup.v1.FindExistingGroupsResponse.anomaly_groups:type_name -> anomalygroup.v1.AnomalyGroup
	14, // 4: anomalygroup.v1.FindTopAnomaliesResponse.anomalies:type_name -> anomalygroup.v1.Anomaly
	0,  // 5: anomalygroup.v1.AnomalyGroup.group_action:type_name -> anomalygroup.v1.GroupActionType
	15, // 6: anomalygroup.v1.Anomaly.paramset:type_name -> anomalygroup.v1.Anomaly.ParamsetEntry
	1,  // 7: anomalygroup.v1.AnomalyGroupService.CreateNewAnomalyGroup:input_type -> anomalygroup.v1.CreateNewAnomalyGroupRequest
	3,  // 8: anomalygroup.v1.AnomalyGroupService.LoadAnomalyGroupByID:input_type -> anomalygroup.v1.LoadAnomalyGroupByIDRequest
	5,  // 9: anomalygroup.v1.AnomalyGroupService.UpdateAnomalyGroup:input_type -> anomalygroup.v1.UpdateAnomalyGroupRequest
	7,  // 10: anomalygroup.v1.AnomalyGroupService.FindExistingGroups:input_type -> anomalygroup.v1.FindExistingGroupsRequest
	9,  // 11: anomalygroup.v1.AnomalyGroupService.FindTopAnomalies:input_type -> anomalygroup.v1.FindTopAnomaliesRequest
	11, // 12: anomalygroup.v1.AnomalyGroupService.FindIssuesFromCulprits:input_type -> anomalygroup.v1.FindIssuesFromCulpritsRequest
	2,  // 13: anomalygroup.v1.AnomalyGroupService.CreateNewAnomalyGroup:output_type -> anomalygroup.v1.CreateNewAnomalyGroupResponse
	4,  // 14: anomalygroup.v1.AnomalyGroupService.LoadAnomalyGroupByID:output_type -> anomalygroup.v1.LoadAnomalyGroupByIDResponse
	6,  // 15: anomalygroup.v1.AnomalyGroupService.UpdateAnomalyGroup:output_type -> anomalygroup.v1.UpdateAnomalyGroupResponse
	8,  // 16: anomalygroup.v1.AnomalyGroupService.FindExistingGroups:output_type -> anomalygroup.v1.FindExistingGroupsResponse
	10, // 17: anomalygroup.v1.AnomalyGroupService.FindTopAnomalies:output_type -> anomalygroup.v1.FindTopAnomaliesResponse
	12, // 18: anomalygroup.v1.AnomalyGroupService.FindIssuesFromCulprits:output_type -> anomalygroup.v1.FindIssuesFromCulpritsResponse
	13, // [13:19] is the sub-list for method output_type
	7,  // [7:13] is the sub-list for method input_type
	7,  // [7:7] is the sub-list for extension type_name
	7,  // [7:7] is the sub-list for extension extendee
	0,  // [0:7] is the sub-list for field type_name
}

func init() { file_anomalygroup_service_proto_init() }
func file_anomalygroup_service_proto_init() {
	if File_anomalygroup_service_proto != nil {
		return
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: unsafe.Slice(unsafe.StringData(file_anomalygroup_service_proto_rawDesc), len(file_anomalygroup_service_proto_rawDesc)),
			NumEnums:      1,
			NumMessages:   15,
			NumExtensions: 0,
			NumServices:   1,
		},
		GoTypes:           file_anomalygroup_service_proto_goTypes,
		DependencyIndexes: file_anomalygroup_service_proto_depIdxs,
		EnumInfos:         file_anomalygroup_service_proto_enumTypes,
		MessageInfos:      file_anomalygroup_service_proto_msgTypes,
	}.Build()
	File_anomalygroup_service_proto = out.File
	file_anomalygroup_service_proto_goTypes = nil
	file_anomalygroup_service_proto_depIdxs = nil
}
