// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.36.10
// 	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
}
