From 9ce36c6be994134e327baf72de20ff27160a7851 Mon Sep 17 00:00:00 2001 From: mnoah1 Date: Tue, 27 Oct 2026 17:11:58 +0000 Subject: [PATCH 1/2] feat(stovepipe): expose retained history event metadata --- api/stovepipe/proto/stovepipe.proto | 47 ++ api/stovepipe/protopb/stovepipe.pb.go | 591 +++++++++++++++--- api/stovepipe/protopb/stovepipe.pb.yarpc.go | 189 +++--- doc/rfc/stovepipe/request-history-api.md | 19 +- doc/rfc/stovepipe/request-log.md | 4 +- service/stovepipe/server/mapper/BUILD.bazel | 3 + .../server/mapper/request_history.go | 60 ++ .../server/mapper/request_history_test.go | 160 +++++ .../gen/api/stovepipe/proto/stovepipe_pb.ts | 197 +++++- 9 files changed, 1071 insertions(+), 199 deletions(-) diff --git a/api/stovepipe/proto/stovepipe.proto b/api/stovepipe/proto/stovepipe.proto index 8de6c2c90..a2bc0c5cb 100644 --- a/api/stovepipe/proto/stovepipe.proto +++ b/api/stovepipe/proto/stovepipe.proto @@ -84,6 +84,53 @@ message HistoryEvent { } // Stable domain reason for a terminal request outcome. Empty otherwise. string outcome_reason = 5; + // Typed context retained with this occurrence. Absent when no supported metadata is available. + HistoryEventData data = 6; +} + +// HistoryEventData exposes known occurrence metadata without exposing the internal metadata map. +message HistoryEventData { + // The payload corresponds to request_state or the event string on the containing HistoryEvent. + oneof payload { + // Context recorded with a request-state transition. + HistoryRequestStateData request_state = 1; + // Context recorded when a build became durable. + HistoryBuildData build_triggered = 2; + // Context recorded when a build reached a terminal status. + HistoryBuildData build_finished = 3; + // Context recorded when a repository validation fact became durable. + HistoryValidationFactData validation_fact_recorded = 4; + // Context recorded when all project facts became durable. + HistoryProjectFactsData project_facts_recorded = 5; + // Context recorded when build analysis was abandoned. + HistoryBuildData build_analysis_abandoned = 6; + } +} + +// HistoryRequestStateData is retained context for a request-state transition. +message HistoryRequestStateData { + // Selected baseline URI. A present empty string means a full build; absence means unknown. + optional string base_uri = 1; + // Build that established the terminal request state, when retained. + optional string build_id = 2; +} + +// HistoryBuildData identifies the build associated with an occurrence. +message HistoryBuildData { + // Opaque runner-assigned build identifier. + string build_id = 1; +} + +// HistoryValidationFactData describes a retained whole-repository validation fact. +message HistoryValidationFactData { + // Breakage degree on [0.0, 1.0]. Zero is a recorded green result. + double fact_degree = 1; +} + +// HistoryProjectFactsData describes a completed batch of project validation facts. +message HistoryProjectFactsData { + // Number of project facts recorded, including zero for an empty batch. + uint64 project_fact_count = 1; } // RequestHistory identifies one request and contains its ordered events and current summary. diff --git a/api/stovepipe/protopb/stovepipe.pb.go b/api/stovepipe/protopb/stovepipe.pb.go index ff308230d..e18e9a8c5 100644 --- a/api/stovepipe/protopb/stovepipe.pb.go +++ b/api/stovepipe/protopb/stovepipe.pb.go @@ -426,6 +426,8 @@ type HistoryEvent struct { Occurrence isHistoryEvent_Occurrence `protobuf_oneof:"occurrence"` // Stable domain reason for a terminal request outcome. Empty otherwise. OutcomeReason string `protobuf:"bytes,5,opt,name=outcome_reason,json=outcomeReason,proto3" json:"outcome_reason,omitempty"` + // Typed context retained with this occurrence. Absent when no supported metadata is available. + Data *HistoryEventData `protobuf:"bytes,6,opt,name=data,proto3" json:"data,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -506,6 +508,13 @@ func (x *HistoryEvent) GetOutcomeReason() string { return "" } +func (x *HistoryEvent) GetData() *HistoryEventData { + if x != nil { + return x.Data + } + return nil +} + type isHistoryEvent_Occurrence interface { isHistoryEvent_Occurrence() } @@ -524,6 +533,354 @@ func (*HistoryEvent_RequestState) isHistoryEvent_Occurrence() {} func (*HistoryEvent_Event) isHistoryEvent_Occurrence() {} +// HistoryEventData exposes known occurrence metadata without exposing the internal metadata map. +type HistoryEventData struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The payload corresponds to request_state or the event string on the containing HistoryEvent. + // + // Types that are valid to be assigned to Payload: + // + // *HistoryEventData_RequestState + // *HistoryEventData_BuildTriggered + // *HistoryEventData_BuildFinished + // *HistoryEventData_ValidationFactRecorded + // *HistoryEventData_ProjectFactsRecorded + // *HistoryEventData_BuildAnalysisAbandoned + Payload isHistoryEventData_Payload `protobuf_oneof:"payload"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *HistoryEventData) Reset() { + *x = HistoryEventData{} + mi := &file_stovepipe_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *HistoryEventData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HistoryEventData) ProtoMessage() {} + +func (x *HistoryEventData) ProtoReflect() protoreflect.Message { + mi := &file_stovepipe_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 HistoryEventData.ProtoReflect.Descriptor instead. +func (*HistoryEventData) Descriptor() ([]byte, []int) { + return file_stovepipe_proto_rawDescGZIP(), []int{7} +} + +func (x *HistoryEventData) GetPayload() isHistoryEventData_Payload { + if x != nil { + return x.Payload + } + return nil +} + +func (x *HistoryEventData) GetRequestState() *HistoryRequestStateData { + if x != nil { + if x, ok := x.Payload.(*HistoryEventData_RequestState); ok { + return x.RequestState + } + } + return nil +} + +func (x *HistoryEventData) GetBuildTriggered() *HistoryBuildData { + if x != nil { + if x, ok := x.Payload.(*HistoryEventData_BuildTriggered); ok { + return x.BuildTriggered + } + } + return nil +} + +func (x *HistoryEventData) GetBuildFinished() *HistoryBuildData { + if x != nil { + if x, ok := x.Payload.(*HistoryEventData_BuildFinished); ok { + return x.BuildFinished + } + } + return nil +} + +func (x *HistoryEventData) GetValidationFactRecorded() *HistoryValidationFactData { + if x != nil { + if x, ok := x.Payload.(*HistoryEventData_ValidationFactRecorded); ok { + return x.ValidationFactRecorded + } + } + return nil +} + +func (x *HistoryEventData) GetProjectFactsRecorded() *HistoryProjectFactsData { + if x != nil { + if x, ok := x.Payload.(*HistoryEventData_ProjectFactsRecorded); ok { + return x.ProjectFactsRecorded + } + } + return nil +} + +func (x *HistoryEventData) GetBuildAnalysisAbandoned() *HistoryBuildData { + if x != nil { + if x, ok := x.Payload.(*HistoryEventData_BuildAnalysisAbandoned); ok { + return x.BuildAnalysisAbandoned + } + } + return nil +} + +type isHistoryEventData_Payload interface { + isHistoryEventData_Payload() +} + +type HistoryEventData_RequestState struct { + // Context recorded with a request-state transition. + RequestState *HistoryRequestStateData `protobuf:"bytes,1,opt,name=request_state,json=requestState,proto3,oneof"` +} + +type HistoryEventData_BuildTriggered struct { + // Context recorded when a build became durable. + BuildTriggered *HistoryBuildData `protobuf:"bytes,2,opt,name=build_triggered,json=buildTriggered,proto3,oneof"` +} + +type HistoryEventData_BuildFinished struct { + // Context recorded when a build reached a terminal status. + BuildFinished *HistoryBuildData `protobuf:"bytes,3,opt,name=build_finished,json=buildFinished,proto3,oneof"` +} + +type HistoryEventData_ValidationFactRecorded struct { + // Context recorded when a repository validation fact became durable. + ValidationFactRecorded *HistoryValidationFactData `protobuf:"bytes,4,opt,name=validation_fact_recorded,json=validationFactRecorded,proto3,oneof"` +} + +type HistoryEventData_ProjectFactsRecorded struct { + // Context recorded when all project facts became durable. + ProjectFactsRecorded *HistoryProjectFactsData `protobuf:"bytes,5,opt,name=project_facts_recorded,json=projectFactsRecorded,proto3,oneof"` +} + +type HistoryEventData_BuildAnalysisAbandoned struct { + // Context recorded when build analysis was abandoned. + BuildAnalysisAbandoned *HistoryBuildData `protobuf:"bytes,6,opt,name=build_analysis_abandoned,json=buildAnalysisAbandoned,proto3,oneof"` +} + +func (*HistoryEventData_RequestState) isHistoryEventData_Payload() {} + +func (*HistoryEventData_BuildTriggered) isHistoryEventData_Payload() {} + +func (*HistoryEventData_BuildFinished) isHistoryEventData_Payload() {} + +func (*HistoryEventData_ValidationFactRecorded) isHistoryEventData_Payload() {} + +func (*HistoryEventData_ProjectFactsRecorded) isHistoryEventData_Payload() {} + +func (*HistoryEventData_BuildAnalysisAbandoned) isHistoryEventData_Payload() {} + +// HistoryRequestStateData is retained context for a request-state transition. +type HistoryRequestStateData struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Selected baseline URI. A present empty string means a full build; absence means unknown. + BaseUri *string `protobuf:"bytes,1,opt,name=base_uri,json=baseUri,proto3,oneof" json:"base_uri,omitempty"` + // Build that established the terminal request state, when retained. + BuildId *string `protobuf:"bytes,2,opt,name=build_id,json=buildId,proto3,oneof" json:"build_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *HistoryRequestStateData) Reset() { + *x = HistoryRequestStateData{} + mi := &file_stovepipe_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *HistoryRequestStateData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HistoryRequestStateData) ProtoMessage() {} + +func (x *HistoryRequestStateData) ProtoReflect() protoreflect.Message { + mi := &file_stovepipe_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 HistoryRequestStateData.ProtoReflect.Descriptor instead. +func (*HistoryRequestStateData) Descriptor() ([]byte, []int) { + return file_stovepipe_proto_rawDescGZIP(), []int{8} +} + +func (x *HistoryRequestStateData) GetBaseUri() string { + if x != nil && x.BaseUri != nil { + return *x.BaseUri + } + return "" +} + +func (x *HistoryRequestStateData) GetBuildId() string { + if x != nil && x.BuildId != nil { + return *x.BuildId + } + return "" +} + +// HistoryBuildData identifies the build associated with an occurrence. +type HistoryBuildData struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Opaque runner-assigned build identifier. + BuildId string `protobuf:"bytes,1,opt,name=build_id,json=buildId,proto3" json:"build_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *HistoryBuildData) Reset() { + *x = HistoryBuildData{} + mi := &file_stovepipe_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *HistoryBuildData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HistoryBuildData) ProtoMessage() {} + +func (x *HistoryBuildData) ProtoReflect() protoreflect.Message { + mi := &file_stovepipe_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 HistoryBuildData.ProtoReflect.Descriptor instead. +func (*HistoryBuildData) Descriptor() ([]byte, []int) { + return file_stovepipe_proto_rawDescGZIP(), []int{9} +} + +func (x *HistoryBuildData) GetBuildId() string { + if x != nil { + return x.BuildId + } + return "" +} + +// HistoryValidationFactData describes a retained whole-repository validation fact. +type HistoryValidationFactData struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Breakage degree on [0.0, 1.0]. Zero is a recorded green result. + FactDegree float64 `protobuf:"fixed64,1,opt,name=fact_degree,json=factDegree,proto3" json:"fact_degree,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *HistoryValidationFactData) Reset() { + *x = HistoryValidationFactData{} + mi := &file_stovepipe_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *HistoryValidationFactData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HistoryValidationFactData) ProtoMessage() {} + +func (x *HistoryValidationFactData) ProtoReflect() protoreflect.Message { + mi := &file_stovepipe_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 HistoryValidationFactData.ProtoReflect.Descriptor instead. +func (*HistoryValidationFactData) Descriptor() ([]byte, []int) { + return file_stovepipe_proto_rawDescGZIP(), []int{10} +} + +func (x *HistoryValidationFactData) GetFactDegree() float64 { + if x != nil { + return x.FactDegree + } + return 0 +} + +// HistoryProjectFactsData describes a completed batch of project validation facts. +type HistoryProjectFactsData struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Number of project facts recorded, including zero for an empty batch. + ProjectFactCount uint64 `protobuf:"varint,1,opt,name=project_fact_count,json=projectFactCount,proto3" json:"project_fact_count,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *HistoryProjectFactsData) Reset() { + *x = HistoryProjectFactsData{} + mi := &file_stovepipe_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *HistoryProjectFactsData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HistoryProjectFactsData) ProtoMessage() {} + +func (x *HistoryProjectFactsData) ProtoReflect() protoreflect.Message { + mi := &file_stovepipe_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 HistoryProjectFactsData.ProtoReflect.Descriptor instead. +func (*HistoryProjectFactsData) Descriptor() ([]byte, []int) { + return file_stovepipe_proto_rawDescGZIP(), []int{11} +} + +func (x *HistoryProjectFactsData) GetProjectFactCount() uint64 { + if x != nil { + return x.ProjectFactCount + } + return 0 +} + // RequestHistory identifies one request and contains its ordered events and current summary. type RequestHistory struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -539,7 +896,7 @@ type RequestHistory struct { func (x *RequestHistory) Reset() { *x = RequestHistory{} - mi := &file_stovepipe_proto_msgTypes[7] + mi := &file_stovepipe_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -551,7 +908,7 @@ func (x *RequestHistory) String() string { func (*RequestHistory) ProtoMessage() {} func (x *RequestHistory) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[7] + mi := &file_stovepipe_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -564,7 +921,7 @@ func (x *RequestHistory) ProtoReflect() protoreflect.Message { // Deprecated: Use RequestHistory.ProtoReflect.Descriptor instead. func (*RequestHistory) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{7} + return file_stovepipe_proto_rawDescGZIP(), []int{12} } func (x *RequestHistory) GetRequestId() string { @@ -601,7 +958,7 @@ type GetRequestHistoryByIDResponse struct { func (x *GetRequestHistoryByIDResponse) Reset() { *x = GetRequestHistoryByIDResponse{} - mi := &file_stovepipe_proto_msgTypes[8] + mi := &file_stovepipe_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -613,7 +970,7 @@ func (x *GetRequestHistoryByIDResponse) String() string { func (*GetRequestHistoryByIDResponse) ProtoMessage() {} func (x *GetRequestHistoryByIDResponse) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[8] + mi := &file_stovepipe_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -626,7 +983,7 @@ func (x *GetRequestHistoryByIDResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRequestHistoryByIDResponse.ProtoReflect.Descriptor instead. func (*GetRequestHistoryByIDResponse) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{8} + return file_stovepipe_proto_rawDescGZIP(), []int{13} } func (x *GetRequestHistoryByIDResponse) GetEvents() []*HistoryEvent { @@ -654,7 +1011,7 @@ type GetRequestHistoryByURIResponse struct { func (x *GetRequestHistoryByURIResponse) Reset() { *x = GetRequestHistoryByURIResponse{} - mi := &file_stovepipe_proto_msgTypes[9] + mi := &file_stovepipe_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -666,7 +1023,7 @@ func (x *GetRequestHistoryByURIResponse) String() string { func (*GetRequestHistoryByURIResponse) ProtoMessage() {} func (x *GetRequestHistoryByURIResponse) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[9] + mi := &file_stovepipe_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -679,7 +1036,7 @@ func (x *GetRequestHistoryByURIResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRequestHistoryByURIResponse.ProtoReflect.Descriptor instead. func (*GetRequestHistoryByURIResponse) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{9} + return file_stovepipe_proto_rawDescGZIP(), []int{14} } func (x *GetRequestHistoryByURIResponse) GetHistories() []*RequestHistory { @@ -708,7 +1065,7 @@ type GetProjectStatusByIDRequest struct { func (x *GetProjectStatusByIDRequest) Reset() { *x = GetProjectStatusByIDRequest{} - mi := &file_stovepipe_proto_msgTypes[10] + mi := &file_stovepipe_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -720,7 +1077,7 @@ func (x *GetProjectStatusByIDRequest) String() string { func (*GetProjectStatusByIDRequest) ProtoMessage() {} func (x *GetProjectStatusByIDRequest) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[10] + mi := &file_stovepipe_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -733,7 +1090,7 @@ func (x *GetProjectStatusByIDRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetProjectStatusByIDRequest.ProtoReflect.Descriptor instead. func (*GetProjectStatusByIDRequest) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{10} + return file_stovepipe_proto_rawDescGZIP(), []int{15} } func (x *GetProjectStatusByIDRequest) GetQueue() string { @@ -790,7 +1147,7 @@ type GetProjectStatusByURIRequest struct { func (x *GetProjectStatusByURIRequest) Reset() { *x = GetProjectStatusByURIRequest{} - mi := &file_stovepipe_proto_msgTypes[11] + mi := &file_stovepipe_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -802,7 +1159,7 @@ func (x *GetProjectStatusByURIRequest) String() string { func (*GetProjectStatusByURIRequest) ProtoMessage() {} func (x *GetProjectStatusByURIRequest) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[11] + mi := &file_stovepipe_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -815,7 +1172,7 @@ func (x *GetProjectStatusByURIRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetProjectStatusByURIRequest.ProtoReflect.Descriptor instead. func (*GetProjectStatusByURIRequest) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{11} + return file_stovepipe_proto_rawDescGZIP(), []int{16} } func (x *GetProjectStatusByURIRequest) GetQueue() string { @@ -870,7 +1227,7 @@ type ProjectValidation struct { func (x *ProjectValidation) Reset() { *x = ProjectValidation{} - mi := &file_stovepipe_proto_msgTypes[12] + mi := &file_stovepipe_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -882,7 +1239,7 @@ func (x *ProjectValidation) String() string { func (*ProjectValidation) ProtoMessage() {} func (x *ProjectValidation) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[12] + mi := &file_stovepipe_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -895,7 +1252,7 @@ func (x *ProjectValidation) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectValidation.ProtoReflect.Descriptor instead. func (*ProjectValidation) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{12} + return file_stovepipe_proto_rawDescGZIP(), []int{17} } func (x *ProjectValidation) GetProject() string { @@ -964,7 +1321,7 @@ type GetProjectStatusByIDResponse struct { func (x *GetProjectStatusByIDResponse) Reset() { *x = GetProjectStatusByIDResponse{} - mi := &file_stovepipe_proto_msgTypes[13] + mi := &file_stovepipe_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -976,7 +1333,7 @@ func (x *GetProjectStatusByIDResponse) String() string { func (*GetProjectStatusByIDResponse) ProtoMessage() {} func (x *GetProjectStatusByIDResponse) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[13] + mi := &file_stovepipe_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -989,7 +1346,7 @@ func (x *GetProjectStatusByIDResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetProjectStatusByIDResponse.ProtoReflect.Descriptor instead. func (*GetProjectStatusByIDResponse) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{13} + return file_stovepipe_proto_rawDescGZIP(), []int{18} } func (x *GetProjectStatusByIDResponse) GetRequestId() string { @@ -1115,7 +1472,7 @@ type GetProjectStatusByURIResponse struct { func (x *GetProjectStatusByURIResponse) Reset() { *x = GetProjectStatusByURIResponse{} - mi := &file_stovepipe_proto_msgTypes[14] + mi := &file_stovepipe_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1127,7 +1484,7 @@ func (x *GetProjectStatusByURIResponse) String() string { func (*GetProjectStatusByURIResponse) ProtoMessage() {} func (x *GetProjectStatusByURIResponse) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[14] + mi := &file_stovepipe_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1140,7 +1497,7 @@ func (x *GetProjectStatusByURIResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetProjectStatusByURIResponse.ProtoReflect.Descriptor instead. func (*GetProjectStatusByURIResponse) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{14} + return file_stovepipe_proto_rawDescGZIP(), []int{19} } func (x *GetProjectStatusByURIResponse) GetRequestId() string { @@ -1258,7 +1615,7 @@ type RequestSummary struct { func (x *RequestSummary) Reset() { *x = RequestSummary{} - mi := &file_stovepipe_proto_msgTypes[15] + mi := &file_stovepipe_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1270,7 +1627,7 @@ func (x *RequestSummary) String() string { func (*RequestSummary) ProtoMessage() {} func (x *RequestSummary) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[15] + mi := &file_stovepipe_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1283,7 +1640,7 @@ func (x *RequestSummary) ProtoReflect() protoreflect.Message { // Deprecated: Use RequestSummary.ProtoReflect.Descriptor instead. func (*RequestSummary) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{15} + return file_stovepipe_proto_rawDescGZIP(), []int{20} } func (x *RequestSummary) GetRequestId() string { @@ -1365,7 +1722,7 @@ type ListRequest struct { func (x *ListRequest) Reset() { *x = ListRequest{} - mi := &file_stovepipe_proto_msgTypes[16] + mi := &file_stovepipe_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1377,7 +1734,7 @@ func (x *ListRequest) String() string { func (*ListRequest) ProtoMessage() {} func (x *ListRequest) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[16] + mi := &file_stovepipe_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1390,7 +1747,7 @@ func (x *ListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRequest.ProtoReflect.Descriptor instead. func (*ListRequest) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{16} + return file_stovepipe_proto_rawDescGZIP(), []int{21} } func (x *ListRequest) GetQueue() string { @@ -1482,7 +1839,7 @@ type ListResponse struct { func (x *ListResponse) Reset() { *x = ListResponse{} - mi := &file_stovepipe_proto_msgTypes[17] + mi := &file_stovepipe_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1494,7 +1851,7 @@ func (x *ListResponse) String() string { func (*ListResponse) ProtoMessage() {} func (x *ListResponse) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[17] + mi := &file_stovepipe_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1507,7 +1864,7 @@ func (x *ListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListResponse.ProtoReflect.Descriptor instead. func (*ListResponse) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{17} + return file_stovepipe_proto_rawDescGZIP(), []int{22} } func (x *ListResponse) GetRequests() []*RequestSummary { @@ -1536,7 +1893,7 @@ type GetQueueStatusRequest struct { func (x *GetQueueStatusRequest) Reset() { *x = GetQueueStatusRequest{} - mi := &file_stovepipe_proto_msgTypes[18] + mi := &file_stovepipe_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1548,7 +1905,7 @@ func (x *GetQueueStatusRequest) String() string { func (*GetQueueStatusRequest) ProtoMessage() {} func (x *GetQueueStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[18] + mi := &file_stovepipe_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1561,7 +1918,7 @@ func (x *GetQueueStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetQueueStatusRequest.ProtoReflect.Descriptor instead. func (*GetQueueStatusRequest) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{18} + return file_stovepipe_proto_rawDescGZIP(), []int{23} } func (x *GetQueueStatusRequest) GetQueue() string { @@ -1595,7 +1952,7 @@ type QueueEnablementStatus struct { func (x *QueueEnablementStatus) Reset() { *x = QueueEnablementStatus{} - mi := &file_stovepipe_proto_msgTypes[19] + mi := &file_stovepipe_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1607,7 +1964,7 @@ func (x *QueueEnablementStatus) String() string { func (*QueueEnablementStatus) ProtoMessage() {} func (x *QueueEnablementStatus) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[19] + mi := &file_stovepipe_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1620,7 +1977,7 @@ func (x *QueueEnablementStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use QueueEnablementStatus.ProtoReflect.Descriptor instead. func (*QueueEnablementStatus) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{19} + return file_stovepipe_proto_rawDescGZIP(), []int{24} } func (x *QueueEnablementStatus) GetVersion() int64 { @@ -1663,7 +2020,7 @@ type GetQueueStatusResponse struct { func (x *GetQueueStatusResponse) Reset() { *x = GetQueueStatusResponse{} - mi := &file_stovepipe_proto_msgTypes[20] + mi := &file_stovepipe_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1675,7 +2032,7 @@ func (x *GetQueueStatusResponse) String() string { func (*GetQueueStatusResponse) ProtoMessage() {} func (x *GetQueueStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[20] + mi := &file_stovepipe_proto_msgTypes[25] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1688,7 +2045,7 @@ func (x *GetQueueStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetQueueStatusResponse.ProtoReflect.Descriptor instead. func (*GetQueueStatusResponse) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{20} + return file_stovepipe_proto_rawDescGZIP(), []int{25} } func (x *GetQueueStatusResponse) GetQueue() string { @@ -1727,15 +2084,36 @@ const file_stovepipe_proto_rawDesc = "" + "request_id\x18\x02 \x01(\tR\trequestId\"G\n" + "\x1dGetRequestHistoryByURIRequest\x12\x14\n" + "\x05queue\x18\x01 \x01(\tR\x05queue\x12\x10\n" + - "\x03uri\x18\x02 \x01(\tR\x03uri\"\xc0\x01\n" + + "\x03uri\x18\x02 \x01(\tR\x03uri\"\x82\x02\n" + "\fHistoryEvent\x12\x19\n" + "\bevent_id\x18\x01 \x01(\tR\aeventId\x12!\n" + "\ftimestamp_ms\x18\x02 \x01(\x03R\vtimestampMs\x12%\n" + "\rrequest_state\x18\x03 \x01(\tH\x00R\frequestState\x12\x16\n" + "\x05event\x18\x04 \x01(\tH\x00R\x05event\x12%\n" + - "\x0eoutcome_reason\x18\x05 \x01(\tR\routcomeReasonB\f\n" + + "\x0eoutcome_reason\x18\x05 \x01(\tR\routcomeReason\x12@\n" + + "\x04data\x18\x06 \x01(\v2,.uber.submitqueue.stovepipe.HistoryEventDataR\x04dataB\f\n" + "\n" + - "occurrence\"\xc6\x01\n" + + "occurrence\"\xf3\x04\n" + + "\x10HistoryEventData\x12Z\n" + + "\rrequest_state\x18\x01 \x01(\v23.uber.submitqueue.stovepipe.HistoryRequestStateDataH\x00R\frequestState\x12W\n" + + "\x0fbuild_triggered\x18\x02 \x01(\v2,.uber.submitqueue.stovepipe.HistoryBuildDataH\x00R\x0ebuildTriggered\x12U\n" + + "\x0ebuild_finished\x18\x03 \x01(\v2,.uber.submitqueue.stovepipe.HistoryBuildDataH\x00R\rbuildFinished\x12q\n" + + "\x18validation_fact_recorded\x18\x04 \x01(\v25.uber.submitqueue.stovepipe.HistoryValidationFactDataH\x00R\x16validationFactRecorded\x12k\n" + + "\x16project_facts_recorded\x18\x05 \x01(\v23.uber.submitqueue.stovepipe.HistoryProjectFactsDataH\x00R\x14projectFactsRecorded\x12h\n" + + "\x18build_analysis_abandoned\x18\x06 \x01(\v2,.uber.submitqueue.stovepipe.HistoryBuildDataH\x00R\x16buildAnalysisAbandonedB\t\n" + + "\apayload\"s\n" + + "\x17HistoryRequestStateData\x12\x1e\n" + + "\bbase_uri\x18\x01 \x01(\tH\x00R\abaseUri\x88\x01\x01\x12\x1e\n" + + "\bbuild_id\x18\x02 \x01(\tH\x01R\abuildId\x88\x01\x01B\v\n" + + "\t_base_uriB\v\n" + + "\t_build_id\"-\n" + + "\x10HistoryBuildData\x12\x19\n" + + "\bbuild_id\x18\x01 \x01(\tR\abuildId\"<\n" + + "\x19HistoryValidationFactData\x12\x1f\n" + + "\vfact_degree\x18\x01 \x01(\x01R\n" + + "factDegree\"G\n" + + "\x17HistoryProjectFactsData\x12,\n" + + "\x12project_fact_count\x18\x01 \x01(\x04R\x10projectFactCount\"\xc6\x01\n" + "\x0eRequestHistory\x12\x1d\n" + "\n" + "request_id\x18\x01 \x01(\tR\trequestId\x12@\n" + @@ -1861,7 +2239,7 @@ func file_stovepipe_proto_rawDescGZIP() []byte { } var file_stovepipe_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_stovepipe_proto_msgTypes = make([]protoimpl.MessageInfo, 21) +var file_stovepipe_proto_msgTypes = make([]protoimpl.MessageInfo, 26) var file_stovepipe_proto_goTypes = []any{ (QueueEnablement)(0), // 0: uber.submitqueue.stovepipe.QueueEnablement (*PingRequest)(nil), // 1: uber.submitqueue.stovepipe.PingRequest @@ -1871,53 +2249,65 @@ var file_stovepipe_proto_goTypes = []any{ (*GetRequestHistoryByIDRequest)(nil), // 5: uber.submitqueue.stovepipe.GetRequestHistoryByIDRequest (*GetRequestHistoryByURIRequest)(nil), // 6: uber.submitqueue.stovepipe.GetRequestHistoryByURIRequest (*HistoryEvent)(nil), // 7: uber.submitqueue.stovepipe.HistoryEvent - (*RequestHistory)(nil), // 8: uber.submitqueue.stovepipe.RequestHistory - (*GetRequestHistoryByIDResponse)(nil), // 9: uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse - (*GetRequestHistoryByURIResponse)(nil), // 10: uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse - (*GetProjectStatusByIDRequest)(nil), // 11: uber.submitqueue.stovepipe.GetProjectStatusByIDRequest - (*GetProjectStatusByURIRequest)(nil), // 12: uber.submitqueue.stovepipe.GetProjectStatusByURIRequest - (*ProjectValidation)(nil), // 13: uber.submitqueue.stovepipe.ProjectValidation - (*GetProjectStatusByIDResponse)(nil), // 14: uber.submitqueue.stovepipe.GetProjectStatusByIDResponse - (*GetProjectStatusByURIResponse)(nil), // 15: uber.submitqueue.stovepipe.GetProjectStatusByURIResponse - (*RequestSummary)(nil), // 16: uber.submitqueue.stovepipe.RequestSummary - (*ListRequest)(nil), // 17: uber.submitqueue.stovepipe.ListRequest - (*ListResponse)(nil), // 18: uber.submitqueue.stovepipe.ListResponse - (*GetQueueStatusRequest)(nil), // 19: uber.submitqueue.stovepipe.GetQueueStatusRequest - (*QueueEnablementStatus)(nil), // 20: uber.submitqueue.stovepipe.QueueEnablementStatus - (*GetQueueStatusResponse)(nil), // 21: uber.submitqueue.stovepipe.GetQueueStatusResponse + (*HistoryEventData)(nil), // 8: uber.submitqueue.stovepipe.HistoryEventData + (*HistoryRequestStateData)(nil), // 9: uber.submitqueue.stovepipe.HistoryRequestStateData + (*HistoryBuildData)(nil), // 10: uber.submitqueue.stovepipe.HistoryBuildData + (*HistoryValidationFactData)(nil), // 11: uber.submitqueue.stovepipe.HistoryValidationFactData + (*HistoryProjectFactsData)(nil), // 12: uber.submitqueue.stovepipe.HistoryProjectFactsData + (*RequestHistory)(nil), // 13: uber.submitqueue.stovepipe.RequestHistory + (*GetRequestHistoryByIDResponse)(nil), // 14: uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse + (*GetRequestHistoryByURIResponse)(nil), // 15: uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse + (*GetProjectStatusByIDRequest)(nil), // 16: uber.submitqueue.stovepipe.GetProjectStatusByIDRequest + (*GetProjectStatusByURIRequest)(nil), // 17: uber.submitqueue.stovepipe.GetProjectStatusByURIRequest + (*ProjectValidation)(nil), // 18: uber.submitqueue.stovepipe.ProjectValidation + (*GetProjectStatusByIDResponse)(nil), // 19: uber.submitqueue.stovepipe.GetProjectStatusByIDResponse + (*GetProjectStatusByURIResponse)(nil), // 20: uber.submitqueue.stovepipe.GetProjectStatusByURIResponse + (*RequestSummary)(nil), // 21: uber.submitqueue.stovepipe.RequestSummary + (*ListRequest)(nil), // 22: uber.submitqueue.stovepipe.ListRequest + (*ListResponse)(nil), // 23: uber.submitqueue.stovepipe.ListResponse + (*GetQueueStatusRequest)(nil), // 24: uber.submitqueue.stovepipe.GetQueueStatusRequest + (*QueueEnablementStatus)(nil), // 25: uber.submitqueue.stovepipe.QueueEnablementStatus + (*GetQueueStatusResponse)(nil), // 26: uber.submitqueue.stovepipe.GetQueueStatusResponse } var file_stovepipe_proto_depIdxs = []int32{ - 7, // 0: uber.submitqueue.stovepipe.RequestHistory.events:type_name -> uber.submitqueue.stovepipe.HistoryEvent - 16, // 1: uber.submitqueue.stovepipe.RequestHistory.request_summary:type_name -> uber.submitqueue.stovepipe.RequestSummary - 7, // 2: uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse.events:type_name -> uber.submitqueue.stovepipe.HistoryEvent - 16, // 3: uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse.request_summary:type_name -> uber.submitqueue.stovepipe.RequestSummary - 8, // 4: uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse.histories:type_name -> uber.submitqueue.stovepipe.RequestHistory - 13, // 5: uber.submitqueue.stovepipe.GetProjectStatusByIDResponse.projects:type_name -> uber.submitqueue.stovepipe.ProjectValidation - 13, // 6: uber.submitqueue.stovepipe.GetProjectStatusByURIResponse.projects:type_name -> uber.submitqueue.stovepipe.ProjectValidation - 16, // 7: uber.submitqueue.stovepipe.ListResponse.requests:type_name -> uber.submitqueue.stovepipe.RequestSummary - 0, // 8: uber.submitqueue.stovepipe.QueueEnablementStatus.state:type_name -> uber.submitqueue.stovepipe.QueueEnablement - 20, // 9: uber.submitqueue.stovepipe.GetQueueStatusResponse.enablement:type_name -> uber.submitqueue.stovepipe.QueueEnablementStatus - 1, // 10: uber.submitqueue.stovepipe.Stovepipe.Ping:input_type -> uber.submitqueue.stovepipe.PingRequest - 3, // 11: uber.submitqueue.stovepipe.Stovepipe.Ingest:input_type -> uber.submitqueue.stovepipe.IngestRequest - 5, // 12: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByID:input_type -> uber.submitqueue.stovepipe.GetRequestHistoryByIDRequest - 6, // 13: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByURI:input_type -> uber.submitqueue.stovepipe.GetRequestHistoryByURIRequest - 11, // 14: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByID:input_type -> uber.submitqueue.stovepipe.GetProjectStatusByIDRequest - 12, // 15: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByURI:input_type -> uber.submitqueue.stovepipe.GetProjectStatusByURIRequest - 17, // 16: uber.submitqueue.stovepipe.Stovepipe.List:input_type -> uber.submitqueue.stovepipe.ListRequest - 19, // 17: uber.submitqueue.stovepipe.Stovepipe.GetQueueStatus:input_type -> uber.submitqueue.stovepipe.GetQueueStatusRequest - 2, // 18: uber.submitqueue.stovepipe.Stovepipe.Ping:output_type -> uber.submitqueue.stovepipe.PingResponse - 4, // 19: uber.submitqueue.stovepipe.Stovepipe.Ingest:output_type -> uber.submitqueue.stovepipe.IngestResponse - 9, // 20: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByID:output_type -> uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse - 10, // 21: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByURI:output_type -> uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse - 14, // 22: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByID:output_type -> uber.submitqueue.stovepipe.GetProjectStatusByIDResponse - 15, // 23: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByURI:output_type -> uber.submitqueue.stovepipe.GetProjectStatusByURIResponse - 18, // 24: uber.submitqueue.stovepipe.Stovepipe.List:output_type -> uber.submitqueue.stovepipe.ListResponse - 21, // 25: uber.submitqueue.stovepipe.Stovepipe.GetQueueStatus:output_type -> uber.submitqueue.stovepipe.GetQueueStatusResponse - 18, // [18:26] is the sub-list for method output_type - 10, // [10:18] is the sub-list for method input_type - 10, // [10:10] is the sub-list for extension type_name - 10, // [10:10] is the sub-list for extension extendee - 0, // [0:10] is the sub-list for field type_name + 8, // 0: uber.submitqueue.stovepipe.HistoryEvent.data:type_name -> uber.submitqueue.stovepipe.HistoryEventData + 9, // 1: uber.submitqueue.stovepipe.HistoryEventData.request_state:type_name -> uber.submitqueue.stovepipe.HistoryRequestStateData + 10, // 2: uber.submitqueue.stovepipe.HistoryEventData.build_triggered:type_name -> uber.submitqueue.stovepipe.HistoryBuildData + 10, // 3: uber.submitqueue.stovepipe.HistoryEventData.build_finished:type_name -> uber.submitqueue.stovepipe.HistoryBuildData + 11, // 4: uber.submitqueue.stovepipe.HistoryEventData.validation_fact_recorded:type_name -> uber.submitqueue.stovepipe.HistoryValidationFactData + 12, // 5: uber.submitqueue.stovepipe.HistoryEventData.project_facts_recorded:type_name -> uber.submitqueue.stovepipe.HistoryProjectFactsData + 10, // 6: uber.submitqueue.stovepipe.HistoryEventData.build_analysis_abandoned:type_name -> uber.submitqueue.stovepipe.HistoryBuildData + 7, // 7: uber.submitqueue.stovepipe.RequestHistory.events:type_name -> uber.submitqueue.stovepipe.HistoryEvent + 21, // 8: uber.submitqueue.stovepipe.RequestHistory.request_summary:type_name -> uber.submitqueue.stovepipe.RequestSummary + 7, // 9: uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse.events:type_name -> uber.submitqueue.stovepipe.HistoryEvent + 21, // 10: uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse.request_summary:type_name -> uber.submitqueue.stovepipe.RequestSummary + 13, // 11: uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse.histories:type_name -> uber.submitqueue.stovepipe.RequestHistory + 18, // 12: uber.submitqueue.stovepipe.GetProjectStatusByIDResponse.projects:type_name -> uber.submitqueue.stovepipe.ProjectValidation + 18, // 13: uber.submitqueue.stovepipe.GetProjectStatusByURIResponse.projects:type_name -> uber.submitqueue.stovepipe.ProjectValidation + 21, // 14: uber.submitqueue.stovepipe.ListResponse.requests:type_name -> uber.submitqueue.stovepipe.RequestSummary + 0, // 15: uber.submitqueue.stovepipe.QueueEnablementStatus.state:type_name -> uber.submitqueue.stovepipe.QueueEnablement + 25, // 16: uber.submitqueue.stovepipe.GetQueueStatusResponse.enablement:type_name -> uber.submitqueue.stovepipe.QueueEnablementStatus + 1, // 17: uber.submitqueue.stovepipe.Stovepipe.Ping:input_type -> uber.submitqueue.stovepipe.PingRequest + 3, // 18: uber.submitqueue.stovepipe.Stovepipe.Ingest:input_type -> uber.submitqueue.stovepipe.IngestRequest + 5, // 19: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByID:input_type -> uber.submitqueue.stovepipe.GetRequestHistoryByIDRequest + 6, // 20: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByURI:input_type -> uber.submitqueue.stovepipe.GetRequestHistoryByURIRequest + 16, // 21: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByID:input_type -> uber.submitqueue.stovepipe.GetProjectStatusByIDRequest + 17, // 22: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByURI:input_type -> uber.submitqueue.stovepipe.GetProjectStatusByURIRequest + 22, // 23: uber.submitqueue.stovepipe.Stovepipe.List:input_type -> uber.submitqueue.stovepipe.ListRequest + 24, // 24: uber.submitqueue.stovepipe.Stovepipe.GetQueueStatus:input_type -> uber.submitqueue.stovepipe.GetQueueStatusRequest + 2, // 25: uber.submitqueue.stovepipe.Stovepipe.Ping:output_type -> uber.submitqueue.stovepipe.PingResponse + 4, // 26: uber.submitqueue.stovepipe.Stovepipe.Ingest:output_type -> uber.submitqueue.stovepipe.IngestResponse + 14, // 27: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByID:output_type -> uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse + 15, // 28: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByURI:output_type -> uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse + 19, // 29: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByID:output_type -> uber.submitqueue.stovepipe.GetProjectStatusByIDResponse + 20, // 30: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByURI:output_type -> uber.submitqueue.stovepipe.GetProjectStatusByURIResponse + 23, // 31: uber.submitqueue.stovepipe.Stovepipe.List:output_type -> uber.submitqueue.stovepipe.ListResponse + 26, // 32: uber.submitqueue.stovepipe.Stovepipe.GetQueueStatus:output_type -> uber.submitqueue.stovepipe.GetQueueStatusResponse + 25, // [25:33] is the sub-list for method output_type + 17, // [17:25] is the sub-list for method input_type + 17, // [17:17] is the sub-list for extension type_name + 17, // [17:17] is the sub-list for extension extendee + 0, // [0:17] is the sub-list for field type_name } func init() { file_stovepipe_proto_init() } @@ -1929,16 +2319,25 @@ func file_stovepipe_proto_init() { (*HistoryEvent_RequestState)(nil), (*HistoryEvent_Event)(nil), } - file_stovepipe_proto_msgTypes[12].OneofWrappers = []any{ + file_stovepipe_proto_msgTypes[7].OneofWrappers = []any{ + (*HistoryEventData_RequestState)(nil), + (*HistoryEventData_BuildTriggered)(nil), + (*HistoryEventData_BuildFinished)(nil), + (*HistoryEventData_ValidationFactRecorded)(nil), + (*HistoryEventData_ProjectFactsRecorded)(nil), + (*HistoryEventData_BuildAnalysisAbandoned)(nil), + } + file_stovepipe_proto_msgTypes[8].OneofWrappers = []any{} + file_stovepipe_proto_msgTypes[17].OneofWrappers = []any{ (*ProjectValidation_BreakageDegree)(nil), } - file_stovepipe_proto_msgTypes[13].OneofWrappers = []any{ + file_stovepipe_proto_msgTypes[18].OneofWrappers = []any{ (*GetProjectStatusByIDResponse_RepositoryBreakageDegree)(nil), } - file_stovepipe_proto_msgTypes[14].OneofWrappers = []any{ + file_stovepipe_proto_msgTypes[19].OneofWrappers = []any{ (*GetProjectStatusByURIResponse_RepositoryBreakageDegree)(nil), } - file_stovepipe_proto_msgTypes[16].OneofWrappers = []any{ + file_stovepipe_proto_msgTypes[21].OneofWrappers = []any{ (*ListRequest_AcceptedAtOrAfterMs)(nil), (*ListRequest_AcceptedBeforeMs)(nil), } @@ -1948,7 +2347,7 @@ func file_stovepipe_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_stovepipe_proto_rawDesc), len(file_stovepipe_proto_rawDesc)), NumEnums: 1, - NumMessages: 21, + NumMessages: 26, NumExtensions: 0, NumServices: 1, }, diff --git a/api/stovepipe/protopb/stovepipe.pb.yarpc.go b/api/stovepipe/protopb/stovepipe.pb.yarpc.go index b2283430a..d01b4b667 100644 --- a/api/stovepipe/protopb/stovepipe.pb.yarpc.go +++ b/api/stovepipe/protopb/stovepipe.pb.yarpc.go @@ -576,91 +576,110 @@ var ( var yarpcFileDescriptorClosurefabdb6b3c0b09022 = [][]byte{ // stovepipe.proto []byte{ - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x4d, 0x6f, 0x1b, 0xc5, - 0x1b, 0xf7, 0xda, 0x79, 0xb1, 0x9f, 0x38, 0x4e, 0x3a, 0x6d, 0xf3, 0x77, 0xdc, 0xa6, 0xca, 0x7f, - 0xa1, 0x34, 0x2d, 0xaa, 0xa3, 0x06, 0x09, 0x5a, 0x0e, 0x88, 0xb8, 0x71, 0x63, 0x8b, 0x26, 0x4d, - 0xd7, 0x0d, 0x48, 0xf4, 0xb0, 0x5a, 0xdb, 0x4f, 0x9c, 0x6d, 0xb3, 0x2f, 0x9d, 0x99, 0x0d, 0xa4, - 0x07, 0x24, 0x0e, 0x9c, 0x90, 0x90, 0xf8, 0x06, 0x9c, 0xe1, 0xce, 0x99, 0x13, 0x5f, 0x80, 0x0b, - 0x7c, 0x02, 0x3e, 0x02, 0x57, 0x34, 0x2f, 0xbb, 0x5e, 0x3b, 0x8e, 0xd3, 0x34, 0x20, 0x81, 0xc4, - 0xcd, 0xf3, 0xbc, 0xfc, 0xe6, 0x99, 0xe7, 0xe5, 0xb7, 0x33, 0x86, 0x39, 0xc6, 0x83, 0x43, 0x0c, - 0xdd, 0x10, 0xab, 0x21, 0x0d, 0x78, 0x40, 0x2a, 0x51, 0x1b, 0x69, 0x95, 0x45, 0x6d, 0xcf, 0xe5, - 0x2f, 0x22, 0x8c, 0xb0, 0x9a, 0x58, 0x98, 0x37, 0x60, 0x66, 0xc7, 0xf5, 0x7b, 0x16, 0xbe, 0x88, - 0x90, 0x71, 0x52, 0x86, 0x69, 0x0f, 0x19, 0x73, 0x7a, 0x58, 0x36, 0x96, 0x8d, 0x95, 0x82, 0x15, - 0x2f, 0xcd, 0xaf, 0x0c, 0x28, 0x2a, 0x4b, 0x16, 0x06, 0x3e, 0xc3, 0x93, 0x4d, 0xc9, 0xff, 0xa1, - 0xc8, 0x90, 0x1e, 0xba, 0x1d, 0xb4, 0x7d, 0xc7, 0xc3, 0x72, 0x56, 0xaa, 0x67, 0xb4, 0x6c, 0xdb, - 0xf1, 0x90, 0x5c, 0x85, 0x02, 0x77, 0x3d, 0x64, 0xdc, 0xf1, 0xc2, 0x72, 0x6e, 0xd9, 0x58, 0xc9, - 0x59, 0x7d, 0x01, 0xa9, 0x40, 0x7e, 0x3f, 0x60, 0x5c, 0x3a, 0x4f, 0x48, 0xe7, 0x64, 0x6d, 0x5e, - 0x87, 0xd9, 0xa6, 0xdf, 0x43, 0xc6, 0xe3, 0x90, 0x2f, 0xc1, 0xa4, 0x3c, 0x94, 0x8e, 0x42, 0x2d, - 0xcc, 0x65, 0x28, 0xc5, 0x66, 0x3a, 0xde, 0x12, 0x64, 0xdd, 0xae, 0x36, 0xca, 0xba, 0x5d, 0xb3, - 0x05, 0x57, 0x37, 0x31, 0x46, 0x69, 0xb8, 0x8c, 0x07, 0xf4, 0xa8, 0x76, 0xd4, 0xdc, 0x18, 0x8b, - 0x4b, 0x96, 0x00, 0xa8, 0x32, 0xb0, 0xdd, 0xae, 0x3e, 0x59, 0x41, 0x4b, 0x9a, 0x5d, 0x73, 0x13, - 0x96, 0x46, 0x80, 0xee, 0x5a, 0xcd, 0xf1, 0xa8, 0xf3, 0x90, 0x8b, 0xa8, 0xab, 0xe1, 0xc4, 0x4f, - 0xf3, 0x27, 0x03, 0x8a, 0xda, 0xbf, 0x7e, 0x88, 0x3e, 0x27, 0x8b, 0x90, 0x47, 0xf1, 0xc3, 0x4e, - 0x0e, 0x31, 0x2d, 0xd7, 0xcd, 0xae, 0xc8, 0x77, 0x92, 0x3b, 0xdb, 0x63, 0x12, 0x26, 0x67, 0xcd, - 0x24, 0xb2, 0x2d, 0x46, 0xae, 0xc3, 0x6c, 0x1c, 0x36, 0xe3, 0x0e, 0x47, 0x99, 0xf3, 0x42, 0x23, - 0x63, 0x15, 0xb5, 0xb8, 0x25, 0xa4, 0x64, 0x01, 0x26, 0x25, 0xa8, 0xca, 0x7a, 0x23, 0x63, 0xa9, - 0x25, 0xb9, 0x0e, 0xa5, 0x20, 0xe2, 0x9d, 0xc0, 0x43, 0x9b, 0xa2, 0xc3, 0x02, 0xbf, 0x3c, 0x29, - 0x43, 0x98, 0xd5, 0x52, 0x4b, 0x0a, 0x6b, 0x45, 0x80, 0xa0, 0xd3, 0x89, 0x28, 0x45, 0xbf, 0x83, - 0xe6, 0xcf, 0x06, 0x94, 0x06, 0x33, 0x31, 0x94, 0x3d, 0x63, 0x28, 0x7b, 0xe4, 0x43, 0x98, 0x92, - 0xfb, 0x89, 0x23, 0xe4, 0x56, 0x66, 0xd6, 0x56, 0xaa, 0x27, 0x77, 0x6e, 0x35, 0x9d, 0x1d, 0x4b, - 0xfb, 0x91, 0x16, 0xcc, 0x25, 0xe7, 0x8c, 0x3c, 0xcf, 0xa1, 0x47, 0xf2, 0xa4, 0x33, 0x6b, 0xb7, - 0xc6, 0x41, 0xe9, 0x28, 0x5b, 0xca, 0xc3, 0x2a, 0xd1, 0x81, 0xb5, 0xf9, 0xa3, 0x31, 0xb2, 0xaa, - 0xa2, 0x55, 0x74, 0x6f, 0xf5, 0x03, 0x37, 0xfe, 0xba, 0xc0, 0xb3, 0xe7, 0x0e, 0xfc, 0x19, 0x5c, - 0x3b, 0xa9, 0x1b, 0x75, 0xe0, 0x0d, 0x28, 0xec, 0x4b, 0xb9, 0x8b, 0x71, 0xec, 0xaf, 0xb2, 0xa1, - 0xc6, 0xb2, 0xfa, 0xce, 0xe6, 0xf7, 0x06, 0x5c, 0xd9, 0x44, 0xbe, 0x43, 0x83, 0x67, 0xd8, 0x91, - 0xed, 0x14, 0xb1, 0xf3, 0x8e, 0x93, 0x20, 0x82, 0x50, 0x01, 0xb2, 0x72, 0x6e, 0x39, 0x27, 0x88, - 0x20, 0x5e, 0x93, 0x2b, 0x50, 0x08, 0x9d, 0x1e, 0xda, 0xcc, 0x7d, 0xa9, 0x58, 0x62, 0xd2, 0xca, - 0x0b, 0x41, 0xcb, 0x7d, 0x29, 0x71, 0xa5, 0x92, 0x07, 0xcf, 0x31, 0x6e, 0x56, 0x69, 0xfe, 0x44, - 0x08, 0xcc, 0x1f, 0x0c, 0x39, 0xfc, 0x43, 0xc1, 0x9e, 0x3a, 0xa6, 0x4b, 0x00, 0x9d, 0x7d, 0xc7, - 0xef, 0xa1, 0xdd, 0x9f, 0xd6, 0x82, 0x92, 0xec, 0x52, 0xf7, 0x6f, 0x8b, 0xb6, 0x0d, 0x17, 0x74, - 0xa4, 0x1f, 0x3b, 0x07, 0x6e, 0xd7, 0xe1, 0x6e, 0xe0, 0x0b, 0xfa, 0xd5, 0xe0, 0x31, 0x1d, 0xe8, - 0x25, 0xb9, 0x09, 0x73, 0x6d, 0x8a, 0xce, 0x73, 0x81, 0xd8, 0xc5, 0x1e, 0x45, 0xc5, 0xc0, 0x46, - 0x23, 0x63, 0x95, 0x62, 0xc5, 0x86, 0x94, 0xd7, 0xf2, 0x30, 0x45, 0x91, 0x45, 0x07, 0xdc, 0xfc, - 0x35, 0x37, 0x2a, 0x23, 0xa9, 0x16, 0x3f, 0x65, 0x74, 0x93, 0x84, 0x65, 0x4f, 0x4e, 0x58, 0x6e, - 0x38, 0x61, 0x8b, 0x90, 0x6f, 0x3b, 0x4c, 0x29, 0x15, 0xcf, 0x4f, 0x8b, 0xb5, 0x50, 0xbd, 0x31, - 0x4c, 0x58, 0x2a, 0x2b, 0x83, 0x74, 0x65, 0xc2, 0x6c, 0x14, 0x76, 0x1d, 0x8e, 0x5d, 0xdb, 0xe1, - 0x82, 0xf9, 0x40, 0x31, 0x9f, 0x16, 0xae, 0xf3, 0x2d, 0x46, 0x3e, 0x80, 0x0a, 0xc5, 0x30, 0x60, - 0xae, 0x68, 0x58, 0x7b, 0x38, 0x31, 0x53, 0x3a, 0x31, 0xe5, 0xbe, 0x4d, 0x6d, 0x20, 0x45, 0xe4, - 0x2e, 0x94, 0x75, 0x62, 0x6d, 0x95, 0x2a, 0x66, 0x77, 0x02, 0x2f, 0x3c, 0x40, 0x8e, 0xe5, 0xe9, - 0x65, 0x63, 0x25, 0x6f, 0x2d, 0x68, 0xbd, 0xa5, 0xd4, 0xf7, 0xb5, 0x96, 0x34, 0x53, 0xed, 0x90, - 0x97, 0xa3, 0x75, 0x7b, 0xdc, 0x68, 0x1d, 0x2b, 0x71, 0xaa, 0x7b, 0xde, 0x82, 0x39, 0x1f, 0x3f, - 0xe7, 0x76, 0xaa, 0x4b, 0x0a, 0x8a, 0x80, 0x85, 0x78, 0x27, 0xee, 0x94, 0xda, 0x45, 0xb8, 0x90, - 0x3a, 0xac, 0x2e, 0xed, 0x6f, 0x39, 0x49, 0x5f, 0xa3, 0x9a, 0xfd, 0xbf, 0xda, 0xfe, 0xcb, 0x6b, - 0xfb, 0x5d, 0x36, 0xf9, 0xc6, 0x6a, 0xd2, 0xff, 0x47, 0x16, 0xf3, 0x36, 0x5c, 0x94, 0x4a, 0x7b, - 0xb0, 0xa4, 0x53, 0xb2, 0xa4, 0xf3, 0x52, 0xb5, 0x9b, 0xaa, 0xeb, 0x9b, 0x50, 0x72, 0x3a, 0x1d, - 0x0c, 0xfb, 0x96, 0xd3, 0xd2, 0xb2, 0x18, 0x4b, 0xa5, 0xd5, 0xf1, 0x4b, 0x49, 0x7e, 0xc4, 0xa5, - 0xc4, 0xfc, 0xc3, 0x80, 0x99, 0x87, 0xee, 0x29, 0xf7, 0x45, 0xf2, 0x2e, 0xfc, 0x2f, 0xbd, 0x65, - 0x40, 0x6d, 0x67, 0x8f, 0x23, 0x4d, 0xae, 0x53, 0x8d, 0x8c, 0x75, 0xb1, 0xbf, 0xfb, 0x23, 0xba, - 0x2e, 0xb4, 0x5b, 0x8c, 0x54, 0x81, 0x24, 0x7e, 0x6d, 0xdc, 0x0b, 0x28, 0x0a, 0x17, 0x79, 0xa3, - 0x6d, 0x18, 0xd6, 0x7c, 0xac, 0xab, 0x49, 0xd5, 0xd6, 0xb9, 0xbe, 0x03, 0xb5, 0x05, 0xb8, 0x94, - 0xec, 0x75, 0x10, 0x7c, 0x86, 0xd4, 0x6e, 0x07, 0x91, 0xdf, 0x1d, 0x90, 0x47, 0x61, 0x18, 0xcb, - 0xcd, 0x2f, 0xa0, 0xa8, 0x0e, 0xae, 0xc7, 0xfc, 0x01, 0xe4, 0x75, 0x55, 0xce, 0xf2, 0xad, 0x8f, - 0x2f, 0x17, 0x89, 0xef, 0xa8, 0x8e, 0xcd, 0x8e, 0xe8, 0x58, 0xf3, 0x21, 0x5c, 0xde, 0x44, 0xfe, - 0x58, 0xc0, 0x2a, 0xd6, 0x39, 0xcf, 0xd7, 0xd5, 0xfc, 0xc5, 0x80, 0xcb, 0x12, 0xab, 0xee, 0x3b, - 0xed, 0x03, 0xf4, 0xd0, 0xd7, 0x5c, 0x26, 0x3e, 0x85, 0x87, 0x48, 0x99, 0x1b, 0xf8, 0x12, 0x30, - 0x67, 0xc5, 0x4b, 0xb2, 0x0e, 0x93, 0xaa, 0x29, 0x05, 0x5a, 0x69, 0xed, 0xed, 0x71, 0xc7, 0x1d, - 0xc2, 0xb6, 0x94, 0x27, 0xb9, 0x07, 0x8b, 0xb8, 0xb7, 0x87, 0x1d, 0xee, 0x1e, 0xa2, 0xbd, 0x47, - 0x03, 0x4f, 0x50, 0x84, 0xe7, 0xf2, 0xd4, 0xa0, 0x2c, 0x24, 0x06, 0x0f, 0x68, 0xe0, 0xdd, 0x97, - 0x6a, 0x31, 0x1a, 0x26, 0xcc, 0xaa, 0xf0, 0xe3, 0x2e, 0x9e, 0x50, 0x14, 0xa6, 0x85, 0xa2, 0x89, - 0xcd, 0x2f, 0x0d, 0x58, 0x18, 0x4e, 0x92, 0x2e, 0xd7, 0xe8, 0x2c, 0x3d, 0x06, 0xc0, 0x24, 0x48, - 0x7d, 0x47, 0xbc, 0x73, 0x86, 0x73, 0xe9, 0x4d, 0x52, 0x20, 0xb7, 0x0e, 0x60, 0x6e, 0xc8, 0x88, - 0x5c, 0x85, 0xf2, 0xe3, 0xdd, 0xfa, 0x6e, 0xdd, 0xae, 0x6f, 0xaf, 0xd7, 0x1e, 0xd6, 0xb7, 0xea, - 0xdb, 0x4f, 0xec, 0xdd, 0xed, 0x8f, 0xb6, 0x1f, 0x7d, 0xb2, 0x3d, 0x9f, 0x19, 0xa9, 0x55, 0x3f, - 0x37, 0xe6, 0x0d, 0xb2, 0x04, 0x8b, 0xc7, 0xb4, 0x1b, 0xcd, 0x96, 0x52, 0x67, 0xd7, 0x7e, 0x9f, - 0x86, 0x42, 0x2b, 0x8e, 0x8e, 0x3c, 0x85, 0x09, 0xf1, 0xaa, 0x24, 0x37, 0xc6, 0xd2, 0x67, 0xff, - 0x85, 0x5a, 0x59, 0x39, 0xdd, 0x50, 0xe5, 0xcf, 0xcc, 0x10, 0x07, 0xa6, 0xd4, 0x23, 0x90, 0xdc, - 0x1c, 0xe7, 0x35, 0xf0, 0x9e, 0xac, 0xdc, 0x7a, 0x15, 0xd3, 0x64, 0x8b, 0x6f, 0x0c, 0xd9, 0xe4, - 0xc7, 0xdf, 0x06, 0xe4, 0xee, 0x38, 0x9c, 0x71, 0x2f, 0xcf, 0xca, 0xbd, 0xd7, 0xf0, 0x4c, 0x02, - 0xfa, 0x56, 0x35, 0xd4, 0x88, 0x4b, 0x3f, 0x39, 0x2b, 0x6e, 0xff, 0x3e, 0x5c, 0x79, 0xff, 0x75, - 0x5c, 0x93, 0x98, 0xbe, 0x36, 0xe0, 0xd2, 0xa8, 0xcb, 0x25, 0x79, 0xef, 0x14, 0xd8, 0x93, 0x5e, - 0x13, 0x95, 0xbb, 0x67, 0x77, 0x1c, 0x2e, 0xd9, 0xf1, 0xfb, 0x10, 0x39, 0x23, 0x6a, 0x2a, 0x3f, - 0xf7, 0x5e, 0xc3, 0x33, 0x09, 0xe8, 0x29, 0x4c, 0x08, 0x9e, 0x1e, 0x3f, 0x03, 0xa9, 0x4f, 0xd8, - 0xf8, 0x19, 0x48, 0x53, 0xbe, 0x99, 0x21, 0x47, 0x50, 0x1a, 0xe4, 0x17, 0x72, 0xe7, 0x94, 0x58, - 0x8f, 0x13, 0x76, 0x65, 0xed, 0x2c, 0x2e, 0xf1, 0xd6, 0x35, 0x84, 0x6b, 0x9d, 0xc0, 0x1b, 0xe3, - 0x5a, 0x2b, 0x25, 0x44, 0xb0, 0x43, 0x03, 0x1e, 0xec, 0x18, 0x9f, 0xde, 0xe9, 0xb9, 0x7c, 0x3f, - 0x6a, 0x57, 0x3b, 0x81, 0xb7, 0x2a, 0x1c, 0x57, 0x53, 0x8e, 0xab, 0x4e, 0xe8, 0xae, 0x26, 0xce, - 0xab, 0xf2, 0xcf, 0xad, 0xb0, 0xdd, 0x9e, 0x92, 0x3f, 0xde, 0xf9, 0x33, 0x00, 0x00, 0xff, 0xff, - 0xd1, 0x24, 0x65, 0xea, 0xf8, 0x12, 0x00, 0x00, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0xcd, 0x6e, 0xdb, 0xc6, + 0x16, 0x36, 0x25, 0xd9, 0x92, 0x8e, 0x6c, 0xd9, 0x99, 0x38, 0x8e, 0xac, 0xc4, 0xb9, 0xbe, 0xbc, + 0x37, 0x37, 0x4e, 0x6e, 0x62, 0x23, 0x0e, 0xee, 0x6d, 0x52, 0x14, 0x45, 0xac, 0xf8, 0x4f, 0x68, + 0xec, 0x38, 0x74, 0xd4, 0x00, 0xc9, 0x82, 0x18, 0x91, 0x63, 0x99, 0x89, 0xf8, 0x13, 0xce, 0xd0, + 0xad, 0xb3, 0x28, 0xd0, 0x02, 0x05, 0x02, 0x14, 0x28, 0xd0, 0x37, 0xe8, 0xba, 0xdd, 0xf7, 0x11, + 0xfa, 0x02, 0xdd, 0xb4, 0x4f, 0xd0, 0x07, 0xe8, 0xa2, 0xdb, 0x62, 0x7e, 0x48, 0x51, 0xb2, 0x2c, + 0x5b, 0x71, 0x0b, 0xb4, 0x40, 0x77, 0x9c, 0x33, 0xe7, 0x7c, 0xe7, 0xcc, 0xf9, 0x9d, 0x21, 0x4c, + 0x52, 0xe6, 0x1f, 0x90, 0xc0, 0x09, 0xc8, 0x62, 0x10, 0xfa, 0xcc, 0x47, 0xd5, 0xa8, 0x49, 0xc2, + 0x45, 0x1a, 0x35, 0x5d, 0x87, 0xbd, 0x8a, 0x48, 0x44, 0x16, 0x13, 0x0e, 0xfd, 0x1a, 0x94, 0x76, + 0x1c, 0xaf, 0x65, 0x90, 0x57, 0x11, 0xa1, 0x0c, 0x55, 0x20, 0xef, 0x12, 0x4a, 0x71, 0x8b, 0x54, + 0xb4, 0x79, 0x6d, 0xa1, 0x68, 0xc4, 0x4b, 0xfd, 0x73, 0x0d, 0xc6, 0x25, 0x27, 0x0d, 0x7c, 0x8f, + 0x92, 0xe3, 0x59, 0xd1, 0x3f, 0x61, 0x9c, 0x92, 0xf0, 0xc0, 0xb1, 0x88, 0xe9, 0x61, 0x97, 0x54, + 0x32, 0x62, 0xbb, 0xa4, 0x68, 0xdb, 0xd8, 0x25, 0xe8, 0x32, 0x14, 0x99, 0xe3, 0x12, 0xca, 0xb0, + 0x1b, 0x54, 0xb2, 0xf3, 0xda, 0x42, 0xd6, 0xe8, 0x10, 0x50, 0x15, 0x0a, 0xfb, 0x3e, 0x65, 0x42, + 0x38, 0x27, 0x84, 0x93, 0xb5, 0x7e, 0x15, 0x26, 0xea, 0x5e, 0x8b, 0x50, 0x16, 0x9b, 0x3c, 0x0d, + 0xa3, 0xe2, 0x50, 0xca, 0x0a, 0xb9, 0xd0, 0xe7, 0xa1, 0x1c, 0xb3, 0x29, 0x7b, 0xcb, 0x90, 0x71, + 0x6c, 0xc5, 0x94, 0x71, 0x6c, 0x7d, 0x17, 0x2e, 0x6f, 0x90, 0x18, 0x65, 0xd3, 0xa1, 0xcc, 0x0f, + 0x0f, 0x6b, 0x87, 0xf5, 0xd5, 0x81, 0xb8, 0x68, 0x0e, 0x20, 0x94, 0x0c, 0xa6, 0x63, 0xab, 0x93, + 0x15, 0x15, 0xa5, 0x6e, 0xeb, 0x1b, 0x30, 0xd7, 0x07, 0xb4, 0x61, 0xd4, 0x07, 0xa3, 0x4e, 0x41, + 0x36, 0x0a, 0x1d, 0x05, 0xc7, 0x3f, 0xf5, 0xcf, 0x32, 0x30, 0xae, 0xe4, 0xd7, 0x0e, 0x88, 0xc7, + 0xd0, 0x2c, 0x14, 0x08, 0xff, 0x30, 0x93, 0x43, 0xe4, 0xc5, 0xba, 0x6e, 0x73, 0x7f, 0x27, 0xbe, + 0x33, 0x5d, 0x2a, 0x60, 0xb2, 0x46, 0x29, 0xa1, 0x6d, 0x51, 0x74, 0x15, 0x26, 0x62, 0xb3, 0x29, + 0xc3, 0x8c, 0x08, 0x9f, 0x17, 0x37, 0x47, 0x8c, 0x71, 0x45, 0xde, 0xe5, 0x54, 0x34, 0x03, 0xa3, + 0x02, 0x54, 0x7a, 0x7d, 0x73, 0xc4, 0x90, 0x4b, 0x74, 0x15, 0xca, 0x7e, 0xc4, 0x2c, 0xdf, 0x25, + 0x66, 0x48, 0x30, 0xf5, 0xbd, 0xca, 0xa8, 0x30, 0x61, 0x42, 0x51, 0x0d, 0x41, 0x44, 0xf7, 0x21, + 0x67, 0x63, 0x86, 0x2b, 0x63, 0xf3, 0xda, 0x42, 0x69, 0xf9, 0xe6, 0xe2, 0xf1, 0x79, 0xb7, 0x98, + 0x3e, 0xdb, 0x2a, 0x66, 0xd8, 0x10, 0x92, 0xb5, 0x71, 0x00, 0xdf, 0xb2, 0xa2, 0x30, 0x24, 0x9e, + 0x45, 0xf4, 0x5f, 0x72, 0x30, 0xd5, 0xcb, 0x88, 0x9e, 0xf5, 0x1e, 0x45, 0x13, 0xda, 0xee, 0x9c, + 0x42, 0x9b, 0x91, 0x3a, 0x2b, 0xc7, 0x3a, 0x72, 0xfe, 0xa7, 0x30, 0xd9, 0x8c, 0x9c, 0xb6, 0x6d, + 0xb2, 0xd0, 0x69, 0xb5, 0x48, 0x48, 0x64, 0x88, 0x4f, 0x77, 0x96, 0x1a, 0x97, 0x54, 0xb0, 0x65, + 0x01, 0xf3, 0x24, 0x46, 0x41, 0x0d, 0x90, 0x14, 0x73, 0xcf, 0xf1, 0x1c, 0xba, 0x4f, 0x6c, 0x11, + 0x80, 0xe1, 0x71, 0x27, 0x04, 0xca, 0xba, 0x02, 0x41, 0xaf, 0xa0, 0x72, 0x80, 0xdb, 0x8e, 0x8d, + 0x99, 0xe3, 0x7b, 0xe6, 0x1e, 0xb6, 0x98, 0x19, 0x12, 0xcb, 0x0f, 0x6d, 0x62, 0x8b, 0x10, 0x96, + 0x96, 0xff, 0x77, 0x0a, 0x05, 0x1f, 0x26, 0x10, 0xeb, 0xd8, 0x62, 0x4a, 0xd3, 0xcc, 0x41, 0x17, + 0xd5, 0x50, 0xb0, 0xe8, 0x25, 0xcc, 0x04, 0xa1, 0xff, 0x82, 0x58, 0x4c, 0xe8, 0xa3, 0x1d, 0x85, + 0xa3, 0xa7, 0x8e, 0xc3, 0x8e, 0x04, 0xe0, 0xb8, 0x54, 0xa9, 0x9b, 0x0e, 0x52, 0xb4, 0x44, 0xd9, + 0x3e, 0x54, 0xa4, 0xdb, 0xb0, 0x87, 0xdb, 0x87, 0xd4, 0xa1, 0x26, 0x6e, 0x62, 0xcf, 0xf6, 0x3d, + 0x62, 0x0f, 0x91, 0x64, 0x69, 0x07, 0xce, 0x08, 0xbc, 0x15, 0x05, 0xb7, 0x12, 0xa3, 0xd5, 0x8a, + 0x90, 0x0f, 0xf0, 0x61, 0xdb, 0xc7, 0xb6, 0x4e, 0xe1, 0xe2, 0x31, 0xf9, 0x82, 0xae, 0x40, 0xa1, + 0x89, 0x29, 0x31, 0x79, 0xb1, 0x6a, 0xaa, 0x44, 0xf2, 0x9c, 0xd2, 0x08, 0x9d, 0x37, 0x9a, 0x26, + 0xf6, 0x85, 0xbd, 0x71, 0x6f, 0xd8, 0xd4, 0x8c, 0xbc, 0xa0, 0xd4, 0xed, 0x37, 0x9a, 0x56, 0x2b, + 0x41, 0xd1, 0x8c, 0x01, 0xe4, 0x42, 0x71, 0xeb, 0xb7, 0x92, 0x4c, 0x4f, 0xac, 0xe5, 0x25, 0x9f, + 0xa0, 0xa9, 0x92, 0x57, 0x58, 0xfa, 0x7b, 0x30, 0x7b, 0x6c, 0xf0, 0xd0, 0x3f, 0xa0, 0x24, 0x52, + 0xc1, 0x26, 0xad, 0x90, 0xc8, 0xfa, 0xd0, 0x0c, 0xe0, 0xa4, 0x55, 0x41, 0xd1, 0x37, 0x92, 0x13, + 0xf6, 0x46, 0x02, 0xdd, 0x04, 0x94, 0x0e, 0xaf, 0x69, 0xf9, 0x91, 0xc7, 0x04, 0x44, 0xce, 0x98, + 0x4a, 0xc5, 0xe8, 0x01, 0xa7, 0xeb, 0xdf, 0x6b, 0x50, 0xee, 0x6e, 0x76, 0x3d, 0x0d, 0x52, 0xeb, + 0x69, 0x90, 0xe8, 0x3e, 0x8c, 0x89, 0x96, 0xc2, 0xbb, 0x54, 0x76, 0xa1, 0xb4, 0xbc, 0x70, 0xda, + 0x26, 0x61, 0x28, 0x39, 0xb4, 0x0b, 0x93, 0x49, 0xfd, 0x47, 0xae, 0x8b, 0xc3, 0x43, 0x55, 0x4b, + 0x37, 0x06, 0x41, 0xc5, 0xa1, 0x94, 0x12, 0x46, 0x39, 0xec, 0x5a, 0xeb, 0xdf, 0x69, 0x7d, 0x1b, + 0x37, 0x9f, 0x06, 0x6a, 0x7c, 0x74, 0x0c, 0xd7, 0x7e, 0x3f, 0xc3, 0x33, 0x67, 0x36, 0xfc, 0x05, + 0x5c, 0x39, 0x6e, 0xe0, 0x28, 0xc3, 0x37, 0xa1, 0xb8, 0x2f, 0xe8, 0x0e, 0x89, 0x6d, 0x3f, 0x8d, + 0xc2, 0xb8, 0x04, 0x3a, 0xc2, 0xfa, 0x37, 0x1a, 0x5c, 0xda, 0x20, 0x4c, 0xe5, 0x0c, 0xaf, 0x8a, + 0x88, 0x9e, 0x75, 0x62, 0xf2, 0x59, 0xaf, 0xd2, 0x8a, 0x56, 0xb2, 0xf3, 0x59, 0x3e, 0xeb, 0xe3, + 0x35, 0xba, 0x04, 0xc5, 0x00, 0xb7, 0x88, 0x49, 0x9d, 0xd7, 0xf2, 0x22, 0x30, 0x6a, 0x14, 0x38, + 0x61, 0xd7, 0x79, 0x2d, 0x70, 0xc5, 0x26, 0xf3, 0x5f, 0x92, 0x78, 0x1e, 0x09, 0xf6, 0x27, 0x9c, + 0xa0, 0x7f, 0xab, 0x89, 0xf9, 0xde, 0x63, 0xec, 0x89, 0x93, 0x78, 0x0e, 0xc0, 0xda, 0xc7, 0x5e, + 0x4b, 0xd6, 0xb8, 0xb2, 0x56, 0x52, 0x1a, 0xa1, 0xf3, 0x87, 0x59, 0xdb, 0x84, 0x73, 0xca, 0xd2, + 0x4e, 0x3d, 0xf3, 0x1b, 0x96, 0x02, 0x8f, 0xcb, 0x5f, 0x2d, 0xd1, 0x75, 0x98, 0x6c, 0x86, 0x04, + 0xbf, 0xe4, 0x88, 0xaa, 0xca, 0xb9, 0xa9, 0x9a, 0x98, 0x3c, 0x6a, 0x43, 0xd6, 0x7a, 0xad, 0x00, + 0x63, 0x21, 0xa1, 0x51, 0x9b, 0xe9, 0x3f, 0x66, 0xfb, 0x79, 0x24, 0x95, 0xe2, 0x27, 0x94, 0x6e, + 0xe2, 0xb0, 0xcc, 0xf1, 0x0e, 0xcb, 0xf6, 0x3a, 0x6c, 0x36, 0xd5, 0x31, 0x73, 0xaa, 0x87, 0xc9, + 0x7e, 0x89, 0xfe, 0xd5, 0x3b, 0xc8, 0xa5, 0x57, 0xba, 0x27, 0xb2, 0x0e, 0x13, 0x51, 0x60, 0x63, + 0x46, 0x6c, 0x13, 0x33, 0x7e, 0xb9, 0x01, 0x79, 0xb9, 0x51, 0xc4, 0x15, 0xb6, 0x45, 0xd1, 0xfb, + 0x50, 0x0d, 0x49, 0xe0, 0x53, 0x87, 0x27, 0xac, 0xd9, 0xeb, 0x98, 0x31, 0xe5, 0x98, 0x4a, 0x87, + 0xa7, 0xd6, 0xe5, 0x22, 0x74, 0x17, 0x2a, 0x71, 0xcf, 0x93, 0xae, 0xa2, 0xa6, 0xe5, 0xbb, 0x41, + 0x9b, 0x30, 0x52, 0xc9, 0xcf, 0x6b, 0x0b, 0x05, 0x23, 0x1e, 0x79, 0x86, 0xdc, 0x7e, 0xa0, 0x76, + 0x51, 0x3d, 0x95, 0x0e, 0x05, 0x51, 0x5a, 0xb7, 0x06, 0x95, 0xd6, 0x91, 0x10, 0xa7, 0xb2, 0xe7, + 0x3f, 0x30, 0xe9, 0x91, 0x8f, 0x99, 0x99, 0xca, 0x92, 0xa2, 0xbc, 0x63, 0x71, 0xf2, 0x4e, 0x9c, + 0x29, 0xb5, 0xf3, 0x70, 0x2e, 0x75, 0x58, 0x15, 0xda, 0x9f, 0xb2, 0xa2, 0x7d, 0xf5, 0x4b, 0xf6, + 0xbf, 0x63, 0xfb, 0x17, 0x8f, 0xed, 0xd7, 0x99, 0x64, 0xc6, 0xaa, 0xa6, 0xff, 0xa7, 0x0c, 0xe6, + 0x2d, 0x38, 0x2f, 0x36, 0xcd, 0xee, 0x90, 0x8e, 0x89, 0x90, 0x4e, 0x89, 0xad, 0x46, 0x2a, 0xae, + 0xff, 0x86, 0x32, 0xb6, 0x2c, 0x12, 0x74, 0x38, 0xf3, 0x82, 0x73, 0x3c, 0xa6, 0x0a, 0xae, 0xa3, + 0xef, 0x8e, 0x42, 0x9f, 0x77, 0x87, 0xfe, 0xab, 0x06, 0xa5, 0x87, 0xce, 0x09, 0x4f, 0x42, 0xf4, + 0x7f, 0xb8, 0x98, 0x56, 0xe9, 0x87, 0x26, 0xde, 0x63, 0x24, 0x4c, 0x5e, 0x4c, 0x9b, 0x23, 0xc6, + 0xf9, 0x8e, 0xf6, 0x47, 0xe1, 0x0a, 0xdf, 0xdd, 0xa2, 0x68, 0x11, 0x50, 0x22, 0xd7, 0x24, 0x7b, + 0x7e, 0x48, 0xb8, 0x88, 0x78, 0xb4, 0x6e, 0x6a, 0xc6, 0x54, 0xbc, 0x57, 0x13, 0x5b, 0x5b, 0x67, + 0x9a, 0x03, 0xb5, 0x19, 0x98, 0x4e, 0x74, 0xb5, 0xfd, 0x8f, 0x48, 0x68, 0x36, 0xfd, 0xc8, 0xb3, + 0xbb, 0xe8, 0x51, 0x10, 0xc4, 0x74, 0xfd, 0x13, 0x18, 0x97, 0x07, 0x57, 0x65, 0xbe, 0x0e, 0x05, + 0x15, 0x95, 0x61, 0x66, 0x7d, 0x7c, 0xb9, 0x48, 0x64, 0xfb, 0x65, 0x6c, 0xa6, 0x4f, 0xc6, 0xea, + 0x0f, 0xe1, 0xc2, 0x06, 0x61, 0x8f, 0x39, 0xac, 0xec, 0x3a, 0x67, 0x99, 0xae, 0xfa, 0x0f, 0x1a, + 0x5c, 0x10, 0x58, 0x6b, 0x1e, 0x6e, 0xb6, 0x89, 0x4b, 0x3c, 0xd5, 0xcb, 0xf8, 0x28, 0x3c, 0x20, + 0x21, 0x75, 0x7c, 0x4f, 0x00, 0x66, 0x8d, 0x78, 0x89, 0x56, 0x60, 0x54, 0x26, 0x25, 0x47, 0x2b, + 0x2f, 0xff, 0x77, 0xd0, 0x71, 0x7b, 0xb0, 0x0d, 0x29, 0x89, 0xee, 0xc1, 0x2c, 0xd9, 0xdb, 0x23, + 0x16, 0x73, 0x0e, 0x88, 0xb9, 0x17, 0xfa, 0x2e, 0x6f, 0x11, 0xae, 0xc3, 0x52, 0x85, 0x32, 0x93, + 0x30, 0xac, 0x87, 0xbe, 0xfb, 0x40, 0x6c, 0xf3, 0xd2, 0xd0, 0x61, 0x42, 0x9a, 0x1f, 0x67, 0x71, + 0x4e, 0xb6, 0x30, 0x45, 0xe4, 0x49, 0xac, 0x7f, 0xaa, 0xc1, 0x4c, 0xaf, 0x93, 0x54, 0xb8, 0xfa, + 0x7b, 0xe9, 0x31, 0x00, 0x49, 0x8c, 0x54, 0x77, 0xc4, 0xdb, 0x43, 0x9c, 0x4b, 0x29, 0x49, 0x81, + 0xdc, 0x68, 0xc3, 0x64, 0x0f, 0x13, 0xba, 0x0c, 0x95, 0xc7, 0x8d, 0xb5, 0xc6, 0x9a, 0xb9, 0xb6, + 0xbd, 0x52, 0x7b, 0xb8, 0xb6, 0xb5, 0xb6, 0xfd, 0xc4, 0x6c, 0x6c, 0x7f, 0xb0, 0xfd, 0xe8, 0xe9, + 0xf6, 0xd4, 0x48, 0xdf, 0x5d, 0xf9, 0xb9, 0x3a, 0xa5, 0xa1, 0x39, 0x98, 0x3d, 0xb2, 0xbb, 0x5a, + 0xdf, 0x95, 0xdb, 0x99, 0xe5, 0x9f, 0xf3, 0x50, 0xdc, 0x8d, 0xad, 0x43, 0xcf, 0x21, 0xb7, 0xe3, + 0x78, 0x2d, 0x74, 0x6d, 0x60, 0xfb, 0xec, 0xfc, 0x84, 0xaa, 0x2e, 0x9c, 0xcc, 0x28, 0xfd, 0xa7, + 0x8f, 0x20, 0x0c, 0x63, 0xf2, 0x3f, 0x0f, 0xba, 0x3e, 0x48, 0xaa, 0xeb, 0x97, 0x51, 0xf5, 0xc6, + 0x69, 0x58, 0x13, 0x15, 0x5f, 0x6a, 0x22, 0xc9, 0x8f, 0xbe, 0x0d, 0xd0, 0xdd, 0x41, 0x38, 0x83, + 0x7e, 0x2e, 0x55, 0xef, 0xbd, 0x85, 0x64, 0x62, 0xd0, 0x57, 0x32, 0xa1, 0xfa, 0x5c, 0xfa, 0xd1, + 0xb0, 0xb8, 0x9d, 0xfb, 0x70, 0xf5, 0xdd, 0xb7, 0x11, 0x4d, 0x6c, 0xfa, 0x42, 0x83, 0xe9, 0x7e, + 0x97, 0x4b, 0xf4, 0xce, 0x09, 0xb0, 0xc7, 0xbd, 0x26, 0xaa, 0x77, 0x87, 0x17, 0xec, 0x0d, 0xd9, + 0xd1, 0xfb, 0x10, 0x1a, 0x12, 0x35, 0xe5, 0x9f, 0x7b, 0x6f, 0x21, 0x99, 0x18, 0xf4, 0x1c, 0x72, + 0xbc, 0x4f, 0x0f, 0xae, 0x81, 0xd4, 0x08, 0x1b, 0x5c, 0x03, 0xe9, 0x96, 0xaf, 0x8f, 0xa0, 0x43, + 0x28, 0x77, 0xf7, 0x17, 0x74, 0xfb, 0x04, 0x5b, 0x8f, 0x36, 0xec, 0xea, 0xf2, 0x30, 0x22, 0xb1, + 0xea, 0x1a, 0x81, 0x2b, 0x96, 0xef, 0x0e, 0x10, 0xad, 0x95, 0x93, 0x46, 0xb0, 0x13, 0xfa, 0xcc, + 0xdf, 0xd1, 0x9e, 0xdd, 0x6e, 0x39, 0x6c, 0x3f, 0x6a, 0x2e, 0x5a, 0xbe, 0xbb, 0xc4, 0x05, 0x97, + 0x52, 0x82, 0x4b, 0x38, 0x70, 0x96, 0x12, 0xe1, 0x25, 0xf1, 0xff, 0x3a, 0x68, 0x36, 0xc7, 0xc4, + 0xc7, 0x9d, 0xdf, 0x02, 0x00, 0x00, 0xff, 0xff, 0xcb, 0x7d, 0x6d, 0xf6, 0xdb, 0x16, 0x00, 0x00, }, } diff --git a/doc/rfc/stovepipe/request-history-api.md b/doc/rfc/stovepipe/request-history-api.md index e2a6a9d09..7f1b6dfd9 100644 --- a/doc/rfc/stovepipe/request-history-api.md +++ b/doc/rfc/stovepipe/request-history-api.md @@ -26,6 +26,23 @@ The append-only history model is defined by [Stovepipe Request Log](request-log. Events are returned by `(timestamp_ms ASC, event_id ASC)`. URI histories are ordered by numeric request ID ascending. Timestamps determine display order; persisted request versions determine causal ordering internally and are not exposed as history-event fields. Later repair may insert an older occurrence into its chronological position. +### Retained Event Data + +`HistoryEvent.data` contains a typed `payload` oneof matching the containing request-state or event occurrence. It reads only metadata retained on that occurrence; it never fills historical context from the current Request, Build, or summary. The internal metadata map remains private. + +| Occurrence | Payload | Retained fields | +|---|---|---| +| Any request-state transition | `request_state` | Optional `base_uri` and `build_id` | +| `build_triggered` | `build_triggered` | `build_id` | +| `build_finished` | `build_finished` | `build_id` | +| `build_analysis_abandoned` | `build_analysis_abandoned` | `build_id` | +| `validation_fact_recorded` | `validation_fact_recorded` | `fact_degree`, a breakage degree in [0, 1] | +| `project_facts_recorded` | `project_facts_recorded` | `project_fact_count`, an unsigned count | + +A present empty `base_uri` means a full build; an absent baseline means it was not retained. State fields are independently optional. Numeric payload presence distinguishes a recorded zero from unavailable metadata. The project-fact count uses protobuf `uint64` (a decimal string in JSON) to preserve precision across clients. + +Missing metadata, malformed or out-of-range numbers, empty build IDs, and unsupported event metadata omit the corresponding payload without failing the history lookup. Clients tolerate absent data and unknown future payload kinds. Existing event fields and field numbers remain unchanged. + ## Retention and Errors History, request-summary, and request-URI mapping retention must support the same advertised lookup period. Neither endpoint promises a lifetime longer than the records required by its selector. @@ -41,7 +58,7 @@ Authorization follows the same queue policy as other Stovepipe reads. Possession ## Testing -Tests cover matching events and summaries across selectors, required summaries and retryable materialization gaps, current summaries independent of retained event subsets, queue and URI consistency, storage-read failures, histories absent despite a stored summary, stable event ordering, and unknown future state and outcome-reason strings. +Tests cover matching events and summaries across selectors, required summaries and retryable materialization gaps, current summaries independent of retained event subsets, queue and URI consistency, storage-read failures, histories absent despite a stored summary, stable event ordering, and unknown future state and outcome-reason strings. Metadata tests cover typed payloads, absent or malformed values, known zeros, empty baseline presence, private keys, and binary/JSON round trips. ## Alternatives Considered diff --git a/doc/rfc/stovepipe/request-log.md b/doc/rfc/stovepipe/request-log.md index a4b3dc2ea..3da430de9 100644 --- a/doc/rfc/stovepipe/request-log.md +++ b/doc/rfc/stovepipe/request-log.md @@ -101,9 +101,9 @@ Enums are strings with unknown sentinels, and the entity has no storage or trans The core column shape follows SubmitQueue's `RequestLog`, except Stovepipe omits SubmitQueue's redundant `Type` column. Context that is meaningful only for one occurrence kind remains in the JSON metadata map instead of adding sparse columns. -Metadata is never used for occurrence identity, filtering, or control flow. Nil and empty maps are equivalent. The initial entity and storage contract treats the map as opaque JSON; writer and projection work may later define and enforce keys such as `superseded_by_request_id`, `build_id`, and `fact_degree`. Producers must not store credentials, raw dependency errors, stack traces, or unbounded payloads. The initial public history API does not expose the raw map. +Metadata is never used for occurrence identity or filtering. Nil and empty maps are equivalent. Storage treats the map as opaque JSON; writers and projections define the bounded `base_uri`, `build_id`, `fact_degree`, and `project_fact_count` keys. Producers must not store credentials, raw dependency errors, stack traces, or unbounded payloads. The public history API exposes supported keys through typed occurrence payloads, never the raw map; the [API contract](request-history-api.md#retained-event-data) defines their presence semantics. -Immutable Request context such as URI, build strategy, base URI, and terminal build id remains on `Request` and is resolved there rather than copied into log records or history responses. Build status and version remain on `Build`; the triggered and finished event kinds plus the terminal Request state describe the lifecycle without duplicating Build snapshots. When a build established the terminal state, that state entry records its id as occurrence context. Diagnostic error codes remain in structured logs until a concrete public vocabulary is required. +State entries retain the selected baseline URI when known, including an empty URI for a full build. When a build established the terminal state, that state entry records its ID as occurrence context. Other Request context and Build status/version remain on their operational entities; history does not load them to enrich old occurrences. The triggered and finished event kinds plus the terminal Request state describe the lifecycle without duplicating Build snapshots. Diagnostic error codes remain in structured logs until a concrete public vocabulary is required. ## Vocabularies diff --git a/service/stovepipe/server/mapper/BUILD.bazel b/service/stovepipe/server/mapper/BUILD.bazel index 0f4c1b5a4..6b81074d3 100644 --- a/service/stovepipe/server/mapper/BUILD.bazel +++ b/service/stovepipe/server/mapper/BUILD.bazel @@ -13,6 +13,7 @@ go_library( visibility = ["//visibility:public"], deps = [ "//api/stovepipe/protopb:go_default_library", + "//stovepipe/core/requestlog:go_default_library", "//stovepipe/entity:go_default_library", ], ) @@ -32,5 +33,7 @@ go_test( "//stovepipe/entity:go_default_library", "@com_github_stretchr_testify//assert:go_default_library", "@com_github_stretchr_testify//require:go_default_library", + "@org_golang_google_protobuf//encoding/protojson:go_default_library", + "@org_golang_google_protobuf//proto:go_default_library", ], ) diff --git a/service/stovepipe/server/mapper/request_history.go b/service/stovepipe/server/mapper/request_history.go index 4e421b182..fe4c5dfce 100644 --- a/service/stovepipe/server/mapper/request_history.go +++ b/service/stovepipe/server/mapper/request_history.go @@ -15,7 +15,11 @@ package mapper import ( + "math" + "strconv" + pb "github.com/uber/submitqueue/api/stovepipe/protopb" + "github.com/uber/submitqueue/stovepipe/core/requestlog" "github.com/uber/submitqueue/stovepipe/entity" ) @@ -45,6 +49,7 @@ func HistoryEventsToProto(logs []entity.RequestLog) []*pb.HistoryEvent { EventId: log.ID, TimestampMs: log.TimestampMs, OutcomeReason: string(log.OutcomeReason), + Data: historyEventDataToProto(log), } if log.State != entity.RequestStateUnknown { event.Occurrence = &pb.HistoryEvent_RequestState{RequestState: string(log.State)} @@ -68,3 +73,58 @@ func RequestHistoriesToProto(histories []entity.RequestHistory) []*pb.RequestHis } return result } + +func historyEventDataToProto(log entity.RequestLog) *pb.HistoryEventData { + if log.State != entity.RequestStateUnknown { + baseURI, hasBaseURI := log.Metadata[requestlog.MetadataKeyBaseURI] + buildID := log.Metadata[requestlog.MetadataKeyBuildID] + if !hasBaseURI && buildID == "" { + return nil + } + state := &pb.HistoryRequestStateData{} + if hasBaseURI { + state.BaseUri = &baseURI + } + if buildID != "" { + state.BuildId = &buildID + } + return &pb.HistoryEventData{Payload: &pb.HistoryEventData_RequestState{RequestState: state}} + } + + switch log.Event { + case entity.RequestEventBuildTriggered, entity.RequestEventBuildFinished, entity.RequestEventBuildAnalysisAbandoned: + buildID := log.Metadata[requestlog.MetadataKeyBuildID] + if buildID == "" { + return nil + } + build := &pb.HistoryBuildData{BuildId: buildID} + data := &pb.HistoryEventData{} + switch log.Event { + case entity.RequestEventBuildTriggered: + data.Payload = &pb.HistoryEventData_BuildTriggered{BuildTriggered: build} + case entity.RequestEventBuildFinished: + data.Payload = &pb.HistoryEventData_BuildFinished{BuildFinished: build} + case entity.RequestEventBuildAnalysisAbandoned: + data.Payload = &pb.HistoryEventData_BuildAnalysisAbandoned{BuildAnalysisAbandoned: build} + } + return data + case entity.RequestEventValidationFactRecorded: + degree, err := strconv.ParseFloat(log.Metadata[requestlog.MetadataKeyFactDegree], 64) + if err != nil || math.IsNaN(degree) || degree < entity.DegreeGreen || degree > entity.DegreeBroken { + return nil + } + return &pb.HistoryEventData{Payload: &pb.HistoryEventData_ValidationFactRecorded{ + ValidationFactRecorded: &pb.HistoryValidationFactData{FactDegree: degree}, + }} + case entity.RequestEventProjectFactsRecorded: + count, err := strconv.ParseUint(log.Metadata[requestlog.MetadataKeyProjectFactCount], 10, 64) + if err != nil { + return nil + } + return &pb.HistoryEventData{Payload: &pb.HistoryEventData_ProjectFactsRecorded{ + ProjectFactsRecorded: &pb.HistoryProjectFactsData{ProjectFactCount: count}, + }} + default: + return nil + } +} diff --git a/service/stovepipe/server/mapper/request_history_test.go b/service/stovepipe/server/mapper/request_history_test.go index 0d7a83f6c..4d894d548 100644 --- a/service/stovepipe/server/mapper/request_history_test.go +++ b/service/stovepipe/server/mapper/request_history_test.go @@ -15,9 +15,14 @@ package mapper import ( + "maps" "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/encoding/protojson" + "google.golang.org/protobuf/proto" + pb "github.com/uber/submitqueue/api/stovepipe/protopb" "github.com/uber/submitqueue/stovepipe/entity" ) @@ -174,6 +179,161 @@ func TestRequestHistoriesToProto(t *testing.T) { } } +func TestHistoryMetadataToProto(t *testing.T) { + tests := []struct { + name string + state entity.RequestState + event entity.RequestEvent + metadata map[string]string + wantData string + }{ + { + name: "state retains baseline and terminal build", + state: entity.RequestStateSucceeded, + metadata: map[string]string{"base_uri": "git://repo/base", "build_id": "build/1", "private": "hidden"}, + wantData: `{"requestState":{"baseUri":"git://repo/base","buildId":"build/1"}}`, + }, + { + name: "full build has an explicitly empty baseline", + state: entity.RequestStateProcessing, + metadata: map[string]string{"base_uri": ""}, + wantData: `{"requestState":{"baseUri":""}}`, + }, + { + name: "baseline without terminal build", + state: entity.RequestStateProcessing, + metadata: map[string]string{"base_uri": "git://repo/base"}, + wantData: `{"requestState":{"baseUri":"git://repo/base"}}`, + }, + { + name: "terminal build with unknown baseline", + state: entity.RequestStateFailed, + metadata: map[string]string{"build_id": "build/1"}, + wantData: `{"requestState":{"buildId":"build/1"}}`, + }, + { + name: "triggered build", + event: entity.RequestEventBuildTriggered, + metadata: map[string]string{"build_id": "build/1", "base_uri": "not state context"}, + wantData: `{"buildTriggered":{"buildId":"build/1"}}`, + }, + { + name: "finished build", + event: entity.RequestEventBuildFinished, + metadata: map[string]string{"build_id": "build/1"}, + wantData: `{"buildFinished":{"buildId":"build/1"}}`, + }, + { + name: "abandoned build analysis", + event: entity.RequestEventBuildAnalysisAbandoned, + metadata: map[string]string{"build_id": "build/1"}, + wantData: `{"buildAnalysisAbandoned":{"buildId":"build/1"}}`, + }, + { + name: "green validation degree is known zero", + event: entity.RequestEventValidationFactRecorded, + metadata: map[string]string{"fact_degree": "0"}, + wantData: `{"validationFactRecorded":{}}`, + }, + { + name: "partial validation degree", + event: entity.RequestEventValidationFactRecorded, + metadata: map[string]string{"fact_degree": "0.5"}, + wantData: `{"validationFactRecorded":{"factDegree":0.5}}`, + }, + { + name: "broken validation degree", + event: entity.RequestEventValidationFactRecorded, + metadata: map[string]string{"fact_degree": "1"}, + wantData: `{"validationFactRecorded":{"factDegree":1}}`, + }, + { + name: "empty project fact batch is known zero", + event: entity.RequestEventProjectFactsRecorded, + metadata: map[string]string{"project_fact_count": "0"}, + wantData: `{"projectFactsRecorded":{}}`, + }, + { + name: "project fact count", + event: entity.RequestEventProjectFactsRecorded, + metadata: map[string]string{"project_fact_count": "42"}, + wantData: `{"projectFactsRecorded":{"projectFactCount":"42"}}`, + }, + { + name: "large project fact count preserves precision", + event: entity.RequestEventProjectFactsRecorded, + metadata: map[string]string{"project_fact_count": "9007199254740993"}, + wantData: `{"projectFactsRecorded":{"projectFactCount":"9007199254740993"}}`, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + metadataBefore := maps.Clone(tt.metadata) + history := entity.RequestHistory{RequestID: "1", Events: []entity.RequestLog{{ + ID: "occurrence", State: tt.state, Event: tt.event, Metadata: tt.metadata, + }}} + byID := RequestHistoryByIDToProto(history).Events[0] + byURI := RequestHistoriesToProto([]entity.RequestHistory{history})[0].Events[0] + require.NotNil(t, byID.Data) + assert.True(t, proto.Equal(byID, byURI)) + assert.Equal(t, metadataBefore, tt.metadata) + + jsonData, err := protojson.Marshal(byID.Data) + require.NoError(t, err) + assert.JSONEq(t, tt.wantData, string(jsonData)) + + encoded, err := proto.Marshal(byID) + require.NoError(t, err) + var decoded pb.HistoryEvent + require.NoError(t, proto.Unmarshal(encoded, &decoded)) + assert.True(t, proto.Equal(byID, &decoded)) + + jsonEvent, err := protojson.Marshal(byID) + require.NoError(t, err) + var decodedJSON pb.HistoryEvent + require.NoError(t, protojson.Unmarshal(jsonEvent, &decodedJSON)) + assert.True(t, proto.Equal(byID, &decodedJSON)) + }) + } +} + +func TestHistoryMetadataUnavailable(t *testing.T) { + type testCase struct { + name string + log entity.RequestLog + } + tests := []testCase{ + {name: "state without metadata", log: entity.RequestLog{State: entity.RequestStateAccepted}}, + {name: "state without recognized metadata", log: entity.RequestLog{State: entity.RequestStateFailed, Metadata: map[string]string{"private": "hidden", "build_id": ""}}}, + {name: "triggered build without metadata", log: entity.RequestLog{Event: entity.RequestEventBuildTriggered}}, + {name: "finished build with empty ID", log: entity.RequestLog{Event: entity.RequestEventBuildFinished, Metadata: map[string]string{"build_id": ""}}}, + {name: "abandoned analysis without metadata", log: entity.RequestLog{Event: entity.RequestEventBuildAnalysisAbandoned}}, + {name: "validation without degree", log: entity.RequestLog{Event: entity.RequestEventValidationFactRecorded}}, + {name: "project facts without count", log: entity.RequestLog{Event: entity.RequestEventProjectFactsRecorded}}, + {name: "metadata for another event", log: entity.RequestLog{Event: entity.RequestEventRecordAbandoned, Metadata: map[string]string{"build_id": "build/1", "fact_degree": "1", "project_fact_count": "2"}}}, + {name: "unknown event metadata", log: entity.RequestLog{Event: entity.RequestEvent("future_event"), Metadata: map[string]string{"build_id": "build/1"}}}, + } + for _, degree := range []string{"invalid", "NaN", "+Inf", "-Inf", "-0.1", "1.1"} { + tests = append(tests, testCase{name: "invalid degree " + degree, log: entity.RequestLog{ + Event: entity.RequestEventValidationFactRecorded, Metadata: map[string]string{"fact_degree": degree}, + }}) + } + for _, count := range []string{"invalid", "-1", "1.5", "18446744073709551616"} { + tests = append(tests, testCase{name: "invalid count " + count, log: entity.RequestLog{ + Event: entity.RequestEventProjectFactsRecorded, Metadata: map[string]string{"project_fact_count": count}, + }}) + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + event := HistoryEventsToProto([]entity.RequestLog{tt.log})[0] + assert.Nil(t, event.Data) + assert.Equal(t, string(tt.log.State), event.GetRequestState()) + assert.Equal(t, string(tt.log.Event), event.GetEvent()) + }) + } +} + func TestRequestHistorySummaryMapping(t *testing.T) { history := entity.RequestHistory{ RequestID: "7", Events: []entity.RequestLog{{ID: "accepted", State: entity.RequestStateAccepted}}, diff --git a/web/api/src/gen/api/stovepipe/proto/stovepipe_pb.ts b/web/api/src/gen/api/stovepipe/proto/stovepipe_pb.ts index 2432f9341..7e9be70cf 100644 --- a/web/api/src/gen/api/stovepipe/proto/stovepipe_pb.ts +++ b/web/api/src/gen/api/stovepipe/proto/stovepipe_pb.ts @@ -24,7 +24,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file api/stovepipe/proto/stovepipe.proto. */ export const file_api_stovepipe_proto_stovepipe: GenFile = /*@__PURE__*/ - fileDesc("CiNhcGkvc3RvdmVwaXBlL3Byb3RvL3N0b3ZlcGlwZS5wcm90bxIadWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUiHgoLUGluZ1JlcXVlc3QSDwoHbWVzc2FnZRgBIAEoCSJaCgxQaW5nUmVzcG9uc2USDwoHbWVzc2FnZRgBIAEoCRIUCgxzZXJ2aWNlX25hbWUYAiABKAkSEQoJdGltZXN0YW1wGAMgASgDEhAKCGhvc3RuYW1lGAQgASgJIh4KDUluZ2VzdFJlcXVlc3QSDQoFcXVldWUYASABKAkiHAoOSW5nZXN0UmVzcG9uc2USCgoCaWQYASABKAkiQQocR2V0UmVxdWVzdEhpc3RvcnlCeUlEUmVxdWVzdBINCgVxdWV1ZRgBIAEoCRISCgpyZXF1ZXN0X2lkGAIgASgJIjsKHUdldFJlcXVlc3RIaXN0b3J5QnlVUklSZXF1ZXN0Eg0KBXF1ZXVlGAEgASgJEgsKA3VyaRgCIAEoCSKGAQoMSGlzdG9yeUV2ZW50EhAKCGV2ZW50X2lkGAEgASgJEhQKDHRpbWVzdGFtcF9tcxgCIAEoAxIXCg1yZXF1ZXN0X3N0YXRlGAMgASgJSAASDwoFZXZlbnQYBCABKAlIABIWCg5vdXRjb21lX3JlYXNvbhgFIAEoCUIMCgpvY2N1cnJlbmNlIqMBCg5SZXF1ZXN0SGlzdG9yeRISCgpyZXF1ZXN0X2lkGAEgASgJEjgKBmV2ZW50cxgCIAMoCzIoLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkhpc3RvcnlFdmVudBJDCg9yZXF1ZXN0X3N1bW1hcnkYAyABKAsyKi51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5SZXF1ZXN0U3VtbWFyeSKeAQodR2V0UmVxdWVzdEhpc3RvcnlCeUlEUmVzcG9uc2USOAoGZXZlbnRzGAEgAygLMigudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuSGlzdG9yeUV2ZW50EkMKD3JlcXVlc3Rfc3VtbWFyeRgCIAEoCzIqLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLlJlcXVlc3RTdW1tYXJ5Il8KHkdldFJlcXVlc3RIaXN0b3J5QnlVUklSZXNwb25zZRI9CgloaXN0b3JpZXMYASADKAsyKi51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5SZXF1ZXN0SGlzdG9yeSJ5ChtHZXRQcm9qZWN0U3RhdHVzQnlJRFJlcXVlc3QSDQoFcXVldWUYASABKAkSEgoKcmVxdWVzdF9pZBgCIAEoCRIQCghwcm9qZWN0cxgDIAMoCRIRCglwYWdlX3NpemUYBCABKAUSEgoKcGFnZV90b2tlbhgFIAEoCSJ6ChxHZXRQcm9qZWN0U3RhdHVzQnlVUklSZXF1ZXN0Eg0KBXF1ZXVlGAEgASgJEhIKCmNoYW5nZV91cmkYAiABKAkSEAoIcHJvamVjdHMYAyADKAkSEQoJcGFnZV9zaXplGAQgASgFEhIKCnBhZ2VfdG9rZW4YBSABKAkiSQoRUHJvamVjdFZhbGlkYXRpb24SDwoHcHJvamVjdBgBIAEoCRIZCg9icmVha2FnZV9kZWdyZWUYAiABKAFIAEIICgZyZXN1bHQizAIKHEdldFByb2plY3RTdGF0dXNCeUlEUmVzcG9uc2USEgoKcmVxdWVzdF9pZBgBIAEoCRINCgVxdWV1ZRgCIAEoCRISCgpjaGFuZ2VfdXJpGAMgASgJEhAKCGJhc2VfdXJpGAQgASgJEhUKDXJlcXVlc3Rfc3RhdGUYBSABKAkSFQoNdXBkYXRlZF9hdF9tcxgKIAEoAxIkChpyZXBvc2l0b3J5X2JyZWFrYWdlX2RlZ3JlZRgGIAEoAUgAEiAKGHByb2plY3RfcmVzdWx0c19jb21wbGV0ZRgHIAEoCBI/Cghwcm9qZWN0cxgIIAMoCzItLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLlByb2plY3RWYWxpZGF0aW9uEhcKD25leHRfcGFnZV90b2tlbhgJIAEoCUITChFyZXBvc2l0b3J5X3Jlc3VsdCLNAgodR2V0UHJvamVjdFN0YXR1c0J5VVJJUmVzcG9uc2USEgoKcmVxdWVzdF9pZBgBIAEoCRINCgVxdWV1ZRgCIAEoCRISCgpjaGFuZ2VfdXJpGAMgASgJEhAKCGJhc2VfdXJpGAQgASgJEhUKDXJlcXVlc3Rfc3RhdGUYBSABKAkSFQoNdXBkYXRlZF9hdF9tcxgKIAEoAxIkChpyZXBvc2l0b3J5X2JyZWFrYWdlX2RlZ3JlZRgGIAEoAUgAEiAKGHByb2plY3RfcmVzdWx0c19jb21wbGV0ZRgHIAEoCBI/Cghwcm9qZWN0cxgIIAMoCzItLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLlByb2plY3RWYWxpZGF0aW9uEhcKD25leHRfcGFnZV90b2tlbhgJIAEoCUITChFyZXBvc2l0b3J5X3Jlc3VsdCK9AQoOUmVxdWVzdFN1bW1hcnkSEgoKcmVxdWVzdF9pZBgBIAEoCRINCgVxdWV1ZRgCIAEoCRISCgpjaGFuZ2VfdXJpGAMgASgJEhAKCGJhc2VfdXJpGAQgASgJEhUKDXJlcXVlc3Rfc3RhdGUYBSABKAkSGwoTc3RhdGVfdXBkYXRlZF9hdF9tcxgGIAEoAxIWCg5hY2NlcHRlZF9hdF9tcxgHIAEoAxIWCg5vdXRjb21lX3JlYXNvbhgIIAEoCSK0AQoLTGlzdFJlcXVlc3QSDQoFcXVldWUYASABKAkSIQoXYWNjZXB0ZWRfYXRfb3JfYWZ0ZXJfbXMYAiABKANIABIcChJhY2NlcHRlZF9iZWZvcmVfbXMYAyABKANIARIRCglwYWdlX3NpemUYBCABKAUSEgoKcGFnZV90b2tlbhgFIAEoCUIWChRhY2NlcHRlZF9sb3dlcl9ib3VuZEIWChRhY2NlcHRlZF91cHBlcl9ib3VuZCJlCgxMaXN0UmVzcG9uc2USPAoIcmVxdWVzdHMYASADKAsyKi51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5SZXF1ZXN0U3VtbWFyeRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkiOgoVR2V0UXVldWVTdGF0dXNSZXF1ZXN0Eg0KBXF1ZXVlGAEgASgJEhIKCmNoYW5nZV91cmkYAiABKAkingEKFVF1ZXVlRW5hYmxlbWVudFN0YXR1cxIPCgd2ZXJzaW9uGAEgASgDEjoKBXN0YXRlGAIgASgOMisudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUXVldWVFbmFibGVtZW50EiEKGWVmZmVjdGl2ZV9mcm9tX2NvbW1pdF91cmkYAyABKAkSFQoNY2hhbmdlZF9hdF9tcxgEIAEoAyJuChZHZXRRdWV1ZVN0YXR1c1Jlc3BvbnNlEg0KBXF1ZXVlGAEgASgJEkUKCmVuYWJsZW1lbnQYAiABKAsyMS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5RdWV1ZUVuYWJsZW1lbnRTdGF0dXMqbAoPUXVldWVFbmFibGVtZW50EhwKGFFVRVVFX0VOQUJMRU1FTlRfVU5LTk9XThAAEhwKGFFVRVVFX0VOQUJMRU1FTlRfRU5BQkxFRBABEh0KGVFVRVVFX0VOQUJMRU1FTlRfRElTQUJMRUQQAjLnBwoJU3RvdmVwaXBlElsKBFBpbmcSJy51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5QaW5nUmVxdWVzdBooLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLlBpbmdSZXNwb25zZSIAEmEKBkluZ2VzdBIpLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkluZ2VzdFJlcXVlc3QaKi51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5Jbmdlc3RSZXNwb25zZSIAEo4BChVHZXRSZXF1ZXN0SGlzdG9yeUJ5SUQSOC51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5HZXRSZXF1ZXN0SGlzdG9yeUJ5SURSZXF1ZXN0GjkudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UmVxdWVzdEhpc3RvcnlCeUlEUmVzcG9uc2UiABKRAQoWR2V0UmVxdWVzdEhpc3RvcnlCeVVSSRI5LnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFJlcXVlc3RIaXN0b3J5QnlVUklSZXF1ZXN0GjoudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UmVxdWVzdEhpc3RvcnlCeVVSSVJlc3BvbnNlIgASiwEKFEdldFByb2plY3RTdGF0dXNCeUlEEjcudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UHJvamVjdFN0YXR1c0J5SURSZXF1ZXN0GjgudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UHJvamVjdFN0YXR1c0J5SURSZXNwb25zZSIAEo4BChVHZXRQcm9qZWN0U3RhdHVzQnlVUkkSOC51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5HZXRQcm9qZWN0U3RhdHVzQnlVUklSZXF1ZXN0GjkudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UHJvamVjdFN0YXR1c0J5VVJJUmVzcG9uc2UiABJbCgRMaXN0EicudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuTGlzdFJlcXVlc3QaKC51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5MaXN0UmVzcG9uc2UiABJ5Cg5HZXRRdWV1ZVN0YXR1cxIxLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFF1ZXVlU3RhdHVzUmVxdWVzdBoyLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFF1ZXVlU3RhdHVzUmVzcG9uc2UiAEJlCh5jb20udWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGVCDlN0b3ZlcGlwZVByb3RvUAFaMWdpdGh1Yi5jb20vdWJlci9zdWJtaXRxdWV1ZS9hcGkvc3RvdmVwaXBlL3Byb3RvcGJiBnByb3RvMw"); + fileDesc("CiNhcGkvc3RvdmVwaXBlL3Byb3RvL3N0b3ZlcGlwZS5wcm90bxIadWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUiHgoLUGluZ1JlcXVlc3QSDwoHbWVzc2FnZRgBIAEoCSJaCgxQaW5nUmVzcG9uc2USDwoHbWVzc2FnZRgBIAEoCRIUCgxzZXJ2aWNlX25hbWUYAiABKAkSEQoJdGltZXN0YW1wGAMgASgDEhAKCGhvc3RuYW1lGAQgASgJIh4KDUluZ2VzdFJlcXVlc3QSDQoFcXVldWUYASABKAkiHAoOSW5nZXN0UmVzcG9uc2USCgoCaWQYASABKAkiQQocR2V0UmVxdWVzdEhpc3RvcnlCeUlEUmVxdWVzdBINCgVxdWV1ZRgBIAEoCRISCgpyZXF1ZXN0X2lkGAIgASgJIjsKHUdldFJlcXVlc3RIaXN0b3J5QnlVUklSZXF1ZXN0Eg0KBXF1ZXVlGAEgASgJEgsKA3VyaRgCIAEoCSLCAQoMSGlzdG9yeUV2ZW50EhAKCGV2ZW50X2lkGAEgASgJEhQKDHRpbWVzdGFtcF9tcxgCIAEoAxIXCg1yZXF1ZXN0X3N0YXRlGAMgASgJSAASDwoFZXZlbnQYBCABKAlIABIWCg5vdXRjb21lX3JlYXNvbhgFIAEoCRI6CgRkYXRhGAYgASgLMiwudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuSGlzdG9yeUV2ZW50RGF0YUIMCgpvY2N1cnJlbmNlIoAEChBIaXN0b3J5RXZlbnREYXRhEkwKDXJlcXVlc3Rfc3RhdGUYASABKAsyMy51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5IaXN0b3J5UmVxdWVzdFN0YXRlRGF0YUgAEkcKD2J1aWxkX3RyaWdnZXJlZBgCIAEoCzIsLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkhpc3RvcnlCdWlsZERhdGFIABJGCg5idWlsZF9maW5pc2hlZBgDIAEoCzIsLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkhpc3RvcnlCdWlsZERhdGFIABJZChh2YWxpZGF0aW9uX2ZhY3RfcmVjb3JkZWQYBCABKAsyNS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5IaXN0b3J5VmFsaWRhdGlvbkZhY3REYXRhSAASVQoWcHJvamVjdF9mYWN0c19yZWNvcmRlZBgFIAEoCzIzLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkhpc3RvcnlQcm9qZWN0RmFjdHNEYXRhSAASUAoYYnVpbGRfYW5hbHlzaXNfYWJhbmRvbmVkGAYgASgLMiwudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuSGlzdG9yeUJ1aWxkRGF0YUgAQgkKB3BheWxvYWQiYQoXSGlzdG9yeVJlcXVlc3RTdGF0ZURhdGESFQoIYmFzZV91cmkYASABKAlIAIgBARIVCghidWlsZF9pZBgCIAEoCUgBiAEBQgsKCV9iYXNlX3VyaUILCglfYnVpbGRfaWQiJAoQSGlzdG9yeUJ1aWxkRGF0YRIQCghidWlsZF9pZBgBIAEoCSIwChlIaXN0b3J5VmFsaWRhdGlvbkZhY3REYXRhEhMKC2ZhY3RfZGVncmVlGAEgASgBIjUKF0hpc3RvcnlQcm9qZWN0RmFjdHNEYXRhEhoKEnByb2plY3RfZmFjdF9jb3VudBgBIAEoBCKjAQoOUmVxdWVzdEhpc3RvcnkSEgoKcmVxdWVzdF9pZBgBIAEoCRI4CgZldmVudHMYAiADKAsyKC51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5IaXN0b3J5RXZlbnQSQwoPcmVxdWVzdF9zdW1tYXJ5GAMgASgLMioudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUmVxdWVzdFN1bW1hcnkingEKHUdldFJlcXVlc3RIaXN0b3J5QnlJRFJlc3BvbnNlEjgKBmV2ZW50cxgBIAMoCzIoLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkhpc3RvcnlFdmVudBJDCg9yZXF1ZXN0X3N1bW1hcnkYAiABKAsyKi51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5SZXF1ZXN0U3VtbWFyeSJfCh5HZXRSZXF1ZXN0SGlzdG9yeUJ5VVJJUmVzcG9uc2USPQoJaGlzdG9yaWVzGAEgAygLMioudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUmVxdWVzdEhpc3RvcnkieQobR2V0UHJvamVjdFN0YXR1c0J5SURSZXF1ZXN0Eg0KBXF1ZXVlGAEgASgJEhIKCnJlcXVlc3RfaWQYAiABKAkSEAoIcHJvamVjdHMYAyADKAkSEQoJcGFnZV9zaXplGAQgASgFEhIKCnBhZ2VfdG9rZW4YBSABKAkiegocR2V0UHJvamVjdFN0YXR1c0J5VVJJUmVxdWVzdBINCgVxdWV1ZRgBIAEoCRISCgpjaGFuZ2VfdXJpGAIgASgJEhAKCHByb2plY3RzGAMgAygJEhEKCXBhZ2Vfc2l6ZRgEIAEoBRISCgpwYWdlX3Rva2VuGAUgASgJIkkKEVByb2plY3RWYWxpZGF0aW9uEg8KB3Byb2plY3QYASABKAkSGQoPYnJlYWthZ2VfZGVncmVlGAIgASgBSABCCAoGcmVzdWx0IswCChxHZXRQcm9qZWN0U3RhdHVzQnlJRFJlc3BvbnNlEhIKCnJlcXVlc3RfaWQYASABKAkSDQoFcXVldWUYAiABKAkSEgoKY2hhbmdlX3VyaRgDIAEoCRIQCghiYXNlX3VyaRgEIAEoCRIVCg1yZXF1ZXN0X3N0YXRlGAUgASgJEhUKDXVwZGF0ZWRfYXRfbXMYCiABKAMSJAoacmVwb3NpdG9yeV9icmVha2FnZV9kZWdyZWUYBiABKAFIABIgChhwcm9qZWN0X3Jlc3VsdHNfY29tcGxldGUYByABKAgSPwoIcHJvamVjdHMYCCADKAsyLS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5Qcm9qZWN0VmFsaWRhdGlvbhIXCg9uZXh0X3BhZ2VfdG9rZW4YCSABKAlCEwoRcmVwb3NpdG9yeV9yZXN1bHQizQIKHUdldFByb2plY3RTdGF0dXNCeVVSSVJlc3BvbnNlEhIKCnJlcXVlc3RfaWQYASABKAkSDQoFcXVldWUYAiABKAkSEgoKY2hhbmdlX3VyaRgDIAEoCRIQCghiYXNlX3VyaRgEIAEoCRIVCg1yZXF1ZXN0X3N0YXRlGAUgASgJEhUKDXVwZGF0ZWRfYXRfbXMYCiABKAMSJAoacmVwb3NpdG9yeV9icmVha2FnZV9kZWdyZWUYBiABKAFIABIgChhwcm9qZWN0X3Jlc3VsdHNfY29tcGxldGUYByABKAgSPwoIcHJvamVjdHMYCCADKAsyLS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5Qcm9qZWN0VmFsaWRhdGlvbhIXCg9uZXh0X3BhZ2VfdG9rZW4YCSABKAlCEwoRcmVwb3NpdG9yeV9yZXN1bHQivQEKDlJlcXVlc3RTdW1tYXJ5EhIKCnJlcXVlc3RfaWQYASABKAkSDQoFcXVldWUYAiABKAkSEgoKY2hhbmdlX3VyaRgDIAEoCRIQCghiYXNlX3VyaRgEIAEoCRIVCg1yZXF1ZXN0X3N0YXRlGAUgASgJEhsKE3N0YXRlX3VwZGF0ZWRfYXRfbXMYBiABKAMSFgoOYWNjZXB0ZWRfYXRfbXMYByABKAMSFgoOb3V0Y29tZV9yZWFzb24YCCABKAkitAEKC0xpc3RSZXF1ZXN0Eg0KBXF1ZXVlGAEgASgJEiEKF2FjY2VwdGVkX2F0X29yX2FmdGVyX21zGAIgASgDSAASHAoSYWNjZXB0ZWRfYmVmb3JlX21zGAMgASgDSAESEQoJcGFnZV9zaXplGAQgASgFEhIKCnBhZ2VfdG9rZW4YBSABKAlCFgoUYWNjZXB0ZWRfbG93ZXJfYm91bmRCFgoUYWNjZXB0ZWRfdXBwZXJfYm91bmQiZQoMTGlzdFJlc3BvbnNlEjwKCHJlcXVlc3RzGAEgAygLMioudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUmVxdWVzdFN1bW1hcnkSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJIjoKFUdldFF1ZXVlU3RhdHVzUmVxdWVzdBINCgVxdWV1ZRgBIAEoCRISCgpjaGFuZ2VfdXJpGAIgASgJIp4BChVRdWV1ZUVuYWJsZW1lbnRTdGF0dXMSDwoHdmVyc2lvbhgBIAEoAxI6CgVzdGF0ZRgCIAEoDjIrLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLlF1ZXVlRW5hYmxlbWVudBIhChllZmZlY3RpdmVfZnJvbV9jb21taXRfdXJpGAMgASgJEhUKDWNoYW5nZWRfYXRfbXMYBCABKAMibgoWR2V0UXVldWVTdGF0dXNSZXNwb25zZRINCgVxdWV1ZRgBIAEoCRJFCgplbmFibGVtZW50GAIgASgLMjEudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUXVldWVFbmFibGVtZW50U3RhdHVzKmwKD1F1ZXVlRW5hYmxlbWVudBIcChhRVUVVRV9FTkFCTEVNRU5UX1VOS05PV04QABIcChhRVUVVRV9FTkFCTEVNRU5UX0VOQUJMRUQQARIdChlRVUVVRV9FTkFCTEVNRU5UX0RJU0FCTEVEEAIy5wcKCVN0b3ZlcGlwZRJbCgRQaW5nEicudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUGluZ1JlcXVlc3QaKC51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5QaW5nUmVzcG9uc2UiABJhCgZJbmdlc3QSKS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5Jbmdlc3RSZXF1ZXN0GioudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuSW5nZXN0UmVzcG9uc2UiABKOAQoVR2V0UmVxdWVzdEhpc3RvcnlCeUlEEjgudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UmVxdWVzdEhpc3RvcnlCeUlEUmVxdWVzdBo5LnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFJlcXVlc3RIaXN0b3J5QnlJRFJlc3BvbnNlIgASkQEKFkdldFJlcXVlc3RIaXN0b3J5QnlVUkkSOS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5HZXRSZXF1ZXN0SGlzdG9yeUJ5VVJJUmVxdWVzdBo6LnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFJlcXVlc3RIaXN0b3J5QnlVUklSZXNwb25zZSIAEosBChRHZXRQcm9qZWN0U3RhdHVzQnlJRBI3LnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFByb2plY3RTdGF0dXNCeUlEUmVxdWVzdBo4LnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFByb2plY3RTdGF0dXNCeUlEUmVzcG9uc2UiABKOAQoVR2V0UHJvamVjdFN0YXR1c0J5VVJJEjgudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UHJvamVjdFN0YXR1c0J5VVJJUmVxdWVzdBo5LnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFByb2plY3RTdGF0dXNCeVVSSVJlc3BvbnNlIgASWwoETGlzdBInLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkxpc3RSZXF1ZXN0GigudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuTGlzdFJlc3BvbnNlIgASeQoOR2V0UXVldWVTdGF0dXMSMS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5HZXRRdWV1ZVN0YXR1c1JlcXVlc3QaMi51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5HZXRRdWV1ZVN0YXR1c1Jlc3BvbnNlIgBCZQoeY29tLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlQg5TdG92ZXBpcGVQcm90b1ABWjFnaXRodWIuY29tL3ViZXIvc3VibWl0cXVldWUvYXBpL3N0b3ZlcGlwZS9wcm90b3BiYgZwcm90bzM"); /** * PingRequest is the request for the Ping method @@ -238,6 +238,13 @@ export type HistoryEvent = Message<"uber.submitqueue.stovepipe.HistoryEvent"> & * @generated from field: string outcome_reason = 5; */ outcomeReason: string; + + /** + * Typed context retained with this occurrence. Absent when no supported metadata is available. + * + * @generated from field: uber.submitqueue.stovepipe.HistoryEventData data = 6; + */ + data?: HistoryEventData | undefined; }; /** @@ -247,6 +254,166 @@ export type HistoryEvent = Message<"uber.submitqueue.stovepipe.HistoryEvent"> & export const HistoryEventSchema: GenMessage = /*@__PURE__*/ messageDesc(file_api_stovepipe_proto_stovepipe, 6); +/** + * HistoryEventData exposes known occurrence metadata without exposing the internal metadata map. + * + * @generated from message uber.submitqueue.stovepipe.HistoryEventData + */ +export type HistoryEventData = Message<"uber.submitqueue.stovepipe.HistoryEventData"> & { + /** + * The payload corresponds to request_state or the event string on the containing HistoryEvent. + * + * @generated from oneof uber.submitqueue.stovepipe.HistoryEventData.payload + */ + payload: { + /** + * Context recorded with a request-state transition. + * + * @generated from field: uber.submitqueue.stovepipe.HistoryRequestStateData request_state = 1; + */ + value: HistoryRequestStateData; + case: "requestState"; + } | { + /** + * Context recorded when a build became durable. + * + * @generated from field: uber.submitqueue.stovepipe.HistoryBuildData build_triggered = 2; + */ + value: HistoryBuildData; + case: "buildTriggered"; + } | { + /** + * Context recorded when a build reached a terminal status. + * + * @generated from field: uber.submitqueue.stovepipe.HistoryBuildData build_finished = 3; + */ + value: HistoryBuildData; + case: "buildFinished"; + } | { + /** + * Context recorded when a repository validation fact became durable. + * + * @generated from field: uber.submitqueue.stovepipe.HistoryValidationFactData validation_fact_recorded = 4; + */ + value: HistoryValidationFactData; + case: "validationFactRecorded"; + } | { + /** + * Context recorded when all project facts became durable. + * + * @generated from field: uber.submitqueue.stovepipe.HistoryProjectFactsData project_facts_recorded = 5; + */ + value: HistoryProjectFactsData; + case: "projectFactsRecorded"; + } | { + /** + * Context recorded when build analysis was abandoned. + * + * @generated from field: uber.submitqueue.stovepipe.HistoryBuildData build_analysis_abandoned = 6; + */ + value: HistoryBuildData; + case: "buildAnalysisAbandoned"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message uber.submitqueue.stovepipe.HistoryEventData. + * Use `create(HistoryEventDataSchema)` to create a new message. + */ +export const HistoryEventDataSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_api_stovepipe_proto_stovepipe, 7); + +/** + * HistoryRequestStateData is retained context for a request-state transition. + * + * @generated from message uber.submitqueue.stovepipe.HistoryRequestStateData + */ +export type HistoryRequestStateData = Message<"uber.submitqueue.stovepipe.HistoryRequestStateData"> & { + /** + * Selected baseline URI. A present empty string means a full build; absence means unknown. + * + * @generated from field: optional string base_uri = 1; + */ + baseUri?: string | undefined; + + /** + * Build that established the terminal request state, when retained. + * + * @generated from field: optional string build_id = 2; + */ + buildId?: string | undefined; +}; + +/** + * Describes the message uber.submitqueue.stovepipe.HistoryRequestStateData. + * Use `create(HistoryRequestStateDataSchema)` to create a new message. + */ +export const HistoryRequestStateDataSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_api_stovepipe_proto_stovepipe, 8); + +/** + * HistoryBuildData identifies the build associated with an occurrence. + * + * @generated from message uber.submitqueue.stovepipe.HistoryBuildData + */ +export type HistoryBuildData = Message<"uber.submitqueue.stovepipe.HistoryBuildData"> & { + /** + * Opaque runner-assigned build identifier. + * + * @generated from field: string build_id = 1; + */ + buildId: string; +}; + +/** + * Describes the message uber.submitqueue.stovepipe.HistoryBuildData. + * Use `create(HistoryBuildDataSchema)` to create a new message. + */ +export const HistoryBuildDataSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_api_stovepipe_proto_stovepipe, 9); + +/** + * HistoryValidationFactData describes a retained whole-repository validation fact. + * + * @generated from message uber.submitqueue.stovepipe.HistoryValidationFactData + */ +export type HistoryValidationFactData = Message<"uber.submitqueue.stovepipe.HistoryValidationFactData"> & { + /** + * Breakage degree on [0.0, 1.0]. Zero is a recorded green result. + * + * @generated from field: double fact_degree = 1; + */ + factDegree: number; +}; + +/** + * Describes the message uber.submitqueue.stovepipe.HistoryValidationFactData. + * Use `create(HistoryValidationFactDataSchema)` to create a new message. + */ +export const HistoryValidationFactDataSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_api_stovepipe_proto_stovepipe, 10); + +/** + * HistoryProjectFactsData describes a completed batch of project validation facts. + * + * @generated from message uber.submitqueue.stovepipe.HistoryProjectFactsData + */ +export type HistoryProjectFactsData = Message<"uber.submitqueue.stovepipe.HistoryProjectFactsData"> & { + /** + * Number of project facts recorded, including zero for an empty batch. + * + * @generated from field: uint64 project_fact_count = 1; + */ + projectFactCount: bigint; +}; + +/** + * Describes the message uber.submitqueue.stovepipe.HistoryProjectFactsData. + * Use `create(HistoryProjectFactsDataSchema)` to create a new message. + */ +export const HistoryProjectFactsDataSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_api_stovepipe_proto_stovepipe, 11); + /** * RequestHistory identifies one request and contains its ordered events and current summary. * @@ -280,7 +447,7 @@ export type RequestHistory = Message<"uber.submitqueue.stovepipe.RequestHistory" * Use `create(RequestHistorySchema)` to create a new message. */ export const RequestHistorySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 7); + messageDesc(file_api_stovepipe_proto_stovepipe, 12); /** * GetRequestHistoryByIDResponse contains retained events and the current summary for one request. @@ -308,7 +475,7 @@ export type GetRequestHistoryByIDResponse = Message<"uber.submitqueue.stovepipe. * Use `create(GetRequestHistoryByIDResponseSchema)` to create a new message. */ export const GetRequestHistoryByIDResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 8); + messageDesc(file_api_stovepipe_proto_stovepipe, 13); /** * GetRequestHistoryByURIResponse contains all retained request histories for an exact URI. @@ -329,7 +496,7 @@ export type GetRequestHistoryByURIResponse = Message<"uber.submitqueue.stovepipe * Use `create(GetRequestHistoryByURIResponseSchema)` to create a new message. */ export const GetRequestHistoryByURIResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 9); + messageDesc(file_api_stovepipe_proto_stovepipe, 14); /** * GetProjectStatusByIDRequest selects the validation status for the ID returned from Ingest. @@ -378,7 +545,7 @@ export type GetProjectStatusByIDRequest = Message<"uber.submitqueue.stovepipe.Ge * Use `create(GetProjectStatusByIDRequestSchema)` to create a new message. */ export const GetProjectStatusByIDRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 10); + messageDesc(file_api_stovepipe_proto_stovepipe, 15); /** * GetProjectStatusByURIRequest selects the validation status for an exact commit URI. @@ -427,7 +594,7 @@ export type GetProjectStatusByURIRequest = Message<"uber.submitqueue.stovepipe.G * Use `create(GetProjectStatusByURIRequestSchema)` to create a new message. */ export const GetProjectStatusByURIRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 11); + messageDesc(file_api_stovepipe_proto_stovepipe, 16); /** * ProjectValidation contains one reported project and its recorded result, if any. @@ -461,7 +628,7 @@ export type ProjectValidation = Message<"uber.submitqueue.stovepipe.ProjectValid * Use `create(ProjectValidationSchema)` to create a new message. */ export const ProjectValidationSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 12); + messageDesc(file_api_stovepipe_proto_stovepipe, 17); /** * GetProjectStatusByIDResponse contains the selected validation's current projection. @@ -551,7 +718,7 @@ export type GetProjectStatusByIDResponse = Message<"uber.submitqueue.stovepipe.G * Use `create(GetProjectStatusByIDResponseSchema)` to create a new message. */ export const GetProjectStatusByIDResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 13); + messageDesc(file_api_stovepipe_proto_stovepipe, 18); /** * GetProjectStatusByURIResponse contains the selected validation's current projection. @@ -641,7 +808,7 @@ export type GetProjectStatusByURIResponse = Message<"uber.submitqueue.stovepipe. * Use `create(GetProjectStatusByURIResponseSchema)` to create a new message. */ export const GetProjectStatusByURIResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 14); + messageDesc(file_api_stovepipe_proto_stovepipe, 19); /** * RequestSummary contains one request's current materialized lifecycle state. @@ -711,7 +878,7 @@ export type RequestSummary = Message<"uber.submitqueue.stovepipe.RequestSummary" * Use `create(RequestSummarySchema)` to create a new message. */ export const RequestSummarySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 15); + messageDesc(file_api_stovepipe_proto_stovepipe, 20); /** * ListRequest selects a page of retained request summaries for one queue. @@ -772,7 +939,7 @@ export type ListRequest = Message<"uber.submitqueue.stovepipe.ListRequest"> & { * Use `create(ListRequestSchema)` to create a new message. */ export const ListRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 16); + messageDesc(file_api_stovepipe_proto_stovepipe, 21); /** * ListResponse contains a page in acceptance-time order, not a snapshot across pages. @@ -801,7 +968,7 @@ export type ListResponse = Message<"uber.submitqueue.stovepipe.ListResponse"> & * Use `create(ListResponseSchema)` to create a new message. */ export const ListResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 17); + messageDesc(file_api_stovepipe_proto_stovepipe, 22); /** * @generated from message uber.submitqueue.stovepipe.GetQueueStatusRequest @@ -827,7 +994,7 @@ export type GetQueueStatusRequest = Message<"uber.submitqueue.stovepipe.GetQueue * Use `create(GetQueueStatusRequestSchema)` to create a new message. */ export const GetQueueStatusRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 18); + messageDesc(file_api_stovepipe_proto_stovepipe, 23); /** * QueueEnablementStatus describes applied enablement. @@ -869,7 +1036,7 @@ export type QueueEnablementStatus = Message<"uber.submitqueue.stovepipe.QueueEna * Use `create(QueueEnablementStatusSchema)` to create a new message. */ export const QueueEnablementStatusSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 19); + messageDesc(file_api_stovepipe_proto_stovepipe, 24); /** * @generated from message uber.submitqueue.stovepipe.GetQueueStatusResponse @@ -895,7 +1062,7 @@ export type GetQueueStatusResponse = Message<"uber.submitqueue.stovepipe.GetQueu * Use `create(GetQueueStatusResponseSchema)` to create a new message. */ export const GetQueueStatusResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 20); + messageDesc(file_api_stovepipe_proto_stovepipe, 25); /** * QueueEnablement is independent of validation results and execution controls. From 187a09bc2c0f457e60da7a94b702afa38fa4e80b Mon Sep 17 00:00:00 2001 From: mnoah1 Date: Tue, 27 Oct 2026 17:20:10 +0000 Subject: [PATCH 2/2] refactor(stovepipe): omit baseline from history event data --- api/stovepipe/proto/stovepipe.proto | 4 +- api/stovepipe/protopb/stovepipe.pb.go | 25 +-- api/stovepipe/protopb/stovepipe.pb.yarpc.go | 206 +++++++++--------- doc/rfc/stovepipe/request-history-api.md | 6 +- doc/rfc/stovepipe/request-log.md | 2 +- .../server/mapper/request_history.go | 14 +- .../server/mapper/request_history_test.go | 20 +- .../gen/api/stovepipe/proto/stovepipe_pb.ts | 13 +- 8 files changed, 125 insertions(+), 165 deletions(-) diff --git a/api/stovepipe/proto/stovepipe.proto b/api/stovepipe/proto/stovepipe.proto index a2bc0c5cb..9444da20d 100644 --- a/api/stovepipe/proto/stovepipe.proto +++ b/api/stovepipe/proto/stovepipe.proto @@ -109,10 +109,8 @@ message HistoryEventData { // HistoryRequestStateData is retained context for a request-state transition. message HistoryRequestStateData { - // Selected baseline URI. A present empty string means a full build; absence means unknown. - optional string base_uri = 1; // Build that established the terminal request state, when retained. - optional string build_id = 2; + string build_id = 1; } // HistoryBuildData identifies the build associated with an occurrence. diff --git a/api/stovepipe/protopb/stovepipe.pb.go b/api/stovepipe/protopb/stovepipe.pb.go index e18e9a8c5..507d043ee 100644 --- a/api/stovepipe/protopb/stovepipe.pb.go +++ b/api/stovepipe/protopb/stovepipe.pb.go @@ -691,10 +691,8 @@ func (*HistoryEventData_BuildAnalysisAbandoned) isHistoryEventData_Payload() {} // HistoryRequestStateData is retained context for a request-state transition. type HistoryRequestStateData struct { state protoimpl.MessageState `protogen:"open.v1"` - // Selected baseline URI. A present empty string means a full build; absence means unknown. - BaseUri *string `protobuf:"bytes,1,opt,name=base_uri,json=baseUri,proto3,oneof" json:"base_uri,omitempty"` // Build that established the terminal request state, when retained. - BuildId *string `protobuf:"bytes,2,opt,name=build_id,json=buildId,proto3,oneof" json:"build_id,omitempty"` + BuildId string `protobuf:"bytes,1,opt,name=build_id,json=buildId,proto3" json:"build_id,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -729,16 +727,9 @@ func (*HistoryRequestStateData) Descriptor() ([]byte, []int) { return file_stovepipe_proto_rawDescGZIP(), []int{8} } -func (x *HistoryRequestStateData) GetBaseUri() string { - if x != nil && x.BaseUri != nil { - return *x.BaseUri - } - return "" -} - func (x *HistoryRequestStateData) GetBuildId() string { - if x != nil && x.BuildId != nil { - return *x.BuildId + if x != nil { + return x.BuildId } return "" } @@ -2101,12 +2092,9 @@ const file_stovepipe_proto_rawDesc = "" + "\x18validation_fact_recorded\x18\x04 \x01(\v25.uber.submitqueue.stovepipe.HistoryValidationFactDataH\x00R\x16validationFactRecorded\x12k\n" + "\x16project_facts_recorded\x18\x05 \x01(\v23.uber.submitqueue.stovepipe.HistoryProjectFactsDataH\x00R\x14projectFactsRecorded\x12h\n" + "\x18build_analysis_abandoned\x18\x06 \x01(\v2,.uber.submitqueue.stovepipe.HistoryBuildDataH\x00R\x16buildAnalysisAbandonedB\t\n" + - "\apayload\"s\n" + - "\x17HistoryRequestStateData\x12\x1e\n" + - "\bbase_uri\x18\x01 \x01(\tH\x00R\abaseUri\x88\x01\x01\x12\x1e\n" + - "\bbuild_id\x18\x02 \x01(\tH\x01R\abuildId\x88\x01\x01B\v\n" + - "\t_base_uriB\v\n" + - "\t_build_id\"-\n" + + "\apayload\"4\n" + + "\x17HistoryRequestStateData\x12\x19\n" + + "\bbuild_id\x18\x01 \x01(\tR\abuildId\"-\n" + "\x10HistoryBuildData\x12\x19\n" + "\bbuild_id\x18\x01 \x01(\tR\abuildId\"<\n" + "\x19HistoryValidationFactData\x12\x1f\n" + @@ -2327,7 +2315,6 @@ func file_stovepipe_proto_init() { (*HistoryEventData_ProjectFactsRecorded)(nil), (*HistoryEventData_BuildAnalysisAbandoned)(nil), } - file_stovepipe_proto_msgTypes[8].OneofWrappers = []any{} file_stovepipe_proto_msgTypes[17].OneofWrappers = []any{ (*ProjectValidation_BreakageDegree)(nil), } diff --git a/api/stovepipe/protopb/stovepipe.pb.yarpc.go b/api/stovepipe/protopb/stovepipe.pb.yarpc.go index d01b4b667..1d0e10c68 100644 --- a/api/stovepipe/protopb/stovepipe.pb.yarpc.go +++ b/api/stovepipe/protopb/stovepipe.pb.yarpc.go @@ -576,110 +576,108 @@ var ( var yarpcFileDescriptorClosurefabdb6b3c0b09022 = [][]byte{ // stovepipe.proto []byte{ - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0xcd, 0x6e, 0xdb, 0xc6, - 0x16, 0x36, 0x25, 0xd9, 0x92, 0x8e, 0x6c, 0xd9, 0x99, 0x38, 0x8e, 0xac, 0xc4, 0xb9, 0xbe, 0xbc, - 0x37, 0x37, 0x4e, 0x6e, 0x62, 0x23, 0x0e, 0xee, 0x6d, 0x52, 0x14, 0x45, 0xac, 0xf8, 0x4f, 0x68, - 0xec, 0x38, 0x74, 0xd4, 0x00, 0xc9, 0x82, 0x18, 0x91, 0x63, 0x99, 0x89, 0xf8, 0x13, 0xce, 0xd0, - 0xad, 0xb3, 0x28, 0xd0, 0x02, 0x05, 0x02, 0x14, 0x28, 0xd0, 0x37, 0xe8, 0xba, 0xdd, 0xf7, 0x11, - 0xfa, 0x02, 0xdd, 0xb4, 0x4f, 0xd0, 0x07, 0xe8, 0xa2, 0xdb, 0x62, 0x7e, 0x48, 0x51, 0xb2, 0x2c, - 0x5b, 0x71, 0x0b, 0xb4, 0x40, 0x77, 0x9c, 0x33, 0xe7, 0x7c, 0xe7, 0xcc, 0xf9, 0x9d, 0x21, 0x4c, - 0x52, 0xe6, 0x1f, 0x90, 0xc0, 0x09, 0xc8, 0x62, 0x10, 0xfa, 0xcc, 0x47, 0xd5, 0xa8, 0x49, 0xc2, - 0x45, 0x1a, 0x35, 0x5d, 0x87, 0xbd, 0x8a, 0x48, 0x44, 0x16, 0x13, 0x0e, 0xfd, 0x1a, 0x94, 0x76, - 0x1c, 0xaf, 0x65, 0x90, 0x57, 0x11, 0xa1, 0x0c, 0x55, 0x20, 0xef, 0x12, 0x4a, 0x71, 0x8b, 0x54, - 0xb4, 0x79, 0x6d, 0xa1, 0x68, 0xc4, 0x4b, 0xfd, 0x73, 0x0d, 0xc6, 0x25, 0x27, 0x0d, 0x7c, 0x8f, - 0x92, 0xe3, 0x59, 0xd1, 0x3f, 0x61, 0x9c, 0x92, 0xf0, 0xc0, 0xb1, 0x88, 0xe9, 0x61, 0x97, 0x54, - 0x32, 0x62, 0xbb, 0xa4, 0x68, 0xdb, 0xd8, 0x25, 0xe8, 0x32, 0x14, 0x99, 0xe3, 0x12, 0xca, 0xb0, - 0x1b, 0x54, 0xb2, 0xf3, 0xda, 0x42, 0xd6, 0xe8, 0x10, 0x50, 0x15, 0x0a, 0xfb, 0x3e, 0x65, 0x42, - 0x38, 0x27, 0x84, 0x93, 0xb5, 0x7e, 0x15, 0x26, 0xea, 0x5e, 0x8b, 0x50, 0x16, 0x9b, 0x3c, 0x0d, - 0xa3, 0xe2, 0x50, 0xca, 0x0a, 0xb9, 0xd0, 0xe7, 0xa1, 0x1c, 0xb3, 0x29, 0x7b, 0xcb, 0x90, 0x71, - 0x6c, 0xc5, 0x94, 0x71, 0x6c, 0x7d, 0x17, 0x2e, 0x6f, 0x90, 0x18, 0x65, 0xd3, 0xa1, 0xcc, 0x0f, - 0x0f, 0x6b, 0x87, 0xf5, 0xd5, 0x81, 0xb8, 0x68, 0x0e, 0x20, 0x94, 0x0c, 0xa6, 0x63, 0xab, 0x93, - 0x15, 0x15, 0xa5, 0x6e, 0xeb, 0x1b, 0x30, 0xd7, 0x07, 0xb4, 0x61, 0xd4, 0x07, 0xa3, 0x4e, 0x41, - 0x36, 0x0a, 0x1d, 0x05, 0xc7, 0x3f, 0xf5, 0xcf, 0x32, 0x30, 0xae, 0xe4, 0xd7, 0x0e, 0x88, 0xc7, - 0xd0, 0x2c, 0x14, 0x08, 0xff, 0x30, 0x93, 0x43, 0xe4, 0xc5, 0xba, 0x6e, 0x73, 0x7f, 0x27, 0xbe, - 0x33, 0x5d, 0x2a, 0x60, 0xb2, 0x46, 0x29, 0xa1, 0x6d, 0x51, 0x74, 0x15, 0x26, 0x62, 0xb3, 0x29, - 0xc3, 0x8c, 0x08, 0x9f, 0x17, 0x37, 0x47, 0x8c, 0x71, 0x45, 0xde, 0xe5, 0x54, 0x34, 0x03, 0xa3, - 0x02, 0x54, 0x7a, 0x7d, 0x73, 0xc4, 0x90, 0x4b, 0x74, 0x15, 0xca, 0x7e, 0xc4, 0x2c, 0xdf, 0x25, - 0x66, 0x48, 0x30, 0xf5, 0xbd, 0xca, 0xa8, 0x30, 0x61, 0x42, 0x51, 0x0d, 0x41, 0x44, 0xf7, 0x21, - 0x67, 0x63, 0x86, 0x2b, 0x63, 0xf3, 0xda, 0x42, 0x69, 0xf9, 0xe6, 0xe2, 0xf1, 0x79, 0xb7, 0x98, - 0x3e, 0xdb, 0x2a, 0x66, 0xd8, 0x10, 0x92, 0xb5, 0x71, 0x00, 0xdf, 0xb2, 0xa2, 0x30, 0x24, 0x9e, - 0x45, 0xf4, 0x5f, 0x72, 0x30, 0xd5, 0xcb, 0x88, 0x9e, 0xf5, 0x1e, 0x45, 0x13, 0xda, 0xee, 0x9c, - 0x42, 0x9b, 0x91, 0x3a, 0x2b, 0xc7, 0x3a, 0x72, 0xfe, 0xa7, 0x30, 0xd9, 0x8c, 0x9c, 0xb6, 0x6d, - 0xb2, 0xd0, 0x69, 0xb5, 0x48, 0x48, 0x64, 0x88, 0x4f, 0x77, 0x96, 0x1a, 0x97, 0x54, 0xb0, 0x65, - 0x01, 0xf3, 0x24, 0x46, 0x41, 0x0d, 0x90, 0x14, 0x73, 0xcf, 0xf1, 0x1c, 0xba, 0x4f, 0x6c, 0x11, - 0x80, 0xe1, 0x71, 0x27, 0x04, 0xca, 0xba, 0x02, 0x41, 0xaf, 0xa0, 0x72, 0x80, 0xdb, 0x8e, 0x8d, - 0x99, 0xe3, 0x7b, 0xe6, 0x1e, 0xb6, 0x98, 0x19, 0x12, 0xcb, 0x0f, 0x6d, 0x62, 0x8b, 0x10, 0x96, - 0x96, 0xff, 0x77, 0x0a, 0x05, 0x1f, 0x26, 0x10, 0xeb, 0xd8, 0x62, 0x4a, 0xd3, 0xcc, 0x41, 0x17, - 0xd5, 0x50, 0xb0, 0xe8, 0x25, 0xcc, 0x04, 0xa1, 0xff, 0x82, 0x58, 0x4c, 0xe8, 0xa3, 0x1d, 0x85, - 0xa3, 0xa7, 0x8e, 0xc3, 0x8e, 0x04, 0xe0, 0xb8, 0x54, 0xa9, 0x9b, 0x0e, 0x52, 0xb4, 0x44, 0xd9, - 0x3e, 0x54, 0xa4, 0xdb, 0xb0, 0x87, 0xdb, 0x87, 0xd4, 0xa1, 0x26, 0x6e, 0x62, 0xcf, 0xf6, 0x3d, - 0x62, 0x0f, 0x91, 0x64, 0x69, 0x07, 0xce, 0x08, 0xbc, 0x15, 0x05, 0xb7, 0x12, 0xa3, 0xd5, 0x8a, - 0x90, 0x0f, 0xf0, 0x61, 0xdb, 0xc7, 0xb6, 0x4e, 0xe1, 0xe2, 0x31, 0xf9, 0x82, 0xae, 0x40, 0xa1, - 0x89, 0x29, 0x31, 0x79, 0xb1, 0x6a, 0xaa, 0x44, 0xf2, 0x9c, 0xd2, 0x08, 0x9d, 0x37, 0x9a, 0x26, - 0xf6, 0x85, 0xbd, 0x71, 0x6f, 0xd8, 0xd4, 0x8c, 0xbc, 0xa0, 0xd4, 0xed, 0x37, 0x9a, 0x56, 0x2b, - 0x41, 0xd1, 0x8c, 0x01, 0xe4, 0x42, 0x71, 0xeb, 0xb7, 0x92, 0x4c, 0x4f, 0xac, 0xe5, 0x25, 0x9f, - 0xa0, 0xa9, 0x92, 0x57, 0x58, 0xfa, 0x7b, 0x30, 0x7b, 0x6c, 0xf0, 0xd0, 0x3f, 0xa0, 0x24, 0x52, - 0xc1, 0x26, 0xad, 0x90, 0xc8, 0xfa, 0xd0, 0x0c, 0xe0, 0xa4, 0x55, 0x41, 0xd1, 0x37, 0x92, 0x13, - 0xf6, 0x46, 0x02, 0xdd, 0x04, 0x94, 0x0e, 0xaf, 0x69, 0xf9, 0x91, 0xc7, 0x04, 0x44, 0xce, 0x98, - 0x4a, 0xc5, 0xe8, 0x01, 0xa7, 0xeb, 0xdf, 0x6b, 0x50, 0xee, 0x6e, 0x76, 0x3d, 0x0d, 0x52, 0xeb, - 0x69, 0x90, 0xe8, 0x3e, 0x8c, 0x89, 0x96, 0xc2, 0xbb, 0x54, 0x76, 0xa1, 0xb4, 0xbc, 0x70, 0xda, - 0x26, 0x61, 0x28, 0x39, 0xb4, 0x0b, 0x93, 0x49, 0xfd, 0x47, 0xae, 0x8b, 0xc3, 0x43, 0x55, 0x4b, - 0x37, 0x06, 0x41, 0xc5, 0xa1, 0x94, 0x12, 0x46, 0x39, 0xec, 0x5a, 0xeb, 0xdf, 0x69, 0x7d, 0x1b, - 0x37, 0x9f, 0x06, 0x6a, 0x7c, 0x74, 0x0c, 0xd7, 0x7e, 0x3f, 0xc3, 0x33, 0x67, 0x36, 0xfc, 0x05, - 0x5c, 0x39, 0x6e, 0xe0, 0x28, 0xc3, 0x37, 0xa1, 0xb8, 0x2f, 0xe8, 0x0e, 0x89, 0x6d, 0x3f, 0x8d, - 0xc2, 0xb8, 0x04, 0x3a, 0xc2, 0xfa, 0x37, 0x1a, 0x5c, 0xda, 0x20, 0x4c, 0xe5, 0x0c, 0xaf, 0x8a, - 0x88, 0x9e, 0x75, 0x62, 0xf2, 0x59, 0xaf, 0xd2, 0x8a, 0x56, 0xb2, 0xf3, 0x59, 0x3e, 0xeb, 0xe3, - 0x35, 0xba, 0x04, 0xc5, 0x00, 0xb7, 0x88, 0x49, 0x9d, 0xd7, 0xf2, 0x22, 0x30, 0x6a, 0x14, 0x38, - 0x61, 0xd7, 0x79, 0x2d, 0x70, 0xc5, 0x26, 0xf3, 0x5f, 0x92, 0x78, 0x1e, 0x09, 0xf6, 0x27, 0x9c, - 0xa0, 0x7f, 0xab, 0x89, 0xf9, 0xde, 0x63, 0xec, 0x89, 0x93, 0x78, 0x0e, 0xc0, 0xda, 0xc7, 0x5e, - 0x4b, 0xd6, 0xb8, 0xb2, 0x56, 0x52, 0x1a, 0xa1, 0xf3, 0x87, 0x59, 0xdb, 0x84, 0x73, 0xca, 0xd2, - 0x4e, 0x3d, 0xf3, 0x1b, 0x96, 0x02, 0x8f, 0xcb, 0x5f, 0x2d, 0xd1, 0x75, 0x98, 0x6c, 0x86, 0x04, - 0xbf, 0xe4, 0x88, 0xaa, 0xca, 0xb9, 0xa9, 0x9a, 0x98, 0x3c, 0x6a, 0x43, 0xd6, 0x7a, 0xad, 0x00, - 0x63, 0x21, 0xa1, 0x51, 0x9b, 0xe9, 0x3f, 0x66, 0xfb, 0x79, 0x24, 0x95, 0xe2, 0x27, 0x94, 0x6e, - 0xe2, 0xb0, 0xcc, 0xf1, 0x0e, 0xcb, 0xf6, 0x3a, 0x6c, 0x36, 0xd5, 0x31, 0x73, 0xaa, 0x87, 0xc9, - 0x7e, 0x89, 0xfe, 0xd5, 0x3b, 0xc8, 0xa5, 0x57, 0xba, 0x27, 0xb2, 0x0e, 0x13, 0x51, 0x60, 0x63, - 0x46, 0x6c, 0x13, 0x33, 0x7e, 0xb9, 0x01, 0x79, 0xb9, 0x51, 0xc4, 0x15, 0xb6, 0x45, 0xd1, 0xfb, - 0x50, 0x0d, 0x49, 0xe0, 0x53, 0x87, 0x27, 0xac, 0xd9, 0xeb, 0x98, 0x31, 0xe5, 0x98, 0x4a, 0x87, - 0xa7, 0xd6, 0xe5, 0x22, 0x74, 0x17, 0x2a, 0x71, 0xcf, 0x93, 0xae, 0xa2, 0xa6, 0xe5, 0xbb, 0x41, - 0x9b, 0x30, 0x52, 0xc9, 0xcf, 0x6b, 0x0b, 0x05, 0x23, 0x1e, 0x79, 0x86, 0xdc, 0x7e, 0xa0, 0x76, - 0x51, 0x3d, 0x95, 0x0e, 0x05, 0x51, 0x5a, 0xb7, 0x06, 0x95, 0xd6, 0x91, 0x10, 0xa7, 0xb2, 0xe7, - 0x3f, 0x30, 0xe9, 0x91, 0x8f, 0x99, 0x99, 0xca, 0x92, 0xa2, 0xbc, 0x63, 0x71, 0xf2, 0x4e, 0x9c, - 0x29, 0xb5, 0xf3, 0x70, 0x2e, 0x75, 0x58, 0x15, 0xda, 0x9f, 0xb2, 0xa2, 0x7d, 0xf5, 0x4b, 0xf6, - 0xbf, 0x63, 0xfb, 0x17, 0x8f, 0xed, 0xd7, 0x99, 0x64, 0xc6, 0xaa, 0xa6, 0xff, 0xa7, 0x0c, 0xe6, - 0x2d, 0x38, 0x2f, 0x36, 0xcd, 0xee, 0x90, 0x8e, 0x89, 0x90, 0x4e, 0x89, 0xad, 0x46, 0x2a, 0xae, - 0xff, 0x86, 0x32, 0xb6, 0x2c, 0x12, 0x74, 0x38, 0xf3, 0x82, 0x73, 0x3c, 0xa6, 0x0a, 0xae, 0xa3, - 0xef, 0x8e, 0x42, 0x9f, 0x77, 0x87, 0xfe, 0xab, 0x06, 0xa5, 0x87, 0xce, 0x09, 0x4f, 0x42, 0xf4, - 0x7f, 0xb8, 0x98, 0x56, 0xe9, 0x87, 0x26, 0xde, 0x63, 0x24, 0x4c, 0x5e, 0x4c, 0x9b, 0x23, 0xc6, - 0xf9, 0x8e, 0xf6, 0x47, 0xe1, 0x0a, 0xdf, 0xdd, 0xa2, 0x68, 0x11, 0x50, 0x22, 0xd7, 0x24, 0x7b, - 0x7e, 0x48, 0xb8, 0x88, 0x78, 0xb4, 0x6e, 0x6a, 0xc6, 0x54, 0xbc, 0x57, 0x13, 0x5b, 0x5b, 0x67, - 0x9a, 0x03, 0xb5, 0x19, 0x98, 0x4e, 0x74, 0xb5, 0xfd, 0x8f, 0x48, 0x68, 0x36, 0xfd, 0xc8, 0xb3, - 0xbb, 0xe8, 0x51, 0x10, 0xc4, 0x74, 0xfd, 0x13, 0x18, 0x97, 0x07, 0x57, 0x65, 0xbe, 0x0e, 0x05, - 0x15, 0x95, 0x61, 0x66, 0x7d, 0x7c, 0xb9, 0x48, 0x64, 0xfb, 0x65, 0x6c, 0xa6, 0x4f, 0xc6, 0xea, - 0x0f, 0xe1, 0xc2, 0x06, 0x61, 0x8f, 0x39, 0xac, 0xec, 0x3a, 0x67, 0x99, 0xae, 0xfa, 0x0f, 0x1a, - 0x5c, 0x10, 0x58, 0x6b, 0x1e, 0x6e, 0xb6, 0x89, 0x4b, 0x3c, 0xd5, 0xcb, 0xf8, 0x28, 0x3c, 0x20, - 0x21, 0x75, 0x7c, 0x4f, 0x00, 0x66, 0x8d, 0x78, 0x89, 0x56, 0x60, 0x54, 0x26, 0x25, 0x47, 0x2b, - 0x2f, 0xff, 0x77, 0xd0, 0x71, 0x7b, 0xb0, 0x0d, 0x29, 0x89, 0xee, 0xc1, 0x2c, 0xd9, 0xdb, 0x23, - 0x16, 0x73, 0x0e, 0x88, 0xb9, 0x17, 0xfa, 0x2e, 0x6f, 0x11, 0xae, 0xc3, 0x52, 0x85, 0x32, 0x93, - 0x30, 0xac, 0x87, 0xbe, 0xfb, 0x40, 0x6c, 0xf3, 0xd2, 0xd0, 0x61, 0x42, 0x9a, 0x1f, 0x67, 0x71, - 0x4e, 0xb6, 0x30, 0x45, 0xe4, 0x49, 0xac, 0x7f, 0xaa, 0xc1, 0x4c, 0xaf, 0x93, 0x54, 0xb8, 0xfa, - 0x7b, 0xe9, 0x31, 0x00, 0x49, 0x8c, 0x54, 0x77, 0xc4, 0xdb, 0x43, 0x9c, 0x4b, 0x29, 0x49, 0x81, - 0xdc, 0x68, 0xc3, 0x64, 0x0f, 0x13, 0xba, 0x0c, 0x95, 0xc7, 0x8d, 0xb5, 0xc6, 0x9a, 0xb9, 0xb6, - 0xbd, 0x52, 0x7b, 0xb8, 0xb6, 0xb5, 0xb6, 0xfd, 0xc4, 0x6c, 0x6c, 0x7f, 0xb0, 0xfd, 0xe8, 0xe9, - 0xf6, 0xd4, 0x48, 0xdf, 0x5d, 0xf9, 0xb9, 0x3a, 0xa5, 0xa1, 0x39, 0x98, 0x3d, 0xb2, 0xbb, 0x5a, - 0xdf, 0x95, 0xdb, 0x99, 0xe5, 0x9f, 0xf3, 0x50, 0xdc, 0x8d, 0xad, 0x43, 0xcf, 0x21, 0xb7, 0xe3, - 0x78, 0x2d, 0x74, 0x6d, 0x60, 0xfb, 0xec, 0xfc, 0x84, 0xaa, 0x2e, 0x9c, 0xcc, 0x28, 0xfd, 0xa7, - 0x8f, 0x20, 0x0c, 0x63, 0xf2, 0x3f, 0x0f, 0xba, 0x3e, 0x48, 0xaa, 0xeb, 0x97, 0x51, 0xf5, 0xc6, - 0x69, 0x58, 0x13, 0x15, 0x5f, 0x6a, 0x22, 0xc9, 0x8f, 0xbe, 0x0d, 0xd0, 0xdd, 0x41, 0x38, 0x83, - 0x7e, 0x2e, 0x55, 0xef, 0xbd, 0x85, 0x64, 0x62, 0xd0, 0x57, 0x32, 0xa1, 0xfa, 0x5c, 0xfa, 0xd1, - 0xb0, 0xb8, 0x9d, 0xfb, 0x70, 0xf5, 0xdd, 0xb7, 0x11, 0x4d, 0x6c, 0xfa, 0x42, 0x83, 0xe9, 0x7e, - 0x97, 0x4b, 0xf4, 0xce, 0x09, 0xb0, 0xc7, 0xbd, 0x26, 0xaa, 0x77, 0x87, 0x17, 0xec, 0x0d, 0xd9, - 0xd1, 0xfb, 0x10, 0x1a, 0x12, 0x35, 0xe5, 0x9f, 0x7b, 0x6f, 0x21, 0x99, 0x18, 0xf4, 0x1c, 0x72, - 0xbc, 0x4f, 0x0f, 0xae, 0x81, 0xd4, 0x08, 0x1b, 0x5c, 0x03, 0xe9, 0x96, 0xaf, 0x8f, 0xa0, 0x43, - 0x28, 0x77, 0xf7, 0x17, 0x74, 0xfb, 0x04, 0x5b, 0x8f, 0x36, 0xec, 0xea, 0xf2, 0x30, 0x22, 0xb1, - 0xea, 0x1a, 0x81, 0x2b, 0x96, 0xef, 0x0e, 0x10, 0xad, 0x95, 0x93, 0x46, 0xb0, 0x13, 0xfa, 0xcc, - 0xdf, 0xd1, 0x9e, 0xdd, 0x6e, 0x39, 0x6c, 0x3f, 0x6a, 0x2e, 0x5a, 0xbe, 0xbb, 0xc4, 0x05, 0x97, - 0x52, 0x82, 0x4b, 0x38, 0x70, 0x96, 0x12, 0xe1, 0x25, 0xf1, 0xff, 0x3a, 0x68, 0x36, 0xc7, 0xc4, - 0xc7, 0x9d, 0xdf, 0x02, 0x00, 0x00, 0xff, 0xff, 0xcb, 0x7d, 0x6d, 0xf6, 0xdb, 0x16, 0x00, 0x00, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0xdb, 0x6e, 0x1b, 0xc7, + 0x19, 0xd6, 0x92, 0x94, 0x44, 0xfe, 0x94, 0x28, 0x79, 0x2c, 0xcb, 0x14, 0x6d, 0xb9, 0xea, 0xb6, + 0xae, 0x65, 0xd7, 0x96, 0x60, 0xb9, 0x07, 0xbb, 0x28, 0x0a, 0x8b, 0xd6, 0x89, 0xa8, 0x25, 0xcb, + 0x2b, 0xab, 0x06, 0xec, 0x8b, 0xc5, 0x70, 0x77, 0x44, 0xad, 0xcd, 0x3d, 0x78, 0x66, 0x56, 0xad, + 0x7c, 0x51, 0xa0, 0x05, 0x7a, 0x55, 0x20, 0x40, 0xde, 0x20, 0xd7, 0xc9, 0x7d, 0x1e, 0x21, 0x2f, + 0x90, 0x9b, 0xe4, 0x09, 0xf2, 0x00, 0xb9, 0xc8, 0x6d, 0x30, 0x87, 0x5d, 0x2e, 0x29, 0x8a, 0x12, + 0xad, 0x04, 0x48, 0x80, 0xdc, 0x71, 0xfe, 0xc3, 0xf7, 0xff, 0xf3, 0x1f, 0x67, 0x09, 0x53, 0x8c, + 0x87, 0x47, 0x24, 0xf2, 0x22, 0xb2, 0x14, 0xd1, 0x90, 0x87, 0xa8, 0x16, 0x37, 0x09, 0x5d, 0x62, + 0x71, 0xd3, 0xf7, 0xf8, 0xbb, 0x98, 0xc4, 0x64, 0x29, 0x95, 0x30, 0x6f, 0x41, 0x79, 0xd7, 0x0b, + 0x5a, 0x16, 0x79, 0x17, 0x13, 0xc6, 0x51, 0x15, 0xc6, 0x7d, 0xc2, 0x18, 0x6e, 0x91, 0xaa, 0xb1, + 0x60, 0x2c, 0x96, 0xac, 0xe4, 0x68, 0xfe, 0xcf, 0x80, 0x09, 0x25, 0xc9, 0xa2, 0x30, 0x60, 0xe4, + 0x74, 0x51, 0xf4, 0x6b, 0x98, 0x60, 0x84, 0x1e, 0x79, 0x0e, 0xb1, 0x03, 0xec, 0x93, 0x6a, 0x4e, + 0xb2, 0xcb, 0x9a, 0xb6, 0x83, 0x7d, 0x82, 0xae, 0x43, 0x89, 0x7b, 0x3e, 0x61, 0x1c, 0xfb, 0x51, + 0x35, 0xbf, 0x60, 0x2c, 0xe6, 0xad, 0x0e, 0x01, 0xd5, 0xa0, 0x78, 0x18, 0x32, 0x2e, 0x95, 0x0b, + 0x52, 0x39, 0x3d, 0x9b, 0x37, 0x61, 0xb2, 0x11, 0xb4, 0x08, 0xe3, 0x89, 0xcb, 0x33, 0x30, 0x2a, + 0x2f, 0xa5, 0xbd, 0x50, 0x07, 0x73, 0x01, 0x2a, 0x89, 0x98, 0xf6, 0xb7, 0x02, 0x39, 0xcf, 0xd5, + 0x42, 0x39, 0xcf, 0x35, 0xf7, 0xe0, 0xfa, 0x26, 0x49, 0x50, 0xb6, 0x3c, 0xc6, 0x43, 0x7a, 0x5c, + 0x3f, 0x6e, 0xac, 0x0d, 0xc4, 0x45, 0xf3, 0x00, 0x54, 0x09, 0xd8, 0x9e, 0xab, 0x6f, 0x56, 0xd2, + 0x94, 0x86, 0x6b, 0x6e, 0xc2, 0x7c, 0x1f, 0xd0, 0x7d, 0xab, 0x31, 0x18, 0x75, 0x1a, 0xf2, 0x31, + 0xf5, 0x34, 0x9c, 0xf8, 0x69, 0xfe, 0x37, 0x07, 0x13, 0x5a, 0x7f, 0xfd, 0x88, 0x04, 0x1c, 0xcd, + 0x41, 0x91, 0x88, 0x1f, 0x76, 0x7a, 0x89, 0x71, 0x79, 0x6e, 0xb8, 0x22, 0xde, 0x69, 0xec, 0x6c, + 0x9f, 0x49, 0x98, 0xbc, 0x55, 0x4e, 0x69, 0xdb, 0x0c, 0xdd, 0x84, 0xc9, 0xc4, 0x6d, 0xc6, 0x31, + 0x27, 0x32, 0xe6, 0xa5, 0xad, 0x11, 0x6b, 0x42, 0x93, 0xf7, 0x04, 0x15, 0xcd, 0xc2, 0xa8, 0x04, + 0x55, 0x51, 0xdf, 0x1a, 0xb1, 0xd4, 0x11, 0xdd, 0x84, 0x4a, 0x18, 0x73, 0x27, 0xf4, 0x89, 0x4d, + 0x09, 0x66, 0x61, 0x50, 0x1d, 0x95, 0x2e, 0x4c, 0x6a, 0xaa, 0x25, 0x89, 0xe8, 0x31, 0x14, 0x5c, + 0xcc, 0x71, 0x75, 0x6c, 0xc1, 0x58, 0x2c, 0xaf, 0xdc, 0x5d, 0x3a, 0xbd, 0xee, 0x96, 0xb2, 0x77, + 0x5b, 0xc3, 0x1c, 0x5b, 0x52, 0xb3, 0x3e, 0x01, 0x10, 0x3a, 0x4e, 0x4c, 0x29, 0x09, 0x1c, 0x62, + 0x7e, 0x5b, 0x80, 0xe9, 0x5e, 0x41, 0xf4, 0xaa, 0xf7, 0x2a, 0x86, 0xb4, 0xf6, 0xe0, 0x1c, 0xd6, + 0xac, 0xcc, 0x5d, 0x05, 0xd6, 0x89, 0xfb, 0xbf, 0x84, 0xa9, 0x66, 0xec, 0xb5, 0x5d, 0x9b, 0x53, + 0xaf, 0xd5, 0x22, 0x94, 0xa8, 0x14, 0x9f, 0xef, 0x2e, 0x75, 0xa1, 0xa9, 0x61, 0x2b, 0x12, 0xe6, + 0x45, 0x82, 0x82, 0xf6, 0x41, 0x51, 0xec, 0x03, 0x2f, 0xf0, 0xd8, 0x21, 0x71, 0x65, 0x02, 0x86, + 0xc7, 0x9d, 0x94, 0x28, 0x1b, 0x1a, 0x04, 0xbd, 0x83, 0xea, 0x11, 0x6e, 0x7b, 0x2e, 0xe6, 0x5e, + 0x18, 0xd8, 0x07, 0xd8, 0xe1, 0x36, 0x25, 0x4e, 0x48, 0x5d, 0xe2, 0xca, 0x14, 0x96, 0x57, 0xfe, + 0x78, 0x0e, 0x03, 0xff, 0x48, 0x21, 0x36, 0xb0, 0xc3, 0xb5, 0xa5, 0xd9, 0xa3, 0x2e, 0xaa, 0xa5, + 0x61, 0xd1, 0x5b, 0x98, 0x8d, 0x68, 0xf8, 0x86, 0x38, 0x5c, 0xda, 0x63, 0x1d, 0x83, 0xa3, 0xe7, + 0xce, 0xc3, 0xae, 0x02, 0x10, 0xb8, 0x4c, 0x9b, 0x9b, 0x89, 0x32, 0xb4, 0xd4, 0xd8, 0x21, 0x54, + 0x55, 0xd8, 0x70, 0x80, 0xdb, 0xc7, 0xcc, 0x63, 0x36, 0x6e, 0xe2, 0xc0, 0x0d, 0x03, 0xe2, 0x0e, + 0x51, 0x64, 0xd9, 0x00, 0xce, 0x4a, 0xbc, 0x55, 0x0d, 0xb7, 0x9a, 0xa0, 0xd5, 0x4b, 0x30, 0x1e, + 0xe1, 0xe3, 0x76, 0x88, 0x5d, 0xf3, 0x0f, 0x70, 0xf5, 0x94, 0x7a, 0x11, 0x4d, 0xa8, 0xfc, 0xe9, + 0x34, 0xa1, 0x3c, 0x37, 0x5c, 0xf3, 0x5e, 0x5a, 0xaa, 0xa9, 0xb9, 0x41, 0xe2, 0x7f, 0x85, 0xb9, + 0x53, 0xa3, 0x8f, 0x7e, 0x05, 0x65, 0x99, 0x4b, 0x97, 0xb4, 0x28, 0x51, 0x05, 0x6e, 0x58, 0x20, + 0x48, 0x6b, 0x92, 0x62, 0x6e, 0xa6, 0x2e, 0xf6, 0x86, 0x12, 0xdd, 0x05, 0x94, 0xcd, 0x8f, 0xed, + 0x84, 0x71, 0xc0, 0x25, 0x44, 0xc1, 0x9a, 0xce, 0x04, 0xf9, 0x89, 0xa0, 0x9b, 0x5f, 0x18, 0x50, + 0xe9, 0x9e, 0x56, 0x3d, 0x13, 0xce, 0xe8, 0x99, 0x70, 0xe8, 0x31, 0x8c, 0xc9, 0x99, 0x20, 0xc6, + 0x4c, 0x7e, 0xb1, 0xbc, 0xb2, 0x78, 0xde, 0x2e, 0xb7, 0xb4, 0x1e, 0xda, 0x83, 0xa9, 0xb4, 0x81, + 0x63, 0xdf, 0xc7, 0xf4, 0x58, 0x37, 0xc3, 0x9d, 0x41, 0x50, 0x49, 0x2e, 0x94, 0x86, 0x55, 0xa1, + 0x5d, 0x67, 0xf3, 0x73, 0xa3, 0xef, 0xe4, 0x15, 0xe3, 0x5c, 0xcf, 0xff, 0x8e, 0xe3, 0xc6, 0x0f, + 0xe7, 0x78, 0xee, 0xc2, 0x8e, 0xbf, 0x81, 0x1b, 0xa7, 0x6d, 0x0c, 0xed, 0xf8, 0x16, 0x94, 0x0e, + 0x25, 0xdd, 0x23, 0x89, 0xef, 0xe7, 0x31, 0x98, 0xd4, 0x70, 0x47, 0xd9, 0xfc, 0xd4, 0x80, 0x6b, + 0x9b, 0x84, 0xeb, 0x9a, 0x11, 0x65, 0x1d, 0xb3, 0x8b, 0xae, 0x3c, 0xb1, 0xac, 0x75, 0x59, 0xb1, + 0x6a, 0x7e, 0x21, 0x2f, 0x96, 0x75, 0x72, 0x46, 0xd7, 0xa0, 0x14, 0xe1, 0x16, 0xb1, 0x99, 0xf7, + 0x5e, 0x6d, 0xf2, 0x51, 0xab, 0x28, 0x08, 0x7b, 0xde, 0x7b, 0x89, 0x2b, 0x99, 0x3c, 0x7c, 0x4b, + 0x92, 0x85, 0x22, 0xc5, 0x5f, 0x08, 0x82, 0xf9, 0x99, 0x21, 0x17, 0x74, 0x8f, 0xb3, 0x67, 0xae, + 0xd2, 0x79, 0x00, 0xe7, 0x10, 0x07, 0x2d, 0x62, 0x77, 0x36, 0x6a, 0x49, 0x51, 0xf6, 0xa9, 0xf7, + 0xa3, 0x79, 0xdb, 0x84, 0x4b, 0xda, 0xd3, 0x4e, 0x3f, 0x8b, 0x27, 0x92, 0x06, 0x4f, 0xda, 0x5f, + 0x1f, 0xd1, 0x6d, 0x98, 0x6a, 0x52, 0x82, 0xdf, 0x0a, 0x44, 0xdd, 0xe5, 0xc2, 0x55, 0x43, 0xae, + 0x0e, 0xcd, 0x50, 0xbd, 0x5e, 0x2f, 0xc2, 0x18, 0x25, 0x2c, 0x6e, 0x73, 0xf3, 0xab, 0x7c, 0xbf, + 0x88, 0x64, 0x4a, 0xfc, 0x8c, 0xd6, 0x4d, 0x03, 0x96, 0x3b, 0x3d, 0x60, 0xf9, 0xde, 0x80, 0x89, + 0x19, 0x86, 0x99, 0x62, 0x16, 0xf4, 0x0c, 0xc3, 0x4c, 0xb2, 0x7e, 0xd3, 0xbb, 0x89, 0x55, 0x54, + 0xba, 0x57, 0xaa, 0x09, 0x93, 0x71, 0xe4, 0x62, 0x4e, 0x5c, 0x1b, 0x73, 0xf1, 0x3a, 0x01, 0xf5, + 0x3a, 0xd1, 0xc4, 0x55, 0xbe, 0xcd, 0xd0, 0xdf, 0xa0, 0x46, 0x49, 0x14, 0x32, 0x4f, 0x14, 0xac, + 0xdd, 0x1b, 0x98, 0x31, 0x1d, 0x98, 0x6a, 0x47, 0xa6, 0xde, 0x15, 0x22, 0xf4, 0x10, 0xaa, 0xc9, + 0xcc, 0x53, 0xa1, 0x62, 0xb6, 0x13, 0xfa, 0x51, 0x9b, 0x70, 0x52, 0x1d, 0x5f, 0x30, 0x16, 0x8b, + 0x56, 0xb2, 0xb3, 0x2c, 0xc5, 0x7e, 0xa2, 0xb9, 0xa8, 0x91, 0x29, 0x87, 0xa2, 0x6c, 0xad, 0x7b, + 0x83, 0x5a, 0xeb, 0x44, 0x8a, 0x33, 0xd5, 0xf3, 0x3b, 0x98, 0x0a, 0xc8, 0xbf, 0xb8, 0x9d, 0xa9, + 0x92, 0x92, 0x7a, 0x24, 0x09, 0xf2, 0x6e, 0x52, 0x29, 0xf5, 0xcb, 0x70, 0x29, 0x73, 0x59, 0x9d, + 0xda, 0xaf, 0xf3, 0x72, 0x7c, 0xf5, 0x2b, 0xf6, 0x5f, 0x72, 0xfb, 0x33, 0xcf, 0xed, 0x27, 0xb9, + 0x74, 0xc7, 0xea, 0xa1, 0xff, 0x93, 0x4c, 0xe6, 0x3d, 0xb8, 0x2c, 0x99, 0x76, 0x77, 0x4a, 0xc7, + 0x64, 0x4a, 0xa7, 0x25, 0x6b, 0x3f, 0x93, 0xd7, 0xdf, 0x42, 0x05, 0x3b, 0x0e, 0x89, 0x3a, 0x92, + 0xe3, 0x52, 0x72, 0x22, 0xa1, 0x4a, 0xa9, 0x93, 0x1f, 0x0e, 0xc5, 0x3e, 0x1f, 0x0e, 0xe6, 0x77, + 0x06, 0x94, 0x9f, 0x7a, 0x67, 0x7c, 0xd3, 0xa1, 0x3f, 0xc1, 0xd5, 0xac, 0xc9, 0x90, 0xda, 0xf8, + 0x80, 0x13, 0x9a, 0x7e, 0xf2, 0x6c, 0x8d, 0x58, 0x97, 0x3b, 0xd6, 0x9f, 0xd1, 0x55, 0xc1, 0xdd, + 0x66, 0x68, 0x09, 0x50, 0xaa, 0xd7, 0x24, 0x07, 0x21, 0x25, 0x42, 0x45, 0x7e, 0x75, 0x6e, 0x19, + 0xd6, 0x74, 0xc2, 0xab, 0x4b, 0xd6, 0xf6, 0x85, 0xf6, 0x40, 0x7d, 0x16, 0x66, 0x52, 0x5b, 0xed, + 0xf0, 0x9f, 0x84, 0xda, 0xcd, 0x30, 0x0e, 0xdc, 0x2e, 0x7a, 0x1c, 0x45, 0x09, 0xdd, 0xfc, 0x37, + 0x4c, 0xa8, 0x8b, 0xeb, 0x36, 0xdf, 0x80, 0xa2, 0xce, 0xca, 0x30, 0xbb, 0x3e, 0x79, 0x5c, 0xa4, + 0xba, 0xfd, 0x2a, 0x36, 0xd7, 0xa7, 0x62, 0xcd, 0xa7, 0x70, 0x65, 0x93, 0xf0, 0xe7, 0x02, 0x56, + 0x4d, 0x9d, 0x8b, 0x6c, 0x57, 0xf3, 0x4b, 0x03, 0xae, 0x48, 0xac, 0xf5, 0x00, 0x37, 0xdb, 0xc4, + 0x27, 0x81, 0x9e, 0x65, 0x62, 0x15, 0x1e, 0x11, 0xca, 0xbc, 0x30, 0x90, 0x80, 0x79, 0x2b, 0x39, + 0xa2, 0x55, 0x18, 0x55, 0x45, 0x29, 0xd0, 0x2a, 0x2b, 0xbf, 0x1f, 0x74, 0xdd, 0x1e, 0x6c, 0x4b, + 0x69, 0xa2, 0x47, 0x30, 0x47, 0x0e, 0x0e, 0x88, 0xc3, 0xbd, 0x23, 0x62, 0x1f, 0xd0, 0xd0, 0x17, + 0x23, 0xc2, 0xf7, 0x78, 0xa6, 0x51, 0x66, 0x53, 0x81, 0x0d, 0x1a, 0xfa, 0x4f, 0x24, 0x5b, 0xb4, + 0x86, 0x09, 0x93, 0xca, 0xfd, 0xa4, 0x8a, 0x0b, 0x6a, 0x84, 0x69, 0xa2, 0x28, 0x62, 0xf3, 0x3f, + 0x06, 0xcc, 0xf6, 0x06, 0x49, 0xa7, 0xab, 0x7f, 0x94, 0x9e, 0x03, 0x90, 0xd4, 0x49, 0xfd, 0x46, + 0xbc, 0x3f, 0xc4, 0xbd, 0xb4, 0x91, 0x0c, 0xc8, 0x9d, 0x36, 0x4c, 0xf5, 0x08, 0xa1, 0xeb, 0x50, + 0x7d, 0xbe, 0xbf, 0xbe, 0xbf, 0x6e, 0xaf, 0xef, 0xac, 0xd6, 0x9f, 0xae, 0x6f, 0xaf, 0xef, 0xbc, + 0xb0, 0xf7, 0x77, 0xfe, 0xbe, 0xf3, 0xec, 0xe5, 0xce, 0xf4, 0x48, 0x5f, 0xae, 0xfa, 0xb9, 0x36, + 0x6d, 0xa0, 0x79, 0x98, 0x3b, 0xc1, 0x5d, 0x6b, 0xec, 0x29, 0x76, 0x6e, 0xe5, 0x9b, 0x71, 0x28, + 0xed, 0x25, 0xde, 0xa1, 0xd7, 0x50, 0xd8, 0xf5, 0x82, 0x16, 0xba, 0x35, 0x70, 0x7c, 0x76, 0xfe, + 0x45, 0xaa, 0x2d, 0x9e, 0x2d, 0xa8, 0xe2, 0x67, 0x8e, 0x20, 0x0c, 0x63, 0xea, 0x8f, 0x1a, 0x74, + 0x7b, 0x90, 0x56, 0xd7, 0x7f, 0x3e, 0xb5, 0x3b, 0xe7, 0x11, 0x4d, 0x4d, 0x7c, 0x64, 0xc8, 0x22, + 0x3f, 0xf9, 0x6d, 0x80, 0x1e, 0x0e, 0xc2, 0x19, 0xf4, 0xef, 0x50, 0xed, 0xd1, 0x07, 0x68, 0xa6, + 0x0e, 0x7d, 0xac, 0x0a, 0xaa, 0xcf, 0xa3, 0x1f, 0x0d, 0x8b, 0xdb, 0x79, 0x0f, 0xd7, 0xfe, 0xf2, + 0x21, 0xaa, 0xa9, 0x4f, 0xff, 0x37, 0x60, 0xa6, 0xdf, 0xe3, 0x12, 0xfd, 0xf9, 0x0c, 0xd8, 0xd3, + 0xbe, 0x26, 0x6a, 0x0f, 0x87, 0x57, 0xec, 0x4d, 0xd9, 0xc9, 0xf7, 0x10, 0x1a, 0x12, 0x35, 0x13, + 0x9f, 0x47, 0x1f, 0xa0, 0x99, 0x3a, 0xf4, 0x1a, 0x0a, 0x62, 0x4e, 0x0f, 0xee, 0x81, 0xcc, 0x0a, + 0x1b, 0xdc, 0x03, 0xd9, 0x91, 0x6f, 0x8e, 0xa0, 0x63, 0xa8, 0x74, 0xcf, 0x17, 0x74, 0xff, 0x0c, + 0x5f, 0x4f, 0x0e, 0xec, 0xda, 0xca, 0x30, 0x2a, 0x89, 0xe9, 0x3a, 0x81, 0x1b, 0x4e, 0xe8, 0x0f, + 0x50, 0xad, 0x57, 0xd2, 0x41, 0xb0, 0x4b, 0x43, 0x1e, 0xee, 0x1a, 0xaf, 0xee, 0xb7, 0x3c, 0x7e, + 0x18, 0x37, 0x97, 0x9c, 0xd0, 0x5f, 0x16, 0x8a, 0xcb, 0x19, 0xc5, 0x65, 0x1c, 0x79, 0xcb, 0xa9, + 0xf2, 0xb2, 0xfc, 0x03, 0x3a, 0x6a, 0x36, 0xc7, 0xe4, 0x8f, 0x07, 0xdf, 0x07, 0x00, 0x00, 0xff, + 0xff, 0x9c, 0xb9, 0x94, 0xbc, 0x9c, 0x16, 0x00, 0x00, }, } diff --git a/doc/rfc/stovepipe/request-history-api.md b/doc/rfc/stovepipe/request-history-api.md index 7f1b6dfd9..adf7526f6 100644 --- a/doc/rfc/stovepipe/request-history-api.md +++ b/doc/rfc/stovepipe/request-history-api.md @@ -32,14 +32,14 @@ Events are returned by `(timestamp_ms ASC, event_id ASC)`. URI histories are ord | Occurrence | Payload | Retained fields | |---|---|---| -| Any request-state transition | `request_state` | Optional `base_uri` and `build_id` | +| Request-state transition with a retained build ID | `request_state` | `build_id` | | `build_triggered` | `build_triggered` | `build_id` | | `build_finished` | `build_finished` | `build_id` | | `build_analysis_abandoned` | `build_analysis_abandoned` | `build_id` | | `validation_fact_recorded` | `validation_fact_recorded` | `fact_degree`, a breakage degree in [0, 1] | | `project_facts_recorded` | `project_facts_recorded` | `project_fact_count`, an unsigned count | -A present empty `base_uri` means a full build; an absent baseline means it was not retained. State fields are independently optional. Numeric payload presence distinguishes a recorded zero from unavailable metadata. The project-fact count uses protobuf `uint64` (a decimal string in JSON) to preserve precision across clients. +Build IDs are ordinary strings, with empty meaning unavailable. Baseline metadata is not exposed in event data. Numeric payload presence distinguishes a recorded zero from unavailable metadata. The project-fact count uses protobuf `uint64` (a decimal string in JSON) to preserve precision across clients. Missing metadata, malformed or out-of-range numbers, empty build IDs, and unsupported event metadata omit the corresponding payload without failing the history lookup. Clients tolerate absent data and unknown future payload kinds. Existing event fields and field numbers remain unchanged. @@ -58,7 +58,7 @@ Authorization follows the same queue policy as other Stovepipe reads. Possession ## Testing -Tests cover matching events and summaries across selectors, required summaries and retryable materialization gaps, current summaries independent of retained event subsets, queue and URI consistency, storage-read failures, histories absent despite a stored summary, stable event ordering, and unknown future state and outcome-reason strings. Metadata tests cover typed payloads, absent or malformed values, known zeros, empty baseline presence, private keys, and binary/JSON round trips. +Tests cover matching events and summaries across selectors, required summaries and retryable materialization gaps, current summaries independent of retained event subsets, queue and URI consistency, storage-read failures, histories absent despite a stored summary, stable event ordering, and unknown future state and outcome-reason strings. Metadata tests cover typed payloads, absent or malformed values, known zeros, omitted baseline and private keys, and binary/JSON round trips. ## Alternatives Considered diff --git a/doc/rfc/stovepipe/request-log.md b/doc/rfc/stovepipe/request-log.md index 3da430de9..0459c9429 100644 --- a/doc/rfc/stovepipe/request-log.md +++ b/doc/rfc/stovepipe/request-log.md @@ -103,7 +103,7 @@ The core column shape follows SubmitQueue's `RequestLog`, except Stovepipe omits Metadata is never used for occurrence identity or filtering. Nil and empty maps are equivalent. Storage treats the map as opaque JSON; writers and projections define the bounded `base_uri`, `build_id`, `fact_degree`, and `project_fact_count` keys. Producers must not store credentials, raw dependency errors, stack traces, or unbounded payloads. The public history API exposes supported keys through typed occurrence payloads, never the raw map; the [API contract](request-history-api.md#retained-event-data) defines their presence semantics. -State entries retain the selected baseline URI when known, including an empty URI for a full build. When a build established the terminal state, that state entry records its ID as occurrence context. Other Request context and Build status/version remain on their operational entities; history does not load them to enrich old occurrences. The triggered and finished event kinds plus the terminal Request state describe the lifecycle without duplicating Build snapshots. Diagnostic error codes remain in structured logs until a concrete public vocabulary is required. +State entries retain the selected baseline URI when known, including an empty URI for a full build; this metadata feeds the summary projection and is not exposed in event payloads. When a build established the terminal state, that state entry records its ID as occurrence context. Other Request context and Build status/version remain on their operational entities; history does not load them to enrich old occurrences. The triggered and finished event kinds plus the terminal Request state describe the lifecycle without duplicating Build snapshots. Diagnostic error codes remain in structured logs until a concrete public vocabulary is required. ## Vocabularies diff --git a/service/stovepipe/server/mapper/request_history.go b/service/stovepipe/server/mapper/request_history.go index fe4c5dfce..15115101a 100644 --- a/service/stovepipe/server/mapper/request_history.go +++ b/service/stovepipe/server/mapper/request_history.go @@ -76,19 +76,13 @@ func RequestHistoriesToProto(histories []entity.RequestHistory) []*pb.RequestHis func historyEventDataToProto(log entity.RequestLog) *pb.HistoryEventData { if log.State != entity.RequestStateUnknown { - baseURI, hasBaseURI := log.Metadata[requestlog.MetadataKeyBaseURI] buildID := log.Metadata[requestlog.MetadataKeyBuildID] - if !hasBaseURI && buildID == "" { + if buildID == "" { return nil } - state := &pb.HistoryRequestStateData{} - if hasBaseURI { - state.BaseUri = &baseURI - } - if buildID != "" { - state.BuildId = &buildID - } - return &pb.HistoryEventData{Payload: &pb.HistoryEventData_RequestState{RequestState: state}} + return &pb.HistoryEventData{Payload: &pb.HistoryEventData_RequestState{ + RequestState: &pb.HistoryRequestStateData{BuildId: buildID}, + }} } switch log.Event { diff --git a/service/stovepipe/server/mapper/request_history_test.go b/service/stovepipe/server/mapper/request_history_test.go index 4d894d548..4867dcd6e 100644 --- a/service/stovepipe/server/mapper/request_history_test.go +++ b/service/stovepipe/server/mapper/request_history_test.go @@ -188,25 +188,13 @@ func TestHistoryMetadataToProto(t *testing.T) { wantData string }{ { - name: "state retains baseline and terminal build", + name: "state retains terminal build without other metadata", state: entity.RequestStateSucceeded, metadata: map[string]string{"base_uri": "git://repo/base", "build_id": "build/1", "private": "hidden"}, - wantData: `{"requestState":{"baseUri":"git://repo/base","buildId":"build/1"}}`, - }, - { - name: "full build has an explicitly empty baseline", - state: entity.RequestStateProcessing, - metadata: map[string]string{"base_uri": ""}, - wantData: `{"requestState":{"baseUri":""}}`, - }, - { - name: "baseline without terminal build", - state: entity.RequestStateProcessing, - metadata: map[string]string{"base_uri": "git://repo/base"}, - wantData: `{"requestState":{"baseUri":"git://repo/base"}}`, + wantData: `{"requestState":{"buildId":"build/1"}}`, }, { - name: "terminal build with unknown baseline", + name: "failed state retains terminal build", state: entity.RequestStateFailed, metadata: map[string]string{"build_id": "build/1"}, wantData: `{"requestState":{"buildId":"build/1"}}`, @@ -306,6 +294,8 @@ func TestHistoryMetadataUnavailable(t *testing.T) { tests := []testCase{ {name: "state without metadata", log: entity.RequestLog{State: entity.RequestStateAccepted}}, {name: "state without recognized metadata", log: entity.RequestLog{State: entity.RequestStateFailed, Metadata: map[string]string{"private": "hidden", "build_id": ""}}}, + {name: "state with only baseline", log: entity.RequestLog{State: entity.RequestStateProcessing, Metadata: map[string]string{"base_uri": "git://repo/base"}}}, + {name: "state with only full build baseline", log: entity.RequestLog{State: entity.RequestStateProcessing, Metadata: map[string]string{"base_uri": ""}}}, {name: "triggered build without metadata", log: entity.RequestLog{Event: entity.RequestEventBuildTriggered}}, {name: "finished build with empty ID", log: entity.RequestLog{Event: entity.RequestEventBuildFinished, Metadata: map[string]string{"build_id": ""}}}, {name: "abandoned analysis without metadata", log: entity.RequestLog{Event: entity.RequestEventBuildAnalysisAbandoned}}, diff --git a/web/api/src/gen/api/stovepipe/proto/stovepipe_pb.ts b/web/api/src/gen/api/stovepipe/proto/stovepipe_pb.ts index 7e9be70cf..eb2b9b7fa 100644 --- a/web/api/src/gen/api/stovepipe/proto/stovepipe_pb.ts +++ b/web/api/src/gen/api/stovepipe/proto/stovepipe_pb.ts @@ -24,7 +24,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file api/stovepipe/proto/stovepipe.proto. */ export const file_api_stovepipe_proto_stovepipe: GenFile = /*@__PURE__*/ - fileDesc("CiNhcGkvc3RvdmVwaXBlL3Byb3RvL3N0b3ZlcGlwZS5wcm90bxIadWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUiHgoLUGluZ1JlcXVlc3QSDwoHbWVzc2FnZRgBIAEoCSJaCgxQaW5nUmVzcG9uc2USDwoHbWVzc2FnZRgBIAEoCRIUCgxzZXJ2aWNlX25hbWUYAiABKAkSEQoJdGltZXN0YW1wGAMgASgDEhAKCGhvc3RuYW1lGAQgASgJIh4KDUluZ2VzdFJlcXVlc3QSDQoFcXVldWUYASABKAkiHAoOSW5nZXN0UmVzcG9uc2USCgoCaWQYASABKAkiQQocR2V0UmVxdWVzdEhpc3RvcnlCeUlEUmVxdWVzdBINCgVxdWV1ZRgBIAEoCRISCgpyZXF1ZXN0X2lkGAIgASgJIjsKHUdldFJlcXVlc3RIaXN0b3J5QnlVUklSZXF1ZXN0Eg0KBXF1ZXVlGAEgASgJEgsKA3VyaRgCIAEoCSLCAQoMSGlzdG9yeUV2ZW50EhAKCGV2ZW50X2lkGAEgASgJEhQKDHRpbWVzdGFtcF9tcxgCIAEoAxIXCg1yZXF1ZXN0X3N0YXRlGAMgASgJSAASDwoFZXZlbnQYBCABKAlIABIWCg5vdXRjb21lX3JlYXNvbhgFIAEoCRI6CgRkYXRhGAYgASgLMiwudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuSGlzdG9yeUV2ZW50RGF0YUIMCgpvY2N1cnJlbmNlIoAEChBIaXN0b3J5RXZlbnREYXRhEkwKDXJlcXVlc3Rfc3RhdGUYASABKAsyMy51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5IaXN0b3J5UmVxdWVzdFN0YXRlRGF0YUgAEkcKD2J1aWxkX3RyaWdnZXJlZBgCIAEoCzIsLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkhpc3RvcnlCdWlsZERhdGFIABJGCg5idWlsZF9maW5pc2hlZBgDIAEoCzIsLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkhpc3RvcnlCdWlsZERhdGFIABJZChh2YWxpZGF0aW9uX2ZhY3RfcmVjb3JkZWQYBCABKAsyNS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5IaXN0b3J5VmFsaWRhdGlvbkZhY3REYXRhSAASVQoWcHJvamVjdF9mYWN0c19yZWNvcmRlZBgFIAEoCzIzLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkhpc3RvcnlQcm9qZWN0RmFjdHNEYXRhSAASUAoYYnVpbGRfYW5hbHlzaXNfYWJhbmRvbmVkGAYgASgLMiwudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuSGlzdG9yeUJ1aWxkRGF0YUgAQgkKB3BheWxvYWQiYQoXSGlzdG9yeVJlcXVlc3RTdGF0ZURhdGESFQoIYmFzZV91cmkYASABKAlIAIgBARIVCghidWlsZF9pZBgCIAEoCUgBiAEBQgsKCV9iYXNlX3VyaUILCglfYnVpbGRfaWQiJAoQSGlzdG9yeUJ1aWxkRGF0YRIQCghidWlsZF9pZBgBIAEoCSIwChlIaXN0b3J5VmFsaWRhdGlvbkZhY3REYXRhEhMKC2ZhY3RfZGVncmVlGAEgASgBIjUKF0hpc3RvcnlQcm9qZWN0RmFjdHNEYXRhEhoKEnByb2plY3RfZmFjdF9jb3VudBgBIAEoBCKjAQoOUmVxdWVzdEhpc3RvcnkSEgoKcmVxdWVzdF9pZBgBIAEoCRI4CgZldmVudHMYAiADKAsyKC51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5IaXN0b3J5RXZlbnQSQwoPcmVxdWVzdF9zdW1tYXJ5GAMgASgLMioudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUmVxdWVzdFN1bW1hcnkingEKHUdldFJlcXVlc3RIaXN0b3J5QnlJRFJlc3BvbnNlEjgKBmV2ZW50cxgBIAMoCzIoLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkhpc3RvcnlFdmVudBJDCg9yZXF1ZXN0X3N1bW1hcnkYAiABKAsyKi51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5SZXF1ZXN0U3VtbWFyeSJfCh5HZXRSZXF1ZXN0SGlzdG9yeUJ5VVJJUmVzcG9uc2USPQoJaGlzdG9yaWVzGAEgAygLMioudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUmVxdWVzdEhpc3RvcnkieQobR2V0UHJvamVjdFN0YXR1c0J5SURSZXF1ZXN0Eg0KBXF1ZXVlGAEgASgJEhIKCnJlcXVlc3RfaWQYAiABKAkSEAoIcHJvamVjdHMYAyADKAkSEQoJcGFnZV9zaXplGAQgASgFEhIKCnBhZ2VfdG9rZW4YBSABKAkiegocR2V0UHJvamVjdFN0YXR1c0J5VVJJUmVxdWVzdBINCgVxdWV1ZRgBIAEoCRISCgpjaGFuZ2VfdXJpGAIgASgJEhAKCHByb2plY3RzGAMgAygJEhEKCXBhZ2Vfc2l6ZRgEIAEoBRISCgpwYWdlX3Rva2VuGAUgASgJIkkKEVByb2plY3RWYWxpZGF0aW9uEg8KB3Byb2plY3QYASABKAkSGQoPYnJlYWthZ2VfZGVncmVlGAIgASgBSABCCAoGcmVzdWx0IswCChxHZXRQcm9qZWN0U3RhdHVzQnlJRFJlc3BvbnNlEhIKCnJlcXVlc3RfaWQYASABKAkSDQoFcXVldWUYAiABKAkSEgoKY2hhbmdlX3VyaRgDIAEoCRIQCghiYXNlX3VyaRgEIAEoCRIVCg1yZXF1ZXN0X3N0YXRlGAUgASgJEhUKDXVwZGF0ZWRfYXRfbXMYCiABKAMSJAoacmVwb3NpdG9yeV9icmVha2FnZV9kZWdyZWUYBiABKAFIABIgChhwcm9qZWN0X3Jlc3VsdHNfY29tcGxldGUYByABKAgSPwoIcHJvamVjdHMYCCADKAsyLS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5Qcm9qZWN0VmFsaWRhdGlvbhIXCg9uZXh0X3BhZ2VfdG9rZW4YCSABKAlCEwoRcmVwb3NpdG9yeV9yZXN1bHQizQIKHUdldFByb2plY3RTdGF0dXNCeVVSSVJlc3BvbnNlEhIKCnJlcXVlc3RfaWQYASABKAkSDQoFcXVldWUYAiABKAkSEgoKY2hhbmdlX3VyaRgDIAEoCRIQCghiYXNlX3VyaRgEIAEoCRIVCg1yZXF1ZXN0X3N0YXRlGAUgASgJEhUKDXVwZGF0ZWRfYXRfbXMYCiABKAMSJAoacmVwb3NpdG9yeV9icmVha2FnZV9kZWdyZWUYBiABKAFIABIgChhwcm9qZWN0X3Jlc3VsdHNfY29tcGxldGUYByABKAgSPwoIcHJvamVjdHMYCCADKAsyLS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5Qcm9qZWN0VmFsaWRhdGlvbhIXCg9uZXh0X3BhZ2VfdG9rZW4YCSABKAlCEwoRcmVwb3NpdG9yeV9yZXN1bHQivQEKDlJlcXVlc3RTdW1tYXJ5EhIKCnJlcXVlc3RfaWQYASABKAkSDQoFcXVldWUYAiABKAkSEgoKY2hhbmdlX3VyaRgDIAEoCRIQCghiYXNlX3VyaRgEIAEoCRIVCg1yZXF1ZXN0X3N0YXRlGAUgASgJEhsKE3N0YXRlX3VwZGF0ZWRfYXRfbXMYBiABKAMSFgoOYWNjZXB0ZWRfYXRfbXMYByABKAMSFgoOb3V0Y29tZV9yZWFzb24YCCABKAkitAEKC0xpc3RSZXF1ZXN0Eg0KBXF1ZXVlGAEgASgJEiEKF2FjY2VwdGVkX2F0X29yX2FmdGVyX21zGAIgASgDSAASHAoSYWNjZXB0ZWRfYmVmb3JlX21zGAMgASgDSAESEQoJcGFnZV9zaXplGAQgASgFEhIKCnBhZ2VfdG9rZW4YBSABKAlCFgoUYWNjZXB0ZWRfbG93ZXJfYm91bmRCFgoUYWNjZXB0ZWRfdXBwZXJfYm91bmQiZQoMTGlzdFJlc3BvbnNlEjwKCHJlcXVlc3RzGAEgAygLMioudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUmVxdWVzdFN1bW1hcnkSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJIjoKFUdldFF1ZXVlU3RhdHVzUmVxdWVzdBINCgVxdWV1ZRgBIAEoCRISCgpjaGFuZ2VfdXJpGAIgASgJIp4BChVRdWV1ZUVuYWJsZW1lbnRTdGF0dXMSDwoHdmVyc2lvbhgBIAEoAxI6CgVzdGF0ZRgCIAEoDjIrLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLlF1ZXVlRW5hYmxlbWVudBIhChllZmZlY3RpdmVfZnJvbV9jb21taXRfdXJpGAMgASgJEhUKDWNoYW5nZWRfYXRfbXMYBCABKAMibgoWR2V0UXVldWVTdGF0dXNSZXNwb25zZRINCgVxdWV1ZRgBIAEoCRJFCgplbmFibGVtZW50GAIgASgLMjEudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUXVldWVFbmFibGVtZW50U3RhdHVzKmwKD1F1ZXVlRW5hYmxlbWVudBIcChhRVUVVRV9FTkFCTEVNRU5UX1VOS05PV04QABIcChhRVUVVRV9FTkFCTEVNRU5UX0VOQUJMRUQQARIdChlRVUVVRV9FTkFCTEVNRU5UX0RJU0FCTEVEEAIy5wcKCVN0b3ZlcGlwZRJbCgRQaW5nEicudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUGluZ1JlcXVlc3QaKC51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5QaW5nUmVzcG9uc2UiABJhCgZJbmdlc3QSKS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5Jbmdlc3RSZXF1ZXN0GioudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuSW5nZXN0UmVzcG9uc2UiABKOAQoVR2V0UmVxdWVzdEhpc3RvcnlCeUlEEjgudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UmVxdWVzdEhpc3RvcnlCeUlEUmVxdWVzdBo5LnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFJlcXVlc3RIaXN0b3J5QnlJRFJlc3BvbnNlIgASkQEKFkdldFJlcXVlc3RIaXN0b3J5QnlVUkkSOS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5HZXRSZXF1ZXN0SGlzdG9yeUJ5VVJJUmVxdWVzdBo6LnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFJlcXVlc3RIaXN0b3J5QnlVUklSZXNwb25zZSIAEosBChRHZXRQcm9qZWN0U3RhdHVzQnlJRBI3LnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFByb2plY3RTdGF0dXNCeUlEUmVxdWVzdBo4LnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFByb2plY3RTdGF0dXNCeUlEUmVzcG9uc2UiABKOAQoVR2V0UHJvamVjdFN0YXR1c0J5VVJJEjgudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UHJvamVjdFN0YXR1c0J5VVJJUmVxdWVzdBo5LnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFByb2plY3RTdGF0dXNCeVVSSVJlc3BvbnNlIgASWwoETGlzdBInLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkxpc3RSZXF1ZXN0GigudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuTGlzdFJlc3BvbnNlIgASeQoOR2V0UXVldWVTdGF0dXMSMS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5HZXRRdWV1ZVN0YXR1c1JlcXVlc3QaMi51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5HZXRRdWV1ZVN0YXR1c1Jlc3BvbnNlIgBCZQoeY29tLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlQg5TdG92ZXBpcGVQcm90b1ABWjFnaXRodWIuY29tL3ViZXIvc3VibWl0cXVldWUvYXBpL3N0b3ZlcGlwZS9wcm90b3BiYgZwcm90bzM"); + fileDesc("CiNhcGkvc3RvdmVwaXBlL3Byb3RvL3N0b3ZlcGlwZS5wcm90bxIadWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUiHgoLUGluZ1JlcXVlc3QSDwoHbWVzc2FnZRgBIAEoCSJaCgxQaW5nUmVzcG9uc2USDwoHbWVzc2FnZRgBIAEoCRIUCgxzZXJ2aWNlX25hbWUYAiABKAkSEQoJdGltZXN0YW1wGAMgASgDEhAKCGhvc3RuYW1lGAQgASgJIh4KDUluZ2VzdFJlcXVlc3QSDQoFcXVldWUYASABKAkiHAoOSW5nZXN0UmVzcG9uc2USCgoCaWQYASABKAkiQQocR2V0UmVxdWVzdEhpc3RvcnlCeUlEUmVxdWVzdBINCgVxdWV1ZRgBIAEoCRISCgpyZXF1ZXN0X2lkGAIgASgJIjsKHUdldFJlcXVlc3RIaXN0b3J5QnlVUklSZXF1ZXN0Eg0KBXF1ZXVlGAEgASgJEgsKA3VyaRgCIAEoCSLCAQoMSGlzdG9yeUV2ZW50EhAKCGV2ZW50X2lkGAEgASgJEhQKDHRpbWVzdGFtcF9tcxgCIAEoAxIXCg1yZXF1ZXN0X3N0YXRlGAMgASgJSAASDwoFZXZlbnQYBCABKAlIABIWCg5vdXRjb21lX3JlYXNvbhgFIAEoCRI6CgRkYXRhGAYgASgLMiwudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuSGlzdG9yeUV2ZW50RGF0YUIMCgpvY2N1cnJlbmNlIoAEChBIaXN0b3J5RXZlbnREYXRhEkwKDXJlcXVlc3Rfc3RhdGUYASABKAsyMy51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5IaXN0b3J5UmVxdWVzdFN0YXRlRGF0YUgAEkcKD2J1aWxkX3RyaWdnZXJlZBgCIAEoCzIsLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkhpc3RvcnlCdWlsZERhdGFIABJGCg5idWlsZF9maW5pc2hlZBgDIAEoCzIsLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkhpc3RvcnlCdWlsZERhdGFIABJZChh2YWxpZGF0aW9uX2ZhY3RfcmVjb3JkZWQYBCABKAsyNS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5IaXN0b3J5VmFsaWRhdGlvbkZhY3REYXRhSAASVQoWcHJvamVjdF9mYWN0c19yZWNvcmRlZBgFIAEoCzIzLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkhpc3RvcnlQcm9qZWN0RmFjdHNEYXRhSAASUAoYYnVpbGRfYW5hbHlzaXNfYWJhbmRvbmVkGAYgASgLMiwudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuSGlzdG9yeUJ1aWxkRGF0YUgAQgkKB3BheWxvYWQiKwoXSGlzdG9yeVJlcXVlc3RTdGF0ZURhdGESEAoIYnVpbGRfaWQYASABKAkiJAoQSGlzdG9yeUJ1aWxkRGF0YRIQCghidWlsZF9pZBgBIAEoCSIwChlIaXN0b3J5VmFsaWRhdGlvbkZhY3REYXRhEhMKC2ZhY3RfZGVncmVlGAEgASgBIjUKF0hpc3RvcnlQcm9qZWN0RmFjdHNEYXRhEhoKEnByb2plY3RfZmFjdF9jb3VudBgBIAEoBCKjAQoOUmVxdWVzdEhpc3RvcnkSEgoKcmVxdWVzdF9pZBgBIAEoCRI4CgZldmVudHMYAiADKAsyKC51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5IaXN0b3J5RXZlbnQSQwoPcmVxdWVzdF9zdW1tYXJ5GAMgASgLMioudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUmVxdWVzdFN1bW1hcnkingEKHUdldFJlcXVlc3RIaXN0b3J5QnlJRFJlc3BvbnNlEjgKBmV2ZW50cxgBIAMoCzIoLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkhpc3RvcnlFdmVudBJDCg9yZXF1ZXN0X3N1bW1hcnkYAiABKAsyKi51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5SZXF1ZXN0U3VtbWFyeSJfCh5HZXRSZXF1ZXN0SGlzdG9yeUJ5VVJJUmVzcG9uc2USPQoJaGlzdG9yaWVzGAEgAygLMioudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUmVxdWVzdEhpc3RvcnkieQobR2V0UHJvamVjdFN0YXR1c0J5SURSZXF1ZXN0Eg0KBXF1ZXVlGAEgASgJEhIKCnJlcXVlc3RfaWQYAiABKAkSEAoIcHJvamVjdHMYAyADKAkSEQoJcGFnZV9zaXplGAQgASgFEhIKCnBhZ2VfdG9rZW4YBSABKAkiegocR2V0UHJvamVjdFN0YXR1c0J5VVJJUmVxdWVzdBINCgVxdWV1ZRgBIAEoCRISCgpjaGFuZ2VfdXJpGAIgASgJEhAKCHByb2plY3RzGAMgAygJEhEKCXBhZ2Vfc2l6ZRgEIAEoBRISCgpwYWdlX3Rva2VuGAUgASgJIkkKEVByb2plY3RWYWxpZGF0aW9uEg8KB3Byb2plY3QYASABKAkSGQoPYnJlYWthZ2VfZGVncmVlGAIgASgBSABCCAoGcmVzdWx0IswCChxHZXRQcm9qZWN0U3RhdHVzQnlJRFJlc3BvbnNlEhIKCnJlcXVlc3RfaWQYASABKAkSDQoFcXVldWUYAiABKAkSEgoKY2hhbmdlX3VyaRgDIAEoCRIQCghiYXNlX3VyaRgEIAEoCRIVCg1yZXF1ZXN0X3N0YXRlGAUgASgJEhUKDXVwZGF0ZWRfYXRfbXMYCiABKAMSJAoacmVwb3NpdG9yeV9icmVha2FnZV9kZWdyZWUYBiABKAFIABIgChhwcm9qZWN0X3Jlc3VsdHNfY29tcGxldGUYByABKAgSPwoIcHJvamVjdHMYCCADKAsyLS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5Qcm9qZWN0VmFsaWRhdGlvbhIXCg9uZXh0X3BhZ2VfdG9rZW4YCSABKAlCEwoRcmVwb3NpdG9yeV9yZXN1bHQizQIKHUdldFByb2plY3RTdGF0dXNCeVVSSVJlc3BvbnNlEhIKCnJlcXVlc3RfaWQYASABKAkSDQoFcXVldWUYAiABKAkSEgoKY2hhbmdlX3VyaRgDIAEoCRIQCghiYXNlX3VyaRgEIAEoCRIVCg1yZXF1ZXN0X3N0YXRlGAUgASgJEhUKDXVwZGF0ZWRfYXRfbXMYCiABKAMSJAoacmVwb3NpdG9yeV9icmVha2FnZV9kZWdyZWUYBiABKAFIABIgChhwcm9qZWN0X3Jlc3VsdHNfY29tcGxldGUYByABKAgSPwoIcHJvamVjdHMYCCADKAsyLS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5Qcm9qZWN0VmFsaWRhdGlvbhIXCg9uZXh0X3BhZ2VfdG9rZW4YCSABKAlCEwoRcmVwb3NpdG9yeV9yZXN1bHQivQEKDlJlcXVlc3RTdW1tYXJ5EhIKCnJlcXVlc3RfaWQYASABKAkSDQoFcXVldWUYAiABKAkSEgoKY2hhbmdlX3VyaRgDIAEoCRIQCghiYXNlX3VyaRgEIAEoCRIVCg1yZXF1ZXN0X3N0YXRlGAUgASgJEhsKE3N0YXRlX3VwZGF0ZWRfYXRfbXMYBiABKAMSFgoOYWNjZXB0ZWRfYXRfbXMYByABKAMSFgoOb3V0Y29tZV9yZWFzb24YCCABKAkitAEKC0xpc3RSZXF1ZXN0Eg0KBXF1ZXVlGAEgASgJEiEKF2FjY2VwdGVkX2F0X29yX2FmdGVyX21zGAIgASgDSAASHAoSYWNjZXB0ZWRfYmVmb3JlX21zGAMgASgDSAESEQoJcGFnZV9zaXplGAQgASgFEhIKCnBhZ2VfdG9rZW4YBSABKAlCFgoUYWNjZXB0ZWRfbG93ZXJfYm91bmRCFgoUYWNjZXB0ZWRfdXBwZXJfYm91bmQiZQoMTGlzdFJlc3BvbnNlEjwKCHJlcXVlc3RzGAEgAygLMioudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUmVxdWVzdFN1bW1hcnkSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJIjoKFUdldFF1ZXVlU3RhdHVzUmVxdWVzdBINCgVxdWV1ZRgBIAEoCRISCgpjaGFuZ2VfdXJpGAIgASgJIp4BChVRdWV1ZUVuYWJsZW1lbnRTdGF0dXMSDwoHdmVyc2lvbhgBIAEoAxI6CgVzdGF0ZRgCIAEoDjIrLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLlF1ZXVlRW5hYmxlbWVudBIhChllZmZlY3RpdmVfZnJvbV9jb21taXRfdXJpGAMgASgJEhUKDWNoYW5nZWRfYXRfbXMYBCABKAMibgoWR2V0UXVldWVTdGF0dXNSZXNwb25zZRINCgVxdWV1ZRgBIAEoCRJFCgplbmFibGVtZW50GAIgASgLMjEudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUXVldWVFbmFibGVtZW50U3RhdHVzKmwKD1F1ZXVlRW5hYmxlbWVudBIcChhRVUVVRV9FTkFCTEVNRU5UX1VOS05PV04QABIcChhRVUVVRV9FTkFCTEVNRU5UX0VOQUJMRUQQARIdChlRVUVVRV9FTkFCTEVNRU5UX0RJU0FCTEVEEAIy5wcKCVN0b3ZlcGlwZRJbCgRQaW5nEicudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUGluZ1JlcXVlc3QaKC51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5QaW5nUmVzcG9uc2UiABJhCgZJbmdlc3QSKS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5Jbmdlc3RSZXF1ZXN0GioudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuSW5nZXN0UmVzcG9uc2UiABKOAQoVR2V0UmVxdWVzdEhpc3RvcnlCeUlEEjgudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UmVxdWVzdEhpc3RvcnlCeUlEUmVxdWVzdBo5LnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFJlcXVlc3RIaXN0b3J5QnlJRFJlc3BvbnNlIgASkQEKFkdldFJlcXVlc3RIaXN0b3J5QnlVUkkSOS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5HZXRSZXF1ZXN0SGlzdG9yeUJ5VVJJUmVxdWVzdBo6LnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFJlcXVlc3RIaXN0b3J5QnlVUklSZXNwb25zZSIAEosBChRHZXRQcm9qZWN0U3RhdHVzQnlJRBI3LnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFByb2plY3RTdGF0dXNCeUlEUmVxdWVzdBo4LnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFByb2plY3RTdGF0dXNCeUlEUmVzcG9uc2UiABKOAQoVR2V0UHJvamVjdFN0YXR1c0J5VVJJEjgudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UHJvamVjdFN0YXR1c0J5VVJJUmVxdWVzdBo5LnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFByb2plY3RTdGF0dXNCeVVSSVJlc3BvbnNlIgASWwoETGlzdBInLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkxpc3RSZXF1ZXN0GigudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuTGlzdFJlc3BvbnNlIgASeQoOR2V0UXVldWVTdGF0dXMSMS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5HZXRRdWV1ZVN0YXR1c1JlcXVlc3QaMi51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5HZXRRdWV1ZVN0YXR1c1Jlc3BvbnNlIgBCZQoeY29tLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlQg5TdG92ZXBpcGVQcm90b1ABWjFnaXRodWIuY29tL3ViZXIvc3VibWl0cXVldWUvYXBpL3N0b3ZlcGlwZS9wcm90b3BiYgZwcm90bzM"); /** * PingRequest is the request for the Ping method @@ -329,19 +329,12 @@ export const HistoryEventDataSchema: GenMessage = /*@__PURE__* * @generated from message uber.submitqueue.stovepipe.HistoryRequestStateData */ export type HistoryRequestStateData = Message<"uber.submitqueue.stovepipe.HistoryRequestStateData"> & { - /** - * Selected baseline URI. A present empty string means a full build; absence means unknown. - * - * @generated from field: optional string base_uri = 1; - */ - baseUri?: string | undefined; - /** * Build that established the terminal request state, when retained. * - * @generated from field: optional string build_id = 2; + * @generated from field: string build_id = 1; */ - buildId?: string | undefined; + buildId: string; }; /**