From d1f1e5545bab4d94e40789fe6a39085c0d7b18d4 Mon Sep 17 00:00:00 2001 From: Andrew Watkins Date: Thu, 7 May 2026 11:30:20 -0500 Subject: [PATCH 1/4] feat(ci): add step summary command --- pkg/api/ci.go | 20 + pkg/api/ci_test.go | 36 + pkg/cmd/ci/ci.go | 1 + pkg/cmd/ci/ci_test.go | 1 + pkg/cmd/ci/summary.go | 111 ++ pkg/cmd/ci/summary_test.go | 198 +++ pkg/proto/depot/ci/v1/ci.pb.go | 1172 +++++++++++------ .../depot/ci/v1/civ1connect/ci.connect.go | 57 + proto/depot/ci/v1/ci.proto | 36 + 9 files changed, 1206 insertions(+), 426 deletions(-) create mode 100644 pkg/cmd/ci/summary.go create mode 100644 pkg/cmd/ci/summary_test.go diff --git a/pkg/api/ci.go b/pkg/api/ci.go index 578630f5..e5025c9d 100644 --- a/pkg/api/ci.go +++ b/pkg/api/ci.go @@ -92,6 +92,26 @@ func CIGetRunMetrics(ctx context.Context, token, orgID, runID string) (*civ1.Get return resp.Msg, nil } +// CIGetJobAttemptSummary returns authored step summary markdown for a job attempt. +func CIGetJobAttemptSummary(ctx context.Context, token, orgID, attemptID string) (*civ1.GetJobSummaryResponse, error) { + client := newCIServiceClient() + resp, err := client.GetJobAttemptSummary(ctx, WithAuthenticationAndOrg(connect.NewRequest(&civ1.GetJobAttemptSummaryRequest{AttemptId: attemptID}), token, orgID)) + if err != nil { + return nil, err + } + return resp.Msg, nil +} + +// CIGetJobSummary returns authored step summary markdown for the current/latest attempt of a job. +func CIGetJobSummary(ctx context.Context, token, orgID, jobID string) (*civ1.GetJobSummaryResponse, error) { + client := newCIServiceClient() + resp, err := client.GetJobSummary(ctx, WithAuthenticationAndOrg(connect.NewRequest(&civ1.GetJobSummaryRequest{JobId: jobID}), token, orgID)) + if err != nil { + return nil, err + } + return resp.Msg, nil +} + // CIGetJobAttemptLogs returns all log lines for a job attempt, paginating through all pages. func CIGetJobAttemptLogs(ctx context.Context, token, orgID, attemptID string) ([]*civ1.LogLine, error) { client := newCIServiceClient() diff --git a/pkg/api/ci_test.go b/pkg/api/ci_test.go index c4f24f5a..266d5b54 100644 --- a/pkg/api/ci_test.go +++ b/pkg/api/ci_test.go @@ -104,6 +104,22 @@ func (h ciServiceTestHandler) GetRunMetrics(_ context.Context, req *connect.Requ return connect.NewResponse(&civ1.GetRunMetricsResponse{SnapshotAt: "2026-05-03T12:00:00Z"}), nil } +func (h ciServiceTestHandler) GetJobAttemptSummary(_ context.Context, req *connect.Request[civ1.GetJobAttemptSummaryRequest]) (*connect.Response[civ1.GetJobSummaryResponse], error) { + assertAuthAndOrg(h.t, req.Header()) + if req.Msg.AttemptId != "attempt-123" { + h.t.Fatalf("AttemptId = %q, want attempt-123", req.Msg.AttemptId) + } + return connect.NewResponse(&civ1.GetJobSummaryResponse{AttemptId: req.Msg.AttemptId, HasSummary: true, Markdown: "attempt summary"}), nil +} + +func (h ciServiceTestHandler) GetJobSummary(_ context.Context, req *connect.Request[civ1.GetJobSummaryRequest]) (*connect.Response[civ1.GetJobSummaryResponse], error) { + assertAuthAndOrg(h.t, req.Header()) + if req.Msg.JobId != "job-123" { + h.t.Fatalf("JobId = %q, want job-123", req.Msg.JobId) + } + return connect.NewResponse(&civ1.GetJobSummaryResponse{JobId: req.Msg.JobId, AttemptId: "attempt-456", HasSummary: true, Markdown: "job summary"}), nil +} + func (h ciServiceTestHandler) GetJobAttemptLogs(context.Context, *connect.Request[civ1.GetJobAttemptLogsRequest]) (*connect.Response[civ1.GetJobAttemptLogsResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, nil) } @@ -188,6 +204,26 @@ func TestCIMetricsWrappers(t *testing.T) { }) } +func TestCISummaryWrappers(t *testing.T) { + withTestCIService(t, func() { + attemptResp, err := CIGetJobAttemptSummary(context.Background(), "token-123", "org-123", "attempt-123") + if err != nil { + t.Fatalf("CIGetJobAttemptSummary returned error: %v", err) + } + if attemptResp.GetMarkdown() != "attempt summary" { + t.Fatalf("unexpected attempt summary: %+v", attemptResp) + } + + jobResp, err := CIGetJobSummary(context.Background(), "token-123", "org-123", "job-123") + if err != nil { + t.Fatalf("CIGetJobSummary returned error: %v", err) + } + if jobResp.GetAttemptId() != "attempt-456" || jobResp.GetMarkdown() != "job summary" { + t.Fatalf("unexpected job summary: %+v", jobResp) + } + }) +} + func withTestCIService(t *testing.T, fn func()) { t.Helper() diff --git a/pkg/cmd/ci/ci.go b/pkg/cmd/ci/ci.go index 7c24975c..2d4c1fdc 100644 --- a/pkg/cmd/ci/ci.go +++ b/pkg/cmd/ci/ci.go @@ -23,6 +23,7 @@ func NewCmdCI() *cobra.Command { cmd.AddCommand(NewCmdSecrets()) cmd.AddCommand(NewCmdSSH()) cmd.AddCommand(NewCmdStatus()) + cmd.AddCommand(NewCmdSummary()) cmd.AddCommand(NewCmdVars()) cmd.AddCommand(NewCmdWorkflow()) diff --git a/pkg/cmd/ci/ci_test.go b/pkg/cmd/ci/ci_test.go index a22a082d..9d20e30a 100644 --- a/pkg/cmd/ci/ci_test.go +++ b/pkg/cmd/ci/ci_test.go @@ -15,6 +15,7 @@ func TestCICommandRegistration(t *testing.T) { "run", "status", "logs", + "summary", "ssh", // mutation verbs (added in DEP-4221) "cancel", diff --git a/pkg/cmd/ci/summary.go b/pkg/cmd/ci/summary.go new file mode 100644 index 00000000..fa1200a6 --- /dev/null +++ b/pkg/cmd/ci/summary.go @@ -0,0 +1,111 @@ +package ci + +import ( + "fmt" + "io" + "strings" + + "connectrpc.com/connect" + "github.com/depot/cli/pkg/api" + "github.com/depot/cli/pkg/config" + "github.com/depot/cli/pkg/helpers" + civ1 "github.com/depot/cli/pkg/proto/depot/ci/v1" + "github.com/spf13/cobra" +) + +var ( + ciGetJobAttemptSummary = api.CIGetJobAttemptSummary + ciGetJobSummary = api.CIGetJobSummary +) + +func NewCmdSummary() *cobra.Command { + var ( + orgID string + token string + ) + + cmd := &cobra.Command{ + Use: "summary ", + Short: "Fetch CI step summary markdown", + Long: "Fetch authored CI step summary markdown for one job attempt or the current/latest attempt of one job.", + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) == 0 { + return cmd.Help() + } + if len(args) > 1 { + return fmt.Errorf("expected exactly one attempt or job ID") + } + + ctx := cmd.Context() + id := args[0] + + if orgID == "" { + orgID = config.GetCurrentOrganization() + } + + tokenVal, err := helpers.ResolveOrgAuth(ctx, token) + if err != nil { + return err + } + if tokenVal == "" { + return fmt.Errorf("missing API token, please run `depot login`") + } + + resp, attemptErr := ciGetJobAttemptSummary(ctx, tokenVal, orgID, id) + if attemptErr == nil { + return printSummaryResponse(cmd.OutOrStdout(), resp) + } + if connect.CodeOf(attemptErr) != connect.CodeNotFound { + return fmt.Errorf("failed to get attempt summary: %w", attemptErr) + } + + resp, jobErr := ciGetJobSummary(ctx, tokenVal, orgID, id) + if jobErr != nil { + if connect.CodeOf(jobErr) == connect.CodeNotFound { + return fmt.Errorf( + "could not resolve %q as an attempt or job ID:\n as attempt: %v\n as job: %v", + id, + attemptErr, + jobErr, + ) + } + return fmt.Errorf("failed to get job summary: %w", jobErr) + } + + if resp.GetAttemptId() != "" { + fmt.Fprintf(cmd.ErrOrStderr(), "Using attempt #%d %s for job %s.\n", resp.GetAttempt(), resp.GetAttemptId(), resp.GetJobId()) + } + return printSummaryResponse(cmd.OutOrStdout(), resp) + }, + } + + cmd.Flags().StringVar(&orgID, "org", "", "Organization ID (required when user is a member of multiple organizations)") + cmd.Flags().StringVar(&token, "token", "", "Depot API token") + + return cmd +} + +func printSummaryResponse(w io.Writer, resp *civ1.GetJobSummaryResponse) error { + if resp.GetHasSummary() { + fmt.Fprint(w, resp.GetMarkdown()) + if !strings.HasSuffix(resp.GetMarkdown(), "\n") { + fmt.Fprintln(w) + } + return nil + } + + fmt.Fprintln(w, emptySummaryMessage(resp)) + return nil +} + +func emptySummaryMessage(resp *civ1.GetJobSummaryResponse) string { + switch resp.GetEmptyReason() { + case "no_attempt": + return "No CI job attempts exist yet, so no step summary is available." + default: + if resp.GetAttemptId() != "" { + return "No CI step summary was produced for this attempt." + } + return "No CI step summary was produced." + } +} diff --git a/pkg/cmd/ci/summary_test.go b/pkg/cmd/ci/summary_test.go new file mode 100644 index 00000000..b5e7afef --- /dev/null +++ b/pkg/cmd/ci/summary_test.go @@ -0,0 +1,198 @@ +package ci + +import ( + "bytes" + "context" + "errors" + "strings" + "testing" + + "connectrpc.com/connect" + civ1 "github.com/depot/cli/pkg/proto/depot/ci/v1" +) + +func TestSummaryAttemptPrintsMarkdownOnlyToStdout(t *testing.T) { + restoreSummaryAPIs(t) + + var capturedAttemptID string + ciGetJobAttemptSummary = func(ctx context.Context, token, orgID, attemptID string) (*civ1.GetJobSummaryResponse, error) { + capturedAttemptID = attemptID + return summaryResponse("attempt-1", "job-1", "## Build\n\nok"), nil + } + ciGetJobSummary = func(ctx context.Context, token, orgID, jobID string) (*civ1.GetJobSummaryResponse, error) { + t.Fatal("job summary should not be called for a resolved attempt") + return nil, nil + } + + stdout, stderr, err := executeSummaryCommand("attempt-1") + if err != nil { + t.Fatal(err) + } + if capturedAttemptID != "attempt-1" { + t.Fatalf("attemptID = %q, want attempt-1", capturedAttemptID) + } + if stdout != "## Build\n\nok\n" { + t.Fatalf("stdout = %q", stdout) + } + if stderr != "" { + t.Fatalf("stderr = %q, want empty", stderr) + } +} + +func TestSummaryFallsBackToJobOnAttemptNotFound(t *testing.T) { + restoreSummaryAPIs(t) + + ciGetJobAttemptSummary = func(ctx context.Context, token, orgID, attemptID string) (*civ1.GetJobSummaryResponse, error) { + return nil, connect.NewError(connect.CodeNotFound, errors.New("attempt not found")) + } + ciGetJobSummary = func(ctx context.Context, token, orgID, jobID string) (*civ1.GetJobSummaryResponse, error) { + if jobID != "job-1" { + t.Fatalf("jobID = %q, want job-1", jobID) + } + return summaryResponse("attempt-3", "job-1", "job markdown"), nil + } + + stdout, stderr, err := executeSummaryCommand("job-1") + if err != nil { + t.Fatal(err) + } + if stdout != "job markdown\n" { + t.Fatalf("stdout = %q", stdout) + } + if !strings.Contains(stderr, "Using attempt #3 attempt-3 for job job-1.") { + t.Fatalf("stderr missing resolution note: %q", stderr) + } +} + +func TestSummaryEmptyAttemptIsNonError(t *testing.T) { + restoreSummaryAPIs(t) + + ciGetJobAttemptSummary = func(ctx context.Context, token, orgID, attemptID string) (*civ1.GetJobSummaryResponse, error) { + return &civ1.GetJobSummaryResponse{ + AttemptId: attemptID, + JobId: "job-1", + HasSummary: false, + EmptyReason: "no_summary", + Attempt: 1, + JobStatus: "finished", + AttemptStatus: "finished", + }, nil + } + ciGetJobSummary = func(ctx context.Context, token, orgID, jobID string) (*civ1.GetJobSummaryResponse, error) { + t.Fatal("job summary should not be called for a resolved attempt") + return nil, nil + } + + stdout, stderr, err := executeSummaryCommand("attempt-1") + if err != nil { + t.Fatal(err) + } + if stdout != "No CI step summary was produced for this attempt.\n" { + t.Fatalf("stdout = %q", stdout) + } + if stderr != "" { + t.Fatalf("stderr = %q, want empty", stderr) + } +} + +func TestSummaryNoAttemptJobIsNonError(t *testing.T) { + restoreSummaryAPIs(t) + + ciGetJobAttemptSummary = func(ctx context.Context, token, orgID, attemptID string) (*civ1.GetJobSummaryResponse, error) { + return nil, connect.NewError(connect.CodeNotFound, errors.New("attempt not found")) + } + ciGetJobSummary = func(ctx context.Context, token, orgID, jobID string) (*civ1.GetJobSummaryResponse, error) { + return &civ1.GetJobSummaryResponse{ + JobId: jobID, + JobStatus: "queued", + HasSummary: false, + EmptyReason: "no_attempt", + }, nil + } + + stdout, stderr, err := executeSummaryCommand("job-1") + if err != nil { + t.Fatal(err) + } + if stdout != "No CI job attempts exist yet, so no step summary is available.\n" { + t.Fatalf("stdout = %q", stdout) + } + if stderr != "" { + t.Fatalf("stderr = %q, want empty", stderr) + } +} + +func TestSummaryBothNotFoundNamesUnresolvedID(t *testing.T) { + restoreSummaryAPIs(t) + + ciGetJobAttemptSummary = func(ctx context.Context, token, orgID, attemptID string) (*civ1.GetJobSummaryResponse, error) { + return nil, connect.NewError(connect.CodeNotFound, errors.New("attempt not found")) + } + ciGetJobSummary = func(ctx context.Context, token, orgID, jobID string) (*civ1.GetJobSummaryResponse, error) { + return nil, connect.NewError(connect.CodeNotFound, errors.New("job not found")) + } + + _, _, err := executeSummaryCommand("missing-id") + if err == nil || !strings.Contains(err.Error(), `could not resolve "missing-id" as an attempt or job ID`) { + t.Fatalf("err = %v", err) + } +} + +func TestSummaryAttemptUnavailableDoesNotFallBackToJob(t *testing.T) { + restoreSummaryAPIs(t) + + jobCalled := false + ciGetJobAttemptSummary = func(ctx context.Context, token, orgID, attemptID string) (*civ1.GetJobSummaryResponse, error) { + return nil, connect.NewError(connect.CodeUnavailable, errors.New("storage unavailable")) + } + ciGetJobSummary = func(ctx context.Context, token, orgID, jobID string) (*civ1.GetJobSummaryResponse, error) { + jobCalled = true + return nil, nil + } + + _, _, err := executeSummaryCommand("attempt-1") + if err == nil || !strings.Contains(err.Error(), "failed to get attempt summary") { + t.Fatalf("err = %v", err) + } + if jobCalled { + t.Fatal("job fallback should not run on unavailable attempt lookup") + } +} + +func executeSummaryCommand(id string) (string, string, error) { + var stdout bytes.Buffer + var stderr bytes.Buffer + cmd := NewCmdSummary() + cmd.SetArgs([]string{"--org", "org-123", "--token", "token-123", id}) + cmd.SetOut(&stdout) + cmd.SetErr(&stderr) + err := cmd.Execute() + return stdout.String(), stderr.String(), err +} + +func restoreSummaryAPIs(t *testing.T) { + t.Helper() + + originalGetAttemptSummary := ciGetJobAttemptSummary + originalGetJobSummary := ciGetJobSummary + t.Cleanup(func() { + ciGetJobAttemptSummary = originalGetAttemptSummary + ciGetJobSummary = originalGetJobSummary + }) +} + +func summaryResponse(attemptID string, jobID string, markdown string) *civ1.GetJobSummaryResponse { + return &civ1.GetJobSummaryResponse{ + OrgId: "org-123", + RunId: "run-1", + WorkflowId: "workflow-1", + JobId: jobID, + AttemptId: attemptID, + Attempt: 3, + JobStatus: "finished", + AttemptStatus: "finished", + HasSummary: true, + StepCount: 1, + Markdown: markdown, + } +} diff --git a/pkg/proto/depot/ci/v1/ci.pb.go b/pkg/proto/depot/ci/v1/ci.pb.go index a5d622b0..f6a68226 100644 --- a/pkg/proto/depot/ci/v1/ci.pb.go +++ b/pkg/proto/depot/ci/v1/ci.pb.go @@ -4004,6 +4004,240 @@ func (x *CIMetricsCapMetadata) GetDownsampleStrategy() string { return "" } +type GetJobAttemptSummaryRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // attempt_id identifies the job attempt whose authored summary markdown to fetch + AttemptId string `protobuf:"bytes,1,opt,name=attempt_id,json=attemptId,proto3" json:"attempt_id,omitempty"` +} + +func (x *GetJobAttemptSummaryRequest) Reset() { + *x = GetJobAttemptSummaryRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[53] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetJobAttemptSummaryRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetJobAttemptSummaryRequest) ProtoMessage() {} + +func (x *GetJobAttemptSummaryRequest) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[53] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetJobAttemptSummaryRequest.ProtoReflect.Descriptor instead. +func (*GetJobAttemptSummaryRequest) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{53} +} + +func (x *GetJobAttemptSummaryRequest) GetAttemptId() string { + if x != nil { + return x.AttemptId + } + return "" +} + +type GetJobSummaryRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // job_id identifies the job whose current/latest attempt summary markdown to fetch + JobId string `protobuf:"bytes,1,opt,name=job_id,json=jobId,proto3" json:"job_id,omitempty"` +} + +func (x *GetJobSummaryRequest) Reset() { + *x = GetJobSummaryRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[54] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetJobSummaryRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetJobSummaryRequest) ProtoMessage() {} + +func (x *GetJobSummaryRequest) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[54] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetJobSummaryRequest.ProtoReflect.Descriptor instead. +func (*GetJobSummaryRequest) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{54} +} + +func (x *GetJobSummaryRequest) GetJobId() string { + if x != nil { + return x.JobId + } + return "" +} + +type GetJobSummaryResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + OrgId string `protobuf:"bytes,1,opt,name=org_id,json=orgId,proto3" json:"org_id,omitempty"` + RunId string `protobuf:"bytes,2,opt,name=run_id,json=runId,proto3" json:"run_id,omitempty"` + WorkflowId string `protobuf:"bytes,3,opt,name=workflow_id,json=workflowId,proto3" json:"workflow_id,omitempty"` + JobId string `protobuf:"bytes,4,opt,name=job_id,json=jobId,proto3" json:"job_id,omitempty"` + AttemptId string `protobuf:"bytes,5,opt,name=attempt_id,json=attemptId,proto3" json:"attempt_id,omitempty"` + Attempt int32 `protobuf:"varint,6,opt,name=attempt,proto3" json:"attempt,omitempty"` + JobStatus string `protobuf:"bytes,7,opt,name=job_status,json=jobStatus,proto3" json:"job_status,omitempty"` + AttemptStatus string `protobuf:"bytes,8,opt,name=attempt_status,json=attemptStatus,proto3" json:"attempt_status,omitempty"` + HasSummary bool `protobuf:"varint,9,opt,name=has_summary,json=hasSummary,proto3" json:"has_summary,omitempty"` + // empty_reason is set when has_summary is false, e.g. "no_summary" or "no_attempt". + EmptyReason string `protobuf:"bytes,10,opt,name=empty_reason,json=emptyReason,proto3" json:"empty_reason,omitempty"` + // step_count counts non-empty step summaries included in markdown. + StepCount uint32 `protobuf:"varint,11,opt,name=step_count,json=stepCount,proto3" json:"step_count,omitempty"` + // markdown contains the authored step summary markdown joined in step order. + Markdown string `protobuf:"bytes,12,opt,name=markdown,proto3" json:"markdown,omitempty"` +} + +func (x *GetJobSummaryResponse) Reset() { + *x = GetJobSummaryResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[55] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetJobSummaryResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetJobSummaryResponse) ProtoMessage() {} + +func (x *GetJobSummaryResponse) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[55] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetJobSummaryResponse.ProtoReflect.Descriptor instead. +func (*GetJobSummaryResponse) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{55} +} + +func (x *GetJobSummaryResponse) GetOrgId() string { + if x != nil { + return x.OrgId + } + return "" +} + +func (x *GetJobSummaryResponse) GetRunId() string { + if x != nil { + return x.RunId + } + return "" +} + +func (x *GetJobSummaryResponse) GetWorkflowId() string { + if x != nil { + return x.WorkflowId + } + return "" +} + +func (x *GetJobSummaryResponse) GetJobId() string { + if x != nil { + return x.JobId + } + return "" +} + +func (x *GetJobSummaryResponse) GetAttemptId() string { + if x != nil { + return x.AttemptId + } + return "" +} + +func (x *GetJobSummaryResponse) GetAttempt() int32 { + if x != nil { + return x.Attempt + } + return 0 +} + +func (x *GetJobSummaryResponse) GetJobStatus() string { + if x != nil { + return x.JobStatus + } + return "" +} + +func (x *GetJobSummaryResponse) GetAttemptStatus() string { + if x != nil { + return x.AttemptStatus + } + return "" +} + +func (x *GetJobSummaryResponse) GetHasSummary() bool { + if x != nil { + return x.HasSummary + } + return false +} + +func (x *GetJobSummaryResponse) GetEmptyReason() string { + if x != nil { + return x.EmptyReason + } + return "" +} + +func (x *GetJobSummaryResponse) GetStepCount() uint32 { + if x != nil { + return x.StepCount + } + return 0 +} + +func (x *GetJobSummaryResponse) GetMarkdown() string { + if x != nil { + return x.Markdown + } + return "" +} + type GetJobAttemptLogsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4018,7 +4252,7 @@ type GetJobAttemptLogsRequest struct { func (x *GetJobAttemptLogsRequest) Reset() { *x = GetJobAttemptLogsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[53] + mi := &file_depot_ci_v1_ci_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4031,7 +4265,7 @@ func (x *GetJobAttemptLogsRequest) String() string { func (*GetJobAttemptLogsRequest) ProtoMessage() {} func (x *GetJobAttemptLogsRequest) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[53] + mi := &file_depot_ci_v1_ci_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4044,7 +4278,7 @@ func (x *GetJobAttemptLogsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetJobAttemptLogsRequest.ProtoReflect.Descriptor instead. func (*GetJobAttemptLogsRequest) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{53} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{56} } func (x *GetJobAttemptLogsRequest) GetAttemptId() string { @@ -4074,7 +4308,7 @@ type GetJobAttemptLogsResponse struct { func (x *GetJobAttemptLogsResponse) Reset() { *x = GetJobAttemptLogsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[54] + mi := &file_depot_ci_v1_ci_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4087,7 +4321,7 @@ func (x *GetJobAttemptLogsResponse) String() string { func (*GetJobAttemptLogsResponse) ProtoMessage() {} func (x *GetJobAttemptLogsResponse) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[54] + mi := &file_depot_ci_v1_ci_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4100,7 +4334,7 @@ func (x *GetJobAttemptLogsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetJobAttemptLogsResponse.ProtoReflect.Descriptor instead. func (*GetJobAttemptLogsResponse) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{54} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{57} } func (x *GetJobAttemptLogsResponse) GetLines() []*LogLine { @@ -4136,7 +4370,7 @@ type StreamJobAttemptLogsRequest struct { func (x *StreamJobAttemptLogsRequest) Reset() { *x = StreamJobAttemptLogsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[55] + mi := &file_depot_ci_v1_ci_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4149,7 +4383,7 @@ func (x *StreamJobAttemptLogsRequest) String() string { func (*StreamJobAttemptLogsRequest) ProtoMessage() {} func (x *StreamJobAttemptLogsRequest) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[55] + mi := &file_depot_ci_v1_ci_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4162,7 +4396,7 @@ func (x *StreamJobAttemptLogsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StreamJobAttemptLogsRequest.ProtoReflect.Descriptor instead. func (*StreamJobAttemptLogsRequest) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{55} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{58} } func (x *StreamJobAttemptLogsRequest) GetAttemptId() string { @@ -4204,7 +4438,7 @@ type StreamJobAttemptLogsResponse struct { func (x *StreamJobAttemptLogsResponse) Reset() { *x = StreamJobAttemptLogsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[56] + mi := &file_depot_ci_v1_ci_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4217,7 +4451,7 @@ func (x *StreamJobAttemptLogsResponse) String() string { func (*StreamJobAttemptLogsResponse) ProtoMessage() {} func (x *StreamJobAttemptLogsResponse) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[56] + mi := &file_depot_ci_v1_ci_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4230,7 +4464,7 @@ func (x *StreamJobAttemptLogsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StreamJobAttemptLogsResponse.ProtoReflect.Descriptor instead. func (*StreamJobAttemptLogsResponse) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{56} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{59} } func (x *StreamJobAttemptLogsResponse) GetLine() *LogLine { @@ -4272,7 +4506,7 @@ type ExportJobAttemptLogsRequest struct { func (x *ExportJobAttemptLogsRequest) Reset() { *x = ExportJobAttemptLogsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[57] + mi := &file_depot_ci_v1_ci_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4285,7 +4519,7 @@ func (x *ExportJobAttemptLogsRequest) String() string { func (*ExportJobAttemptLogsRequest) ProtoMessage() {} func (x *ExportJobAttemptLogsRequest) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[57] + mi := &file_depot_ci_v1_ci_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4298,7 +4532,7 @@ func (x *ExportJobAttemptLogsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExportJobAttemptLogsRequest.ProtoReflect.Descriptor instead. func (*ExportJobAttemptLogsRequest) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{57} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{60} } func (x *ExportJobAttemptLogsRequest) GetAttemptId() string { @@ -4343,7 +4577,7 @@ type JobAttemptLogExportMetadata struct { func (x *JobAttemptLogExportMetadata) Reset() { *x = JobAttemptLogExportMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[58] + mi := &file_depot_ci_v1_ci_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4356,7 +4590,7 @@ func (x *JobAttemptLogExportMetadata) String() string { func (*JobAttemptLogExportMetadata) ProtoMessage() {} func (x *JobAttemptLogExportMetadata) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[58] + mi := &file_depot_ci_v1_ci_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4369,7 +4603,7 @@ func (x *JobAttemptLogExportMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use JobAttemptLogExportMetadata.ProtoReflect.Descriptor instead. func (*JobAttemptLogExportMetadata) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{58} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{61} } func (x *JobAttemptLogExportMetadata) GetFilename() string { @@ -4408,7 +4642,7 @@ type ExportJobAttemptLogsResponse struct { func (x *ExportJobAttemptLogsResponse) Reset() { *x = ExportJobAttemptLogsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[59] + mi := &file_depot_ci_v1_ci_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4421,7 +4655,7 @@ func (x *ExportJobAttemptLogsResponse) String() string { func (*ExportJobAttemptLogsResponse) ProtoMessage() {} func (x *ExportJobAttemptLogsResponse) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[59] + mi := &file_depot_ci_v1_ci_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4434,7 +4668,7 @@ func (x *ExportJobAttemptLogsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ExportJobAttemptLogsResponse.ProtoReflect.Descriptor instead. func (*ExportJobAttemptLogsResponse) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{59} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{62} } func (m *ExportJobAttemptLogsResponse) GetEvent() isExportJobAttemptLogsResponse_Event { @@ -4503,7 +4737,7 @@ type LogLine struct { func (x *LogLine) Reset() { *x = LogLine{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[60] + mi := &file_depot_ci_v1_ci_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4516,7 +4750,7 @@ func (x *LogLine) String() string { func (*LogLine) ProtoMessage() {} func (x *LogLine) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[60] + mi := &file_depot_ci_v1_ci_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4529,7 +4763,7 @@ func (x *LogLine) ProtoReflect() protoreflect.Message { // Deprecated: Use LogLine.ProtoReflect.Descriptor instead. func (*LogLine) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{60} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{63} } func (x *LogLine) GetStepKey() string { @@ -4606,7 +4840,7 @@ type ListRunsRequest struct { func (x *ListRunsRequest) Reset() { *x = ListRunsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[61] + mi := &file_depot_ci_v1_ci_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4619,7 +4853,7 @@ func (x *ListRunsRequest) String() string { func (*ListRunsRequest) ProtoMessage() {} func (x *ListRunsRequest) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[61] + mi := &file_depot_ci_v1_ci_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4632,7 +4866,7 @@ func (x *ListRunsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRunsRequest.ProtoReflect.Descriptor instead. func (*ListRunsRequest) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{61} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{64} } func (x *ListRunsRequest) GetStatus() []string { @@ -4696,7 +4930,7 @@ type ListRunsResponse struct { func (x *ListRunsResponse) Reset() { *x = ListRunsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[62] + mi := &file_depot_ci_v1_ci_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4709,7 +4943,7 @@ func (x *ListRunsResponse) String() string { func (*ListRunsResponse) ProtoMessage() {} func (x *ListRunsResponse) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[62] + mi := &file_depot_ci_v1_ci_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4722,7 +4956,7 @@ func (x *ListRunsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRunsResponse.ProtoReflect.Descriptor instead. func (*ListRunsResponse) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{62} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{65} } func (x *ListRunsResponse) GetRuns() []*ListRunsResponseRun { @@ -4758,7 +4992,7 @@ type ListRunsResponseRun struct { func (x *ListRunsResponseRun) Reset() { *x = ListRunsResponseRun{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[63] + mi := &file_depot_ci_v1_ci_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4771,7 +5005,7 @@ func (x *ListRunsResponseRun) String() string { func (*ListRunsResponseRun) ProtoMessage() {} func (x *ListRunsResponseRun) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[63] + mi := &file_depot_ci_v1_ci_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4784,7 +5018,7 @@ func (x *ListRunsResponseRun) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRunsResponseRun.ProtoReflect.Descriptor instead. func (*ListRunsResponseRun) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{63} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{66} } func (x *ListRunsResponseRun) GetRunId() string { @@ -4867,7 +5101,7 @@ type ListWorkflowsRequest struct { func (x *ListWorkflowsRequest) Reset() { *x = ListWorkflowsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[64] + mi := &file_depot_ci_v1_ci_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4880,7 +5114,7 @@ func (x *ListWorkflowsRequest) String() string { func (*ListWorkflowsRequest) ProtoMessage() {} func (x *ListWorkflowsRequest) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[64] + mi := &file_depot_ci_v1_ci_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4893,7 +5127,7 @@ func (x *ListWorkflowsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWorkflowsRequest.ProtoReflect.Descriptor instead. func (*ListWorkflowsRequest) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{64} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{67} } func (x *ListWorkflowsRequest) GetPageSize() int32 { @@ -4956,7 +5190,7 @@ type ListWorkflowsResponse struct { func (x *ListWorkflowsResponse) Reset() { *x = ListWorkflowsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[65] + mi := &file_depot_ci_v1_ci_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4969,7 +5203,7 @@ func (x *ListWorkflowsResponse) String() string { func (*ListWorkflowsResponse) ProtoMessage() {} func (x *ListWorkflowsResponse) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[65] + mi := &file_depot_ci_v1_ci_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4982,7 +5216,7 @@ func (x *ListWorkflowsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWorkflowsResponse.ProtoReflect.Descriptor instead. func (*ListWorkflowsResponse) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{65} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{68} } func (x *ListWorkflowsResponse) GetWorkflows() []*ListWorkflowsResponseWorkflow { @@ -5014,7 +5248,7 @@ type ListWorkflowsResponseWorkflow struct { func (x *ListWorkflowsResponseWorkflow) Reset() { *x = ListWorkflowsResponseWorkflow{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[66] + mi := &file_depot_ci_v1_ci_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5027,7 +5261,7 @@ func (x *ListWorkflowsResponseWorkflow) String() string { func (*ListWorkflowsResponseWorkflow) ProtoMessage() {} func (x *ListWorkflowsResponseWorkflow) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[66] + mi := &file_depot_ci_v1_ci_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5040,7 +5274,7 @@ func (x *ListWorkflowsResponseWorkflow) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWorkflowsResponseWorkflow.ProtoReflect.Descriptor instead. func (*ListWorkflowsResponseWorkflow) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{66} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{69} } func (x *ListWorkflowsResponseWorkflow) GetWorkflowId() string { @@ -5138,7 +5372,7 @@ type ListWorkflowsResponseJobCounts struct { func (x *ListWorkflowsResponseJobCounts) Reset() { *x = ListWorkflowsResponseJobCounts{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[67] + mi := &file_depot_ci_v1_ci_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5151,7 +5385,7 @@ func (x *ListWorkflowsResponseJobCounts) String() string { func (*ListWorkflowsResponseJobCounts) ProtoMessage() {} func (x *ListWorkflowsResponseJobCounts) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[67] + mi := &file_depot_ci_v1_ci_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5164,7 +5398,7 @@ func (x *ListWorkflowsResponseJobCounts) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWorkflowsResponseJobCounts.ProtoReflect.Descriptor instead. func (*ListWorkflowsResponseJobCounts) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{67} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{70} } func (x *ListWorkflowsResponseJobCounts) GetTotal() int32 { @@ -5810,323 +6044,366 @@ var file_depot_ci_v1_ci_proto_rawDesc = []byte{ 0x64, 0x12, 0x2f, 0x0a, 0x13, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, - 0x67, 0x79, 0x22, 0x58, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, - 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, - 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, - 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x6f, 0x0a, 0x19, - 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x6c, 0x69, 0x6e, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, - 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x52, 0x05, - 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, - 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x6b, 0x0a, - 0x1b, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, - 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, - 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, - 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, - 0x73, 0x6f, 0x72, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x90, 0x01, 0x0a, 0x1c, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, - 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x6c, - 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x64, 0x65, 0x70, 0x6f, - 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x52, - 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x75, - 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x65, 0x78, 0x74, - 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, - 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x93, 0x01, - 0x0a, 0x1b, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, - 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, - 0x0a, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, - 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, - 0x62, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x22, 0x9c, 0x01, 0x0a, 0x1b, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, - 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x22, 0x87, 0x01, 0x0a, 0x1c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, - 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, - 0x67, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, - 0x00, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x05, 0x63, - 0x68, 0x75, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x05, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0xca, 0x01, 0x0a, - 0x07, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x74, 0x65, 0x70, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x74, 0x65, 0x70, - 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x5f, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x4d, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6c, 0x69, 0x6e, - 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, - 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, - 0x6f, 0x64, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x65, 0x70, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, - 0x73, 0x74, 0x65, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x73, 0x74, 0x65, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x0f, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, - 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x68, 0x61, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x73, 0x68, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x70, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x70, - 0x72, 0x22, 0x70, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x52, 0x75, 0x6e, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, - 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x22, 0xd0, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x75, 0x6e, 0x12, 0x15, 0x0a, 0x06, 0x72, - 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x75, 0x6e, - 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, - 0x12, 0x10, 0x0a, 0x03, 0x73, 0x68, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, - 0x68, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x66, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x65, 0x66, 0x12, 0x19, 0x0a, 0x08, 0x68, - 0x65, 0x61, 0x64, 0x5f, 0x73, 0x68, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, - 0x65, 0x61, 0x64, 0x53, 0x68, 0x61, 0x22, 0xc1, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x72, 0x65, 0x70, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, - 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x68, 0x61, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x68, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x70, 0x72, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x70, 0x72, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x0a, - 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x78, 0x0a, 0x15, 0x4c, 0x69, - 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x4a, 0x04, 0x08, - 0x02, 0x10, 0x03, 0x52, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xee, 0x02, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x74, 0x68, - 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x72, 0x65, 0x70, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, - 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x10, 0x0a, - 0x03, 0x73, 0x68, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x68, 0x61, 0x12, - 0x19, 0x0a, 0x08, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x73, 0x68, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x53, 0x68, 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x4a, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, - 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x22, 0xee, 0x01, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4a, - 0x6f, 0x62, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x16, - 0x0a, 0x06, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, - 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, - 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, - 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, - 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x66, 0x69, - 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x1c, - 0x0a, 0x09, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x09, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, - 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x73, - 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x2a, 0xff, 0x01, 0x0a, 0x19, 0x43, 0x49, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, - 0x43, 0x6f, 0x64, 0x65, 0x12, 0x2c, 0x0a, 0x28, 0x43, 0x49, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, - 0x43, 0x53, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, - 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x2a, 0x0a, 0x26, 0x43, 0x49, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, - 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x43, 0x4f, - 0x44, 0x45, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x2b, - 0x0a, 0x27, 0x43, 0x49, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x41, 0x56, 0x41, - 0x49, 0x4c, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4e, - 0x4f, 0x5f, 0x53, 0x41, 0x4e, 0x44, 0x42, 0x4f, 0x58, 0x10, 0x02, 0x12, 0x2e, 0x0a, 0x2a, 0x43, - 0x49, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, - 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x5f, 0x54, - 0x49, 0x4d, 0x45, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x03, 0x12, 0x2b, 0x0a, 0x27, 0x43, - 0x49, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, - 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x5f, 0x53, - 0x41, 0x4d, 0x50, 0x4c, 0x45, 0x53, 0x10, 0x04, 0x2a, 0x9b, 0x01, 0x0a, 0x19, 0x4a, 0x6f, 0x62, + 0x67, 0x79, 0x22, 0x3c, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, + 0x6d, 0x70, 0x74, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, + 0x22, 0x2d, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, + 0xfb, 0x02, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, 0x67, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, + 0x12, 0x15, 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, + 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, + 0x1d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, 0x18, + 0x0a, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6a, 0x6f, + 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x74, 0x74, 0x65, 0x6d, + 0x70, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, + 0x0a, 0x0b, 0x68, 0x61, 0x73, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0a, 0x68, 0x61, 0x73, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, + 0x21, 0x0a, 0x0c, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x52, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x73, 0x74, 0x65, 0x70, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x22, 0x58, 0x0a, + 0x18, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, + 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x74, 0x74, + 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, + 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, + 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x6f, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4a, 0x6f, + 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6e, 0x65, 0x73, + 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, + 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x6b, 0x0a, 0x1b, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x65, 0x6d, + 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x74, 0x74, + 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x15, + 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x90, 0x01, 0x0a, 0x1c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, + 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x43, 0x75, 0x72, 0x73, 0x6f, + 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x74, 0x74, 0x65, 0x6d, + 0x70, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x93, 0x01, 0x0a, 0x1b, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x65, + 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x74, + 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x3e, + 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, + 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x2d, 0x0a, 0x29, 0x4a, 0x4f, 0x42, 0x5f, 0x41, 0x54, - 0x54, 0x45, 0x4d, 0x50, 0x54, 0x5f, 0x4c, 0x4f, 0x47, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, - 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, - 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x26, 0x0a, 0x22, 0x4a, 0x4f, 0x42, 0x5f, 0x41, 0x54, 0x54, - 0x45, 0x4d, 0x50, 0x54, 0x5f, 0x4c, 0x4f, 0x47, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x5f, - 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x54, 0x45, 0x58, 0x54, 0x10, 0x01, 0x12, 0x27, 0x0a, - 0x23, 0x4a, 0x4f, 0x42, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, 0x5f, 0x4c, 0x4f, 0x47, - 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x4a, - 0x53, 0x4f, 0x4e, 0x4c, 0x10, 0x02, 0x32, 0xa8, 0x0d, 0x0a, 0x09, 0x43, 0x49, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x3a, 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, 0x17, 0x2e, 0x64, 0x65, - 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x61, 0x0a, 0x10, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x24, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x65, 0x70, - 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, - 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x08, 0x52, 0x65, 0x74, 0x72, 0x79, 0x4a, 0x6f, 0x62, 0x12, - 0x1c, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, - 0x74, 0x72, 0x79, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, - 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, - 0x79, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, - 0x0a, 0x0d, 0x52, 0x65, 0x72, 0x75, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, - 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, - 0x72, 0x75, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x65, 0x72, 0x75, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x0f, 0x52, 0x65, 0x74, 0x72, - 0x79, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x23, 0x2e, 0x64, 0x65, + 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x9c, + 0x01, 0x0a, 0x1b, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1a, + 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3e, 0x0a, + 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, + 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x41, + 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x87, 0x01, + 0x0a, 0x1c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, + 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, + 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4a, + 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x42, 0x07, + 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0xca, 0x01, 0x0a, 0x07, 0x4c, 0x6f, 0x67, 0x4c, + 0x69, 0x6e, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x74, 0x65, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x21, + 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x6d, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4d, + 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6c, 0x69, 0x6e, 0x65, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, + 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x17, + 0x0a, 0x07, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x74, 0x65, 0x70, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x65, 0x70, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x65, 0x70, + 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, + 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x12, 0x0a, 0x04, + 0x72, 0x65, 0x70, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, + 0x12, 0x10, 0x0a, 0x03, 0x73, 0x68, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, + 0x68, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, + 0x70, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x70, 0x72, 0x22, 0x70, 0x0a, 0x10, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x34, 0x0a, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x75, 0x6e, + 0x52, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, + 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xd0, + 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x52, 0x75, 0x6e, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, + 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, + 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x73, + 0x68, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x68, 0x61, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x72, 0x65, 0x66, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x73, + 0x68, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x53, 0x68, + 0x61, 0x22, 0xc1, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, + 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, + 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x72, + 0x65, 0x70, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x68, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x73, 0x68, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x70, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x70, 0x72, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x78, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, + 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2a, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x09, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x0f, + 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, + 0xee, 0x02, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x72, + 0x65, 0x70, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x68, 0x61, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x68, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x65, + 0x61, 0x64, 0x5f, 0x73, 0x68, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, 0x65, + 0x61, 0x64, 0x53, 0x68, 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x4a, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, + 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4a, 0x6f, 0x62, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, + 0x22, 0xee, 0x01, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x71, 0x75, 0x65, + 0x75, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x71, 0x75, 0x65, 0x75, 0x65, + 0x64, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x07, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x72, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x72, 0x75, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, + 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, + 0x64, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x61, 0x6e, + 0x63, 0x65, 0x6c, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x63, 0x61, + 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x6b, 0x69, 0x70, 0x70, + 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, + 0x64, 0x2a, 0xff, 0x01, 0x0a, 0x19, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x12, + 0x2c, 0x0a, 0x28, 0x43, 0x49, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x41, 0x56, + 0x41, 0x49, 0x4c, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2a, 0x0a, + 0x26, 0x43, 0x49, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x41, 0x56, 0x41, 0x49, + 0x4c, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x41, 0x56, + 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x2b, 0x0a, 0x27, 0x43, 0x49, 0x5f, + 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x49, + 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x5f, 0x53, 0x41, 0x4e, + 0x44, 0x42, 0x4f, 0x58, 0x10, 0x02, 0x12, 0x2e, 0x0a, 0x2a, 0x43, 0x49, 0x5f, 0x4d, 0x45, 0x54, + 0x52, 0x49, 0x43, 0x53, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, + 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x52, + 0x41, 0x4e, 0x47, 0x45, 0x10, 0x03, 0x12, 0x2b, 0x0a, 0x27, 0x43, 0x49, 0x5f, 0x4d, 0x45, 0x54, + 0x52, 0x49, 0x43, 0x53, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, + 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x5f, 0x53, 0x41, 0x4d, 0x50, 0x4c, 0x45, + 0x53, 0x10, 0x04, 0x2a, 0x9b, 0x01, 0x0a, 0x19, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, + 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x12, 0x2d, 0x0a, 0x29, 0x4a, 0x4f, 0x42, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, + 0x5f, 0x4c, 0x4f, 0x47, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, + 0x41, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x26, 0x0a, 0x22, 0x4a, 0x4f, 0x42, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, 0x5f, + 0x4c, 0x4f, 0x47, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, + 0x54, 0x5f, 0x54, 0x45, 0x58, 0x54, 0x10, 0x01, 0x12, 0x27, 0x0a, 0x23, 0x4a, 0x4f, 0x42, 0x5f, + 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, 0x5f, 0x4c, 0x4f, 0x47, 0x5f, 0x45, 0x58, 0x50, 0x4f, + 0x52, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x4c, 0x10, + 0x02, 0x32, 0xea, 0x0e, 0x0a, 0x09, 0x43, 0x49, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x3a, 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, 0x17, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x18, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x10, 0x44, + 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, + 0x24, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, + 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, + 0x0a, 0x08, 0x52, 0x65, 0x74, 0x72, 0x79, 0x4a, 0x6f, 0x62, 0x12, 0x1c, 0x2e, 0x64, 0x65, 0x70, + 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x4a, 0x6f, + 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, + 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x4a, 0x6f, 0x62, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0d, 0x52, 0x65, 0x72, + 0x75, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x21, 0x2e, 0x64, 0x65, 0x70, + 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x72, 0x75, 0x6e, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, + 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x72, 0x75, + 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x0f, 0x52, 0x65, 0x74, 0x72, 0x79, 0x46, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x23, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, + 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x46, - 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x24, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, - 0x65, 0x74, 0x72, 0x79, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x09, 0x43, 0x61, 0x6e, 0x63, - 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x1d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, - 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, - 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, - 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x12, 0x1a, 0x2e, - 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, - 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x64, 0x65, 0x70, 0x6f, - 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x09, 0x43, 0x61, 0x6e, 0x63, - 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x12, 0x1d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, - 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, - 0x0b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x1f, 0x2e, 0x64, - 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, - 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x6d, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, - 0x70, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, - 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, - 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x58, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x12, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0d, 0x47, 0x65, - 0x74, 0x52, 0x75, 0x6e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x21, 0x2e, 0x64, 0x65, - 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x09, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, + 0x12, 0x1d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1e, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, + 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x12, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, + 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x43, + 0x0a, 0x06, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x12, 0x1a, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, + 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x09, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x75, 0x6e, + 0x12, 0x1d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1e, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, + 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x55, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x1f, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, + 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, + 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x14, + 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x52, 0x75, 0x6e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x64, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, - 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x25, 0x2e, 0x64, 0x65, 0x70, 0x6f, - 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, - 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x26, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x14, 0x53, 0x74, + 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0d, 0x47, + 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x21, 0x2e, 0x64, + 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, + 0x62, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x4a, 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, + 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, + 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, + 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, + 0x6d, 0x70, 0x74, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4a, 0x6f, + 0x62, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, + 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x75, 0x6d, + 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x65, + 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, + 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x64, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, + 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x25, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, + 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, + 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x14, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, + 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, - 0x67, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, - 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, - 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x6f, 0x0a, 0x14, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, - 0x6f, 0x67, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, - 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, - 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, + 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x65, 0x70, 0x6f, + 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4a, 0x6f, + 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x6f, 0x0a, 0x14, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x49, 0x0a, 0x08, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x12, 0x1c, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, - 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, + 0x12, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, + 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x65, 0x70, + 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4a, + 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x49, 0x0a, 0x08, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x75, 0x6e, 0x73, 0x12, 0x1c, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x65, - 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x32, 0xe1, 0x01, 0x0a, 0x10, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5e, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x2e, 0x64, 0x65, 0x70, 0x6f, - 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, - 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x14, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, - 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x41, 0x6e, 0x64, 0x56, 0x61, 0x72, 0x73, 0x12, 0x28, - 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6d, 0x70, - 0x6f, 0x72, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x41, 0x6e, 0x64, 0x56, 0x61, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, - 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x73, 0x41, 0x6e, 0x64, 0x56, 0x61, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x99, 0x01, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x65, - 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x07, 0x43, 0x69, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x69, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2f, 0x63, 0x69, 0x2f, 0x76, 0x31, - 0x3b, 0x63, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x44, 0x43, 0x58, 0xaa, 0x02, 0x0b, 0x44, 0x65, - 0x70, 0x6f, 0x74, 0x2e, 0x43, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0b, 0x44, 0x65, 0x70, 0x6f, - 0x74, 0x5c, 0x43, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x17, 0x44, 0x65, 0x70, 0x6f, 0x74, 0x5c, - 0x43, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0xea, 0x02, 0x0d, 0x44, 0x65, 0x70, 0x6f, 0x74, 0x3a, 0x3a, 0x43, 0x69, 0x3a, 0x3a, 0x56, - 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0xe1, + 0x01, 0x0a, 0x10, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x5e, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, + 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x64, 0x65, + 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x14, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x73, 0x41, 0x6e, 0x64, 0x56, 0x61, 0x72, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x65, + 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x41, 0x6e, 0x64, 0x56, 0x61, 0x72, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x73, 0x41, 0x6e, 0x64, 0x56, 0x61, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x42, 0x99, 0x01, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, + 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x07, 0x43, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, + 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, + 0x70, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x69, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2f, 0x63, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x63, 0x69, + 0x76, 0x31, 0xa2, 0x02, 0x03, 0x44, 0x43, 0x58, 0xaa, 0x02, 0x0b, 0x44, 0x65, 0x70, 0x6f, 0x74, + 0x2e, 0x43, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0b, 0x44, 0x65, 0x70, 0x6f, 0x74, 0x5c, 0x43, + 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x17, 0x44, 0x65, 0x70, 0x6f, 0x74, 0x5c, 0x43, 0x69, 0x5c, + 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, + 0x0d, 0x44, 0x65, 0x70, 0x6f, 0x74, 0x3a, 0x3a, 0x43, 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -6142,7 +6419,7 @@ func file_depot_ci_v1_ci_proto_rawDescGZIP() []byte { } var file_depot_ci_v1_ci_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_depot_ci_v1_ci_proto_msgTypes = make([]protoimpl.MessageInfo, 69) +var file_depot_ci_v1_ci_proto_msgTypes = make([]protoimpl.MessageInfo, 72) var file_depot_ci_v1_ci_proto_goTypes = []interface{}{ (CIMetricsAvailabilityCode)(0), // 0: depot.ci.v1.CIMetricsAvailabilityCode (JobAttemptLogExportFormat)(0), // 1: depot.ci.v1.JobAttemptLogExportFormat @@ -6199,28 +6476,31 @@ var file_depot_ci_v1_ci_proto_goTypes = []interface{}{ (*CIMetricsStats)(nil), // 52: depot.ci.v1.CIMetricsStats (*CIMetricsAvailability)(nil), // 53: depot.ci.v1.CIMetricsAvailability (*CIMetricsCapMetadata)(nil), // 54: depot.ci.v1.CIMetricsCapMetadata - (*GetJobAttemptLogsRequest)(nil), // 55: depot.ci.v1.GetJobAttemptLogsRequest - (*GetJobAttemptLogsResponse)(nil), // 56: depot.ci.v1.GetJobAttemptLogsResponse - (*StreamJobAttemptLogsRequest)(nil), // 57: depot.ci.v1.StreamJobAttemptLogsRequest - (*StreamJobAttemptLogsResponse)(nil), // 58: depot.ci.v1.StreamJobAttemptLogsResponse - (*ExportJobAttemptLogsRequest)(nil), // 59: depot.ci.v1.ExportJobAttemptLogsRequest - (*JobAttemptLogExportMetadata)(nil), // 60: depot.ci.v1.JobAttemptLogExportMetadata - (*ExportJobAttemptLogsResponse)(nil), // 61: depot.ci.v1.ExportJobAttemptLogsResponse - (*LogLine)(nil), // 62: depot.ci.v1.LogLine - (*ListRunsRequest)(nil), // 63: depot.ci.v1.ListRunsRequest - (*ListRunsResponse)(nil), // 64: depot.ci.v1.ListRunsResponse - (*ListRunsResponseRun)(nil), // 65: depot.ci.v1.ListRunsResponseRun - (*ListWorkflowsRequest)(nil), // 66: depot.ci.v1.ListWorkflowsRequest - (*ListWorkflowsResponse)(nil), // 67: depot.ci.v1.ListWorkflowsResponse - (*ListWorkflowsResponseWorkflow)(nil), // 68: depot.ci.v1.ListWorkflowsResponseWorkflow - (*ListWorkflowsResponseJobCounts)(nil), // 69: depot.ci.v1.ListWorkflowsResponseJobCounts - nil, // 70: depot.ci.v1.DispatchWorkflowRequest.InputsEntry + (*GetJobAttemptSummaryRequest)(nil), // 55: depot.ci.v1.GetJobAttemptSummaryRequest + (*GetJobSummaryRequest)(nil), // 56: depot.ci.v1.GetJobSummaryRequest + (*GetJobSummaryResponse)(nil), // 57: depot.ci.v1.GetJobSummaryResponse + (*GetJobAttemptLogsRequest)(nil), // 58: depot.ci.v1.GetJobAttemptLogsRequest + (*GetJobAttemptLogsResponse)(nil), // 59: depot.ci.v1.GetJobAttemptLogsResponse + (*StreamJobAttemptLogsRequest)(nil), // 60: depot.ci.v1.StreamJobAttemptLogsRequest + (*StreamJobAttemptLogsResponse)(nil), // 61: depot.ci.v1.StreamJobAttemptLogsResponse + (*ExportJobAttemptLogsRequest)(nil), // 62: depot.ci.v1.ExportJobAttemptLogsRequest + (*JobAttemptLogExportMetadata)(nil), // 63: depot.ci.v1.JobAttemptLogExportMetadata + (*ExportJobAttemptLogsResponse)(nil), // 64: depot.ci.v1.ExportJobAttemptLogsResponse + (*LogLine)(nil), // 65: depot.ci.v1.LogLine + (*ListRunsRequest)(nil), // 66: depot.ci.v1.ListRunsRequest + (*ListRunsResponse)(nil), // 67: depot.ci.v1.ListRunsResponse + (*ListRunsResponseRun)(nil), // 68: depot.ci.v1.ListRunsResponseRun + (*ListWorkflowsRequest)(nil), // 69: depot.ci.v1.ListWorkflowsRequest + (*ListWorkflowsResponse)(nil), // 70: depot.ci.v1.ListWorkflowsResponse + (*ListWorkflowsResponseWorkflow)(nil), // 71: depot.ci.v1.ListWorkflowsResponseWorkflow + (*ListWorkflowsResponseJobCounts)(nil), // 72: depot.ci.v1.ListWorkflowsResponseJobCounts + nil, // 73: depot.ci.v1.DispatchWorkflowRequest.InputsEntry } var file_depot_ci_v1_ci_proto_depIdxs = []int32{ 8, // 0: depot.ci.v1.GetInstallationResponse.installations:type_name -> depot.ci.v1.Installation 6, // 1: depot.ci.v1.ImportSecretsAndVarsResponse.dry_run_result:type_name -> depot.ci.v1.DryRunResult 7, // 2: depot.ci.v1.ImportSecretsAndVarsResponse.run_result:type_name -> depot.ci.v1.RunResult - 70, // 3: depot.ci.v1.DispatchWorkflowRequest.inputs:type_name -> depot.ci.v1.DispatchWorkflowRequest.InputsEntry + 73, // 3: depot.ci.v1.DispatchWorkflowRequest.inputs:type_name -> depot.ci.v1.DispatchWorkflowRequest.InputsEntry 29, // 4: depot.ci.v1.GetRunStatusResponse.workflows:type_name -> depot.ci.v1.WorkflowStatus 30, // 5: depot.ci.v1.WorkflowStatus.jobs:type_name -> depot.ci.v1.JobStatus 31, // 6: depot.ci.v1.JobStatus.attempts:type_name -> depot.ci.v1.AttemptStatus @@ -6251,14 +6531,14 @@ var file_depot_ci_v1_ci_proto_depIdxs = []int32{ 52, // 31: depot.ci.v1.CIMetricsAttemptSummary.stats:type_name -> depot.ci.v1.CIMetricsStats 54, // 32: depot.ci.v1.CIMetricsAttemptSummary.cap:type_name -> depot.ci.v1.CIMetricsCapMetadata 0, // 33: depot.ci.v1.CIMetricsAvailability.code:type_name -> depot.ci.v1.CIMetricsAvailabilityCode - 62, // 34: depot.ci.v1.GetJobAttemptLogsResponse.lines:type_name -> depot.ci.v1.LogLine - 62, // 35: depot.ci.v1.StreamJobAttemptLogsResponse.line:type_name -> depot.ci.v1.LogLine + 65, // 34: depot.ci.v1.GetJobAttemptLogsResponse.lines:type_name -> depot.ci.v1.LogLine + 65, // 35: depot.ci.v1.StreamJobAttemptLogsResponse.line:type_name -> depot.ci.v1.LogLine 1, // 36: depot.ci.v1.ExportJobAttemptLogsRequest.format:type_name -> depot.ci.v1.JobAttemptLogExportFormat 1, // 37: depot.ci.v1.JobAttemptLogExportMetadata.format:type_name -> depot.ci.v1.JobAttemptLogExportFormat - 60, // 38: depot.ci.v1.ExportJobAttemptLogsResponse.metadata:type_name -> depot.ci.v1.JobAttemptLogExportMetadata - 65, // 39: depot.ci.v1.ListRunsResponse.runs:type_name -> depot.ci.v1.ListRunsResponseRun - 68, // 40: depot.ci.v1.ListWorkflowsResponse.workflows:type_name -> depot.ci.v1.ListWorkflowsResponseWorkflow - 69, // 41: depot.ci.v1.ListWorkflowsResponseWorkflow.job_counts:type_name -> depot.ci.v1.ListWorkflowsResponseJobCounts + 63, // 38: depot.ci.v1.ExportJobAttemptLogsResponse.metadata:type_name -> depot.ci.v1.JobAttemptLogExportMetadata + 68, // 39: depot.ci.v1.ListRunsResponse.runs:type_name -> depot.ci.v1.ListRunsResponseRun + 71, // 40: depot.ci.v1.ListWorkflowsResponse.workflows:type_name -> depot.ci.v1.ListWorkflowsResponseWorkflow + 72, // 41: depot.ci.v1.ListWorkflowsResponseWorkflow.job_counts:type_name -> depot.ci.v1.ListWorkflowsResponseJobCounts 9, // 42: depot.ci.v1.CIService.Run:input_type -> depot.ci.v1.RunRequest 11, // 43: depot.ci.v1.CIService.DispatchWorkflow:input_type -> depot.ci.v1.DispatchWorkflowRequest 13, // 44: depot.ci.v1.CIService.RetryJob:input_type -> depot.ci.v1.RetryJobRequest @@ -6273,36 +6553,40 @@ var file_depot_ci_v1_ci_proto_depIdxs = []int32{ 37, // 53: depot.ci.v1.CIService.GetJobAttemptMetrics:input_type -> depot.ci.v1.GetJobAttemptMetricsRequest 38, // 54: depot.ci.v1.CIService.GetJobMetrics:input_type -> depot.ci.v1.GetJobMetricsRequest 39, // 55: depot.ci.v1.CIService.GetRunMetrics:input_type -> depot.ci.v1.GetRunMetricsRequest - 55, // 56: depot.ci.v1.CIService.GetJobAttemptLogs:input_type -> depot.ci.v1.GetJobAttemptLogsRequest - 57, // 57: depot.ci.v1.CIService.StreamJobAttemptLogs:input_type -> depot.ci.v1.StreamJobAttemptLogsRequest - 59, // 58: depot.ci.v1.CIService.ExportJobAttemptLogs:input_type -> depot.ci.v1.ExportJobAttemptLogsRequest - 63, // 59: depot.ci.v1.CIService.ListRuns:input_type -> depot.ci.v1.ListRunsRequest - 66, // 60: depot.ci.v1.CIService.ListWorkflows:input_type -> depot.ci.v1.ListWorkflowsRequest - 2, // 61: depot.ci.v1.MigrationService.GetInstallation:input_type -> depot.ci.v1.GetInstallationRequest - 4, // 62: depot.ci.v1.MigrationService.ImportSecretsAndVars:input_type -> depot.ci.v1.ImportSecretsAndVarsRequest - 10, // 63: depot.ci.v1.CIService.Run:output_type -> depot.ci.v1.RunResponse - 12, // 64: depot.ci.v1.CIService.DispatchWorkflow:output_type -> depot.ci.v1.DispatchWorkflowResponse - 14, // 65: depot.ci.v1.CIService.RetryJob:output_type -> depot.ci.v1.RetryJobResponse - 16, // 66: depot.ci.v1.CIService.RerunWorkflow:output_type -> depot.ci.v1.RerunWorkflowResponse - 18, // 67: depot.ci.v1.CIService.RetryFailedJobs:output_type -> depot.ci.v1.RetryFailedJobsResponse - 20, // 68: depot.ci.v1.CIService.CancelJob:output_type -> depot.ci.v1.CancelJobResponse - 22, // 69: depot.ci.v1.CIService.CancelWorkflow:output_type -> depot.ci.v1.CancelWorkflowResponse - 24, // 70: depot.ci.v1.CIService.GetRun:output_type -> depot.ci.v1.GetRunResponse - 26, // 71: depot.ci.v1.CIService.CancelRun:output_type -> depot.ci.v1.CancelRunResponse - 28, // 72: depot.ci.v1.CIService.GetRunStatus:output_type -> depot.ci.v1.GetRunStatusResponse - 33, // 73: depot.ci.v1.CIService.GetWorkflow:output_type -> depot.ci.v1.GetWorkflowResponse - 40, // 74: depot.ci.v1.CIService.GetJobAttemptMetrics:output_type -> depot.ci.v1.GetJobAttemptMetricsResponse - 41, // 75: depot.ci.v1.CIService.GetJobMetrics:output_type -> depot.ci.v1.GetJobMetricsResponse - 42, // 76: depot.ci.v1.CIService.GetRunMetrics:output_type -> depot.ci.v1.GetRunMetricsResponse - 56, // 77: depot.ci.v1.CIService.GetJobAttemptLogs:output_type -> depot.ci.v1.GetJobAttemptLogsResponse - 58, // 78: depot.ci.v1.CIService.StreamJobAttemptLogs:output_type -> depot.ci.v1.StreamJobAttemptLogsResponse - 61, // 79: depot.ci.v1.CIService.ExportJobAttemptLogs:output_type -> depot.ci.v1.ExportJobAttemptLogsResponse - 64, // 80: depot.ci.v1.CIService.ListRuns:output_type -> depot.ci.v1.ListRunsResponse - 67, // 81: depot.ci.v1.CIService.ListWorkflows:output_type -> depot.ci.v1.ListWorkflowsResponse - 3, // 82: depot.ci.v1.MigrationService.GetInstallation:output_type -> depot.ci.v1.GetInstallationResponse - 5, // 83: depot.ci.v1.MigrationService.ImportSecretsAndVars:output_type -> depot.ci.v1.ImportSecretsAndVarsResponse - 63, // [63:84] is the sub-list for method output_type - 42, // [42:63] is the sub-list for method input_type + 55, // 56: depot.ci.v1.CIService.GetJobAttemptSummary:input_type -> depot.ci.v1.GetJobAttemptSummaryRequest + 56, // 57: depot.ci.v1.CIService.GetJobSummary:input_type -> depot.ci.v1.GetJobSummaryRequest + 58, // 58: depot.ci.v1.CIService.GetJobAttemptLogs:input_type -> depot.ci.v1.GetJobAttemptLogsRequest + 60, // 59: depot.ci.v1.CIService.StreamJobAttemptLogs:input_type -> depot.ci.v1.StreamJobAttemptLogsRequest + 62, // 60: depot.ci.v1.CIService.ExportJobAttemptLogs:input_type -> depot.ci.v1.ExportJobAttemptLogsRequest + 66, // 61: depot.ci.v1.CIService.ListRuns:input_type -> depot.ci.v1.ListRunsRequest + 69, // 62: depot.ci.v1.CIService.ListWorkflows:input_type -> depot.ci.v1.ListWorkflowsRequest + 2, // 63: depot.ci.v1.MigrationService.GetInstallation:input_type -> depot.ci.v1.GetInstallationRequest + 4, // 64: depot.ci.v1.MigrationService.ImportSecretsAndVars:input_type -> depot.ci.v1.ImportSecretsAndVarsRequest + 10, // 65: depot.ci.v1.CIService.Run:output_type -> depot.ci.v1.RunResponse + 12, // 66: depot.ci.v1.CIService.DispatchWorkflow:output_type -> depot.ci.v1.DispatchWorkflowResponse + 14, // 67: depot.ci.v1.CIService.RetryJob:output_type -> depot.ci.v1.RetryJobResponse + 16, // 68: depot.ci.v1.CIService.RerunWorkflow:output_type -> depot.ci.v1.RerunWorkflowResponse + 18, // 69: depot.ci.v1.CIService.RetryFailedJobs:output_type -> depot.ci.v1.RetryFailedJobsResponse + 20, // 70: depot.ci.v1.CIService.CancelJob:output_type -> depot.ci.v1.CancelJobResponse + 22, // 71: depot.ci.v1.CIService.CancelWorkflow:output_type -> depot.ci.v1.CancelWorkflowResponse + 24, // 72: depot.ci.v1.CIService.GetRun:output_type -> depot.ci.v1.GetRunResponse + 26, // 73: depot.ci.v1.CIService.CancelRun:output_type -> depot.ci.v1.CancelRunResponse + 28, // 74: depot.ci.v1.CIService.GetRunStatus:output_type -> depot.ci.v1.GetRunStatusResponse + 33, // 75: depot.ci.v1.CIService.GetWorkflow:output_type -> depot.ci.v1.GetWorkflowResponse + 40, // 76: depot.ci.v1.CIService.GetJobAttemptMetrics:output_type -> depot.ci.v1.GetJobAttemptMetricsResponse + 41, // 77: depot.ci.v1.CIService.GetJobMetrics:output_type -> depot.ci.v1.GetJobMetricsResponse + 42, // 78: depot.ci.v1.CIService.GetRunMetrics:output_type -> depot.ci.v1.GetRunMetricsResponse + 57, // 79: depot.ci.v1.CIService.GetJobAttemptSummary:output_type -> depot.ci.v1.GetJobSummaryResponse + 57, // 80: depot.ci.v1.CIService.GetJobSummary:output_type -> depot.ci.v1.GetJobSummaryResponse + 59, // 81: depot.ci.v1.CIService.GetJobAttemptLogs:output_type -> depot.ci.v1.GetJobAttemptLogsResponse + 61, // 82: depot.ci.v1.CIService.StreamJobAttemptLogs:output_type -> depot.ci.v1.StreamJobAttemptLogsResponse + 64, // 83: depot.ci.v1.CIService.ExportJobAttemptLogs:output_type -> depot.ci.v1.ExportJobAttemptLogsResponse + 67, // 84: depot.ci.v1.CIService.ListRuns:output_type -> depot.ci.v1.ListRunsResponse + 70, // 85: depot.ci.v1.CIService.ListWorkflows:output_type -> depot.ci.v1.ListWorkflowsResponse + 3, // 86: depot.ci.v1.MigrationService.GetInstallation:output_type -> depot.ci.v1.GetInstallationResponse + 5, // 87: depot.ci.v1.MigrationService.ImportSecretsAndVars:output_type -> depot.ci.v1.ImportSecretsAndVarsResponse + 65, // [65:88] is the sub-list for method output_type + 42, // [42:65] is the sub-list for method input_type 42, // [42:42] is the sub-list for extension type_name 42, // [42:42] is the sub-list for extension extendee 0, // [0:42] is the sub-list for field type_name @@ -6951,7 +7235,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetJobAttemptLogsRequest); i { + switch v := v.(*GetJobAttemptSummaryRequest); i { case 0: return &v.state case 1: @@ -6963,7 +7247,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetJobAttemptLogsResponse); i { + switch v := v.(*GetJobSummaryRequest); i { case 0: return &v.state case 1: @@ -6975,7 +7259,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StreamJobAttemptLogsRequest); i { + switch v := v.(*GetJobSummaryResponse); i { case 0: return &v.state case 1: @@ -6987,7 +7271,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StreamJobAttemptLogsResponse); i { + switch v := v.(*GetJobAttemptLogsRequest); i { case 0: return &v.state case 1: @@ -6999,7 +7283,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExportJobAttemptLogsRequest); i { + switch v := v.(*GetJobAttemptLogsResponse); i { case 0: return &v.state case 1: @@ -7011,7 +7295,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobAttemptLogExportMetadata); i { + switch v := v.(*StreamJobAttemptLogsRequest); i { case 0: return &v.state case 1: @@ -7023,7 +7307,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExportJobAttemptLogsResponse); i { + switch v := v.(*StreamJobAttemptLogsResponse); i { case 0: return &v.state case 1: @@ -7035,7 +7319,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LogLine); i { + switch v := v.(*ExportJobAttemptLogsRequest); i { case 0: return &v.state case 1: @@ -7047,7 +7331,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRunsRequest); i { + switch v := v.(*JobAttemptLogExportMetadata); i { case 0: return &v.state case 1: @@ -7059,7 +7343,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRunsResponse); i { + switch v := v.(*ExportJobAttemptLogsResponse); i { case 0: return &v.state case 1: @@ -7071,7 +7355,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRunsResponseRun); i { + switch v := v.(*LogLine); i { case 0: return &v.state case 1: @@ -7083,7 +7367,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkflowsRequest); i { + switch v := v.(*ListRunsRequest); i { case 0: return &v.state case 1: @@ -7095,7 +7379,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkflowsResponse); i { + switch v := v.(*ListRunsResponse); i { case 0: return &v.state case 1: @@ -7107,7 +7391,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkflowsResponseWorkflow); i { + switch v := v.(*ListRunsResponseRun); i { case 0: return &v.state case 1: @@ -7119,6 +7403,42 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkflowsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkflowsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkflowsResponseWorkflow); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListWorkflowsResponseJobCounts); i { case 0: return &v.state @@ -7138,7 +7458,7 @@ func file_depot_ci_v1_ci_proto_init() { file_depot_ci_v1_ci_proto_msgTypes[7].OneofWrappers = []interface{}{} file_depot_ci_v1_ci_proto_msgTypes[49].OneofWrappers = []interface{}{} file_depot_ci_v1_ci_proto_msgTypes[50].OneofWrappers = []interface{}{} - file_depot_ci_v1_ci_proto_msgTypes[59].OneofWrappers = []interface{}{ + file_depot_ci_v1_ci_proto_msgTypes[62].OneofWrappers = []interface{}{ (*ExportJobAttemptLogsResponse_Metadata)(nil), (*ExportJobAttemptLogsResponse_Chunk)(nil), } @@ -7148,7 +7468,7 @@ func file_depot_ci_v1_ci_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_depot_ci_v1_ci_proto_rawDesc, NumEnums: 2, - NumMessages: 69, + NumMessages: 72, NumExtensions: 0, NumServices: 2, }, diff --git a/pkg/proto/depot/ci/v1/civ1connect/ci.connect.go b/pkg/proto/depot/ci/v1/civ1connect/ci.connect.go index 8417d8b9..355de0b6 100644 --- a/pkg/proto/depot/ci/v1/civ1connect/ci.connect.go +++ b/pkg/proto/depot/ci/v1/civ1connect/ci.connect.go @@ -67,6 +67,11 @@ const ( CIServiceGetJobMetricsProcedure = "/depot.ci.v1.CIService/GetJobMetrics" // CIServiceGetRunMetricsProcedure is the fully-qualified name of the CIService's GetRunMetrics RPC. CIServiceGetRunMetricsProcedure = "/depot.ci.v1.CIService/GetRunMetrics" + // CIServiceGetJobAttemptSummaryProcedure is the fully-qualified name of the CIService's + // GetJobAttemptSummary RPC. + CIServiceGetJobAttemptSummaryProcedure = "/depot.ci.v1.CIService/GetJobAttemptSummary" + // CIServiceGetJobSummaryProcedure is the fully-qualified name of the CIService's GetJobSummary RPC. + CIServiceGetJobSummaryProcedure = "/depot.ci.v1.CIService/GetJobSummary" // CIServiceGetJobAttemptLogsProcedure is the fully-qualified name of the CIService's // GetJobAttemptLogs RPC. CIServiceGetJobAttemptLogsProcedure = "/depot.ci.v1.CIService/GetJobAttemptLogs" @@ -118,6 +123,10 @@ type CIServiceClient interface { GetJobMetrics(context.Context, *connect.Request[v1.GetJobMetricsRequest]) (*connect.Response[v1.GetJobMetricsResponse], error) // GetRunMetrics returns workflow/job/attempt CPU and memory metric summaries for one run GetRunMetrics(context.Context, *connect.Request[v1.GetRunMetricsRequest]) (*connect.Response[v1.GetRunMetricsResponse], error) + // GetJobAttemptSummary returns authored step summary markdown for one concrete job attempt + GetJobAttemptSummary(context.Context, *connect.Request[v1.GetJobAttemptSummaryRequest]) (*connect.Response[v1.GetJobSummaryResponse], error) + // GetJobSummary resolves one job to its current/latest attempt and returns authored step summary markdown + GetJobSummary(context.Context, *connect.Request[v1.GetJobSummaryRequest]) (*connect.Response[v1.GetJobSummaryResponse], error) // GetJobAttemptLogs returns log lines for a job attempt GetJobAttemptLogs(context.Context, *connect.Request[v1.GetJobAttemptLogsRequest]) (*connect.Response[v1.GetJobAttemptLogsResponse], error) // StreamJobAttemptLogs follows persisted log lines for a job attempt. @@ -225,6 +234,16 @@ func NewCIServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...c baseURL+CIServiceGetRunMetricsProcedure, opts..., ), + getJobAttemptSummary: connect.NewClient[v1.GetJobAttemptSummaryRequest, v1.GetJobSummaryResponse]( + httpClient, + baseURL+CIServiceGetJobAttemptSummaryProcedure, + opts..., + ), + getJobSummary: connect.NewClient[v1.GetJobSummaryRequest, v1.GetJobSummaryResponse]( + httpClient, + baseURL+CIServiceGetJobSummaryProcedure, + opts..., + ), getJobAttemptLogs: connect.NewClient[v1.GetJobAttemptLogsRequest, v1.GetJobAttemptLogsResponse]( httpClient, baseURL+CIServiceGetJobAttemptLogsProcedure, @@ -269,6 +288,8 @@ type cIServiceClient struct { getJobAttemptMetrics *connect.Client[v1.GetJobAttemptMetricsRequest, v1.GetJobAttemptMetricsResponse] getJobMetrics *connect.Client[v1.GetJobMetricsRequest, v1.GetJobMetricsResponse] getRunMetrics *connect.Client[v1.GetRunMetricsRequest, v1.GetRunMetricsResponse] + getJobAttemptSummary *connect.Client[v1.GetJobAttemptSummaryRequest, v1.GetJobSummaryResponse] + getJobSummary *connect.Client[v1.GetJobSummaryRequest, v1.GetJobSummaryResponse] getJobAttemptLogs *connect.Client[v1.GetJobAttemptLogsRequest, v1.GetJobAttemptLogsResponse] streamJobAttemptLogs *connect.Client[v1.StreamJobAttemptLogsRequest, v1.StreamJobAttemptLogsResponse] exportJobAttemptLogs *connect.Client[v1.ExportJobAttemptLogsRequest, v1.ExportJobAttemptLogsResponse] @@ -346,6 +367,16 @@ func (c *cIServiceClient) GetRunMetrics(ctx context.Context, req *connect.Reques return c.getRunMetrics.CallUnary(ctx, req) } +// GetJobAttemptSummary calls depot.ci.v1.CIService.GetJobAttemptSummary. +func (c *cIServiceClient) GetJobAttemptSummary(ctx context.Context, req *connect.Request[v1.GetJobAttemptSummaryRequest]) (*connect.Response[v1.GetJobSummaryResponse], error) { + return c.getJobAttemptSummary.CallUnary(ctx, req) +} + +// GetJobSummary calls depot.ci.v1.CIService.GetJobSummary. +func (c *cIServiceClient) GetJobSummary(ctx context.Context, req *connect.Request[v1.GetJobSummaryRequest]) (*connect.Response[v1.GetJobSummaryResponse], error) { + return c.getJobSummary.CallUnary(ctx, req) +} + // GetJobAttemptLogs calls depot.ci.v1.CIService.GetJobAttemptLogs. func (c *cIServiceClient) GetJobAttemptLogs(ctx context.Context, req *connect.Request[v1.GetJobAttemptLogsRequest]) (*connect.Response[v1.GetJobAttemptLogsResponse], error) { return c.getJobAttemptLogs.CallUnary(ctx, req) @@ -401,6 +432,10 @@ type CIServiceHandler interface { GetJobMetrics(context.Context, *connect.Request[v1.GetJobMetricsRequest]) (*connect.Response[v1.GetJobMetricsResponse], error) // GetRunMetrics returns workflow/job/attempt CPU and memory metric summaries for one run GetRunMetrics(context.Context, *connect.Request[v1.GetRunMetricsRequest]) (*connect.Response[v1.GetRunMetricsResponse], error) + // GetJobAttemptSummary returns authored step summary markdown for one concrete job attempt + GetJobAttemptSummary(context.Context, *connect.Request[v1.GetJobAttemptSummaryRequest]) (*connect.Response[v1.GetJobSummaryResponse], error) + // GetJobSummary resolves one job to its current/latest attempt and returns authored step summary markdown + GetJobSummary(context.Context, *connect.Request[v1.GetJobSummaryRequest]) (*connect.Response[v1.GetJobSummaryResponse], error) // GetJobAttemptLogs returns log lines for a job attempt GetJobAttemptLogs(context.Context, *connect.Request[v1.GetJobAttemptLogsRequest]) (*connect.Response[v1.GetJobAttemptLogsResponse], error) // StreamJobAttemptLogs follows persisted log lines for a job attempt. @@ -504,6 +539,16 @@ func NewCIServiceHandler(svc CIServiceHandler, opts ...connect.HandlerOption) (s svc.GetRunMetrics, opts..., ) + cIServiceGetJobAttemptSummaryHandler := connect.NewUnaryHandler( + CIServiceGetJobAttemptSummaryProcedure, + svc.GetJobAttemptSummary, + opts..., + ) + cIServiceGetJobSummaryHandler := connect.NewUnaryHandler( + CIServiceGetJobSummaryProcedure, + svc.GetJobSummary, + opts..., + ) cIServiceGetJobAttemptLogsHandler := connect.NewUnaryHandler( CIServiceGetJobAttemptLogsProcedure, svc.GetJobAttemptLogs, @@ -559,6 +604,10 @@ func NewCIServiceHandler(svc CIServiceHandler, opts ...connect.HandlerOption) (s cIServiceGetJobMetricsHandler.ServeHTTP(w, r) case CIServiceGetRunMetricsProcedure: cIServiceGetRunMetricsHandler.ServeHTTP(w, r) + case CIServiceGetJobAttemptSummaryProcedure: + cIServiceGetJobAttemptSummaryHandler.ServeHTTP(w, r) + case CIServiceGetJobSummaryProcedure: + cIServiceGetJobSummaryHandler.ServeHTTP(w, r) case CIServiceGetJobAttemptLogsProcedure: cIServiceGetJobAttemptLogsHandler.ServeHTTP(w, r) case CIServiceStreamJobAttemptLogsProcedure: @@ -634,6 +683,14 @@ func (UnimplementedCIServiceHandler) GetRunMetrics(context.Context, *connect.Req return nil, connect.NewError(connect.CodeUnimplemented, errors.New("depot.ci.v1.CIService.GetRunMetrics is not implemented")) } +func (UnimplementedCIServiceHandler) GetJobAttemptSummary(context.Context, *connect.Request[v1.GetJobAttemptSummaryRequest]) (*connect.Response[v1.GetJobSummaryResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("depot.ci.v1.CIService.GetJobAttemptSummary is not implemented")) +} + +func (UnimplementedCIServiceHandler) GetJobSummary(context.Context, *connect.Request[v1.GetJobSummaryRequest]) (*connect.Response[v1.GetJobSummaryResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("depot.ci.v1.CIService.GetJobSummary is not implemented")) +} + func (UnimplementedCIServiceHandler) GetJobAttemptLogs(context.Context, *connect.Request[v1.GetJobAttemptLogsRequest]) (*connect.Response[v1.GetJobAttemptLogsResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("depot.ci.v1.CIService.GetJobAttemptLogs is not implemented")) } diff --git a/proto/depot/ci/v1/ci.proto b/proto/depot/ci/v1/ci.proto index 652a1f83..1b046d39 100644 --- a/proto/depot/ci/v1/ci.proto +++ b/proto/depot/ci/v1/ci.proto @@ -47,6 +47,12 @@ service CIService { // GetRunMetrics returns workflow/job/attempt CPU and memory metric summaries for one run rpc GetRunMetrics(GetRunMetricsRequest) returns (GetRunMetricsResponse) {} + // GetJobAttemptSummary returns authored step summary markdown for one concrete job attempt + rpc GetJobAttemptSummary(GetJobAttemptSummaryRequest) returns (GetJobSummaryResponse) {} + + // GetJobSummary resolves one job to its current/latest attempt and returns authored step summary markdown + rpc GetJobSummary(GetJobSummaryRequest) returns (GetJobSummaryResponse) {} + // GetJobAttemptLogs returns log lines for a job attempt rpc GetJobAttemptLogs(GetJobAttemptLogsRequest) returns (GetJobAttemptLogsResponse) {} @@ -563,6 +569,36 @@ message CIMetricsCapMetadata { string downsample_strategy = 5; } +// GetJobSummary messages + +message GetJobAttemptSummaryRequest { + // attempt_id identifies the job attempt whose authored summary markdown to fetch + string attempt_id = 1; +} + +message GetJobSummaryRequest { + // job_id identifies the job whose current/latest attempt summary markdown to fetch + string job_id = 1; +} + +message GetJobSummaryResponse { + string org_id = 1; + string run_id = 2; + string workflow_id = 3; + string job_id = 4; + string attempt_id = 5; + int32 attempt = 6; + string job_status = 7; + string attempt_status = 8; + bool has_summary = 9; + // empty_reason is set when has_summary is false, e.g. "no_summary" or "no_attempt". + string empty_reason = 10; + // step_count counts non-empty step summaries included in markdown. + uint32 step_count = 11; + // markdown contains the authored step summary markdown joined in step order. + string markdown = 12; +} + // GetJobAttemptLogs messages message GetJobAttemptLogsRequest { From d6be8facb392a2c729151758f06f325b38da64ec Mon Sep 17 00:00:00 2001 From: Andrew Watkins Date: Thu, 7 May 2026 11:48:29 -0500 Subject: [PATCH 2/4] fix(ci): add json output for summaries --- pkg/cmd/ci/summary.go | 62 ++++++++++++++++++++- pkg/cmd/ci/summary_test.go | 108 +++++++++++++++++++++++++++++++++++++ 2 files changed, 168 insertions(+), 2 deletions(-) diff --git a/pkg/cmd/ci/summary.go b/pkg/cmd/ci/summary.go index fa1200a6..68818cf9 100644 --- a/pkg/cmd/ci/summary.go +++ b/pkg/cmd/ci/summary.go @@ -20,15 +20,22 @@ var ( func NewCmdSummary() *cobra.Command { var ( - orgID string - token string + orgID string + token string + output string ) cmd := &cobra.Command{ Use: "summary ", Short: "Fetch CI step summary markdown", Long: "Fetch authored CI step summary markdown for one job attempt or the current/latest attempt of one job.", + Example: ` depot ci summary + depot ci summary + depot ci summary --output json`, RunE: func(cmd *cobra.Command, args []string) error { + if err := validateSummaryOutput(output); err != nil { + return err + } if len(args) == 0 { return cmd.Help() } @@ -53,6 +60,9 @@ func NewCmdSummary() *cobra.Command { resp, attemptErr := ciGetJobAttemptSummary(ctx, tokenVal, orgID, id) if attemptErr == nil { + if summaryOutputJSON(output) { + return writeJSON(buildSummaryJSON(resp)) + } return printSummaryResponse(cmd.OutOrStdout(), resp) } if connect.CodeOf(attemptErr) != connect.CodeNotFound { @@ -72,6 +82,10 @@ func NewCmdSummary() *cobra.Command { return fmt.Errorf("failed to get job summary: %w", jobErr) } + if summaryOutputJSON(output) { + return writeJSON(buildSummaryJSON(resp)) + } + if resp.GetAttemptId() != "" { fmt.Fprintf(cmd.ErrOrStderr(), "Using attempt #%d %s for job %s.\n", resp.GetAttempt(), resp.GetAttemptId(), resp.GetJobId()) } @@ -81,10 +95,43 @@ func NewCmdSummary() *cobra.Command { cmd.Flags().StringVar(&orgID, "org", "", "Organization ID (required when user is a member of multiple organizations)") cmd.Flags().StringVar(&token, "token", "", "Depot API token") + cmd.Flags().StringVarP(&output, "output", "o", "", "Output format (text, json)") return cmd } +type summaryJSONDocument struct { + OrgID string `json:"org_id"` + RunID string `json:"run_id"` + WorkflowID string `json:"workflow_id"` + JobID string `json:"job_id"` + AttemptID string `json:"attempt_id"` + Attempt int32 `json:"attempt"` + JobStatus string `json:"job_status"` + AttemptStatus string `json:"attempt_status"` + HasSummary bool `json:"has_summary"` + EmptyReason string `json:"empty_reason"` + StepCount uint32 `json:"step_count"` + Markdown string `json:"markdown"` +} + +func buildSummaryJSON(resp *civ1.GetJobSummaryResponse) summaryJSONDocument { + return summaryJSONDocument{ + OrgID: resp.GetOrgId(), + RunID: resp.GetRunId(), + WorkflowID: resp.GetWorkflowId(), + JobID: resp.GetJobId(), + AttemptID: resp.GetAttemptId(), + Attempt: resp.GetAttempt(), + JobStatus: resp.GetJobStatus(), + AttemptStatus: resp.GetAttemptStatus(), + HasSummary: resp.GetHasSummary(), + EmptyReason: resp.GetEmptyReason(), + StepCount: resp.GetStepCount(), + Markdown: resp.GetMarkdown(), + } +} + func printSummaryResponse(w io.Writer, resp *civ1.GetJobSummaryResponse) error { if resp.GetHasSummary() { fmt.Fprint(w, resp.GetMarkdown()) @@ -109,3 +156,14 @@ func emptySummaryMessage(resp *civ1.GetJobSummaryResponse) string { return "No CI step summary was produced." } } + +func validateSummaryOutput(output string) error { + if output == "" || output == "text" || output == "json" { + return nil + } + return fmt.Errorf("unsupported output %q (valid: text, json)", output) +} + +func summaryOutputJSON(output string) bool { + return output == "json" +} diff --git a/pkg/cmd/ci/summary_test.go b/pkg/cmd/ci/summary_test.go index b5e7afef..b8cad14f 100644 --- a/pkg/cmd/ci/summary_test.go +++ b/pkg/cmd/ci/summary_test.go @@ -3,7 +3,9 @@ package ci import ( "bytes" "context" + "encoding/json" "errors" + "io" "strings" "testing" @@ -39,6 +41,39 @@ func TestSummaryAttemptPrintsMarkdownOnlyToStdout(t *testing.T) { } } +func TestSummaryAttemptJSONOutput(t *testing.T) { + restoreSummaryAPIs(t) + + ciGetJobAttemptSummary = func(ctx context.Context, token, orgID, attemptID string) (*civ1.GetJobSummaryResponse, error) { + return summaryResponse(attemptID, "job-1", "## Build\n\nok"), nil + } + ciGetJobSummary = func(ctx context.Context, token, orgID, jobID string) (*civ1.GetJobSummaryResponse, error) { + t.Fatal("job summary should not be called for a resolved attempt") + return nil, nil + } + + cmd := NewCmdSummary() + cmd.SetArgs([]string{"--org", "org-123", "--token", "token-123", "--output", "json", "attempt-1"}) + cmd.SetOut(io.Discard) + cmd.SetErr(io.Discard) + + stdout, err := captureStdout(t, cmd.Execute) + if err != nil { + t.Fatal(err) + } + + var got summaryJSONDocument + if err := json.Unmarshal([]byte(stdout), &got); err != nil { + t.Fatalf("invalid JSON output: %v\n%s", err, stdout) + } + if got.AttemptID != "attempt-1" || got.JobID != "job-1" || !got.HasSummary || got.Markdown != "## Build\n\nok" { + t.Fatalf("unexpected JSON document: %+v", got) + } + if got.StepCount != 1 { + t.Fatalf("step_count = %d, want 1", got.StepCount) + } +} + func TestSummaryFallsBackToJobOnAttemptNotFound(t *testing.T) { restoreSummaryAPIs(t) @@ -122,6 +157,56 @@ func TestSummaryNoAttemptJobIsNonError(t *testing.T) { } } +func TestSummaryJSONJobFallbackEmptyIncludesResolvedAttempt(t *testing.T) { + restoreSummaryAPIs(t) + + ciGetJobAttemptSummary = func(ctx context.Context, token, orgID, attemptID string) (*civ1.GetJobSummaryResponse, error) { + return nil, connect.NewError(connect.CodeNotFound, errors.New("attempt not found")) + } + ciGetJobSummary = func(ctx context.Context, token, orgID, jobID string) (*civ1.GetJobSummaryResponse, error) { + return &civ1.GetJobSummaryResponse{ + OrgId: "org-123", + RunId: "run-1", + WorkflowId: "workflow-1", + JobId: jobID, + AttemptId: "attempt-1", + Attempt: 1, + JobStatus: "finished", + AttemptStatus: "finished", + HasSummary: false, + EmptyReason: "no_summary", + }, nil + } + + var stderr bytes.Buffer + cmd := NewCmdSummary() + cmd.SetArgs([]string{"--org", "org-123", "--token", "token-123", "--output", "json", "job-1"}) + cmd.SetOut(io.Discard) + cmd.SetErr(&stderr) + + stdout, err := captureStdout(t, cmd.Execute) + if err != nil { + t.Fatal(err) + } + if stderr.String() != "" { + t.Fatalf("stderr = %q, want empty for json output", stderr.String()) + } + + var got map[string]any + if err := json.Unmarshal([]byte(stdout), &got); err != nil { + t.Fatalf("invalid JSON output: %v\n%s", err, stdout) + } + if got["job_id"] != "job-1" || got["attempt_id"] != "attempt-1" || got["empty_reason"] != "no_summary" { + t.Fatalf("unexpected JSON document: %+v", got) + } + if got["has_summary"] != false { + t.Fatalf("has_summary = %#v, want false", got["has_summary"]) + } + if got["step_count"] != float64(0) { + t.Fatalf("step_count = %#v, want 0", got["step_count"]) + } +} + func TestSummaryBothNotFoundNamesUnresolvedID(t *testing.T) { restoreSummaryAPIs(t) @@ -159,6 +244,29 @@ func TestSummaryAttemptUnavailableDoesNotFallBackToJob(t *testing.T) { } } +func TestSummaryRejectsUnsupportedOutputBeforeAuth(t *testing.T) { + restoreSummaryAPIs(t) + + ciGetJobAttemptSummary = func(ctx context.Context, token, orgID, attemptID string) (*civ1.GetJobSummaryResponse, error) { + t.Fatal("attempt summary should not be called for invalid output") + return nil, nil + } + ciGetJobSummary = func(ctx context.Context, token, orgID, jobID string) (*civ1.GetJobSummaryResponse, error) { + t.Fatal("job summary should not be called for invalid output") + return nil, nil + } + + cmd := NewCmdSummary() + cmd.SetArgs([]string{"--output", "yaml", "attempt-1"}) + cmd.SetOut(io.Discard) + cmd.SetErr(io.Discard) + + err := cmd.Execute() + if err == nil || !strings.Contains(err.Error(), `unsupported output "yaml"`) { + t.Fatalf("err = %v", err) + } +} + func executeSummaryCommand(id string) (string, string, error) { var stdout bytes.Buffer var stderr bytes.Buffer From 2488b5728f602977b236db4c8c190e14023c3dc2 Mon Sep 17 00:00:00 2001 From: Andrew Watkins Date: Thu, 7 May 2026 13:52:46 -0500 Subject: [PATCH 3/4] fix(ci): simplify summary resolution --- pkg/api/ci.go | 16 +- pkg/api/ci_test.go | 32 +- pkg/cmd/ci/metrics.go | 19 +- pkg/cmd/ci/output.go | 17 + pkg/cmd/ci/summary.go | 43 +- pkg/cmd/ci/summary_test.go | 112 +- pkg/proto/depot/ci/v1/ci.pb.go | 1019 ++++++++--------- .../depot/ci/v1/civ1connect/ci.connect.go | 33 +- proto/depot/ci/v1/ci.proto | 12 +- 9 files changed, 595 insertions(+), 708 deletions(-) diff --git a/pkg/api/ci.go b/pkg/api/ci.go index e5025c9d..340d34bb 100644 --- a/pkg/api/ci.go +++ b/pkg/api/ci.go @@ -92,20 +92,10 @@ func CIGetRunMetrics(ctx context.Context, token, orgID, runID string) (*civ1.Get return resp.Msg, nil } -// CIGetJobAttemptSummary returns authored step summary markdown for a job attempt. -func CIGetJobAttemptSummary(ctx context.Context, token, orgID, attemptID string) (*civ1.GetJobSummaryResponse, error) { +// CIGetJobSummary returns authored step summary markdown for a job, a concrete attempt, or both. +func CIGetJobSummary(ctx context.Context, token, orgID string, req *civ1.GetJobSummaryRequest) (*civ1.GetJobSummaryResponse, error) { client := newCIServiceClient() - resp, err := client.GetJobAttemptSummary(ctx, WithAuthenticationAndOrg(connect.NewRequest(&civ1.GetJobAttemptSummaryRequest{AttemptId: attemptID}), token, orgID)) - if err != nil { - return nil, err - } - return resp.Msg, nil -} - -// CIGetJobSummary returns authored step summary markdown for the current/latest attempt of a job. -func CIGetJobSummary(ctx context.Context, token, orgID, jobID string) (*civ1.GetJobSummaryResponse, error) { - client := newCIServiceClient() - resp, err := client.GetJobSummary(ctx, WithAuthenticationAndOrg(connect.NewRequest(&civ1.GetJobSummaryRequest{JobId: jobID}), token, orgID)) + resp, err := client.GetJobSummary(ctx, WithAuthenticationAndOrg(connect.NewRequest(req), token, orgID)) if err != nil { return nil, err } diff --git a/pkg/api/ci_test.go b/pkg/api/ci_test.go index 266d5b54..abddef7a 100644 --- a/pkg/api/ci_test.go +++ b/pkg/api/ci_test.go @@ -104,16 +104,14 @@ func (h ciServiceTestHandler) GetRunMetrics(_ context.Context, req *connect.Requ return connect.NewResponse(&civ1.GetRunMetricsResponse{SnapshotAt: "2026-05-03T12:00:00Z"}), nil } -func (h ciServiceTestHandler) GetJobAttemptSummary(_ context.Context, req *connect.Request[civ1.GetJobAttemptSummaryRequest]) (*connect.Response[civ1.GetJobSummaryResponse], error) { - assertAuthAndOrg(h.t, req.Header()) - if req.Msg.AttemptId != "attempt-123" { - h.t.Fatalf("AttemptId = %q, want attempt-123", req.Msg.AttemptId) - } - return connect.NewResponse(&civ1.GetJobSummaryResponse{AttemptId: req.Msg.AttemptId, HasSummary: true, Markdown: "attempt summary"}), nil -} - func (h ciServiceTestHandler) GetJobSummary(_ context.Context, req *connect.Request[civ1.GetJobSummaryRequest]) (*connect.Response[civ1.GetJobSummaryResponse], error) { assertAuthAndOrg(h.t, req.Header()) + if req.Msg.AttemptId != "" { + if req.Msg.AttemptId != "attempt-123" { + h.t.Fatalf("AttemptId = %q, want attempt-123", req.Msg.AttemptId) + } + return connect.NewResponse(&civ1.GetJobSummaryResponse{AttemptId: req.Msg.AttemptId, HasSummary: true, Markdown: "attempt summary"}), nil + } if req.Msg.JobId != "job-123" { h.t.Fatalf("JobId = %q, want job-123", req.Msg.JobId) } @@ -206,17 +204,27 @@ func TestCIMetricsWrappers(t *testing.T) { func TestCISummaryWrappers(t *testing.T) { withTestCIService(t, func() { - attemptResp, err := CIGetJobAttemptSummary(context.Background(), "token-123", "org-123", "attempt-123") + attemptResp, err := CIGetJobSummary( + context.Background(), + "token-123", + "org-123", + &civ1.GetJobSummaryRequest{AttemptId: "attempt-123"}, + ) if err != nil { - t.Fatalf("CIGetJobAttemptSummary returned error: %v", err) + t.Fatalf("CIGetJobSummary attempt request returned error: %v", err) } if attemptResp.GetMarkdown() != "attempt summary" { t.Fatalf("unexpected attempt summary: %+v", attemptResp) } - jobResp, err := CIGetJobSummary(context.Background(), "token-123", "org-123", "job-123") + jobResp, err := CIGetJobSummary( + context.Background(), + "token-123", + "org-123", + &civ1.GetJobSummaryRequest{JobId: "job-123"}, + ) if err != nil { - t.Fatalf("CIGetJobSummary returned error: %v", err) + t.Fatalf("CIGetJobSummary job request returned error: %v", err) } if jobResp.GetAttemptId() != "attempt-456" || jobResp.GetMarkdown() != "job summary" { t.Fatalf("unexpected job summary: %+v", jobResp) diff --git a/pkg/cmd/ci/metrics.go b/pkg/cmd/ci/metrics.go index a623a6e6..1e27e860 100644 --- a/pkg/cmd/ci/metrics.go +++ b/pkg/cmd/ci/metrics.go @@ -38,7 +38,7 @@ func NewCmdMetrics() *cobra.Command { depot ci metrics --job job_123 --output json depot ci metrics --run run_123 --output json`, RunE: func(cmd *cobra.Command, args []string) error { - if err := validateMetricsOutput(output); err != nil { + if err := validateTextOrJSONOutput(output); err != nil { return err } if len(args) > 1 { @@ -84,7 +84,7 @@ func NewCmdMetrics() *cobra.Command { } return fmt.Errorf("failed to get job metrics: %w", err) } - if metricsOutputJSON(output) { + if outputIsJSON(output) { return writeJSON(buildJobMetricsJSON(resp)) } printJobMetrics(resp, orgFlag) @@ -96,7 +96,7 @@ func NewCmdMetrics() *cobra.Command { } return fmt.Errorf("failed to get run metrics: %w", err) } - if metricsOutputJSON(output) { + if outputIsJSON(output) { return writeJSON(buildRunMetricsJSON(resp)) } printRunMetrics(resp, orgFlag) @@ -108,7 +108,7 @@ func NewCmdMetrics() *cobra.Command { } return fmt.Errorf("failed to get attempt metrics: %w", err) } - if metricsOutputJSON(output) { + if outputIsJSON(output) { return writeJSON(buildAttemptMetricsJSON(resp)) } printAttemptMetrics(resp, orgFlag) @@ -451,17 +451,6 @@ func connectErrorText(err error) string { return "" } -func validateMetricsOutput(output string) error { - if output == "" || output == "text" || output == "json" { - return nil - } - return fmt.Errorf("unsupported output %q (valid: text, json)", output) -} - -func metricsOutputJSON(output string) bool { - return output == "json" -} - func countNonEmpty(values ...string) int { count := 0 for _, value := range values { diff --git a/pkg/cmd/ci/output.go b/pkg/cmd/ci/output.go index ec40e586..45752a94 100644 --- a/pkg/cmd/ci/output.go +++ b/pkg/cmd/ci/output.go @@ -2,9 +2,15 @@ package ci import ( "encoding/json" + "fmt" "os" ) +const ( + outputFormatText = "text" + outputFormatJSON = "json" +) + // writeJSON encodes v as indented JSON to stdout. Used by the `--output json` // path on `depot ci` verbs so every verb formats RPC responses identically. func writeJSON(v any) error { @@ -12,3 +18,14 @@ func writeJSON(v any) error { enc.SetIndent("", " ") return enc.Encode(v) } + +func validateTextOrJSONOutput(output string) error { + if output == "" || output == outputFormatText || output == outputFormatJSON { + return nil + } + return fmt.Errorf("unsupported output %q (valid: text, json)", output) +} + +func outputIsJSON(output string) bool { + return output == outputFormatJSON +} diff --git a/pkg/cmd/ci/summary.go b/pkg/cmd/ci/summary.go index 68818cf9..dcff97f4 100644 --- a/pkg/cmd/ci/summary.go +++ b/pkg/cmd/ci/summary.go @@ -14,8 +14,7 @@ import ( ) var ( - ciGetJobAttemptSummary = api.CIGetJobAttemptSummary - ciGetJobSummary = api.CIGetJobSummary + ciGetJobSummary = api.CIGetJobSummary ) func NewCmdSummary() *cobra.Command { @@ -33,7 +32,7 @@ func NewCmdSummary() *cobra.Command { depot ci summary depot ci summary --output json`, RunE: func(cmd *cobra.Command, args []string) error { - if err := validateSummaryOutput(output); err != nil { + if err := validateTextOrJSONOutput(output); err != nil { return err } if len(args) == 0 { @@ -58,20 +57,23 @@ func NewCmdSummary() *cobra.Command { return fmt.Errorf("missing API token, please run `depot login`") } - resp, attemptErr := ciGetJobAttemptSummary(ctx, tokenVal, orgID, id) - if attemptErr == nil { - if summaryOutputJSON(output) { + resp, jobErr := ciGetJobSummary(ctx, tokenVal, orgID, &civ1.GetJobSummaryRequest{JobId: id}) + if jobErr == nil { + if outputIsJSON(output) { return writeJSON(buildSummaryJSON(resp)) } + if resp.GetAttemptId() != "" { + fmt.Fprintf(cmd.ErrOrStderr(), "Using attempt #%d %s for job %s.\n", resp.GetAttempt(), resp.GetAttemptId(), resp.GetJobId()) + } return printSummaryResponse(cmd.OutOrStdout(), resp) } - if connect.CodeOf(attemptErr) != connect.CodeNotFound { - return fmt.Errorf("failed to get attempt summary: %w", attemptErr) + if connect.CodeOf(jobErr) != connect.CodeNotFound { + return fmt.Errorf("failed to get job summary: %w", jobErr) } - resp, jobErr := ciGetJobSummary(ctx, tokenVal, orgID, id) - if jobErr != nil { - if connect.CodeOf(jobErr) == connect.CodeNotFound { + resp, attemptErr := ciGetJobSummary(ctx, tokenVal, orgID, &civ1.GetJobSummaryRequest{AttemptId: id}) + if attemptErr != nil { + if connect.CodeOf(attemptErr) == connect.CodeNotFound { return fmt.Errorf( "could not resolve %q as an attempt or job ID:\n as attempt: %v\n as job: %v", id, @@ -79,16 +81,12 @@ func NewCmdSummary() *cobra.Command { jobErr, ) } - return fmt.Errorf("failed to get job summary: %w", jobErr) + return fmt.Errorf("failed to get attempt summary: %w", attemptErr) } - if summaryOutputJSON(output) { + if outputIsJSON(output) { return writeJSON(buildSummaryJSON(resp)) } - - if resp.GetAttemptId() != "" { - fmt.Fprintf(cmd.ErrOrStderr(), "Using attempt #%d %s for job %s.\n", resp.GetAttempt(), resp.GetAttemptId(), resp.GetJobId()) - } return printSummaryResponse(cmd.OutOrStdout(), resp) }, } @@ -156,14 +154,3 @@ func emptySummaryMessage(resp *civ1.GetJobSummaryResponse) string { return "No CI step summary was produced." } } - -func validateSummaryOutput(output string) error { - if output == "" || output == "text" || output == "json" { - return nil - } - return fmt.Errorf("unsupported output %q (valid: text, json)", output) -} - -func summaryOutputJSON(output string) bool { - return output == "json" -} diff --git a/pkg/cmd/ci/summary_test.go b/pkg/cmd/ci/summary_test.go index b8cad14f..54f5d355 100644 --- a/pkg/cmd/ci/summary_test.go +++ b/pkg/cmd/ci/summary_test.go @@ -17,14 +17,13 @@ func TestSummaryAttemptPrintsMarkdownOnlyToStdout(t *testing.T) { restoreSummaryAPIs(t) var capturedAttemptID string - ciGetJobAttemptSummary = func(ctx context.Context, token, orgID, attemptID string) (*civ1.GetJobSummaryResponse, error) { - capturedAttemptID = attemptID + ciGetJobSummary = func(ctx context.Context, token, orgID string, req *civ1.GetJobSummaryRequest) (*civ1.GetJobSummaryResponse, error) { + if req.GetJobId() != "" { + return nil, connect.NewError(connect.CodeNotFound, errors.New("job not found")) + } + capturedAttemptID = req.GetAttemptId() return summaryResponse("attempt-1", "job-1", "## Build\n\nok"), nil } - ciGetJobSummary = func(ctx context.Context, token, orgID, jobID string) (*civ1.GetJobSummaryResponse, error) { - t.Fatal("job summary should not be called for a resolved attempt") - return nil, nil - } stdout, stderr, err := executeSummaryCommand("attempt-1") if err != nil { @@ -44,12 +43,11 @@ func TestSummaryAttemptPrintsMarkdownOnlyToStdout(t *testing.T) { func TestSummaryAttemptJSONOutput(t *testing.T) { restoreSummaryAPIs(t) - ciGetJobAttemptSummary = func(ctx context.Context, token, orgID, attemptID string) (*civ1.GetJobSummaryResponse, error) { - return summaryResponse(attemptID, "job-1", "## Build\n\nok"), nil - } - ciGetJobSummary = func(ctx context.Context, token, orgID, jobID string) (*civ1.GetJobSummaryResponse, error) { - t.Fatal("job summary should not be called for a resolved attempt") - return nil, nil + ciGetJobSummary = func(ctx context.Context, token, orgID string, req *civ1.GetJobSummaryRequest) (*civ1.GetJobSummaryResponse, error) { + if req.GetJobId() != "" { + return nil, connect.NewError(connect.CodeNotFound, errors.New("job not found")) + } + return summaryResponse(req.GetAttemptId(), "job-1", "## Build\n\nok"), nil } cmd := NewCmdSummary() @@ -74,15 +72,14 @@ func TestSummaryAttemptJSONOutput(t *testing.T) { } } -func TestSummaryFallsBackToJobOnAttemptNotFound(t *testing.T) { +func TestSummaryResolvesJobBeforeAttempt(t *testing.T) { restoreSummaryAPIs(t) - ciGetJobAttemptSummary = func(ctx context.Context, token, orgID, attemptID string) (*civ1.GetJobSummaryResponse, error) { - return nil, connect.NewError(connect.CodeNotFound, errors.New("attempt not found")) - } - ciGetJobSummary = func(ctx context.Context, token, orgID, jobID string) (*civ1.GetJobSummaryResponse, error) { - if jobID != "job-1" { - t.Fatalf("jobID = %q, want job-1", jobID) + var requests []string + ciGetJobSummary = func(ctx context.Context, token, orgID string, req *civ1.GetJobSummaryRequest) (*civ1.GetJobSummaryResponse, error) { + requests = append(requests, "job:"+req.GetJobId()+" attempt:"+req.GetAttemptId()) + if req.GetJobId() != "job-1" { + t.Fatalf("JobId = %q, want job-1", req.GetJobId()) } return summaryResponse("attempt-3", "job-1", "job markdown"), nil } @@ -94,6 +91,9 @@ func TestSummaryFallsBackToJobOnAttemptNotFound(t *testing.T) { if stdout != "job markdown\n" { t.Fatalf("stdout = %q", stdout) } + if strings.Join(requests, ",") != "job:job-1 attempt:" { + t.Fatalf("requests = %#v, want job lookup only", requests) + } if !strings.Contains(stderr, "Using attempt #3 attempt-3 for job job-1.") { t.Fatalf("stderr missing resolution note: %q", stderr) } @@ -102,9 +102,12 @@ func TestSummaryFallsBackToJobOnAttemptNotFound(t *testing.T) { func TestSummaryEmptyAttemptIsNonError(t *testing.T) { restoreSummaryAPIs(t) - ciGetJobAttemptSummary = func(ctx context.Context, token, orgID, attemptID string) (*civ1.GetJobSummaryResponse, error) { + ciGetJobSummary = func(ctx context.Context, token, orgID string, req *civ1.GetJobSummaryRequest) (*civ1.GetJobSummaryResponse, error) { + if req.GetJobId() != "" { + return nil, connect.NewError(connect.CodeNotFound, errors.New("job not found")) + } return &civ1.GetJobSummaryResponse{ - AttemptId: attemptID, + AttemptId: req.GetAttemptId(), JobId: "job-1", HasSummary: false, EmptyReason: "no_summary", @@ -113,11 +116,6 @@ func TestSummaryEmptyAttemptIsNonError(t *testing.T) { AttemptStatus: "finished", }, nil } - ciGetJobSummary = func(ctx context.Context, token, orgID, jobID string) (*civ1.GetJobSummaryResponse, error) { - t.Fatal("job summary should not be called for a resolved attempt") - return nil, nil - } - stdout, stderr, err := executeSummaryCommand("attempt-1") if err != nil { t.Fatal(err) @@ -133,12 +131,13 @@ func TestSummaryEmptyAttemptIsNonError(t *testing.T) { func TestSummaryNoAttemptJobIsNonError(t *testing.T) { restoreSummaryAPIs(t) - ciGetJobAttemptSummary = func(ctx context.Context, token, orgID, attemptID string) (*civ1.GetJobSummaryResponse, error) { - return nil, connect.NewError(connect.CodeNotFound, errors.New("attempt not found")) - } - ciGetJobSummary = func(ctx context.Context, token, orgID, jobID string) (*civ1.GetJobSummaryResponse, error) { + ciGetJobSummary = func(ctx context.Context, token, orgID string, req *civ1.GetJobSummaryRequest) (*civ1.GetJobSummaryResponse, error) { + if req.GetAttemptId() != "" { + t.Fatal("attempt lookup should not be called for a resolved job") + return nil, nil + } return &civ1.GetJobSummaryResponse{ - JobId: jobID, + JobId: req.GetJobId(), JobStatus: "queued", HasSummary: false, EmptyReason: "no_attempt", @@ -160,15 +159,16 @@ func TestSummaryNoAttemptJobIsNonError(t *testing.T) { func TestSummaryJSONJobFallbackEmptyIncludesResolvedAttempt(t *testing.T) { restoreSummaryAPIs(t) - ciGetJobAttemptSummary = func(ctx context.Context, token, orgID, attemptID string) (*civ1.GetJobSummaryResponse, error) { - return nil, connect.NewError(connect.CodeNotFound, errors.New("attempt not found")) - } - ciGetJobSummary = func(ctx context.Context, token, orgID, jobID string) (*civ1.GetJobSummaryResponse, error) { + ciGetJobSummary = func(ctx context.Context, token, orgID string, req *civ1.GetJobSummaryRequest) (*civ1.GetJobSummaryResponse, error) { + if req.GetAttemptId() != "" { + t.Fatal("attempt lookup should not be called for a resolved job") + return nil, nil + } return &civ1.GetJobSummaryResponse{ OrgId: "org-123", RunId: "run-1", WorkflowId: "workflow-1", - JobId: jobID, + JobId: req.GetJobId(), AttemptId: "attempt-1", Attempt: 1, JobStatus: "finished", @@ -210,12 +210,12 @@ func TestSummaryJSONJobFallbackEmptyIncludesResolvedAttempt(t *testing.T) { func TestSummaryBothNotFoundNamesUnresolvedID(t *testing.T) { restoreSummaryAPIs(t) - ciGetJobAttemptSummary = func(ctx context.Context, token, orgID, attemptID string) (*civ1.GetJobSummaryResponse, error) { + ciGetJobSummary = func(ctx context.Context, token, orgID string, req *civ1.GetJobSummaryRequest) (*civ1.GetJobSummaryResponse, error) { + if req.GetJobId() != "" { + return nil, connect.NewError(connect.CodeNotFound, errors.New("job not found")) + } return nil, connect.NewError(connect.CodeNotFound, errors.New("attempt not found")) } - ciGetJobSummary = func(ctx context.Context, token, orgID, jobID string) (*civ1.GetJobSummaryResponse, error) { - return nil, connect.NewError(connect.CodeNotFound, errors.New("job not found")) - } _, _, err := executeSummaryCommand("missing-id") if err == nil || !strings.Contains(err.Error(), `could not resolve "missing-id" as an attempt or job ID`) { @@ -223,36 +223,32 @@ func TestSummaryBothNotFoundNamesUnresolvedID(t *testing.T) { } } -func TestSummaryAttemptUnavailableDoesNotFallBackToJob(t *testing.T) { +func TestSummaryJobUnavailableDoesNotTryAttempt(t *testing.T) { restoreSummaryAPIs(t) - jobCalled := false - ciGetJobAttemptSummary = func(ctx context.Context, token, orgID, attemptID string) (*civ1.GetJobSummaryResponse, error) { + attemptCalled := false + ciGetJobSummary = func(ctx context.Context, token, orgID string, req *civ1.GetJobSummaryRequest) (*civ1.GetJobSummaryResponse, error) { + if req.GetAttemptId() != "" { + attemptCalled = true + return nil, nil + } return nil, connect.NewError(connect.CodeUnavailable, errors.New("storage unavailable")) } - ciGetJobSummary = func(ctx context.Context, token, orgID, jobID string) (*civ1.GetJobSummaryResponse, error) { - jobCalled = true - return nil, nil - } - _, _, err := executeSummaryCommand("attempt-1") - if err == nil || !strings.Contains(err.Error(), "failed to get attempt summary") { + _, _, err := executeSummaryCommand("job-1") + if err == nil || !strings.Contains(err.Error(), "failed to get job summary") { t.Fatalf("err = %v", err) } - if jobCalled { - t.Fatal("job fallback should not run on unavailable attempt lookup") + if attemptCalled { + t.Fatal("attempt lookup should not run on unavailable job lookup") } } func TestSummaryRejectsUnsupportedOutputBeforeAuth(t *testing.T) { restoreSummaryAPIs(t) - ciGetJobAttemptSummary = func(ctx context.Context, token, orgID, attemptID string) (*civ1.GetJobSummaryResponse, error) { - t.Fatal("attempt summary should not be called for invalid output") - return nil, nil - } - ciGetJobSummary = func(ctx context.Context, token, orgID, jobID string) (*civ1.GetJobSummaryResponse, error) { - t.Fatal("job summary should not be called for invalid output") + ciGetJobSummary = func(ctx context.Context, token, orgID string, req *civ1.GetJobSummaryRequest) (*civ1.GetJobSummaryResponse, error) { + t.Fatal("summary API should not be called for invalid output") return nil, nil } @@ -281,10 +277,8 @@ func executeSummaryCommand(id string) (string, string, error) { func restoreSummaryAPIs(t *testing.T) { t.Helper() - originalGetAttemptSummary := ciGetJobAttemptSummary originalGetJobSummary := ciGetJobSummary t.Cleanup(func() { - ciGetJobAttemptSummary = originalGetAttemptSummary ciGetJobSummary = originalGetJobSummary }) } diff --git a/pkg/proto/depot/ci/v1/ci.pb.go b/pkg/proto/depot/ci/v1/ci.pb.go index f6a68226..51ae9b3b 100644 --- a/pkg/proto/depot/ci/v1/ci.pb.go +++ b/pkg/proto/depot/ci/v1/ci.pb.go @@ -4004,54 +4004,6 @@ func (x *CIMetricsCapMetadata) GetDownsampleStrategy() string { return "" } -type GetJobAttemptSummaryRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // attempt_id identifies the job attempt whose authored summary markdown to fetch - AttemptId string `protobuf:"bytes,1,opt,name=attempt_id,json=attemptId,proto3" json:"attempt_id,omitempty"` -} - -func (x *GetJobAttemptSummaryRequest) Reset() { - *x = GetJobAttemptSummaryRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[53] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetJobAttemptSummaryRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetJobAttemptSummaryRequest) ProtoMessage() {} - -func (x *GetJobAttemptSummaryRequest) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[53] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetJobAttemptSummaryRequest.ProtoReflect.Descriptor instead. -func (*GetJobAttemptSummaryRequest) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{53} -} - -func (x *GetJobAttemptSummaryRequest) GetAttemptId() string { - if x != nil { - return x.AttemptId - } - return "" -} - type GetJobSummaryRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4059,12 +4011,14 @@ type GetJobSummaryRequest struct { // job_id identifies the job whose current/latest attempt summary markdown to fetch JobId string `protobuf:"bytes,1,opt,name=job_id,json=jobId,proto3" json:"job_id,omitempty"` + // attempt_id identifies one concrete job attempt summary to fetch, optionally scoped by job_id + AttemptId string `protobuf:"bytes,2,opt,name=attempt_id,json=attemptId,proto3" json:"attempt_id,omitempty"` } func (x *GetJobSummaryRequest) Reset() { *x = GetJobSummaryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[54] + mi := &file_depot_ci_v1_ci_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4077,7 +4031,7 @@ func (x *GetJobSummaryRequest) String() string { func (*GetJobSummaryRequest) ProtoMessage() {} func (x *GetJobSummaryRequest) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[54] + mi := &file_depot_ci_v1_ci_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4090,7 +4044,7 @@ func (x *GetJobSummaryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetJobSummaryRequest.ProtoReflect.Descriptor instead. func (*GetJobSummaryRequest) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{54} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{53} } func (x *GetJobSummaryRequest) GetJobId() string { @@ -4100,6 +4054,13 @@ func (x *GetJobSummaryRequest) GetJobId() string { return "" } +func (x *GetJobSummaryRequest) GetAttemptId() string { + if x != nil { + return x.AttemptId + } + return "" +} + type GetJobSummaryResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4125,7 +4086,7 @@ type GetJobSummaryResponse struct { func (x *GetJobSummaryResponse) Reset() { *x = GetJobSummaryResponse{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[55] + mi := &file_depot_ci_v1_ci_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4138,7 +4099,7 @@ func (x *GetJobSummaryResponse) String() string { func (*GetJobSummaryResponse) ProtoMessage() {} func (x *GetJobSummaryResponse) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[55] + mi := &file_depot_ci_v1_ci_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4151,7 +4112,7 @@ func (x *GetJobSummaryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetJobSummaryResponse.ProtoReflect.Descriptor instead. func (*GetJobSummaryResponse) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{55} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{54} } func (x *GetJobSummaryResponse) GetOrgId() string { @@ -4252,7 +4213,7 @@ type GetJobAttemptLogsRequest struct { func (x *GetJobAttemptLogsRequest) Reset() { *x = GetJobAttemptLogsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[56] + mi := &file_depot_ci_v1_ci_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4265,7 +4226,7 @@ func (x *GetJobAttemptLogsRequest) String() string { func (*GetJobAttemptLogsRequest) ProtoMessage() {} func (x *GetJobAttemptLogsRequest) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[56] + mi := &file_depot_ci_v1_ci_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4278,7 +4239,7 @@ func (x *GetJobAttemptLogsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetJobAttemptLogsRequest.ProtoReflect.Descriptor instead. func (*GetJobAttemptLogsRequest) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{56} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{55} } func (x *GetJobAttemptLogsRequest) GetAttemptId() string { @@ -4308,7 +4269,7 @@ type GetJobAttemptLogsResponse struct { func (x *GetJobAttemptLogsResponse) Reset() { *x = GetJobAttemptLogsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[57] + mi := &file_depot_ci_v1_ci_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4321,7 +4282,7 @@ func (x *GetJobAttemptLogsResponse) String() string { func (*GetJobAttemptLogsResponse) ProtoMessage() {} func (x *GetJobAttemptLogsResponse) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[57] + mi := &file_depot_ci_v1_ci_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4334,7 +4295,7 @@ func (x *GetJobAttemptLogsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetJobAttemptLogsResponse.ProtoReflect.Descriptor instead. func (*GetJobAttemptLogsResponse) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{57} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{56} } func (x *GetJobAttemptLogsResponse) GetLines() []*LogLine { @@ -4370,7 +4331,7 @@ type StreamJobAttemptLogsRequest struct { func (x *StreamJobAttemptLogsRequest) Reset() { *x = StreamJobAttemptLogsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[58] + mi := &file_depot_ci_v1_ci_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4383,7 +4344,7 @@ func (x *StreamJobAttemptLogsRequest) String() string { func (*StreamJobAttemptLogsRequest) ProtoMessage() {} func (x *StreamJobAttemptLogsRequest) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[58] + mi := &file_depot_ci_v1_ci_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4396,7 +4357,7 @@ func (x *StreamJobAttemptLogsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StreamJobAttemptLogsRequest.ProtoReflect.Descriptor instead. func (*StreamJobAttemptLogsRequest) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{58} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{57} } func (x *StreamJobAttemptLogsRequest) GetAttemptId() string { @@ -4438,7 +4399,7 @@ type StreamJobAttemptLogsResponse struct { func (x *StreamJobAttemptLogsResponse) Reset() { *x = StreamJobAttemptLogsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[59] + mi := &file_depot_ci_v1_ci_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4451,7 +4412,7 @@ func (x *StreamJobAttemptLogsResponse) String() string { func (*StreamJobAttemptLogsResponse) ProtoMessage() {} func (x *StreamJobAttemptLogsResponse) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[59] + mi := &file_depot_ci_v1_ci_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4464,7 +4425,7 @@ func (x *StreamJobAttemptLogsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StreamJobAttemptLogsResponse.ProtoReflect.Descriptor instead. func (*StreamJobAttemptLogsResponse) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{59} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{58} } func (x *StreamJobAttemptLogsResponse) GetLine() *LogLine { @@ -4506,7 +4467,7 @@ type ExportJobAttemptLogsRequest struct { func (x *ExportJobAttemptLogsRequest) Reset() { *x = ExportJobAttemptLogsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[60] + mi := &file_depot_ci_v1_ci_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4519,7 +4480,7 @@ func (x *ExportJobAttemptLogsRequest) String() string { func (*ExportJobAttemptLogsRequest) ProtoMessage() {} func (x *ExportJobAttemptLogsRequest) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[60] + mi := &file_depot_ci_v1_ci_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4532,7 +4493,7 @@ func (x *ExportJobAttemptLogsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExportJobAttemptLogsRequest.ProtoReflect.Descriptor instead. func (*ExportJobAttemptLogsRequest) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{60} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{59} } func (x *ExportJobAttemptLogsRequest) GetAttemptId() string { @@ -4577,7 +4538,7 @@ type JobAttemptLogExportMetadata struct { func (x *JobAttemptLogExportMetadata) Reset() { *x = JobAttemptLogExportMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[61] + mi := &file_depot_ci_v1_ci_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4590,7 +4551,7 @@ func (x *JobAttemptLogExportMetadata) String() string { func (*JobAttemptLogExportMetadata) ProtoMessage() {} func (x *JobAttemptLogExportMetadata) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[61] + mi := &file_depot_ci_v1_ci_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4603,7 +4564,7 @@ func (x *JobAttemptLogExportMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use JobAttemptLogExportMetadata.ProtoReflect.Descriptor instead. func (*JobAttemptLogExportMetadata) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{61} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{60} } func (x *JobAttemptLogExportMetadata) GetFilename() string { @@ -4642,7 +4603,7 @@ type ExportJobAttemptLogsResponse struct { func (x *ExportJobAttemptLogsResponse) Reset() { *x = ExportJobAttemptLogsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[62] + mi := &file_depot_ci_v1_ci_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4655,7 +4616,7 @@ func (x *ExportJobAttemptLogsResponse) String() string { func (*ExportJobAttemptLogsResponse) ProtoMessage() {} func (x *ExportJobAttemptLogsResponse) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[62] + mi := &file_depot_ci_v1_ci_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4668,7 +4629,7 @@ func (x *ExportJobAttemptLogsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ExportJobAttemptLogsResponse.ProtoReflect.Descriptor instead. func (*ExportJobAttemptLogsResponse) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{62} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{61} } func (m *ExportJobAttemptLogsResponse) GetEvent() isExportJobAttemptLogsResponse_Event { @@ -4737,7 +4698,7 @@ type LogLine struct { func (x *LogLine) Reset() { *x = LogLine{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[63] + mi := &file_depot_ci_v1_ci_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4750,7 +4711,7 @@ func (x *LogLine) String() string { func (*LogLine) ProtoMessage() {} func (x *LogLine) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[63] + mi := &file_depot_ci_v1_ci_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4763,7 +4724,7 @@ func (x *LogLine) ProtoReflect() protoreflect.Message { // Deprecated: Use LogLine.ProtoReflect.Descriptor instead. func (*LogLine) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{63} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{62} } func (x *LogLine) GetStepKey() string { @@ -4840,7 +4801,7 @@ type ListRunsRequest struct { func (x *ListRunsRequest) Reset() { *x = ListRunsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[64] + mi := &file_depot_ci_v1_ci_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4853,7 +4814,7 @@ func (x *ListRunsRequest) String() string { func (*ListRunsRequest) ProtoMessage() {} func (x *ListRunsRequest) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[64] + mi := &file_depot_ci_v1_ci_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4866,7 +4827,7 @@ func (x *ListRunsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRunsRequest.ProtoReflect.Descriptor instead. func (*ListRunsRequest) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{64} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{63} } func (x *ListRunsRequest) GetStatus() []string { @@ -4930,7 +4891,7 @@ type ListRunsResponse struct { func (x *ListRunsResponse) Reset() { *x = ListRunsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[65] + mi := &file_depot_ci_v1_ci_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4943,7 +4904,7 @@ func (x *ListRunsResponse) String() string { func (*ListRunsResponse) ProtoMessage() {} func (x *ListRunsResponse) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[65] + mi := &file_depot_ci_v1_ci_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4956,7 +4917,7 @@ func (x *ListRunsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRunsResponse.ProtoReflect.Descriptor instead. func (*ListRunsResponse) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{65} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{64} } func (x *ListRunsResponse) GetRuns() []*ListRunsResponseRun { @@ -4992,7 +4953,7 @@ type ListRunsResponseRun struct { func (x *ListRunsResponseRun) Reset() { *x = ListRunsResponseRun{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[66] + mi := &file_depot_ci_v1_ci_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5005,7 +4966,7 @@ func (x *ListRunsResponseRun) String() string { func (*ListRunsResponseRun) ProtoMessage() {} func (x *ListRunsResponseRun) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[66] + mi := &file_depot_ci_v1_ci_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5018,7 +4979,7 @@ func (x *ListRunsResponseRun) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRunsResponseRun.ProtoReflect.Descriptor instead. func (*ListRunsResponseRun) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{66} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{65} } func (x *ListRunsResponseRun) GetRunId() string { @@ -5101,7 +5062,7 @@ type ListWorkflowsRequest struct { func (x *ListWorkflowsRequest) Reset() { *x = ListWorkflowsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[67] + mi := &file_depot_ci_v1_ci_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5114,7 +5075,7 @@ func (x *ListWorkflowsRequest) String() string { func (*ListWorkflowsRequest) ProtoMessage() {} func (x *ListWorkflowsRequest) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[67] + mi := &file_depot_ci_v1_ci_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5127,7 +5088,7 @@ func (x *ListWorkflowsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWorkflowsRequest.ProtoReflect.Descriptor instead. func (*ListWorkflowsRequest) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{67} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{66} } func (x *ListWorkflowsRequest) GetPageSize() int32 { @@ -5190,7 +5151,7 @@ type ListWorkflowsResponse struct { func (x *ListWorkflowsResponse) Reset() { *x = ListWorkflowsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[68] + mi := &file_depot_ci_v1_ci_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5203,7 +5164,7 @@ func (x *ListWorkflowsResponse) String() string { func (*ListWorkflowsResponse) ProtoMessage() {} func (x *ListWorkflowsResponse) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[68] + mi := &file_depot_ci_v1_ci_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5216,7 +5177,7 @@ func (x *ListWorkflowsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWorkflowsResponse.ProtoReflect.Descriptor instead. func (*ListWorkflowsResponse) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{68} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{67} } func (x *ListWorkflowsResponse) GetWorkflows() []*ListWorkflowsResponseWorkflow { @@ -5248,7 +5209,7 @@ type ListWorkflowsResponseWorkflow struct { func (x *ListWorkflowsResponseWorkflow) Reset() { *x = ListWorkflowsResponseWorkflow{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[69] + mi := &file_depot_ci_v1_ci_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5261,7 +5222,7 @@ func (x *ListWorkflowsResponseWorkflow) String() string { func (*ListWorkflowsResponseWorkflow) ProtoMessage() {} func (x *ListWorkflowsResponseWorkflow) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[69] + mi := &file_depot_ci_v1_ci_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5274,7 +5235,7 @@ func (x *ListWorkflowsResponseWorkflow) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWorkflowsResponseWorkflow.ProtoReflect.Descriptor instead. func (*ListWorkflowsResponseWorkflow) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{69} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{68} } func (x *ListWorkflowsResponseWorkflow) GetWorkflowId() string { @@ -5372,7 +5333,7 @@ type ListWorkflowsResponseJobCounts struct { func (x *ListWorkflowsResponseJobCounts) Reset() { *x = ListWorkflowsResponseJobCounts{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[70] + mi := &file_depot_ci_v1_ci_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5385,7 +5346,7 @@ func (x *ListWorkflowsResponseJobCounts) String() string { func (*ListWorkflowsResponseJobCounts) ProtoMessage() {} func (x *ListWorkflowsResponseJobCounts) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[70] + mi := &file_depot_ci_v1_ci_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5398,7 +5359,7 @@ func (x *ListWorkflowsResponseJobCounts) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWorkflowsResponseJobCounts.ProtoReflect.Descriptor instead. func (*ListWorkflowsResponseJobCounts) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{70} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{69} } func (x *ListWorkflowsResponseJobCounts) GetTotal() int32 { @@ -6044,366 +6005,357 @@ var file_depot_ci_v1_ci_proto_rawDesc = []byte{ 0x64, 0x12, 0x2f, 0x0a, 0x13, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, - 0x67, 0x79, 0x22, 0x3c, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, - 0x6d, 0x70, 0x74, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, - 0x22, 0x2d, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, - 0xfb, 0x02, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, 0x67, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, - 0x12, 0x15, 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, - 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, - 0x1d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, 0x18, - 0x0a, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6a, 0x6f, - 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x74, 0x74, 0x65, 0x6d, - 0x70, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, - 0x0a, 0x0b, 0x68, 0x61, 0x73, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0a, 0x68, 0x61, 0x73, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, - 0x21, 0x0a, 0x0c, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x52, 0x65, 0x61, 0x73, - 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x73, 0x74, 0x65, 0x70, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x22, 0x58, 0x0a, - 0x18, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, - 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x74, 0x74, - 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, - 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, - 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, - 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x6f, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4a, 0x6f, - 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6e, 0x65, 0x73, - 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, - 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x6b, 0x0a, 0x1b, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x65, 0x6d, - 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x74, 0x74, - 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x15, - 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x90, 0x01, 0x0a, 0x1c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, - 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x43, 0x75, 0x72, 0x73, 0x6f, - 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x74, 0x74, 0x65, 0x6d, - 0x70, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x93, 0x01, 0x0a, 0x1b, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, + 0x67, 0x79, 0x22, 0x4c, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, + 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, + 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, + 0x22, 0xfb, 0x02, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x75, 0x6d, 0x6d, 0x61, + 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, + 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, + 0x64, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, + 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, + 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, + 0x18, 0x0a, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6a, + 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x74, 0x74, 0x65, + 0x6d, 0x70, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x1f, 0x0a, 0x0b, 0x68, 0x61, 0x73, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x68, 0x61, 0x73, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, + 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x52, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x73, 0x74, 0x65, 0x70, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x22, 0x58, + 0x0a, 0x18, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, + 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x74, + 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, + 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, + 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x6f, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4a, + 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6e, 0x65, + 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, + 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x6b, 0x0a, 0x1b, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x74, - 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x3e, + 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, + 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x90, 0x01, 0x0a, 0x1c, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x52, 0x04, 0x6c, 0x69, 0x6e, + 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x43, 0x75, 0x72, 0x73, + 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x74, 0x74, 0x65, + 0x6d, 0x70, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x93, 0x01, 0x0a, 0x1b, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, + 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x74, 0x74, + 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, + 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, + 0x3e, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x26, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, + 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, + 0x9c, 0x01, 0x0a, 0x1b, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, + 0x67, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, + 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x9c, - 0x01, 0x0a, 0x1b, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1a, - 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3e, 0x0a, - 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, - 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x41, - 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x46, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x87, 0x01, - 0x0a, 0x1c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, - 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, - 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4a, - 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x42, 0x07, - 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0xca, 0x01, 0x0a, 0x07, 0x4c, 0x6f, 0x67, 0x4c, - 0x69, 0x6e, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x74, 0x65, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x21, - 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x6d, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4d, - 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6c, 0x69, 0x6e, 0x65, 0x4e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, - 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x17, - 0x0a, 0x07, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x74, 0x65, 0x70, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x65, 0x70, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x65, 0x70, - 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, - 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x12, 0x0a, 0x04, + 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x87, + 0x01, 0x0a, 0x1c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, + 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x46, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x42, + 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0xca, 0x01, 0x0a, 0x07, 0x4c, 0x6f, 0x67, + 0x4c, 0x69, 0x6e, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x74, 0x65, 0x70, 0x4b, 0x65, 0x79, 0x12, + 0x21, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x6d, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x4d, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6c, 0x69, 0x6e, 0x65, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x62, + 0x6f, 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, + 0x17, 0x0a, 0x07, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x74, 0x65, 0x70, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x65, 0x70, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x65, + 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, + 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, + 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, + 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x68, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x73, 0x68, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x0e, 0x0a, + 0x02, 0x70, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x70, 0x72, 0x22, 0x70, 0x0a, + 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x34, 0x0a, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x75, + 0x6e, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, + 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, + 0xd0, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x75, 0x6e, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, + 0x70, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, + 0x73, 0x68, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x68, 0x61, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x72, 0x65, 0x66, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x65, 0x61, 0x64, 0x5f, + 0x73, 0x68, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x53, + 0x68, 0x61, 0x22, 0xc1, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, + 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, + 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, - 0x12, 0x10, 0x0a, 0x03, 0x73, 0x68, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, - 0x68, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, - 0x70, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x70, 0x72, 0x22, 0x70, 0x0a, 0x10, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x34, 0x0a, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, - 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x75, 0x6e, - 0x52, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, - 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xd0, - 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x52, 0x75, 0x6e, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, - 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x73, - 0x68, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x68, 0x61, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x72, 0x65, 0x66, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x73, - 0x68, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x53, 0x68, - 0x61, 0x22, 0xc1, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, - 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, - 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x72, - 0x65, 0x70, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x68, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x73, 0x68, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x70, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x70, 0x72, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x78, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, - 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2a, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x09, 0x77, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x0f, - 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, - 0xee, 0x02, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x72, - 0x65, 0x70, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x68, 0x61, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x68, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x65, - 0x61, 0x64, 0x5f, 0x73, 0x68, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, 0x65, - 0x61, 0x64, 0x53, 0x68, 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x4a, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, - 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4a, 0x6f, 0x62, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, - 0x22, 0xee, 0x01, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x71, 0x75, 0x65, - 0x75, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x71, 0x75, 0x65, 0x75, 0x65, - 0x64, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x07, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x72, - 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x72, 0x75, - 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, - 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, - 0x64, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x61, 0x6e, - 0x63, 0x65, 0x6c, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x63, 0x61, - 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x6b, 0x69, 0x70, 0x70, - 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, - 0x64, 0x2a, 0xff, 0x01, 0x0a, 0x19, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x12, - 0x2c, 0x0a, 0x28, 0x43, 0x49, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x41, 0x56, - 0x41, 0x49, 0x4c, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, - 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2a, 0x0a, - 0x26, 0x43, 0x49, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x41, 0x56, 0x41, 0x49, - 0x4c, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x41, 0x56, - 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x2b, 0x0a, 0x27, 0x43, 0x49, 0x5f, - 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x49, - 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x5f, 0x53, 0x41, 0x4e, - 0x44, 0x42, 0x4f, 0x58, 0x10, 0x02, 0x12, 0x2e, 0x0a, 0x2a, 0x43, 0x49, 0x5f, 0x4d, 0x45, 0x54, - 0x52, 0x49, 0x43, 0x53, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, - 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x52, - 0x41, 0x4e, 0x47, 0x45, 0x10, 0x03, 0x12, 0x2b, 0x0a, 0x27, 0x43, 0x49, 0x5f, 0x4d, 0x45, 0x54, - 0x52, 0x49, 0x43, 0x53, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, - 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x5f, 0x53, 0x41, 0x4d, 0x50, 0x4c, 0x45, - 0x53, 0x10, 0x04, 0x2a, 0x9b, 0x01, 0x0a, 0x19, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, - 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x12, 0x2d, 0x0a, 0x29, 0x4a, 0x4f, 0x42, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x68, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x73, 0x68, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x70, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x70, 0x72, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x65, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x78, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x48, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x09, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, + 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x22, 0xee, 0x02, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, + 0x72, 0x65, 0x70, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x68, 0x61, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x68, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x68, + 0x65, 0x61, 0x64, 0x5f, 0x73, 0x68, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, + 0x65, 0x61, 0x64, 0x53, 0x68, 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x4a, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x64, 0x65, 0x70, 0x6f, + 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4a, 0x6f, 0x62, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x73, 0x22, 0xee, 0x01, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4a, 0x6f, 0x62, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x71, 0x75, + 0x65, 0x75, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x71, 0x75, 0x65, 0x75, + 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x07, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, + 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x72, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, + 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, + 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x61, + 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x63, + 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x6b, 0x69, 0x70, + 0x70, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x73, 0x6b, 0x69, 0x70, 0x70, + 0x65, 0x64, 0x2a, 0xff, 0x01, 0x0a, 0x19, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x64, 0x65, + 0x12, 0x2c, 0x0a, 0x28, 0x43, 0x49, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x41, + 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, + 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2a, + 0x0a, 0x26, 0x43, 0x49, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x41, 0x56, 0x41, + 0x49, 0x4c, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x41, + 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x2b, 0x0a, 0x27, 0x43, 0x49, + 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, + 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x5f, 0x53, 0x41, + 0x4e, 0x44, 0x42, 0x4f, 0x58, 0x10, 0x02, 0x12, 0x2e, 0x0a, 0x2a, 0x43, 0x49, 0x5f, 0x4d, 0x45, + 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x49, 0x4c, 0x49, + 0x54, 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, + 0x52, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x03, 0x12, 0x2b, 0x0a, 0x27, 0x43, 0x49, 0x5f, 0x4d, 0x45, + 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x49, 0x4c, 0x49, + 0x54, 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x5f, 0x53, 0x41, 0x4d, 0x50, 0x4c, + 0x45, 0x53, 0x10, 0x04, 0x2a, 0x9b, 0x01, 0x0a, 0x19, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, + 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x12, 0x2d, 0x0a, 0x29, 0x4a, 0x4f, 0x42, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, + 0x54, 0x5f, 0x4c, 0x4f, 0x47, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x46, 0x4f, 0x52, + 0x4d, 0x41, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x26, 0x0a, 0x22, 0x4a, 0x4f, 0x42, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, 0x5f, 0x4c, 0x4f, 0x47, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, - 0x41, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x26, 0x0a, 0x22, 0x4a, 0x4f, 0x42, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, 0x5f, - 0x4c, 0x4f, 0x47, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, - 0x54, 0x5f, 0x54, 0x45, 0x58, 0x54, 0x10, 0x01, 0x12, 0x27, 0x0a, 0x23, 0x4a, 0x4f, 0x42, 0x5f, - 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, 0x5f, 0x4c, 0x4f, 0x47, 0x5f, 0x45, 0x58, 0x50, 0x4f, - 0x52, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x4c, 0x10, - 0x02, 0x32, 0xea, 0x0e, 0x0a, 0x09, 0x43, 0x49, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x3a, 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, 0x17, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x18, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x10, 0x44, - 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, - 0x24, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, - 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, - 0x0a, 0x08, 0x52, 0x65, 0x74, 0x72, 0x79, 0x4a, 0x6f, 0x62, 0x12, 0x1c, 0x2e, 0x64, 0x65, 0x70, - 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x4a, 0x6f, - 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, - 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x4a, 0x6f, 0x62, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0d, 0x52, 0x65, 0x72, - 0x75, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x21, 0x2e, 0x64, 0x65, 0x70, - 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x72, 0x75, 0x6e, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, - 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x72, 0x75, - 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x0f, 0x52, 0x65, 0x74, 0x72, 0x79, 0x46, 0x61, 0x69, 0x6c, - 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x23, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, - 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x64, 0x65, - 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x46, - 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x09, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, - 0x12, 0x1d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1e, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, - 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x12, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, - 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x43, - 0x0a, 0x06, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x12, 0x1a, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, - 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x09, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x75, 0x6e, - 0x12, 0x1d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1e, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, - 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x55, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x1f, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, - 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, + 0x41, 0x54, 0x5f, 0x54, 0x45, 0x58, 0x54, 0x10, 0x01, 0x12, 0x27, 0x0a, 0x23, 0x4a, 0x4f, 0x42, + 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, 0x5f, 0x4c, 0x4f, 0x47, 0x5f, 0x45, 0x58, 0x50, + 0x4f, 0x52, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x4c, + 0x10, 0x02, 0x32, 0x82, 0x0e, 0x0a, 0x09, 0x43, 0x49, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x3a, 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, 0x17, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, + 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x18, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x10, + 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x12, 0x24, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x49, 0x0a, 0x08, 0x52, 0x65, 0x74, 0x72, 0x79, 0x4a, 0x6f, 0x62, 0x12, 0x1c, 0x2e, 0x64, 0x65, + 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x4a, + 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x64, 0x65, 0x70, 0x6f, + 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x4a, 0x6f, 0x62, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0d, 0x52, 0x65, + 0x72, 0x75, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x21, 0x2e, 0x64, 0x65, + 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x72, 0x75, 0x6e, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x72, + 0x75, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x0f, 0x52, 0x65, 0x74, 0x72, 0x79, 0x46, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x23, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, + 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x46, 0x61, 0x69, 0x6c, 0x65, + 0x64, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x64, + 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, + 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x09, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, + 0x62, 0x12, 0x1d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, + 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x43, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x12, 0x1a, 0x2e, 0x64, 0x65, 0x70, 0x6f, + 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x09, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x75, + 0x6e, 0x12, 0x1d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0b, 0x47, 0x65, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x1f, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x14, - 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, - 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0d, 0x47, - 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x21, 0x2e, 0x64, - 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, - 0x62, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x4a, 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, - 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, - 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, - 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, - 0x6d, 0x70, 0x74, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4a, 0x6f, - 0x62, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, - 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x65, - 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, - 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x64, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, - 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x25, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, - 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, + 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, + 0x14, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, + 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x29, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0d, + 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, - 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x14, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, - 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, - 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x65, 0x70, 0x6f, - 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4a, 0x6f, - 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x6f, 0x0a, 0x14, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, - 0x12, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, - 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x65, 0x70, - 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4a, - 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x49, 0x0a, 0x08, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x75, 0x6e, 0x73, 0x12, 0x1c, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, - 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0xe1, - 0x01, 0x0a, 0x10, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x12, 0x5e, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, - 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x64, 0x65, - 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x14, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x73, 0x41, 0x6e, 0x64, 0x56, 0x61, 0x72, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x65, - 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, - 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x41, 0x6e, 0x64, 0x56, 0x61, 0x72, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x73, 0x41, 0x6e, 0x64, 0x56, 0x61, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x42, 0x99, 0x01, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, - 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x07, 0x43, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, - 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, - 0x70, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x69, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2f, 0x63, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x63, 0x69, - 0x76, 0x31, 0xa2, 0x02, 0x03, 0x44, 0x43, 0x58, 0xaa, 0x02, 0x0b, 0x44, 0x65, 0x70, 0x6f, 0x74, - 0x2e, 0x43, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0b, 0x44, 0x65, 0x70, 0x6f, 0x74, 0x5c, 0x43, - 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x17, 0x44, 0x65, 0x70, 0x6f, 0x74, 0x5c, 0x43, 0x69, 0x5c, - 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, - 0x0d, 0x44, 0x65, 0x70, 0x6f, 0x74, 0x3a, 0x3a, 0x43, 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, + 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x65, 0x70, + 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x58, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 0x12, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x64, 0x0a, 0x11, 0x47, 0x65, + 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, + 0x25, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, + 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x6f, 0x0a, 0x14, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, + 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, + 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4a, 0x6f, 0x62, + 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, + 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, + 0x01, 0x12, 0x6f, 0x0a, 0x14, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, + 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, + 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, + 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, + 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x49, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x12, 0x1c, + 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x64, + 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, + 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x21, + 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0xe1, 0x01, 0x0a, 0x10, 0x4d, 0x69, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5e, 0x0a, 0x0f, + 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x23, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x14, + 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x41, 0x6e, 0x64, + 0x56, 0x61, 0x72, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, + 0x41, 0x6e, 0x64, 0x56, 0x61, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, + 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x41, 0x6e, 0x64, 0x56, 0x61, 0x72, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x99, 0x01, 0x0a, 0x0f, + 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x42, + 0x07, 0x43, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x69, + 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x74, + 0x2f, 0x63, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x63, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x44, 0x43, + 0x58, 0xaa, 0x02, 0x0b, 0x44, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x43, 0x69, 0x2e, 0x56, 0x31, 0xca, + 0x02, 0x0b, 0x44, 0x65, 0x70, 0x6f, 0x74, 0x5c, 0x43, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x17, + 0x44, 0x65, 0x70, 0x6f, 0x74, 0x5c, 0x43, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0d, 0x44, 0x65, 0x70, 0x6f, 0x74, 0x3a, + 0x3a, 0x43, 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -6419,7 +6371,7 @@ func file_depot_ci_v1_ci_proto_rawDescGZIP() []byte { } var file_depot_ci_v1_ci_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_depot_ci_v1_ci_proto_msgTypes = make([]protoimpl.MessageInfo, 72) +var file_depot_ci_v1_ci_proto_msgTypes = make([]protoimpl.MessageInfo, 71) var file_depot_ci_v1_ci_proto_goTypes = []interface{}{ (CIMetricsAvailabilityCode)(0), // 0: depot.ci.v1.CIMetricsAvailabilityCode (JobAttemptLogExportFormat)(0), // 1: depot.ci.v1.JobAttemptLogExportFormat @@ -6476,31 +6428,30 @@ var file_depot_ci_v1_ci_proto_goTypes = []interface{}{ (*CIMetricsStats)(nil), // 52: depot.ci.v1.CIMetricsStats (*CIMetricsAvailability)(nil), // 53: depot.ci.v1.CIMetricsAvailability (*CIMetricsCapMetadata)(nil), // 54: depot.ci.v1.CIMetricsCapMetadata - (*GetJobAttemptSummaryRequest)(nil), // 55: depot.ci.v1.GetJobAttemptSummaryRequest - (*GetJobSummaryRequest)(nil), // 56: depot.ci.v1.GetJobSummaryRequest - (*GetJobSummaryResponse)(nil), // 57: depot.ci.v1.GetJobSummaryResponse - (*GetJobAttemptLogsRequest)(nil), // 58: depot.ci.v1.GetJobAttemptLogsRequest - (*GetJobAttemptLogsResponse)(nil), // 59: depot.ci.v1.GetJobAttemptLogsResponse - (*StreamJobAttemptLogsRequest)(nil), // 60: depot.ci.v1.StreamJobAttemptLogsRequest - (*StreamJobAttemptLogsResponse)(nil), // 61: depot.ci.v1.StreamJobAttemptLogsResponse - (*ExportJobAttemptLogsRequest)(nil), // 62: depot.ci.v1.ExportJobAttemptLogsRequest - (*JobAttemptLogExportMetadata)(nil), // 63: depot.ci.v1.JobAttemptLogExportMetadata - (*ExportJobAttemptLogsResponse)(nil), // 64: depot.ci.v1.ExportJobAttemptLogsResponse - (*LogLine)(nil), // 65: depot.ci.v1.LogLine - (*ListRunsRequest)(nil), // 66: depot.ci.v1.ListRunsRequest - (*ListRunsResponse)(nil), // 67: depot.ci.v1.ListRunsResponse - (*ListRunsResponseRun)(nil), // 68: depot.ci.v1.ListRunsResponseRun - (*ListWorkflowsRequest)(nil), // 69: depot.ci.v1.ListWorkflowsRequest - (*ListWorkflowsResponse)(nil), // 70: depot.ci.v1.ListWorkflowsResponse - (*ListWorkflowsResponseWorkflow)(nil), // 71: depot.ci.v1.ListWorkflowsResponseWorkflow - (*ListWorkflowsResponseJobCounts)(nil), // 72: depot.ci.v1.ListWorkflowsResponseJobCounts - nil, // 73: depot.ci.v1.DispatchWorkflowRequest.InputsEntry + (*GetJobSummaryRequest)(nil), // 55: depot.ci.v1.GetJobSummaryRequest + (*GetJobSummaryResponse)(nil), // 56: depot.ci.v1.GetJobSummaryResponse + (*GetJobAttemptLogsRequest)(nil), // 57: depot.ci.v1.GetJobAttemptLogsRequest + (*GetJobAttemptLogsResponse)(nil), // 58: depot.ci.v1.GetJobAttemptLogsResponse + (*StreamJobAttemptLogsRequest)(nil), // 59: depot.ci.v1.StreamJobAttemptLogsRequest + (*StreamJobAttemptLogsResponse)(nil), // 60: depot.ci.v1.StreamJobAttemptLogsResponse + (*ExportJobAttemptLogsRequest)(nil), // 61: depot.ci.v1.ExportJobAttemptLogsRequest + (*JobAttemptLogExportMetadata)(nil), // 62: depot.ci.v1.JobAttemptLogExportMetadata + (*ExportJobAttemptLogsResponse)(nil), // 63: depot.ci.v1.ExportJobAttemptLogsResponse + (*LogLine)(nil), // 64: depot.ci.v1.LogLine + (*ListRunsRequest)(nil), // 65: depot.ci.v1.ListRunsRequest + (*ListRunsResponse)(nil), // 66: depot.ci.v1.ListRunsResponse + (*ListRunsResponseRun)(nil), // 67: depot.ci.v1.ListRunsResponseRun + (*ListWorkflowsRequest)(nil), // 68: depot.ci.v1.ListWorkflowsRequest + (*ListWorkflowsResponse)(nil), // 69: depot.ci.v1.ListWorkflowsResponse + (*ListWorkflowsResponseWorkflow)(nil), // 70: depot.ci.v1.ListWorkflowsResponseWorkflow + (*ListWorkflowsResponseJobCounts)(nil), // 71: depot.ci.v1.ListWorkflowsResponseJobCounts + nil, // 72: depot.ci.v1.DispatchWorkflowRequest.InputsEntry } var file_depot_ci_v1_ci_proto_depIdxs = []int32{ 8, // 0: depot.ci.v1.GetInstallationResponse.installations:type_name -> depot.ci.v1.Installation 6, // 1: depot.ci.v1.ImportSecretsAndVarsResponse.dry_run_result:type_name -> depot.ci.v1.DryRunResult 7, // 2: depot.ci.v1.ImportSecretsAndVarsResponse.run_result:type_name -> depot.ci.v1.RunResult - 73, // 3: depot.ci.v1.DispatchWorkflowRequest.inputs:type_name -> depot.ci.v1.DispatchWorkflowRequest.InputsEntry + 72, // 3: depot.ci.v1.DispatchWorkflowRequest.inputs:type_name -> depot.ci.v1.DispatchWorkflowRequest.InputsEntry 29, // 4: depot.ci.v1.GetRunStatusResponse.workflows:type_name -> depot.ci.v1.WorkflowStatus 30, // 5: depot.ci.v1.WorkflowStatus.jobs:type_name -> depot.ci.v1.JobStatus 31, // 6: depot.ci.v1.JobStatus.attempts:type_name -> depot.ci.v1.AttemptStatus @@ -6531,14 +6482,14 @@ var file_depot_ci_v1_ci_proto_depIdxs = []int32{ 52, // 31: depot.ci.v1.CIMetricsAttemptSummary.stats:type_name -> depot.ci.v1.CIMetricsStats 54, // 32: depot.ci.v1.CIMetricsAttemptSummary.cap:type_name -> depot.ci.v1.CIMetricsCapMetadata 0, // 33: depot.ci.v1.CIMetricsAvailability.code:type_name -> depot.ci.v1.CIMetricsAvailabilityCode - 65, // 34: depot.ci.v1.GetJobAttemptLogsResponse.lines:type_name -> depot.ci.v1.LogLine - 65, // 35: depot.ci.v1.StreamJobAttemptLogsResponse.line:type_name -> depot.ci.v1.LogLine + 64, // 34: depot.ci.v1.GetJobAttemptLogsResponse.lines:type_name -> depot.ci.v1.LogLine + 64, // 35: depot.ci.v1.StreamJobAttemptLogsResponse.line:type_name -> depot.ci.v1.LogLine 1, // 36: depot.ci.v1.ExportJobAttemptLogsRequest.format:type_name -> depot.ci.v1.JobAttemptLogExportFormat 1, // 37: depot.ci.v1.JobAttemptLogExportMetadata.format:type_name -> depot.ci.v1.JobAttemptLogExportFormat - 63, // 38: depot.ci.v1.ExportJobAttemptLogsResponse.metadata:type_name -> depot.ci.v1.JobAttemptLogExportMetadata - 68, // 39: depot.ci.v1.ListRunsResponse.runs:type_name -> depot.ci.v1.ListRunsResponseRun - 71, // 40: depot.ci.v1.ListWorkflowsResponse.workflows:type_name -> depot.ci.v1.ListWorkflowsResponseWorkflow - 72, // 41: depot.ci.v1.ListWorkflowsResponseWorkflow.job_counts:type_name -> depot.ci.v1.ListWorkflowsResponseJobCounts + 62, // 38: depot.ci.v1.ExportJobAttemptLogsResponse.metadata:type_name -> depot.ci.v1.JobAttemptLogExportMetadata + 67, // 39: depot.ci.v1.ListRunsResponse.runs:type_name -> depot.ci.v1.ListRunsResponseRun + 70, // 40: depot.ci.v1.ListWorkflowsResponse.workflows:type_name -> depot.ci.v1.ListWorkflowsResponseWorkflow + 71, // 41: depot.ci.v1.ListWorkflowsResponseWorkflow.job_counts:type_name -> depot.ci.v1.ListWorkflowsResponseJobCounts 9, // 42: depot.ci.v1.CIService.Run:input_type -> depot.ci.v1.RunRequest 11, // 43: depot.ci.v1.CIService.DispatchWorkflow:input_type -> depot.ci.v1.DispatchWorkflowRequest 13, // 44: depot.ci.v1.CIService.RetryJob:input_type -> depot.ci.v1.RetryJobRequest @@ -6553,40 +6504,38 @@ var file_depot_ci_v1_ci_proto_depIdxs = []int32{ 37, // 53: depot.ci.v1.CIService.GetJobAttemptMetrics:input_type -> depot.ci.v1.GetJobAttemptMetricsRequest 38, // 54: depot.ci.v1.CIService.GetJobMetrics:input_type -> depot.ci.v1.GetJobMetricsRequest 39, // 55: depot.ci.v1.CIService.GetRunMetrics:input_type -> depot.ci.v1.GetRunMetricsRequest - 55, // 56: depot.ci.v1.CIService.GetJobAttemptSummary:input_type -> depot.ci.v1.GetJobAttemptSummaryRequest - 56, // 57: depot.ci.v1.CIService.GetJobSummary:input_type -> depot.ci.v1.GetJobSummaryRequest - 58, // 58: depot.ci.v1.CIService.GetJobAttemptLogs:input_type -> depot.ci.v1.GetJobAttemptLogsRequest - 60, // 59: depot.ci.v1.CIService.StreamJobAttemptLogs:input_type -> depot.ci.v1.StreamJobAttemptLogsRequest - 62, // 60: depot.ci.v1.CIService.ExportJobAttemptLogs:input_type -> depot.ci.v1.ExportJobAttemptLogsRequest - 66, // 61: depot.ci.v1.CIService.ListRuns:input_type -> depot.ci.v1.ListRunsRequest - 69, // 62: depot.ci.v1.CIService.ListWorkflows:input_type -> depot.ci.v1.ListWorkflowsRequest - 2, // 63: depot.ci.v1.MigrationService.GetInstallation:input_type -> depot.ci.v1.GetInstallationRequest - 4, // 64: depot.ci.v1.MigrationService.ImportSecretsAndVars:input_type -> depot.ci.v1.ImportSecretsAndVarsRequest - 10, // 65: depot.ci.v1.CIService.Run:output_type -> depot.ci.v1.RunResponse - 12, // 66: depot.ci.v1.CIService.DispatchWorkflow:output_type -> depot.ci.v1.DispatchWorkflowResponse - 14, // 67: depot.ci.v1.CIService.RetryJob:output_type -> depot.ci.v1.RetryJobResponse - 16, // 68: depot.ci.v1.CIService.RerunWorkflow:output_type -> depot.ci.v1.RerunWorkflowResponse - 18, // 69: depot.ci.v1.CIService.RetryFailedJobs:output_type -> depot.ci.v1.RetryFailedJobsResponse - 20, // 70: depot.ci.v1.CIService.CancelJob:output_type -> depot.ci.v1.CancelJobResponse - 22, // 71: depot.ci.v1.CIService.CancelWorkflow:output_type -> depot.ci.v1.CancelWorkflowResponse - 24, // 72: depot.ci.v1.CIService.GetRun:output_type -> depot.ci.v1.GetRunResponse - 26, // 73: depot.ci.v1.CIService.CancelRun:output_type -> depot.ci.v1.CancelRunResponse - 28, // 74: depot.ci.v1.CIService.GetRunStatus:output_type -> depot.ci.v1.GetRunStatusResponse - 33, // 75: depot.ci.v1.CIService.GetWorkflow:output_type -> depot.ci.v1.GetWorkflowResponse - 40, // 76: depot.ci.v1.CIService.GetJobAttemptMetrics:output_type -> depot.ci.v1.GetJobAttemptMetricsResponse - 41, // 77: depot.ci.v1.CIService.GetJobMetrics:output_type -> depot.ci.v1.GetJobMetricsResponse - 42, // 78: depot.ci.v1.CIService.GetRunMetrics:output_type -> depot.ci.v1.GetRunMetricsResponse - 57, // 79: depot.ci.v1.CIService.GetJobAttemptSummary:output_type -> depot.ci.v1.GetJobSummaryResponse - 57, // 80: depot.ci.v1.CIService.GetJobSummary:output_type -> depot.ci.v1.GetJobSummaryResponse - 59, // 81: depot.ci.v1.CIService.GetJobAttemptLogs:output_type -> depot.ci.v1.GetJobAttemptLogsResponse - 61, // 82: depot.ci.v1.CIService.StreamJobAttemptLogs:output_type -> depot.ci.v1.StreamJobAttemptLogsResponse - 64, // 83: depot.ci.v1.CIService.ExportJobAttemptLogs:output_type -> depot.ci.v1.ExportJobAttemptLogsResponse - 67, // 84: depot.ci.v1.CIService.ListRuns:output_type -> depot.ci.v1.ListRunsResponse - 70, // 85: depot.ci.v1.CIService.ListWorkflows:output_type -> depot.ci.v1.ListWorkflowsResponse - 3, // 86: depot.ci.v1.MigrationService.GetInstallation:output_type -> depot.ci.v1.GetInstallationResponse - 5, // 87: depot.ci.v1.MigrationService.ImportSecretsAndVars:output_type -> depot.ci.v1.ImportSecretsAndVarsResponse - 65, // [65:88] is the sub-list for method output_type - 42, // [42:65] is the sub-list for method input_type + 55, // 56: depot.ci.v1.CIService.GetJobSummary:input_type -> depot.ci.v1.GetJobSummaryRequest + 57, // 57: depot.ci.v1.CIService.GetJobAttemptLogs:input_type -> depot.ci.v1.GetJobAttemptLogsRequest + 59, // 58: depot.ci.v1.CIService.StreamJobAttemptLogs:input_type -> depot.ci.v1.StreamJobAttemptLogsRequest + 61, // 59: depot.ci.v1.CIService.ExportJobAttemptLogs:input_type -> depot.ci.v1.ExportJobAttemptLogsRequest + 65, // 60: depot.ci.v1.CIService.ListRuns:input_type -> depot.ci.v1.ListRunsRequest + 68, // 61: depot.ci.v1.CIService.ListWorkflows:input_type -> depot.ci.v1.ListWorkflowsRequest + 2, // 62: depot.ci.v1.MigrationService.GetInstallation:input_type -> depot.ci.v1.GetInstallationRequest + 4, // 63: depot.ci.v1.MigrationService.ImportSecretsAndVars:input_type -> depot.ci.v1.ImportSecretsAndVarsRequest + 10, // 64: depot.ci.v1.CIService.Run:output_type -> depot.ci.v1.RunResponse + 12, // 65: depot.ci.v1.CIService.DispatchWorkflow:output_type -> depot.ci.v1.DispatchWorkflowResponse + 14, // 66: depot.ci.v1.CIService.RetryJob:output_type -> depot.ci.v1.RetryJobResponse + 16, // 67: depot.ci.v1.CIService.RerunWorkflow:output_type -> depot.ci.v1.RerunWorkflowResponse + 18, // 68: depot.ci.v1.CIService.RetryFailedJobs:output_type -> depot.ci.v1.RetryFailedJobsResponse + 20, // 69: depot.ci.v1.CIService.CancelJob:output_type -> depot.ci.v1.CancelJobResponse + 22, // 70: depot.ci.v1.CIService.CancelWorkflow:output_type -> depot.ci.v1.CancelWorkflowResponse + 24, // 71: depot.ci.v1.CIService.GetRun:output_type -> depot.ci.v1.GetRunResponse + 26, // 72: depot.ci.v1.CIService.CancelRun:output_type -> depot.ci.v1.CancelRunResponse + 28, // 73: depot.ci.v1.CIService.GetRunStatus:output_type -> depot.ci.v1.GetRunStatusResponse + 33, // 74: depot.ci.v1.CIService.GetWorkflow:output_type -> depot.ci.v1.GetWorkflowResponse + 40, // 75: depot.ci.v1.CIService.GetJobAttemptMetrics:output_type -> depot.ci.v1.GetJobAttemptMetricsResponse + 41, // 76: depot.ci.v1.CIService.GetJobMetrics:output_type -> depot.ci.v1.GetJobMetricsResponse + 42, // 77: depot.ci.v1.CIService.GetRunMetrics:output_type -> depot.ci.v1.GetRunMetricsResponse + 56, // 78: depot.ci.v1.CIService.GetJobSummary:output_type -> depot.ci.v1.GetJobSummaryResponse + 58, // 79: depot.ci.v1.CIService.GetJobAttemptLogs:output_type -> depot.ci.v1.GetJobAttemptLogsResponse + 60, // 80: depot.ci.v1.CIService.StreamJobAttemptLogs:output_type -> depot.ci.v1.StreamJobAttemptLogsResponse + 63, // 81: depot.ci.v1.CIService.ExportJobAttemptLogs:output_type -> depot.ci.v1.ExportJobAttemptLogsResponse + 66, // 82: depot.ci.v1.CIService.ListRuns:output_type -> depot.ci.v1.ListRunsResponse + 69, // 83: depot.ci.v1.CIService.ListWorkflows:output_type -> depot.ci.v1.ListWorkflowsResponse + 3, // 84: depot.ci.v1.MigrationService.GetInstallation:output_type -> depot.ci.v1.GetInstallationResponse + 5, // 85: depot.ci.v1.MigrationService.ImportSecretsAndVars:output_type -> depot.ci.v1.ImportSecretsAndVarsResponse + 64, // [64:86] is the sub-list for method output_type + 42, // [42:64] is the sub-list for method input_type 42, // [42:42] is the sub-list for extension type_name 42, // [42:42] is the sub-list for extension extendee 0, // [0:42] is the sub-list for field type_name @@ -7235,18 +7184,6 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetJobAttemptSummaryRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_depot_ci_v1_ci_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetJobSummaryRequest); i { case 0: return &v.state @@ -7258,7 +7195,7 @@ func file_depot_ci_v1_ci_proto_init() { return nil } } - file_depot_ci_v1_ci_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_depot_ci_v1_ci_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetJobSummaryResponse); i { case 0: return &v.state @@ -7270,7 +7207,7 @@ func file_depot_ci_v1_ci_proto_init() { return nil } } - file_depot_ci_v1_ci_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_depot_ci_v1_ci_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetJobAttemptLogsRequest); i { case 0: return &v.state @@ -7282,7 +7219,7 @@ func file_depot_ci_v1_ci_proto_init() { return nil } } - file_depot_ci_v1_ci_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_depot_ci_v1_ci_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetJobAttemptLogsResponse); i { case 0: return &v.state @@ -7294,7 +7231,7 @@ func file_depot_ci_v1_ci_proto_init() { return nil } } - file_depot_ci_v1_ci_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_depot_ci_v1_ci_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StreamJobAttemptLogsRequest); i { case 0: return &v.state @@ -7306,7 +7243,7 @@ func file_depot_ci_v1_ci_proto_init() { return nil } } - file_depot_ci_v1_ci_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_depot_ci_v1_ci_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StreamJobAttemptLogsResponse); i { case 0: return &v.state @@ -7318,7 +7255,7 @@ func file_depot_ci_v1_ci_proto_init() { return nil } } - file_depot_ci_v1_ci_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_depot_ci_v1_ci_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ExportJobAttemptLogsRequest); i { case 0: return &v.state @@ -7330,7 +7267,7 @@ func file_depot_ci_v1_ci_proto_init() { return nil } } - file_depot_ci_v1_ci_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_depot_ci_v1_ci_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobAttemptLogExportMetadata); i { case 0: return &v.state @@ -7342,7 +7279,7 @@ func file_depot_ci_v1_ci_proto_init() { return nil } } - file_depot_ci_v1_ci_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + file_depot_ci_v1_ci_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ExportJobAttemptLogsResponse); i { case 0: return &v.state @@ -7354,7 +7291,7 @@ func file_depot_ci_v1_ci_proto_init() { return nil } } - file_depot_ci_v1_ci_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + file_depot_ci_v1_ci_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LogLine); i { case 0: return &v.state @@ -7366,7 +7303,7 @@ func file_depot_ci_v1_ci_proto_init() { return nil } } - file_depot_ci_v1_ci_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + file_depot_ci_v1_ci_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListRunsRequest); i { case 0: return &v.state @@ -7378,7 +7315,7 @@ func file_depot_ci_v1_ci_proto_init() { return nil } } - file_depot_ci_v1_ci_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + file_depot_ci_v1_ci_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListRunsResponse); i { case 0: return &v.state @@ -7390,7 +7327,7 @@ func file_depot_ci_v1_ci_proto_init() { return nil } } - file_depot_ci_v1_ci_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + file_depot_ci_v1_ci_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListRunsResponseRun); i { case 0: return &v.state @@ -7402,7 +7339,7 @@ func file_depot_ci_v1_ci_proto_init() { return nil } } - file_depot_ci_v1_ci_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + file_depot_ci_v1_ci_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListWorkflowsRequest); i { case 0: return &v.state @@ -7414,7 +7351,7 @@ func file_depot_ci_v1_ci_proto_init() { return nil } } - file_depot_ci_v1_ci_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + file_depot_ci_v1_ci_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListWorkflowsResponse); i { case 0: return &v.state @@ -7426,7 +7363,7 @@ func file_depot_ci_v1_ci_proto_init() { return nil } } - file_depot_ci_v1_ci_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + file_depot_ci_v1_ci_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListWorkflowsResponseWorkflow); i { case 0: return &v.state @@ -7438,7 +7375,7 @@ func file_depot_ci_v1_ci_proto_init() { return nil } } - file_depot_ci_v1_ci_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + file_depot_ci_v1_ci_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListWorkflowsResponseJobCounts); i { case 0: return &v.state @@ -7458,7 +7395,7 @@ func file_depot_ci_v1_ci_proto_init() { file_depot_ci_v1_ci_proto_msgTypes[7].OneofWrappers = []interface{}{} file_depot_ci_v1_ci_proto_msgTypes[49].OneofWrappers = []interface{}{} file_depot_ci_v1_ci_proto_msgTypes[50].OneofWrappers = []interface{}{} - file_depot_ci_v1_ci_proto_msgTypes[62].OneofWrappers = []interface{}{ + file_depot_ci_v1_ci_proto_msgTypes[61].OneofWrappers = []interface{}{ (*ExportJobAttemptLogsResponse_Metadata)(nil), (*ExportJobAttemptLogsResponse_Chunk)(nil), } @@ -7468,7 +7405,7 @@ func file_depot_ci_v1_ci_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_depot_ci_v1_ci_proto_rawDesc, NumEnums: 2, - NumMessages: 72, + NumMessages: 71, NumExtensions: 0, NumServices: 2, }, diff --git a/pkg/proto/depot/ci/v1/civ1connect/ci.connect.go b/pkg/proto/depot/ci/v1/civ1connect/ci.connect.go index 355de0b6..5f51c63c 100644 --- a/pkg/proto/depot/ci/v1/civ1connect/ci.connect.go +++ b/pkg/proto/depot/ci/v1/civ1connect/ci.connect.go @@ -67,9 +67,6 @@ const ( CIServiceGetJobMetricsProcedure = "/depot.ci.v1.CIService/GetJobMetrics" // CIServiceGetRunMetricsProcedure is the fully-qualified name of the CIService's GetRunMetrics RPC. CIServiceGetRunMetricsProcedure = "/depot.ci.v1.CIService/GetRunMetrics" - // CIServiceGetJobAttemptSummaryProcedure is the fully-qualified name of the CIService's - // GetJobAttemptSummary RPC. - CIServiceGetJobAttemptSummaryProcedure = "/depot.ci.v1.CIService/GetJobAttemptSummary" // CIServiceGetJobSummaryProcedure is the fully-qualified name of the CIService's GetJobSummary RPC. CIServiceGetJobSummaryProcedure = "/depot.ci.v1.CIService/GetJobSummary" // CIServiceGetJobAttemptLogsProcedure is the fully-qualified name of the CIService's @@ -123,9 +120,7 @@ type CIServiceClient interface { GetJobMetrics(context.Context, *connect.Request[v1.GetJobMetricsRequest]) (*connect.Response[v1.GetJobMetricsResponse], error) // GetRunMetrics returns workflow/job/attempt CPU and memory metric summaries for one run GetRunMetrics(context.Context, *connect.Request[v1.GetRunMetricsRequest]) (*connect.Response[v1.GetRunMetricsResponse], error) - // GetJobAttemptSummary returns authored step summary markdown for one concrete job attempt - GetJobAttemptSummary(context.Context, *connect.Request[v1.GetJobAttemptSummaryRequest]) (*connect.Response[v1.GetJobSummaryResponse], error) - // GetJobSummary resolves one job to its current/latest attempt and returns authored step summary markdown + // GetJobSummary returns authored step summary markdown for a job, a concrete attempt, or both. GetJobSummary(context.Context, *connect.Request[v1.GetJobSummaryRequest]) (*connect.Response[v1.GetJobSummaryResponse], error) // GetJobAttemptLogs returns log lines for a job attempt GetJobAttemptLogs(context.Context, *connect.Request[v1.GetJobAttemptLogsRequest]) (*connect.Response[v1.GetJobAttemptLogsResponse], error) @@ -234,11 +229,6 @@ func NewCIServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...c baseURL+CIServiceGetRunMetricsProcedure, opts..., ), - getJobAttemptSummary: connect.NewClient[v1.GetJobAttemptSummaryRequest, v1.GetJobSummaryResponse]( - httpClient, - baseURL+CIServiceGetJobAttemptSummaryProcedure, - opts..., - ), getJobSummary: connect.NewClient[v1.GetJobSummaryRequest, v1.GetJobSummaryResponse]( httpClient, baseURL+CIServiceGetJobSummaryProcedure, @@ -288,7 +278,6 @@ type cIServiceClient struct { getJobAttemptMetrics *connect.Client[v1.GetJobAttemptMetricsRequest, v1.GetJobAttemptMetricsResponse] getJobMetrics *connect.Client[v1.GetJobMetricsRequest, v1.GetJobMetricsResponse] getRunMetrics *connect.Client[v1.GetRunMetricsRequest, v1.GetRunMetricsResponse] - getJobAttemptSummary *connect.Client[v1.GetJobAttemptSummaryRequest, v1.GetJobSummaryResponse] getJobSummary *connect.Client[v1.GetJobSummaryRequest, v1.GetJobSummaryResponse] getJobAttemptLogs *connect.Client[v1.GetJobAttemptLogsRequest, v1.GetJobAttemptLogsResponse] streamJobAttemptLogs *connect.Client[v1.StreamJobAttemptLogsRequest, v1.StreamJobAttemptLogsResponse] @@ -367,11 +356,6 @@ func (c *cIServiceClient) GetRunMetrics(ctx context.Context, req *connect.Reques return c.getRunMetrics.CallUnary(ctx, req) } -// GetJobAttemptSummary calls depot.ci.v1.CIService.GetJobAttemptSummary. -func (c *cIServiceClient) GetJobAttemptSummary(ctx context.Context, req *connect.Request[v1.GetJobAttemptSummaryRequest]) (*connect.Response[v1.GetJobSummaryResponse], error) { - return c.getJobAttemptSummary.CallUnary(ctx, req) -} - // GetJobSummary calls depot.ci.v1.CIService.GetJobSummary. func (c *cIServiceClient) GetJobSummary(ctx context.Context, req *connect.Request[v1.GetJobSummaryRequest]) (*connect.Response[v1.GetJobSummaryResponse], error) { return c.getJobSummary.CallUnary(ctx, req) @@ -432,9 +416,7 @@ type CIServiceHandler interface { GetJobMetrics(context.Context, *connect.Request[v1.GetJobMetricsRequest]) (*connect.Response[v1.GetJobMetricsResponse], error) // GetRunMetrics returns workflow/job/attempt CPU and memory metric summaries for one run GetRunMetrics(context.Context, *connect.Request[v1.GetRunMetricsRequest]) (*connect.Response[v1.GetRunMetricsResponse], error) - // GetJobAttemptSummary returns authored step summary markdown for one concrete job attempt - GetJobAttemptSummary(context.Context, *connect.Request[v1.GetJobAttemptSummaryRequest]) (*connect.Response[v1.GetJobSummaryResponse], error) - // GetJobSummary resolves one job to its current/latest attempt and returns authored step summary markdown + // GetJobSummary returns authored step summary markdown for a job, a concrete attempt, or both. GetJobSummary(context.Context, *connect.Request[v1.GetJobSummaryRequest]) (*connect.Response[v1.GetJobSummaryResponse], error) // GetJobAttemptLogs returns log lines for a job attempt GetJobAttemptLogs(context.Context, *connect.Request[v1.GetJobAttemptLogsRequest]) (*connect.Response[v1.GetJobAttemptLogsResponse], error) @@ -539,11 +521,6 @@ func NewCIServiceHandler(svc CIServiceHandler, opts ...connect.HandlerOption) (s svc.GetRunMetrics, opts..., ) - cIServiceGetJobAttemptSummaryHandler := connect.NewUnaryHandler( - CIServiceGetJobAttemptSummaryProcedure, - svc.GetJobAttemptSummary, - opts..., - ) cIServiceGetJobSummaryHandler := connect.NewUnaryHandler( CIServiceGetJobSummaryProcedure, svc.GetJobSummary, @@ -604,8 +581,6 @@ func NewCIServiceHandler(svc CIServiceHandler, opts ...connect.HandlerOption) (s cIServiceGetJobMetricsHandler.ServeHTTP(w, r) case CIServiceGetRunMetricsProcedure: cIServiceGetRunMetricsHandler.ServeHTTP(w, r) - case CIServiceGetJobAttemptSummaryProcedure: - cIServiceGetJobAttemptSummaryHandler.ServeHTTP(w, r) case CIServiceGetJobSummaryProcedure: cIServiceGetJobSummaryHandler.ServeHTTP(w, r) case CIServiceGetJobAttemptLogsProcedure: @@ -683,10 +658,6 @@ func (UnimplementedCIServiceHandler) GetRunMetrics(context.Context, *connect.Req return nil, connect.NewError(connect.CodeUnimplemented, errors.New("depot.ci.v1.CIService.GetRunMetrics is not implemented")) } -func (UnimplementedCIServiceHandler) GetJobAttemptSummary(context.Context, *connect.Request[v1.GetJobAttemptSummaryRequest]) (*connect.Response[v1.GetJobSummaryResponse], error) { - return nil, connect.NewError(connect.CodeUnimplemented, errors.New("depot.ci.v1.CIService.GetJobAttemptSummary is not implemented")) -} - func (UnimplementedCIServiceHandler) GetJobSummary(context.Context, *connect.Request[v1.GetJobSummaryRequest]) (*connect.Response[v1.GetJobSummaryResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("depot.ci.v1.CIService.GetJobSummary is not implemented")) } diff --git a/proto/depot/ci/v1/ci.proto b/proto/depot/ci/v1/ci.proto index 1b046d39..faa923e6 100644 --- a/proto/depot/ci/v1/ci.proto +++ b/proto/depot/ci/v1/ci.proto @@ -47,10 +47,7 @@ service CIService { // GetRunMetrics returns workflow/job/attempt CPU and memory metric summaries for one run rpc GetRunMetrics(GetRunMetricsRequest) returns (GetRunMetricsResponse) {} - // GetJobAttemptSummary returns authored step summary markdown for one concrete job attempt - rpc GetJobAttemptSummary(GetJobAttemptSummaryRequest) returns (GetJobSummaryResponse) {} - - // GetJobSummary resolves one job to its current/latest attempt and returns authored step summary markdown + // GetJobSummary returns authored step summary markdown for a job, a concrete attempt, or both. rpc GetJobSummary(GetJobSummaryRequest) returns (GetJobSummaryResponse) {} // GetJobAttemptLogs returns log lines for a job attempt @@ -571,14 +568,11 @@ message CIMetricsCapMetadata { // GetJobSummary messages -message GetJobAttemptSummaryRequest { - // attempt_id identifies the job attempt whose authored summary markdown to fetch - string attempt_id = 1; -} - message GetJobSummaryRequest { // job_id identifies the job whose current/latest attempt summary markdown to fetch string job_id = 1; + // attempt_id identifies one concrete job attempt summary to fetch, optionally scoped by job_id + string attempt_id = 2; } message GetJobSummaryResponse { From 25be9507c26197dea6f71bc80bf063d75fe08829 Mon Sep 17 00:00:00 2001 From: Andrew Watkins Date: Thu, 7 May 2026 14:22:29 -0500 Subject: [PATCH 4/4] fix(ci): keep summary json stdout clean --- pkg/cmd/ci/summary.go | 4 ++++ pkg/cmd/ci/summary_test.go | 27 +++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/pkg/cmd/ci/summary.go b/pkg/cmd/ci/summary.go index dcff97f4..7aabba4c 100644 --- a/pkg/cmd/ci/summary.go +++ b/pkg/cmd/ci/summary.go @@ -36,6 +36,10 @@ func NewCmdSummary() *cobra.Command { return err } if len(args) == 0 { + if outputIsJSON(output) { + cmd.SilenceUsage = true + return fmt.Errorf("expected exactly one attempt or job ID") + } return cmd.Help() } if len(args) > 1 { diff --git a/pkg/cmd/ci/summary_test.go b/pkg/cmd/ci/summary_test.go index 54f5d355..06a43300 100644 --- a/pkg/cmd/ci/summary_test.go +++ b/pkg/cmd/ci/summary_test.go @@ -263,6 +263,33 @@ func TestSummaryRejectsUnsupportedOutputBeforeAuth(t *testing.T) { } } +func TestSummaryJSONOutputRequiresIDWithoutPrintingHelp(t *testing.T) { + restoreSummaryAPIs(t) + + ciGetJobSummary = func(ctx context.Context, token, orgID string, req *civ1.GetJobSummaryRequest) (*civ1.GetJobSummaryResponse, error) { + t.Fatal("summary API should not be called without an ID") + return nil, nil + } + + var stdout bytes.Buffer + var stderr bytes.Buffer + cmd := NewCmdSummary() + cmd.SetArgs([]string{"--output", "json"}) + cmd.SetOut(&stdout) + cmd.SetErr(&stderr) + + err := cmd.Execute() + if err == nil || !strings.Contains(err.Error(), "expected exactly one attempt or job ID") { + t.Fatalf("err = %v", err) + } + if stdout.String() != "" { + t.Fatalf("stdout = %q, want empty", stdout.String()) + } + if strings.Contains(stderr.String(), "Usage:") { + t.Fatalf("stderr = %q, want no help text", stderr.String()) + } +} + func executeSummaryCommand(id string) (string, string, error) { var stdout bytes.Buffer var stderr bytes.Buffer