diff --git a/docs/docs/08-api.md b/docs/docs/08-api.md index 39502196f..f5d126557 100644 --- a/docs/docs/08-api.md +++ b/docs/docs/08-api.md @@ -468,6 +468,12 @@ languages [here](/docs/developer-guide/grpc), but we put this here for the true | ------------ | ------------- | ------------| | [PutPrincipalRequest](#putprincipalrequest) | [Principal](#principal) | EXPERIMENTAL: Creates an Principal. | +### RPC `GetPrincipal` {#getprincipal} + +| Request Type | Response Type | Description | +| ------------ | ------------- | ------------| +| [PrincipalId](#principalid) | [Principal](#principal) | | + ### RPC `Whoami` {#whoami} | Request Type | Response Type | Description | diff --git a/lhctl/go.work.sum b/lhctl/go.work.sum new file mode 100644 index 000000000..960543bf6 --- /dev/null +++ b/lhctl/go.work.sum @@ -0,0 +1,15 @@ +cel.dev/expr v0.15.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/envoyproxy/go-control-plane v0.12.1-0.20240621013728-1eb8caab5155/go.mod h1:5Wkq+JduFtdAXihLmeTJf+tRYIT4KBc2vPXDhwVo1pA= +github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= +github.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto/googleapis/api v0.0.0-20240604185151-ef581f913117/go.mod h1:OimBR/bc1wPO9iV4NC2bpyjy3VnAwZh5EBPQdtaE5oo= diff --git a/lhctl/internal/principal.go b/lhctl/internal/principal.go index 844559d85..d767c48c4 100644 --- a/lhctl/internal/principal.go +++ b/lhctl/internal/principal.go @@ -1,12 +1,13 @@ package internal import ( - "github.com/littlehorse-enterprises/littlehorse/sdk-go/lhproto" - "github.com/littlehorse-enterprises/littlehorse/sdk-go/littlehorse" "log" "os" "strings" + "github.com/littlehorse-enterprises/littlehorse/sdk-go/lhproto" + "github.com/littlehorse-enterprises/littlehorse/sdk-go/littlehorse" + "github.com/spf13/cobra" "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/proto" @@ -47,6 +48,20 @@ var putPrincipalCmd = &cobra.Command{ }, } +var getPrincipalCmd = &cobra.Command{ + Use: "principal ", + Short: "Get a Principal", + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + littlehorse.PrintResp(getGlobalClient(cmd).GetPrincipal( + requestContext(cmd), + &lhproto.PrincipalId{ + Id: args[0], + }, + )) + }, +} + var searchPrincipalCmd = &cobra.Command{ Use: "principal", Short: "Search for Principals", @@ -199,7 +214,8 @@ func init() { searchPrincipalCmd.Flags().Bool("isAdmin", false, "List only Principals that are admins") searchPrincipalCmd.Flags().Int("earliestMinutesAgo", -1, "Search only for Principals that were created no more than this number of minutes ago") searchPrincipalCmd.Flags().Int("latestMinutesAgo", -1, "Search only for Principals that were created at least this number of minutes ago") - searchPrincipalCmd.MarkFlagsOneRequired("tenantId", "isAdmin") + + getCmd.AddCommand(getPrincipalCmd) deployCmd.AddCommand(deployPrincipalCmd) deleteCmd.AddCommand(deletePrincipalCmd) diff --git a/schemas/littlehorse/service.proto b/schemas/littlehorse/service.proto index b93070b82..f3ad42b06 100644 --- a/schemas/littlehorse/service.proto +++ b/schemas/littlehorse/service.proto @@ -285,6 +285,8 @@ service LittleHorse { // EXPERIMENTAL: Creates an Principal. rpc PutPrincipal(PutPrincipalRequest) returns (Principal) {} + rpc GetPrincipal(PrincipalId) returns (Principal) {} + // Returns the Principal of the caller. rpc Whoami(google.protobuf.Empty) returns (Principal) {} diff --git a/sdk-go/lhproto/service.pb.go b/sdk-go/lhproto/service.pb.go index 0d1f1a77c..21892823a 100644 --- a/sdk-go/lhproto/service.pb.go +++ b/sdk-go/lhproto/service.pb.go @@ -7110,7 +7110,7 @@ var file_service_proto_rawDesc = []byte{ 0x4c, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x53, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x4d, 0x49, 0x4e, 0x4f, 0x52, 0x5f, 0x52, 0x45, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x53, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x4f, 0x5f, 0x55, 0x50, - 0x44, 0x41, 0x54, 0x45, 0x53, 0x10, 0x02, 0x32, 0xea, 0x2f, 0x0a, 0x0b, 0x4c, 0x69, 0x74, 0x74, + 0x44, 0x41, 0x54, 0x45, 0x53, 0x10, 0x02, 0x32, 0xae, 0x30, 0x0a, 0x0b, 0x4c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x48, 0x6f, 0x72, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x0a, 0x50, 0x75, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x66, 0x12, 0x1e, 0x2e, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x68, 0x6f, 0x72, 0x73, 0x65, 0x2e, 0x50, 0x75, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x66, 0x52, 0x65, @@ -7484,21 +7484,25 @@ var file_service_proto_rawDesc = []byte{ 0x61, 0x6c, 0x12, 0x20, 0x2e, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x68, 0x6f, 0x72, 0x73, 0x65, 0x2e, 0x50, 0x75, 0x74, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x68, 0x6f, 0x72, - 0x73, 0x65, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x22, 0x00, 0x12, 0x3a, - 0x0a, 0x06, 0x57, 0x68, 0x6f, 0x61, 0x6d, 0x69, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x16, 0x2e, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x68, 0x6f, 0x72, 0x73, 0x65, 0x2e, 0x50, - 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x10, 0x47, 0x65, - 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x68, - 0x6f, 0x72, 0x73, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x00, 0x42, 0x49, 0x0a, 0x1f, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x74, 0x74, 0x6c, - 0x65, 0x68, 0x6f, 0x72, 0x73, 0x65, 0x2e, 0x73, 0x64, 0x6b, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x09, 0x2e, 0x3b, 0x6c, 0x68, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0xaa, 0x02, 0x18, 0x4c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x48, 0x6f, 0x72, - 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x65, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x22, 0x00, 0x12, 0x42, + 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x12, 0x18, + 0x2e, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x68, 0x6f, 0x72, 0x73, 0x65, 0x2e, 0x50, 0x72, 0x69, + 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x49, 0x64, 0x1a, 0x16, 0x2e, 0x6c, 0x69, 0x74, 0x74, 0x6c, + 0x65, 0x68, 0x6f, 0x72, 0x73, 0x65, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, + 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x06, 0x57, 0x68, 0x6f, 0x61, 0x6d, 0x69, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x68, 0x6f, 0x72, + 0x73, 0x65, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x22, 0x00, 0x12, 0x48, + 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x6c, 0x69, 0x74, + 0x74, 0x6c, 0x65, 0x68, 0x6f, 0x72, 0x73, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x00, 0x42, 0x49, 0x0a, 0x1f, 0x69, 0x6f, 0x2e, 0x6c, + 0x69, 0x74, 0x74, 0x6c, 0x65, 0x68, 0x6f, 0x72, 0x73, 0x65, 0x2e, 0x73, 0x64, 0x6b, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x09, 0x2e, + 0x3b, 0x6c, 0x68, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0xaa, 0x02, 0x18, 0x4c, 0x69, 0x74, 0x74, 0x6c, + 0x65, 0x48, 0x6f, 0x72, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -7867,84 +7871,86 @@ var file_service_proto_depIdxs = []int32{ 137, // 197: littlehorse.LittleHorse.PutTenant:input_type -> littlehorse.PutTenantRequest 116, // 198: littlehorse.LittleHorse.GetTenant:input_type -> littlehorse.TenantId 138, // 199: littlehorse.LittleHorse.PutPrincipal:input_type -> littlehorse.PutPrincipalRequest - 139, // 200: littlehorse.LittleHorse.Whoami:input_type -> google.protobuf.Empty - 139, // 201: littlehorse.LittleHorse.GetServerVersion:input_type -> google.protobuf.Empty - 140, // 202: littlehorse.LittleHorse.PutTaskDef:output_type -> littlehorse.TaskDef - 140, // 203: littlehorse.LittleHorse.GetTaskDef:output_type -> littlehorse.TaskDef - 81, // 204: littlehorse.LittleHorse.GetTaskWorkerGroup:output_type -> littlehorse.TaskWorkerGroup - 141, // 205: littlehorse.LittleHorse.PutExternalEventDef:output_type -> littlehorse.ExternalEventDef - 141, // 206: littlehorse.LittleHorse.GetExternalEventDef:output_type -> littlehorse.ExternalEventDef - 142, // 207: littlehorse.LittleHorse.PutWorkflowEventDef:output_type -> littlehorse.WorkflowEventDef - 143, // 208: littlehorse.LittleHorse.PutWfSpec:output_type -> littlehorse.WfSpec - 143, // 209: littlehorse.LittleHorse.GetWfSpec:output_type -> littlehorse.WfSpec - 143, // 210: littlehorse.LittleHorse.GetLatestWfSpec:output_type -> littlehorse.WfSpec - 143, // 211: littlehorse.LittleHorse.MigrateWfSpec:output_type -> littlehorse.WfSpec - 144, // 212: littlehorse.LittleHorse.PutUserTaskDef:output_type -> littlehorse.UserTaskDef - 144, // 213: littlehorse.LittleHorse.GetUserTaskDef:output_type -> littlehorse.UserTaskDef - 144, // 214: littlehorse.LittleHorse.GetLatestUserTaskDef:output_type -> littlehorse.UserTaskDef - 145, // 215: littlehorse.LittleHorse.RunWf:output_type -> littlehorse.WfRun - 146, // 216: littlehorse.LittleHorse.ScheduleWf:output_type -> littlehorse.ScheduledWfRun - 78, // 217: littlehorse.LittleHorse.SearchScheduledWfRun:output_type -> littlehorse.ScheduledWfRunIdList - 146, // 218: littlehorse.LittleHorse.GetScheduledWfRun:output_type -> littlehorse.ScheduledWfRun - 145, // 219: littlehorse.LittleHorse.GetWfRun:output_type -> littlehorse.WfRun - 127, // 220: littlehorse.LittleHorse.GetUserTaskRun:output_type -> littlehorse.UserTaskRun - 139, // 221: littlehorse.LittleHorse.AssignUserTaskRun:output_type -> google.protobuf.Empty - 139, // 222: littlehorse.LittleHorse.CompleteUserTaskRun:output_type -> google.protobuf.Empty - 139, // 223: littlehorse.LittleHorse.CancelUserTaskRun:output_type -> google.protobuf.Empty - 127, // 224: littlehorse.LittleHorse.SaveUserTaskRunProgress:output_type -> littlehorse.UserTaskRun - 77, // 225: littlehorse.LittleHorse.ListUserTaskRuns:output_type -> littlehorse.UserTaskRunList - 118, // 226: littlehorse.LittleHorse.GetNodeRun:output_type -> littlehorse.NodeRun - 50, // 227: littlehorse.LittleHorse.ListNodeRuns:output_type -> littlehorse.NodeRunList - 129, // 228: littlehorse.LittleHorse.GetTaskRun:output_type -> littlehorse.TaskRun - 83, // 229: littlehorse.LittleHorse.ListTaskRuns:output_type -> littlehorse.TaskRunList - 119, // 230: littlehorse.LittleHorse.GetVariable:output_type -> littlehorse.Variable - 52, // 231: littlehorse.LittleHorse.ListVariables:output_type -> littlehorse.VariableList - 120, // 232: littlehorse.LittleHorse.PutExternalEvent:output_type -> littlehorse.ExternalEvent - 120, // 233: littlehorse.LittleHorse.GetExternalEvent:output_type -> littlehorse.ExternalEvent - 121, // 234: littlehorse.LittleHorse.AwaitWorkflowEvent:output_type -> littlehorse.WorkflowEvent - 142, // 235: littlehorse.LittleHorse.GetWorkflowEventDef:output_type -> littlehorse.WorkflowEventDef - 121, // 236: littlehorse.LittleHorse.GetWorkflowEvent:output_type -> littlehorse.WorkflowEvent - 54, // 237: littlehorse.LittleHorse.ListExternalEvents:output_type -> littlehorse.ExternalEventList - 56, // 238: littlehorse.LittleHorse.ListWorkflowEvents:output_type -> littlehorse.WorkflowEventList - 22, // 239: littlehorse.LittleHorse.SearchWfRun:output_type -> littlehorse.WfRunIdList - 26, // 240: littlehorse.LittleHorse.SearchNodeRun:output_type -> littlehorse.NodeRunIdList - 24, // 241: littlehorse.LittleHorse.SearchTaskRun:output_type -> littlehorse.TaskRunIdList - 28, // 242: littlehorse.LittleHorse.SearchUserTaskRun:output_type -> littlehorse.UserTaskRunIdList - 30, // 243: littlehorse.LittleHorse.SearchVariable:output_type -> littlehorse.VariableIdList - 46, // 244: littlehorse.LittleHorse.SearchExternalEvent:output_type -> littlehorse.ExternalEventIdList - 48, // 245: littlehorse.LittleHorse.SearchWorkflowEvent:output_type -> littlehorse.WorkflowEventIdList - 32, // 246: littlehorse.LittleHorse.SearchTaskDef:output_type -> littlehorse.TaskDefIdList - 34, // 247: littlehorse.LittleHorse.SearchUserTaskDef:output_type -> littlehorse.UserTaskDefIdList - 36, // 248: littlehorse.LittleHorse.SearchWfSpec:output_type -> littlehorse.WfSpecIdList - 38, // 249: littlehorse.LittleHorse.SearchExternalEventDef:output_type -> littlehorse.ExternalEventDefIdList - 40, // 250: littlehorse.LittleHorse.SearchWorkflowEventDef:output_type -> littlehorse.WorkflowEventDefIdList - 42, // 251: littlehorse.LittleHorse.SearchTenant:output_type -> littlehorse.TenantIdList - 44, // 252: littlehorse.LittleHorse.SearchPrincipal:output_type -> littlehorse.PrincipalIdList - 59, // 253: littlehorse.LittleHorse.RegisterTaskWorker:output_type -> littlehorse.RegisterTaskWorkerResponse - 63, // 254: littlehorse.LittleHorse.PollTask:output_type -> littlehorse.PollTaskResponse - 139, // 255: littlehorse.LittleHorse.ReportTask:output_type -> google.protobuf.Empty - 139, // 256: littlehorse.LittleHorse.StopWfRun:output_type -> google.protobuf.Empty - 139, // 257: littlehorse.LittleHorse.ResumeWfRun:output_type -> google.protobuf.Empty - 145, // 258: littlehorse.LittleHorse.RescueThreadRun:output_type -> littlehorse.WfRun - 139, // 259: littlehorse.LittleHorse.DeleteWfRun:output_type -> google.protobuf.Empty - 139, // 260: littlehorse.LittleHorse.DeleteTaskDef:output_type -> google.protobuf.Empty - 139, // 261: littlehorse.LittleHorse.DeleteWfSpec:output_type -> google.protobuf.Empty - 139, // 262: littlehorse.LittleHorse.DeleteUserTaskDef:output_type -> google.protobuf.Empty - 139, // 263: littlehorse.LittleHorse.DeleteExternalEventDef:output_type -> google.protobuf.Empty - 139, // 264: littlehorse.LittleHorse.DeleteWorkflowEventDef:output_type -> google.protobuf.Empty - 139, // 265: littlehorse.LittleHorse.DeletePrincipal:output_type -> google.protobuf.Empty - 139, // 266: littlehorse.LittleHorse.DeleteScheduledWfRun:output_type -> google.protobuf.Empty - 74, // 267: littlehorse.LittleHorse.GetTaskDefMetricsWindow:output_type -> littlehorse.TaskDefMetrics - 75, // 268: littlehorse.LittleHorse.GetWfSpecMetricsWindow:output_type -> littlehorse.WfSpecMetrics - 70, // 269: littlehorse.LittleHorse.ListTaskDefMetrics:output_type -> littlehorse.ListTaskMetricsResponse - 73, // 270: littlehorse.LittleHorse.ListWfSpecMetrics:output_type -> littlehorse.ListWfMetricsResponse - 147, // 271: littlehorse.LittleHorse.PutTenant:output_type -> littlehorse.Tenant - 147, // 272: littlehorse.LittleHorse.GetTenant:output_type -> littlehorse.Tenant - 148, // 273: littlehorse.LittleHorse.PutPrincipal:output_type -> littlehorse.Principal - 148, // 274: littlehorse.LittleHorse.Whoami:output_type -> littlehorse.Principal - 86, // 275: littlehorse.LittleHorse.GetServerVersion:output_type -> littlehorse.ServerVersion - 202, // [202:276] is the sub-list for method output_type - 128, // [128:202] is the sub-list for method input_type + 117, // 200: littlehorse.LittleHorse.GetPrincipal:input_type -> littlehorse.PrincipalId + 139, // 201: littlehorse.LittleHorse.Whoami:input_type -> google.protobuf.Empty + 139, // 202: littlehorse.LittleHorse.GetServerVersion:input_type -> google.protobuf.Empty + 140, // 203: littlehorse.LittleHorse.PutTaskDef:output_type -> littlehorse.TaskDef + 140, // 204: littlehorse.LittleHorse.GetTaskDef:output_type -> littlehorse.TaskDef + 81, // 205: littlehorse.LittleHorse.GetTaskWorkerGroup:output_type -> littlehorse.TaskWorkerGroup + 141, // 206: littlehorse.LittleHorse.PutExternalEventDef:output_type -> littlehorse.ExternalEventDef + 141, // 207: littlehorse.LittleHorse.GetExternalEventDef:output_type -> littlehorse.ExternalEventDef + 142, // 208: littlehorse.LittleHorse.PutWorkflowEventDef:output_type -> littlehorse.WorkflowEventDef + 143, // 209: littlehorse.LittleHorse.PutWfSpec:output_type -> littlehorse.WfSpec + 143, // 210: littlehorse.LittleHorse.GetWfSpec:output_type -> littlehorse.WfSpec + 143, // 211: littlehorse.LittleHorse.GetLatestWfSpec:output_type -> littlehorse.WfSpec + 143, // 212: littlehorse.LittleHorse.MigrateWfSpec:output_type -> littlehorse.WfSpec + 144, // 213: littlehorse.LittleHorse.PutUserTaskDef:output_type -> littlehorse.UserTaskDef + 144, // 214: littlehorse.LittleHorse.GetUserTaskDef:output_type -> littlehorse.UserTaskDef + 144, // 215: littlehorse.LittleHorse.GetLatestUserTaskDef:output_type -> littlehorse.UserTaskDef + 145, // 216: littlehorse.LittleHorse.RunWf:output_type -> littlehorse.WfRun + 146, // 217: littlehorse.LittleHorse.ScheduleWf:output_type -> littlehorse.ScheduledWfRun + 78, // 218: littlehorse.LittleHorse.SearchScheduledWfRun:output_type -> littlehorse.ScheduledWfRunIdList + 146, // 219: littlehorse.LittleHorse.GetScheduledWfRun:output_type -> littlehorse.ScheduledWfRun + 145, // 220: littlehorse.LittleHorse.GetWfRun:output_type -> littlehorse.WfRun + 127, // 221: littlehorse.LittleHorse.GetUserTaskRun:output_type -> littlehorse.UserTaskRun + 139, // 222: littlehorse.LittleHorse.AssignUserTaskRun:output_type -> google.protobuf.Empty + 139, // 223: littlehorse.LittleHorse.CompleteUserTaskRun:output_type -> google.protobuf.Empty + 139, // 224: littlehorse.LittleHorse.CancelUserTaskRun:output_type -> google.protobuf.Empty + 127, // 225: littlehorse.LittleHorse.SaveUserTaskRunProgress:output_type -> littlehorse.UserTaskRun + 77, // 226: littlehorse.LittleHorse.ListUserTaskRuns:output_type -> littlehorse.UserTaskRunList + 118, // 227: littlehorse.LittleHorse.GetNodeRun:output_type -> littlehorse.NodeRun + 50, // 228: littlehorse.LittleHorse.ListNodeRuns:output_type -> littlehorse.NodeRunList + 129, // 229: littlehorse.LittleHorse.GetTaskRun:output_type -> littlehorse.TaskRun + 83, // 230: littlehorse.LittleHorse.ListTaskRuns:output_type -> littlehorse.TaskRunList + 119, // 231: littlehorse.LittleHorse.GetVariable:output_type -> littlehorse.Variable + 52, // 232: littlehorse.LittleHorse.ListVariables:output_type -> littlehorse.VariableList + 120, // 233: littlehorse.LittleHorse.PutExternalEvent:output_type -> littlehorse.ExternalEvent + 120, // 234: littlehorse.LittleHorse.GetExternalEvent:output_type -> littlehorse.ExternalEvent + 121, // 235: littlehorse.LittleHorse.AwaitWorkflowEvent:output_type -> littlehorse.WorkflowEvent + 142, // 236: littlehorse.LittleHorse.GetWorkflowEventDef:output_type -> littlehorse.WorkflowEventDef + 121, // 237: littlehorse.LittleHorse.GetWorkflowEvent:output_type -> littlehorse.WorkflowEvent + 54, // 238: littlehorse.LittleHorse.ListExternalEvents:output_type -> littlehorse.ExternalEventList + 56, // 239: littlehorse.LittleHorse.ListWorkflowEvents:output_type -> littlehorse.WorkflowEventList + 22, // 240: littlehorse.LittleHorse.SearchWfRun:output_type -> littlehorse.WfRunIdList + 26, // 241: littlehorse.LittleHorse.SearchNodeRun:output_type -> littlehorse.NodeRunIdList + 24, // 242: littlehorse.LittleHorse.SearchTaskRun:output_type -> littlehorse.TaskRunIdList + 28, // 243: littlehorse.LittleHorse.SearchUserTaskRun:output_type -> littlehorse.UserTaskRunIdList + 30, // 244: littlehorse.LittleHorse.SearchVariable:output_type -> littlehorse.VariableIdList + 46, // 245: littlehorse.LittleHorse.SearchExternalEvent:output_type -> littlehorse.ExternalEventIdList + 48, // 246: littlehorse.LittleHorse.SearchWorkflowEvent:output_type -> littlehorse.WorkflowEventIdList + 32, // 247: littlehorse.LittleHorse.SearchTaskDef:output_type -> littlehorse.TaskDefIdList + 34, // 248: littlehorse.LittleHorse.SearchUserTaskDef:output_type -> littlehorse.UserTaskDefIdList + 36, // 249: littlehorse.LittleHorse.SearchWfSpec:output_type -> littlehorse.WfSpecIdList + 38, // 250: littlehorse.LittleHorse.SearchExternalEventDef:output_type -> littlehorse.ExternalEventDefIdList + 40, // 251: littlehorse.LittleHorse.SearchWorkflowEventDef:output_type -> littlehorse.WorkflowEventDefIdList + 42, // 252: littlehorse.LittleHorse.SearchTenant:output_type -> littlehorse.TenantIdList + 44, // 253: littlehorse.LittleHorse.SearchPrincipal:output_type -> littlehorse.PrincipalIdList + 59, // 254: littlehorse.LittleHorse.RegisterTaskWorker:output_type -> littlehorse.RegisterTaskWorkerResponse + 63, // 255: littlehorse.LittleHorse.PollTask:output_type -> littlehorse.PollTaskResponse + 139, // 256: littlehorse.LittleHorse.ReportTask:output_type -> google.protobuf.Empty + 139, // 257: littlehorse.LittleHorse.StopWfRun:output_type -> google.protobuf.Empty + 139, // 258: littlehorse.LittleHorse.ResumeWfRun:output_type -> google.protobuf.Empty + 145, // 259: littlehorse.LittleHorse.RescueThreadRun:output_type -> littlehorse.WfRun + 139, // 260: littlehorse.LittleHorse.DeleteWfRun:output_type -> google.protobuf.Empty + 139, // 261: littlehorse.LittleHorse.DeleteTaskDef:output_type -> google.protobuf.Empty + 139, // 262: littlehorse.LittleHorse.DeleteWfSpec:output_type -> google.protobuf.Empty + 139, // 263: littlehorse.LittleHorse.DeleteUserTaskDef:output_type -> google.protobuf.Empty + 139, // 264: littlehorse.LittleHorse.DeleteExternalEventDef:output_type -> google.protobuf.Empty + 139, // 265: littlehorse.LittleHorse.DeleteWorkflowEventDef:output_type -> google.protobuf.Empty + 139, // 266: littlehorse.LittleHorse.DeletePrincipal:output_type -> google.protobuf.Empty + 139, // 267: littlehorse.LittleHorse.DeleteScheduledWfRun:output_type -> google.protobuf.Empty + 74, // 268: littlehorse.LittleHorse.GetTaskDefMetricsWindow:output_type -> littlehorse.TaskDefMetrics + 75, // 269: littlehorse.LittleHorse.GetWfSpecMetricsWindow:output_type -> littlehorse.WfSpecMetrics + 70, // 270: littlehorse.LittleHorse.ListTaskDefMetrics:output_type -> littlehorse.ListTaskMetricsResponse + 73, // 271: littlehorse.LittleHorse.ListWfSpecMetrics:output_type -> littlehorse.ListWfMetricsResponse + 147, // 272: littlehorse.LittleHorse.PutTenant:output_type -> littlehorse.Tenant + 147, // 273: littlehorse.LittleHorse.GetTenant:output_type -> littlehorse.Tenant + 148, // 274: littlehorse.LittleHorse.PutPrincipal:output_type -> littlehorse.Principal + 148, // 275: littlehorse.LittleHorse.GetPrincipal:output_type -> littlehorse.Principal + 148, // 276: littlehorse.LittleHorse.Whoami:output_type -> littlehorse.Principal + 86, // 277: littlehorse.LittleHorse.GetServerVersion:output_type -> littlehorse.ServerVersion + 203, // [203:278] is the sub-list for method output_type + 128, // [128:203] is the sub-list for method input_type 128, // [128:128] is the sub-list for extension type_name 128, // [128:128] is the sub-list for extension extendee 0, // [0:128] is the sub-list for field type_name diff --git a/sdk-go/lhproto/service_grpc.pb.go b/sdk-go/lhproto/service_grpc.pb.go index 2a184b411..75c513723 100644 --- a/sdk-go/lhproto/service_grpc.pb.go +++ b/sdk-go/lhproto/service_grpc.pb.go @@ -92,6 +92,7 @@ const ( LittleHorse_PutTenant_FullMethodName = "/littlehorse.LittleHorse/PutTenant" LittleHorse_GetTenant_FullMethodName = "/littlehorse.LittleHorse/GetTenant" LittleHorse_PutPrincipal_FullMethodName = "/littlehorse.LittleHorse/PutPrincipal" + LittleHorse_GetPrincipal_FullMethodName = "/littlehorse.LittleHorse/GetPrincipal" LittleHorse_Whoami_FullMethodName = "/littlehorse.LittleHorse/Whoami" LittleHorse_GetServerVersion_FullMethodName = "/littlehorse.LittleHorse/GetServerVersion" ) @@ -299,6 +300,7 @@ type LittleHorseClient interface { GetTenant(ctx context.Context, in *TenantId, opts ...grpc.CallOption) (*Tenant, error) // EXPERIMENTAL: Creates an Principal. PutPrincipal(ctx context.Context, in *PutPrincipalRequest, opts ...grpc.CallOption) (*Principal, error) + GetPrincipal(ctx context.Context, in *PrincipalId, opts ...grpc.CallOption) (*Principal, error) // Returns the Principal of the caller. Whoami(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*Principal, error) // Gets the version of the LH Server. @@ -983,6 +985,15 @@ func (c *littleHorseClient) PutPrincipal(ctx context.Context, in *PutPrincipalRe return out, nil } +func (c *littleHorseClient) GetPrincipal(ctx context.Context, in *PrincipalId, opts ...grpc.CallOption) (*Principal, error) { + out := new(Principal) + err := c.cc.Invoke(ctx, LittleHorse_GetPrincipal_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *littleHorseClient) Whoami(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*Principal, error) { out := new(Principal) err := c.cc.Invoke(ctx, LittleHorse_Whoami_FullMethodName, in, out, opts...) @@ -1204,6 +1215,7 @@ type LittleHorseServer interface { GetTenant(context.Context, *TenantId) (*Tenant, error) // EXPERIMENTAL: Creates an Principal. PutPrincipal(context.Context, *PutPrincipalRequest) (*Principal, error) + GetPrincipal(context.Context, *PrincipalId) (*Principal, error) // Returns the Principal of the caller. Whoami(context.Context, *emptypb.Empty) (*Principal, error) // Gets the version of the LH Server. @@ -1431,6 +1443,9 @@ func (UnimplementedLittleHorseServer) GetTenant(context.Context, *TenantId) (*Te func (UnimplementedLittleHorseServer) PutPrincipal(context.Context, *PutPrincipalRequest) (*Principal, error) { return nil, status.Errorf(codes.Unimplemented, "method PutPrincipal not implemented") } +func (UnimplementedLittleHorseServer) GetPrincipal(context.Context, *PrincipalId) (*Principal, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetPrincipal not implemented") +} func (UnimplementedLittleHorseServer) Whoami(context.Context, *emptypb.Empty) (*Principal, error) { return nil, status.Errorf(codes.Unimplemented, "method Whoami not implemented") } @@ -2754,6 +2769,24 @@ func _LittleHorse_PutPrincipal_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _LittleHorse_GetPrincipal_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PrincipalId) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LittleHorseServer).GetPrincipal(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: LittleHorse_GetPrincipal_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LittleHorseServer).GetPrincipal(ctx, req.(*PrincipalId)) + } + return interceptor(ctx, in, info, handler) +} + func _LittleHorse_Whoami_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(emptypb.Empty) if err := dec(in); err != nil { @@ -3081,6 +3114,10 @@ var LittleHorse_ServiceDesc = grpc.ServiceDesc{ MethodName: "PutPrincipal", Handler: _LittleHorse_PutPrincipal_Handler, }, + { + MethodName: "GetPrincipal", + Handler: _LittleHorse_GetPrincipal_Handler, + }, { MethodName: "Whoami", Handler: _LittleHorse_Whoami_Handler, diff --git a/sdk-java/src/main/java/io/littlehorse/sdk/common/proto/LittleHorseGrpc.java b/sdk-java/src/main/java/io/littlehorse/sdk/common/proto/LittleHorseGrpc.java index bbc582e35..0c810179c 100644 --- a/sdk-java/src/main/java/io/littlehorse/sdk/common/proto/LittleHorseGrpc.java +++ b/sdk-java/src/main/java/io/littlehorse/sdk/common/proto/LittleHorseGrpc.java @@ -2247,6 +2247,37 @@ io.littlehorse.sdk.common.proto.Principal> getPutPrincipalMethod() { return getPutPrincipalMethod; } + private static volatile io.grpc.MethodDescriptor getGetPrincipalMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "GetPrincipal", + requestType = io.littlehorse.sdk.common.proto.PrincipalId.class, + responseType = io.littlehorse.sdk.common.proto.Principal.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor getGetPrincipalMethod() { + io.grpc.MethodDescriptor getGetPrincipalMethod; + if ((getGetPrincipalMethod = LittleHorseGrpc.getGetPrincipalMethod) == null) { + synchronized (LittleHorseGrpc.class) { + if ((getGetPrincipalMethod = LittleHorseGrpc.getGetPrincipalMethod) == null) { + LittleHorseGrpc.getGetPrincipalMethod = getGetPrincipalMethod = + io.grpc.MethodDescriptor.newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "GetPrincipal")) + .setSampledToLocalTracing(true) + .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + io.littlehorse.sdk.common.proto.PrincipalId.getDefaultInstance())) + .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + io.littlehorse.sdk.common.proto.Principal.getDefaultInstance())) + .setSchemaDescriptor(new LittleHorseMethodDescriptorSupplier("GetPrincipal")) + .build(); + } + } + } + return getGetPrincipalMethod; + } + private static volatile io.grpc.MethodDescriptor getWhoamiMethod; @@ -3119,6 +3150,13 @@ default void putPrincipal(io.littlehorse.sdk.common.proto.PutPrincipalRequest re io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getPutPrincipalMethod(), responseObserver); } + /** + */ + default void getPrincipal(io.littlehorse.sdk.common.proto.PrincipalId request, + io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetPrincipalMethod(), responseObserver); + } + /** *
      * Returns the Principal of the caller.
@@ -4001,6 +4039,14 @@ public void putPrincipal(io.littlehorse.sdk.common.proto.PutPrincipalRequest req
           getChannel().newCall(getPutPrincipalMethod(), getCallOptions()), request, responseObserver);
     }
 
+    /**
+     */
+    public void getPrincipal(io.littlehorse.sdk.common.proto.PrincipalId request,
+        io.grpc.stub.StreamObserver responseObserver) {
+      io.grpc.stub.ClientCalls.asyncUnaryCall(
+          getChannel().newCall(getGetPrincipalMethod(), getCallOptions()), request, responseObserver);
+    }
+
     /**
      * 
      * Returns the Principal of the caller.
@@ -4791,6 +4837,13 @@ public io.littlehorse.sdk.common.proto.Principal putPrincipal(io.littlehorse.sdk
           getChannel(), getPutPrincipalMethod(), getCallOptions(), request);
     }
 
+    /**
+     */
+    public io.littlehorse.sdk.common.proto.Principal getPrincipal(io.littlehorse.sdk.common.proto.PrincipalId request) {
+      return io.grpc.stub.ClientCalls.blockingUnaryCall(
+          getChannel(), getGetPrincipalMethod(), getCallOptions(), request);
+    }
+
     /**
      * 
      * Returns the Principal of the caller.
@@ -5650,6 +5703,14 @@ public com.google.common.util.concurrent.ListenableFuture getPrincipal(
+        io.littlehorse.sdk.common.proto.PrincipalId request) {
+      return io.grpc.stub.ClientCalls.futureUnaryCall(
+          getChannel().newCall(getGetPrincipalMethod(), getCallOptions()), request);
+    }
+
     /**
      * 
      * Returns the Principal of the caller.
@@ -5744,9 +5805,10 @@ public com.google.common.util.concurrent.ListenableFuture implements
       io.grpc.stub.ServerCalls.UnaryMethod,
@@ -6049,6 +6111,10 @@ public void invoke(Req request, io.grpc.stub.StreamObserver responseObserv
           serviceImpl.putPrincipal((io.littlehorse.sdk.common.proto.PutPrincipalRequest) request,
               (io.grpc.stub.StreamObserver) responseObserver);
           break;
+        case METHODID_GET_PRINCIPAL:
+          serviceImpl.getPrincipal((io.littlehorse.sdk.common.proto.PrincipalId) request,
+              (io.grpc.stub.StreamObserver) responseObserver);
+          break;
         case METHODID_WHOAMI:
           serviceImpl.whoami((com.google.protobuf.Empty) request,
               (io.grpc.stub.StreamObserver) responseObserver);
@@ -6582,6 +6648,13 @@ public static final io.grpc.ServerServiceDefinition bindService(AsyncService ser
               io.littlehorse.sdk.common.proto.PutPrincipalRequest,
               io.littlehorse.sdk.common.proto.Principal>(
                 service, METHODID_PUT_PRINCIPAL)))
+        .addMethod(
+          getGetPrincipalMethod(),
+          io.grpc.stub.ServerCalls.asyncUnaryCall(
+            new MethodHandlers<
+              io.littlehorse.sdk.common.proto.PrincipalId,
+              io.littlehorse.sdk.common.proto.Principal>(
+                service, METHODID_GET_PRINCIPAL)))
         .addMethod(
           getWhoamiMethod(),
           io.grpc.stub.ServerCalls.asyncUnaryCall(
@@ -6716,6 +6789,7 @@ public static io.grpc.ServiceDescriptor getServiceDescriptor() {
               .addMethod(getPutTenantMethod())
               .addMethod(getGetTenantMethod())
               .addMethod(getPutPrincipalMethod())
+              .addMethod(getGetPrincipalMethod())
               .addMethod(getWhoamiMethod())
               .addMethod(getGetServerVersionMethod())
               .build();
diff --git a/sdk-java/src/main/java/io/littlehorse/sdk/common/proto/Service.java b/sdk-java/src/main/java/io/littlehorse/sdk/common/proto/Service.java
index 75b041c3a..ae4988cdf 100644
--- a/sdk-java/src/main/java/io/littlehorse/sdk/common/proto/Service.java
+++ b/sdk-java/src/main/java/io/littlehorse/sdk/common/proto/Service.java
@@ -806,7 +806,7 @@ public static void registerAllExtensions(
       "se_identifier\030\004 \001(\tH\000\210\001\001B\031\n\027_pre_release" +
       "_identifier*P\n\021AllowedUpdateType\022\017\n\013ALL_" +
       "UPDATES\020\000\022\032\n\026MINOR_REVISION_UPDATES\020\001\022\016\n" +
-      "\nNO_UPDATES\020\0022\352/\n\013LittleHorse\022D\n\nPutTask" +
+      "\nNO_UPDATES\020\0022\2560\n\013LittleHorse\022D\n\nPutTask" +
       "Def\022\036.littlehorse.PutTaskDefRequest\032\024.li" +
       "ttlehorse.TaskDef\"\000\022<\n\nGetTaskDef\022\026.litt" +
       "lehorse.TaskDefId\032\024.littlehorse.TaskDef\"" +
@@ -956,12 +956,14 @@ public static void registerAllExtensions(
       "nt\022\025.littlehorse.TenantId\032\023.littlehorse." +
       "Tenant\"\000\022J\n\014PutPrincipal\022 .littlehorse.P" +
       "utPrincipalRequest\032\026.littlehorse.Princip" +
-      "al\"\000\022:\n\006Whoami\022\026.google.protobuf.Empty\032\026" +
-      ".littlehorse.Principal\"\000\022H\n\020GetServerVer" +
-      "sion\022\026.google.protobuf.Empty\032\032.littlehor" +
-      "se.ServerVersion\"\000BI\n\037io.littlehorse.sdk" +
-      ".common.protoP\001Z\t.;lhproto\252\002\030LittleHorse" +
-      ".Common.Protob\006proto3"
+      "al\"\000\022B\n\014GetPrincipal\022\030.littlehorse.Princ" +
+      "ipalId\032\026.littlehorse.Principal\"\000\022:\n\006Whoa" +
+      "mi\022\026.google.protobuf.Empty\032\026.littlehorse" +
+      ".Principal\"\000\022H\n\020GetServerVersion\022\026.googl" +
+      "e.protobuf.Empty\032\032.littlehorse.ServerVer" +
+      "sion\"\000BI\n\037io.littlehorse.sdk.common.prot" +
+      "oP\001Z\t.;lhproto\252\002\030LittleHorse.Common.Prot" +
+      "ob\006proto3"
     };
     descriptor = com.google.protobuf.Descriptors.FileDescriptor
       .internalBuildGeneratedFileFrom(descriptorData,
diff --git a/sdk-js/src/proto/service.ts b/sdk-js/src/proto/service.ts
index 7127eeedd..23cdba469 100644
--- a/sdk-js/src/proto/service.ts
+++ b/sdk-js/src/proto/service.ts
@@ -8447,6 +8447,14 @@ export const LittleHorseDefinition = {
       responseStream: false,
       options: {},
     },
+    getPrincipal: {
+      name: "GetPrincipal",
+      requestType: PrincipalId,
+      requestStream: false,
+      responseType: Principal,
+      responseStream: false,
+      options: {},
+    },
     /** Returns the Principal of the caller. */
     whoami: {
       name: "Whoami",
@@ -8828,6 +8836,7 @@ export interface LittleHorseServiceImplementation {
   getTenant(request: TenantId, context: CallContext & CallContextExt): Promise>;
   /** EXPERIMENTAL: Creates an Principal. */
   putPrincipal(request: PutPrincipalRequest, context: CallContext & CallContextExt): Promise>;
+  getPrincipal(request: PrincipalId, context: CallContext & CallContextExt): Promise>;
   /** Returns the Principal of the caller. */
   whoami(request: Empty, context: CallContext & CallContextExt): Promise>;
   /** Gets the version of the LH Server. */
@@ -9203,6 +9212,7 @@ export interface LittleHorseClient {
   getTenant(request: DeepPartial, options?: CallOptions & CallOptionsExt): Promise;
   /** EXPERIMENTAL: Creates an Principal. */
   putPrincipal(request: DeepPartial, options?: CallOptions & CallOptionsExt): Promise;
+  getPrincipal(request: DeepPartial, options?: CallOptions & CallOptionsExt): Promise;
   /** Returns the Principal of the caller. */
   whoami(request: DeepPartial, options?: CallOptions & CallOptionsExt): Promise;
   /** Gets the version of the LH Server. */
diff --git a/sdk-python/littlehorse/model/__init__.py b/sdk-python/littlehorse/model/__init__.py
index c956189c7..85f573b7e 100644
--- a/sdk-python/littlehorse/model/__init__.py
+++ b/sdk-python/littlehorse/model/__init__.py
@@ -5,8 +5,8 @@
 from .node_run_pb2 import *
 from .object_id_pb2 import *
 from .scheduled_wf_run_pb2 import *
-from .service_pb2_grpc import *
 from .service_pb2 import *
+from .service_pb2_grpc import *
 from .task_def_pb2 import *
 from .task_run_pb2 import *
 from .user_tasks_pb2 import *
diff --git a/sdk-python/littlehorse/model/service_pb2.py b/sdk-python/littlehorse/model/service_pb2.py
index dc8a8eb6a..f5c4b5dfe 100644
--- a/sdk-python/littlehorse/model/service_pb2.py
+++ b/sdk-python/littlehorse/model/service_pb2.py
@@ -29,7 +29,7 @@
 import littlehorse.model.scheduled_wf_run_pb2 as scheduled__wf__run__pb2
 
 
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\rservice.proto\x12\x0blittlehorse\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x13\x63ommon_wfspec.proto\x1a\x12\x63ommon_enums.proto\x1a\x0fobject_id.proto\x1a\x0evariable.proto\x1a\x14\x65xternal_event.proto\x1a\x0cwf_run.proto\x1a\x0enode_run.proto\x1a\x0etask_run.proto\x1a\x10user_tasks.proto\x1a\rwf_spec.proto\x1a\x0etask_def.proto\x1a\nacls.proto\x1a\x14workflow_event.proto\x1a\x16scheduled_wf_run.proto\"+\n\x1bGetLatestUserTaskDefRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\xd3\x03\n\x10PutWfSpecRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x44\n\x0cthread_specs\x18\x05 \x03(\x0b\x32..littlehorse.PutWfSpecRequest.ThreadSpecsEntry\x12\x1e\n\x16\x65ntrypoint_thread_name\x18\x06 \x01(\t\x12\x43\n\x10retention_policy\x18\x08 \x01(\x0b\x32$.littlehorse.WorkflowRetentionPolicyH\x00\x88\x01\x01\x12\x46\n\x0eparent_wf_spec\x18\t \x01(\x0b\x32).littlehorse.WfSpec.ParentWfSpecReferenceH\x01\x88\x01\x01\x12\x37\n\x0f\x61llowed_updates\x18\n \x01(\x0e\x32\x1e.littlehorse.AllowedUpdateType\x1aK\n\x10ThreadSpecsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12&\n\x05value\x18\x02 \x01(\x0b\x32\x17.littlehorse.ThreadSpec:\x02\x38\x01\x42\x13\n\x11_retention_policyB\x11\n\x0f_parent_wf_specJ\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04J\x04\x08\x04\x10\x05\"\x9f\x01\n\x11PutTaskDefRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12,\n\ninput_vars\x18\x02 \x03(\x0b\x32\x18.littlehorse.VariableDef\x12<\n\routput_schema\x18\x03 \x01(\x0b\x32 .littlehorse.TaskDefOutputSchemaH\x00\x88\x01\x01\x42\x10\n\x0e_output_schema\"S\n\x1aPutWorkflowEventDefRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\'\n\x04type\x18\x02 \x01(\x0e\x32\x19.littlehorse.VariableType\"{\n\x15PutUserTaskDefRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12*\n\x06\x66ields\x18\x02 \x03(\x0b\x32\x1a.littlehorse.UserTaskField\x12\x18\n\x0b\x64\x65scription\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\x0e\n\x0c_description\"o\n\x1aPutExternalEventDefRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x43\n\x10retention_policy\x18\x02 \x01(\x0b\x32).littlehorse.ExternalEventRetentionPolicy\"\xc3\x02\n\x17PutExternalEventRequest\x12\'\n\twf_run_id\x18\x01 \x01(\x0b\x32\x14.littlehorse.WfRunId\x12>\n\x15\x65xternal_event_def_id\x18\x02 \x01(\x0b\x32\x1f.littlehorse.ExternalEventDefId\x12\x11\n\x04guid\x18\x03 \x01(\tH\x00\x88\x01\x01\x12+\n\x07\x63ontent\x18\x05 \x01(\x0b\x32\x1a.littlehorse.VariableValue\x12\x1e\n\x11thread_run_number\x18\x06 \x01(\x05H\x01\x88\x01\x01\x12\x1e\n\x11node_run_position\x18\x07 \x01(\x05H\x02\x88\x01\x01\x42\x07\n\x05_guidB\x14\n\x12_thread_run_numberB\x14\n\x12_node_run_positionJ\x04\x08\x04\x10\x05J\x04\x08\x08\x10\t\"F\n\x1a\x44\x65leteExternalEventRequest\x12(\n\x02id\x18\x01 \x01(\x0b\x32\x1c.littlehorse.ExternalEventId\"H\n\x1b\x44\x65leteScheduledWfRunRequest\x12)\n\x02id\x18\x01 \x01(\x0b\x32\x1d.littlehorse.ScheduledWfRunId\"6\n\x12\x44\x65leteWfRunRequest\x12 \n\x02id\x18\x01 \x01(\x0b\x32\x14.littlehorse.WfRunId\":\n\x14\x44\x65leteTaskDefRequest\x12\"\n\x02id\x18\x01 \x01(\x0b\x32\x16.littlehorse.TaskDefId\"B\n\x18\x44\x65leteUserTaskDefRequest\x12&\n\x02id\x18\x01 \x01(\x0b\x32\x1a.littlehorse.UserTaskDefId\"8\n\x13\x44\x65leteWfSpecRequest\x12!\n\x02id\x18\x01 \x01(\x0b\x32\x15.littlehorse.WfSpecId\"L\n\x1d\x44\x65leteExternalEventDefRequest\x12+\n\x02id\x18\x01 \x01(\x0b\x32\x1f.littlehorse.ExternalEventDefId\"L\n\x1d\x44\x65leteWorkflowEventDefRequest\x12+\n\x02id\x18\x01 \x01(\x0b\x32\x1f.littlehorse.WorkflowEventDefId\"\xe3\x02\n\x0cRunWfRequest\x12\x14\n\x0cwf_spec_name\x18\x01 \x01(\t\x12\x1a\n\rmajor_version\x18\x02 \x01(\x05H\x00\x88\x01\x01\x12\x15\n\x08revision\x18\x03 \x01(\x05H\x01\x88\x01\x01\x12;\n\tvariables\x18\x04 \x03(\x0b\x32(.littlehorse.RunWfRequest.VariablesEntry\x12\x0f\n\x02id\x18\x05 \x01(\tH\x02\x88\x01\x01\x12\x33\n\x10parent_wf_run_id\x18\x06 \x01(\x0b\x32\x14.littlehorse.WfRunIdH\x03\x88\x01\x01\x1aL\n\x0eVariablesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12)\n\x05value\x18\x02 \x01(\x0b\x32\x1a.littlehorse.VariableValue:\x02\x38\x01\x42\x10\n\x0e_major_versionB\x0b\n\t_revisionB\x05\n\x03_idB\x13\n\x11_parent_wf_run_id\"\x86\x03\n\x11ScheduleWfRequest\x12\x0f\n\x02id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x0cwf_spec_name\x18\x02 \x01(\t\x12\x1a\n\rmajor_version\x18\x03 \x01(\x05H\x01\x88\x01\x01\x12\x15\n\x08revision\x18\x04 \x01(\x05H\x02\x88\x01\x01\x12@\n\tvariables\x18\x05 \x03(\x0b\x32-.littlehorse.ScheduleWfRequest.VariablesEntry\x12\x33\n\x10parent_wf_run_id\x18\x06 \x01(\x0b\x32\x14.littlehorse.WfRunIdH\x03\x88\x01\x01\x12\x17\n\x0f\x63ron_expression\x18\x07 \x01(\t\x1aL\n\x0eVariablesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12)\n\x05value\x18\x02 \x01(\x0b\x32\x1a.littlehorse.VariableValue:\x02\x38\x01\x42\x05\n\x03_idB\x10\n\x0e_major_versionB\x0b\n\t_revisionB\x13\n\x11_parent_wf_run_id\"L\n\rVariableMatch\x12\x10\n\x08var_name\x18\x01 \x01(\t\x12)\n\x05value\x18\x02 \x01(\x0b\x32\x1a.littlehorse.VariableValue\"\xbd\x01\n\x19\x41waitWorkflowEventRequest\x12\'\n\twf_run_id\x18\x01 \x01(\x0b\x32\x14.littlehorse.WfRunId\x12\x36\n\revent_def_ids\x18\x02 \x03(\x0b\x32\x1f.littlehorse.WorkflowEventDefId\x12?\n\x19workflow_events_to_ignore\x18\x03 \x03(\x0b\x32\x1c.littlehorse.WorkflowEventId\"\xdf\x03\n\x12SearchWfRunRequest\x12\x15\n\x08\x62ookmark\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12\x14\n\x0cwf_spec_name\x18\x03 \x01(\t\x12\"\n\x15wf_spec_major_version\x18\x04 \x01(\x05H\x02\x88\x01\x01\x12\x1d\n\x10wf_spec_revision\x18\x05 \x01(\x05H\x03\x88\x01\x01\x12*\n\x06status\x18\x06 \x01(\x0e\x32\x15.littlehorse.LHStatusH\x04\x88\x01\x01\x12\x37\n\x0e\x65\x61rliest_start\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x05\x88\x01\x01\x12\x35\n\x0clatest_start\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x06\x88\x01\x01\x12\x34\n\x10variable_filters\x18\t \x03(\x0b\x32\x1a.littlehorse.VariableMatchB\x0b\n\t_bookmarkB\x08\n\x06_limitB\x18\n\x16_wf_spec_major_versionB\x13\n\x11_wf_spec_revisionB\t\n\x07_statusB\x11\n\x0f_earliest_startB\x0f\n\r_latest_start\"X\n\x0bWfRunIdList\x12%\n\x07results\x18\x01 \x03(\x0b\x32\x14.littlehorse.WfRunId\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_bookmark\"\xbc\x02\n\x14SearchTaskRunRequest\x12\x15\n\x08\x62ookmark\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12\x15\n\rtask_def_name\x18\x03 \x01(\t\x12,\n\x06status\x18\x04 \x01(\x0e\x32\x17.littlehorse.TaskStatusH\x02\x88\x01\x01\x12\x37\n\x0e\x65\x61rliest_start\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x03\x88\x01\x01\x12\x35\n\x0clatest_start\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x04\x88\x01\x01\x42\x0b\n\t_bookmarkB\x08\n\x06_limitB\t\n\x07_statusB\x11\n\x0f_earliest_startB\x0f\n\r_latest_start\"\\\n\rTaskRunIdList\x12\'\n\x07results\x18\x01 \x03(\x0b\x32\x16.littlehorse.TaskRunId\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_bookmark\"\xf1\x03\n\x14SearchNodeRunRequest\x12\x15\n\x08\x62ookmark\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12\x37\n\x0e\x65\x61rliest_start\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x02\x88\x01\x01\x12\x35\n\x0clatest_start\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x03\x88\x01\x01\x12=\n\tnode_type\x18\x05 \x01(\x0e\x32*.littlehorse.SearchNodeRunRequest.NodeType\x12%\n\x06status\x18\x06 \x01(\x0e\x32\x15.littlehorse.LHStatus\"\x9c\x01\n\x08NodeType\x12\x08\n\x04TASK\x10\x00\x12\x12\n\x0e\x45XTERNAL_EVENT\x10\x01\x12\x0e\n\nENTRYPOINT\x10\x02\x12\x08\n\x04\x45XIT\x10\x03\x12\x10\n\x0cSTART_THREAD\x10\x04\x12\x10\n\x0cWAIT_THREADS\x10\x05\x12\t\n\x05SLEEP\x10\x06\x12\r\n\tUSER_TASK\x10\x07\x12\x1a\n\x16START_MULTIPLE_THREADS\x10\x08\x42\x0b\n\t_bookmarkB\x08\n\x06_limitB\x11\n\x0f_earliest_startB\x0f\n\r_latest_start\"\\\n\rNodeRunIdList\x12\'\n\x07results\x18\x01 \x03(\x0b\x32\x16.littlehorse.NodeRunId\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_bookmark\"\xb2\x03\n\x18SearchUserTaskRunRequest\x12\x15\n\x08\x62ookmark\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12\x33\n\x06status\x18\x03 \x01(\x0e\x32\x1e.littlehorse.UserTaskRunStatusH\x02\x88\x01\x01\x12\x1f\n\x12user_task_def_name\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x14\n\x07user_id\x18\x05 \x01(\tH\x04\x88\x01\x01\x12\x17\n\nuser_group\x18\x06 \x01(\tH\x05\x88\x01\x01\x12\x37\n\x0e\x65\x61rliest_start\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x06\x88\x01\x01\x12\x35\n\x0clatest_start\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x07\x88\x01\x01\x42\x0b\n\t_bookmarkB\x08\n\x06_limitB\t\n\x07_statusB\x15\n\x13_user_task_def_nameB\n\n\x08_user_idB\r\n\x0b_user_groupB\x11\n\x0f_earliest_startB\x0f\n\r_latest_start\"d\n\x11UserTaskRunIdList\x12+\n\x07results\x18\x01 \x03(\x0b\x32\x1a.littlehorse.UserTaskRunId\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_bookmark\"\x9e\x02\n\x15SearchVariableRequest\x12\x15\n\x08\x62ookmark\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12)\n\x05value\x18\x03 \x01(\x0b\x32\x1a.littlehorse.VariableValue\x12\"\n\x15wf_spec_major_version\x18\x04 \x01(\x05H\x02\x88\x01\x01\x12\x1d\n\x10wf_spec_revision\x18\x05 \x01(\x05H\x03\x88\x01\x01\x12\x10\n\x08var_name\x18\x06 \x01(\t\x12\x14\n\x0cwf_spec_name\x18\x07 \x01(\tB\x0b\n\t_bookmarkB\x08\n\x06_limitB\x18\n\x16_wf_spec_major_versionB\x13\n\x11_wf_spec_revision\"^\n\x0eVariableIdList\x12(\n\x07results\x18\x01 \x03(\x0b\x32\x17.littlehorse.VariableId\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_bookmark\"x\n\x14SearchTaskDefRequest\x12\x15\n\x08\x62ookmark\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12\x13\n\x06prefix\x18\x03 \x01(\tH\x02\x88\x01\x01\x42\x0b\n\t_bookmarkB\x08\n\x06_limitB\t\n\x07_prefix\"\\\n\rTaskDefIdList\x12\'\n\x07results\x18\x01 \x03(\x0b\x32\x16.littlehorse.TaskDefId\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_bookmark\"\x98\x01\n\x18SearchUserTaskDefRequest\x12\x15\n\x08\x62ookmark\x18\x01 \x01(\x0cH\x01\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\x05H\x02\x88\x01\x01\x12\x10\n\x06prefix\x18\x03 \x01(\tH\x00\x12\x0e\n\x04name\x18\x04 \x01(\tH\x00\x42\x18\n\x16user_task_def_criteriaB\x0b\n\t_bookmarkB\x08\n\x06_limit\"d\n\x11UserTaskDefIdList\x12+\n\x07results\x18\x01 \x03(\x0b\x32\x1a.littlehorse.UserTaskDefId\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_bookmark\"\xa6\x01\n\x13SearchWfSpecRequest\x12\x15\n\x08\x62ookmark\x18\x01 \x01(\x0cH\x01\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\x05H\x02\x88\x01\x01\x12\x0e\n\x04name\x18\x03 \x01(\tH\x00\x12\x10\n\x06prefix\x18\x04 \x01(\tH\x00\x12\x17\n\rtask_def_name\x18\x05 \x01(\tH\x00\x42\x12\n\x10wf_spec_criteriaB\x0b\n\t_bookmarkB\x08\n\x06_limit\"Z\n\x0cWfSpecIdList\x12&\n\x07results\x18\x01 \x03(\x0b\x32\x15.littlehorse.WfSpecId\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_bookmark\"\x81\x01\n\x1dSearchExternalEventDefRequest\x12\x15\n\x08\x62ookmark\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12\x13\n\x06prefix\x18\x03 \x01(\tH\x02\x88\x01\x01\x42\x0b\n\t_bookmarkB\x08\n\x06_limitB\t\n\x07_prefix\"n\n\x16\x45xternalEventDefIdList\x12\x30\n\x07results\x18\x01 \x03(\x0b\x32\x1f.littlehorse.ExternalEventDefId\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_bookmark\"\x81\x01\n\x1dSearchWorkflowEventDefRequest\x12\x15\n\x08\x62ookmark\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12\x13\n\x06prefix\x18\x03 \x01(\tH\x02\x88\x01\x01\x42\x0b\n\t_bookmarkB\x08\n\x06_limitB\t\n\x07_prefix\"n\n\x16WorkflowEventDefIdList\x12\x30\n\x07results\x18\x01 \x03(\x0b\x32\x1f.littlehorse.WorkflowEventDefId\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_bookmark\"W\n\x13SearchTenantRequest\x12\x12\n\x05limit\x18\x01 \x01(\x05H\x00\x88\x01\x01\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x01\x88\x01\x01\x42\x08\n\x06_limitB\x0b\n\t_bookmark\"Z\n\x0cTenantIdList\x12&\n\x07results\x18\x01 \x03(\x0b\x32\x15.littlehorse.TenantId\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_bookmark\"\xab\x02\n\x16SearchPrincipalRequest\x12\x15\n\x08\x62ookmark\x18\x01 \x01(\x0cH\x01\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\x05H\x02\x88\x01\x01\x12\x37\n\x0e\x65\x61rliest_start\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x03\x88\x01\x01\x12\x35\n\x0clatest_start\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x04\x88\x01\x01\x12\x11\n\x07isAdmin\x18\x05 \x01(\x08H\x00\x12\x12\n\x08tenantId\x18\x06 \x01(\tH\x00\x42\x14\n\x12principal_criteriaB\x0b\n\t_bookmarkB\x08\n\x06_limitB\x11\n\x0f_earliest_startB\x0f\n\r_latest_start\"`\n\x0fPrincipalIdList\x12)\n\x07results\x18\x01 \x03(\x0b\x32\x18.littlehorse.PrincipalId\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_bookmark\"\xda\x02\n\x1aSearchExternalEventRequest\x12\x15\n\x08\x62ookmark\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12\x37\n\x0e\x65\x61rliest_start\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x02\x88\x01\x01\x12\x35\n\x0clatest_start\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x03\x88\x01\x01\x12>\n\x15\x65xternal_event_def_id\x18\x05 \x01(\x0b\x32\x1f.littlehorse.ExternalEventDefId\x12\x17\n\nis_claimed\x18\x06 \x01(\x08H\x04\x88\x01\x01\x42\x0b\n\t_bookmarkB\x08\n\x06_limitB\x11\n\x0f_earliest_startB\x0f\n\r_latest_startB\r\n\x0b_is_claimed\"h\n\x13\x45xternalEventIdList\x12-\n\x07results\x18\x01 \x03(\x0b\x32\x1c.littlehorse.ExternalEventId\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_bookmark\"\xb2\x02\n\x1aSearchWorkflowEventRequest\x12\x15\n\x08\x62ookmark\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12\x37\n\x0e\x65\x61rliest_start\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x02\x88\x01\x01\x12\x35\n\x0clatest_start\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x03\x88\x01\x01\x12>\n\x15workflow_event_def_id\x18\x05 \x01(\x0b\x32\x1f.littlehorse.WorkflowEventDefIdB\x0b\n\t_bookmarkB\x08\n\x06_limitB\x11\n\x0f_earliest_startB\x0f\n\r_latest_start\"h\n\x13WorkflowEventIdList\x12-\n\x07results\x18\x01 \x03(\x0b\x32\x1c.littlehorse.WorkflowEventId\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_bookmark\"\xb6\x01\n\x13ListNodeRunsRequest\x12\'\n\twf_run_id\x18\x01 \x01(\x0b\x32\x14.littlehorse.WfRunId\x12\x1e\n\x11thread_run_number\x18\x02 \x01(\x05H\x00\x88\x01\x01\x12\x15\n\x08\x62ookmark\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x12\n\x05limit\x18\x04 \x01(\x05H\x02\x88\x01\x01\x42\x14\n\x12_thread_run_numberB\x0b\n\t_bookmarkB\x08\n\x06_limit\"X\n\x0bNodeRunList\x12%\n\x07results\x18\x01 \x03(\x0b\x32\x14.littlehorse.NodeRun\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_bookmark\"?\n\x14ListVariablesRequest\x12\'\n\twf_run_id\x18\x01 \x01(\x0b\x32\x14.littlehorse.WfRunId\"6\n\x0cVariableList\x12&\n\x07results\x18\x01 \x03(\x0b\x32\x15.littlehorse.Variable\"D\n\x19ListExternalEventsRequest\x12\'\n\twf_run_id\x18\x01 \x01(\x0b\x32\x14.littlehorse.WfRunId\"@\n\x11\x45xternalEventList\x12+\n\x07results\x18\x01 \x03(\x0b\x32\x1a.littlehorse.ExternalEvent\"D\n\x19ListWorkflowEventsRequest\x12\'\n\twf_run_id\x18\x01 \x01(\x0b\x32\x14.littlehorse.WfRunId\"@\n\x11WorkflowEventList\x12+\n\x07results\x18\x01 \x03(\x0b\x32\x1a.littlehorse.WorkflowEvent\"`\n\x19RegisterTaskWorkerRequest\x12\x16\n\x0etask_worker_id\x18\x01 \x01(\t\x12+\n\x0btask_def_id\x18\x02 \x01(\x0b\x32\x16.littlehorse.TaskDefId\"s\n\x1aTaskWorkerHeartBeatRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12+\n\x0btask_def_id\x18\x02 \x01(\x0b\x32\x16.littlehorse.TaskDefId\x12\x15\n\rlistener_name\x18\x03 \x01(\t\"\x81\x01\n\x1aRegisterTaskWorkerResponse\x12+\n\nyour_hosts\x18\x01 \x03(\x0b\x32\x17.littlehorse.LHHostInfo\x12\x1f\n\x12is_cluster_healthy\x18\x02 \x01(\x08H\x00\x88\x01\x01\x42\x15\n\x13_is_cluster_healthy\"(\n\nLHHostInfo\x12\x0c\n\x04host\x18\x01 \x01(\t\x12\x0c\n\x04port\x18\x02 \x01(\x05\"\x8b\x01\n\x0fPollTaskRequest\x12+\n\x0btask_def_id\x18\x01 \x01(\x0b\x32\x16.littlehorse.TaskDefId\x12\x11\n\tclient_id\x18\x02 \x01(\t\x12 \n\x13task_worker_version\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\x16\n\x14_task_worker_version\"\x8c\x02\n\rScheduledTask\x12+\n\x0btask_run_id\x18\x01 \x01(\x0b\x32\x16.littlehorse.TaskRunId\x12+\n\x0btask_def_id\x18\x02 \x01(\x0b\x32\x16.littlehorse.TaskDefId\x12\x16\n\x0e\x61ttempt_number\x18\x03 \x01(\x05\x12-\n\tvariables\x18\x04 \x03(\x0b\x32\x1a.littlehorse.VarNameAndVal\x12.\n\ncreated_at\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12*\n\x06source\x18\x06 \x01(\x0b\x32\x1a.littlehorse.TaskRunSource\"N\n\x10PollTaskResponse\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1a.littlehorse.ScheduledTaskH\x00\x88\x01\x01\x42\t\n\x07_result\"\x81\x03\n\rReportTaskRun\x12+\n\x0btask_run_id\x18\x01 \x01(\x0b\x32\x16.littlehorse.TaskRunId\x12(\n\x04time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\'\n\x06status\x18\x03 \x01(\x0e\x32\x17.littlehorse.TaskStatus\x12\x33\n\nlog_output\x18\x05 \x01(\x0b\x32\x1a.littlehorse.VariableValueH\x01\x88\x01\x01\x12\x16\n\x0e\x61ttempt_number\x18\x06 \x01(\x05\x12,\n\x06output\x18\x04 \x01(\x0b\x32\x1a.littlehorse.VariableValueH\x00\x12)\n\x05\x65rror\x18\x07 \x01(\x0b\x32\x18.littlehorse.LHTaskErrorH\x00\x12\x31\n\texception\x18\x08 \x01(\x0b\x32\x1c.littlehorse.LHTaskExceptionH\x00\x42\x08\n\x06resultB\r\n\x0b_log_output\"V\n\x10StopWfRunRequest\x12\'\n\twf_run_id\x18\x01 \x01(\x0b\x32\x14.littlehorse.WfRunId\x12\x19\n\x11thread_run_number\x18\x02 \x01(\x05\"X\n\x12ResumeWfRunRequest\x12\'\n\twf_run_id\x18\x01 \x01(\x0b\x32\x14.littlehorse.WfRunId\x12\x19\n\x11thread_run_number\x18\x02 \x01(\x05\"w\n\x16RescueThreadRunRequest\x12\'\n\twf_run_id\x18\x01 \x01(\x0b\x32\x14.littlehorse.WfRunId\x12\x19\n\x11thread_run_number\x18\x02 \x01(\x05\x12\x19\n\x11skip_current_node\x18\x03 \x01(\x08\"\xb3\x01\n\x1aTaskDefMetricsQueryRequest\x12\x30\n\x0cwindow_start\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x35\n\x0bwindow_type\x18\x02 \x01(\x0e\x32 .littlehorse.MetricsWindowLength\x12\x1a\n\rtask_def_name\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\x10\n\x0e_task_def_name\"\xca\x01\n\x16ListTaskMetricsRequest\x12+\n\x0btask_def_id\x18\x01 \x01(\x0b\x32\x16.littlehorse.TaskDefId\x12\x35\n\x11last_window_start\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\rwindow_length\x18\x03 \x01(\x0e\x32 .littlehorse.MetricsWindowLength\x12\x13\n\x0bnum_windows\x18\x04 \x01(\x05\"G\n\x17ListTaskMetricsResponse\x12,\n\x07results\x18\x01 \x03(\x0b\x32\x1b.littlehorse.TaskDefMetrics\"\xb1\x01\n\x19WfSpecMetricsQueryRequest\x12)\n\nwf_spec_id\x18\x01 \x01(\x0b\x32\x15.littlehorse.WfSpecId\x12\x30\n\x0cwindow_start\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\rwindow_length\x18\x03 \x01(\x0e\x32 .littlehorse.MetricsWindowLength\"\xc6\x01\n\x14ListWfMetricsRequest\x12)\n\nwf_spec_id\x18\x01 \x01(\x0b\x32\x15.littlehorse.WfSpecId\x12\x35\n\x11last_window_start\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\rwindow_length\x18\x03 \x01(\x0e\x32 .littlehorse.MetricsWindowLength\x12\x13\n\x0bnum_windows\x18\x04 \x01(\x05\"D\n\x15ListWfMetricsResponse\x12+\n\x07results\x18\x01 \x03(\x0b\x32\x1a.littlehorse.WfSpecMetrics\"\xfb\x02\n\x0eTaskDefMetrics\x12+\n\x0btask_def_id\x18\x01 \x01(\x0b\x32\x16.littlehorse.TaskDefId\x12\x30\n\x0cwindow_start\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\x04type\x18\x03 \x01(\x0e\x32 .littlehorse.MetricsWindowLength\x12\x1d\n\x15schedule_to_start_max\x18\x04 \x01(\x03\x12\x1d\n\x15schedule_to_start_avg\x18\x05 \x01(\x03\x12\x1d\n\x15start_to_complete_max\x18\x06 \x01(\x03\x12\x1d\n\x15start_to_complete_avg\x18\x07 \x01(\x03\x12\x17\n\x0ftotal_completed\x18\x08 \x01(\x03\x12\x15\n\rtotal_errored\x18\t \x01(\x03\x12\x15\n\rtotal_started\x18\n \x01(\x03\x12\x17\n\x0ftotal_scheduled\x18\x0b \x01(\x03\"\xa1\x02\n\rWfSpecMetrics\x12)\n\nwf_spec_id\x18\x01 \x01(\x0b\x32\x15.littlehorse.WfSpecId\x12\x30\n\x0cwindow_start\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\x04type\x18\x03 \x01(\x0e\x32 .littlehorse.MetricsWindowLength\x12\x15\n\rtotal_started\x18\x04 \x01(\x03\x12\x17\n\x0ftotal_completed\x18\x05 \x01(\x03\x12\x15\n\rtotal_errored\x18\x06 \x01(\x03\x12\x1d\n\x15start_to_complete_max\x18\x07 \x01(\x03\x12\x1d\n\x15start_to_complete_avg\x18\x08 \x01(\x03\"A\n\x16ListUserTaskRunRequest\x12\'\n\twf_run_id\x18\x01 \x01(\x0b\x32\x14.littlehorse.WfRunId\"<\n\x0fUserTaskRunList\x12)\n\x07results\x18\x01 \x03(\x0b\x32\x18.littlehorse.UserTaskRun\"F\n\x14ScheduledWfRunIdList\x12.\n\x07results\x18\x01 \x03(\x0b\x32\x1d.littlehorse.ScheduledWfRunId\"\x85\x01\n\x1bSearchScheduledWfRunRequest\x12\x14\n\x0cwf_spec_name\x18\x01 \x01(\t\x12\x1a\n\rmajor_version\x18\x02 \x01(\x05H\x00\x88\x01\x01\x12\x15\n\x08revision\x18\x03 \x01(\x05H\x01\x88\x01\x01\x42\x10\n\x0e_major_versionB\x0b\n\t_revision\"\x8a\x01\n\x12TaskWorkerMetadata\x12\x16\n\x0etask_worker_id\x18\x01 \x01(\t\x12\x34\n\x10latest_heartbeat\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12&\n\x05hosts\x18\x03 \x03(\x0b\x32\x17.littlehorse.LHHostInfo\"\x87\x02\n\x0fTaskWorkerGroup\x12*\n\x02id\x18\x01 \x01(\x0b\x32\x1e.littlehorse.TaskWorkerGroupId\x12.\n\ncreated_at\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x43\n\x0ctask_workers\x18\x03 \x03(\x0b\x32-.littlehorse.TaskWorkerGroup.TaskWorkersEntry\x1aS\n\x10TaskWorkersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.littlehorse.TaskWorkerMetadata:\x02\x38\x01\">\n\x13ListTaskRunsRequest\x12\'\n\twf_run_id\x18\x01 \x01(\x0b\x32\x14.littlehorse.WfRunId\"4\n\x0bTaskRunList\x12%\n\x07results\x18\x01 \x03(\x0b\x32\x14.littlehorse.TaskRun\"z\n\x14MigrateWfSpecRequest\x12*\n\x0bold_wf_spec\x18\x01 \x01(\x0b\x32\x15.littlehorse.WfSpecId\x12\x36\n\tmigration\x18\x02 \x01(\x0b\x32#.littlehorse.WfSpecVersionMigration\"T\n\x16GetLatestWfSpecRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1a\n\rmajor_version\x18\x02 \x01(\x05H\x00\x88\x01\x01\x42\x10\n\x0e_major_version\"\x94\x01\n\rServerVersion\x12\x15\n\rmajor_version\x18\x01 \x01(\x05\x12\x15\n\rminor_version\x18\x02 \x01(\x05\x12\x15\n\rpatch_version\x18\x03 \x01(\x05\x12#\n\x16pre_release_identifier\x18\x04 \x01(\tH\x00\x88\x01\x01\x42\x19\n\x17_pre_release_identifier*P\n\x11\x41llowedUpdateType\x12\x0f\n\x0b\x41LL_UPDATES\x10\x00\x12\x1a\n\x16MINOR_REVISION_UPDATES\x10\x01\x12\x0e\n\nNO_UPDATES\x10\x02\x32\xea/\n\x0bLittleHorse\x12\x44\n\nPutTaskDef\x12\x1e.littlehorse.PutTaskDefRequest\x1a\x14.littlehorse.TaskDef\"\x00\x12<\n\nGetTaskDef\x12\x16.littlehorse.TaskDefId\x1a\x14.littlehorse.TaskDef\"\x00\x12L\n\x12GetTaskWorkerGroup\x12\x16.littlehorse.TaskDefId\x1a\x1c.littlehorse.TaskWorkerGroup\"\x00\x12_\n\x13PutExternalEventDef\x12\'.littlehorse.PutExternalEventDefRequest\x1a\x1d.littlehorse.ExternalEventDef\"\x00\x12W\n\x13GetExternalEventDef\x12\x1f.littlehorse.ExternalEventDefId\x1a\x1d.littlehorse.ExternalEventDef\"\x00\x12_\n\x13PutWorkflowEventDef\x12\'.littlehorse.PutWorkflowEventDefRequest\x1a\x1d.littlehorse.WorkflowEventDef\"\x00\x12\x41\n\tPutWfSpec\x12\x1d.littlehorse.PutWfSpecRequest\x1a\x13.littlehorse.WfSpec\"\x00\x12\x39\n\tGetWfSpec\x12\x15.littlehorse.WfSpecId\x1a\x13.littlehorse.WfSpec\"\x00\x12M\n\x0fGetLatestWfSpec\x12#.littlehorse.GetLatestWfSpecRequest\x1a\x13.littlehorse.WfSpec\"\x00\x12I\n\rMigrateWfSpec\x12!.littlehorse.MigrateWfSpecRequest\x1a\x13.littlehorse.WfSpec\"\x00\x12P\n\x0ePutUserTaskDef\x12\".littlehorse.PutUserTaskDefRequest\x1a\x18.littlehorse.UserTaskDef\"\x00\x12H\n\x0eGetUserTaskDef\x12\x1a.littlehorse.UserTaskDefId\x1a\x18.littlehorse.UserTaskDef\"\x00\x12\\\n\x14GetLatestUserTaskDef\x12(.littlehorse.GetLatestUserTaskDefRequest\x1a\x18.littlehorse.UserTaskDef\"\x00\x12\x38\n\x05RunWf\x12\x19.littlehorse.RunWfRequest\x1a\x12.littlehorse.WfRun\"\x00\x12K\n\nScheduleWf\x12\x1e.littlehorse.ScheduleWfRequest\x1a\x1b.littlehorse.ScheduledWfRun\"\x00\x12\x65\n\x14SearchScheduledWfRun\x12(.littlehorse.SearchScheduledWfRunRequest\x1a!.littlehorse.ScheduledWfRunIdList\"\x00\x12Q\n\x11GetScheduledWfRun\x12\x1d.littlehorse.ScheduledWfRunId\x1a\x1b.littlehorse.ScheduledWfRun\"\x00\x12\x36\n\x08GetWfRun\x12\x14.littlehorse.WfRunId\x1a\x12.littlehorse.WfRun\"\x00\x12H\n\x0eGetUserTaskRun\x12\x1a.littlehorse.UserTaskRunId\x1a\x18.littlehorse.UserTaskRun\"\x00\x12T\n\x11\x41ssignUserTaskRun\x12%.littlehorse.AssignUserTaskRunRequest\x1a\x16.google.protobuf.Empty\"\x00\x12X\n\x13\x43ompleteUserTaskRun\x12\'.littlehorse.CompleteUserTaskRunRequest\x1a\x16.google.protobuf.Empty\"\x00\x12T\n\x11\x43\x61ncelUserTaskRun\x12%.littlehorse.CancelUserTaskRunRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x62\n\x17SaveUserTaskRunProgress\x12+.littlehorse.SaveUserTaskRunProgressRequest\x1a\x18.littlehorse.UserTaskRun\"\x00\x12W\n\x10ListUserTaskRuns\x12#.littlehorse.ListUserTaskRunRequest\x1a\x1c.littlehorse.UserTaskRunList\"\x00\x12<\n\nGetNodeRun\x12\x16.littlehorse.NodeRunId\x1a\x14.littlehorse.NodeRun\"\x00\x12L\n\x0cListNodeRuns\x12 .littlehorse.ListNodeRunsRequest\x1a\x18.littlehorse.NodeRunList\"\x00\x12<\n\nGetTaskRun\x12\x16.littlehorse.TaskRunId\x1a\x14.littlehorse.TaskRun\"\x00\x12L\n\x0cListTaskRuns\x12 .littlehorse.ListTaskRunsRequest\x1a\x18.littlehorse.TaskRunList\"\x00\x12?\n\x0bGetVariable\x12\x17.littlehorse.VariableId\x1a\x15.littlehorse.Variable\"\x00\x12O\n\rListVariables\x12!.littlehorse.ListVariablesRequest\x1a\x19.littlehorse.VariableList\"\x00\x12V\n\x10PutExternalEvent\x12$.littlehorse.PutExternalEventRequest\x1a\x1a.littlehorse.ExternalEvent\"\x00\x12N\n\x10GetExternalEvent\x12\x1c.littlehorse.ExternalEventId\x1a\x1a.littlehorse.ExternalEvent\"\x00\x12Z\n\x12\x41waitWorkflowEvent\x12&.littlehorse.AwaitWorkflowEventRequest\x1a\x1a.littlehorse.WorkflowEvent\"\x00\x12W\n\x13GetWorkflowEventDef\x12\x1f.littlehorse.WorkflowEventDefId\x1a\x1d.littlehorse.WorkflowEventDef\"\x00\x12N\n\x10GetWorkflowEvent\x12\x1c.littlehorse.WorkflowEventId\x1a\x1a.littlehorse.WorkflowEvent\"\x00\x12^\n\x12ListExternalEvents\x12&.littlehorse.ListExternalEventsRequest\x1a\x1e.littlehorse.ExternalEventList\"\x00\x12^\n\x12ListWorkflowEvents\x12&.littlehorse.ListWorkflowEventsRequest\x1a\x1e.littlehorse.WorkflowEventList\"\x00\x12J\n\x0bSearchWfRun\x12\x1f.littlehorse.SearchWfRunRequest\x1a\x18.littlehorse.WfRunIdList\"\x00\x12P\n\rSearchNodeRun\x12!.littlehorse.SearchNodeRunRequest\x1a\x1a.littlehorse.NodeRunIdList\"\x00\x12P\n\rSearchTaskRun\x12!.littlehorse.SearchTaskRunRequest\x1a\x1a.littlehorse.TaskRunIdList\"\x00\x12\\\n\x11SearchUserTaskRun\x12%.littlehorse.SearchUserTaskRunRequest\x1a\x1e.littlehorse.UserTaskRunIdList\"\x00\x12S\n\x0eSearchVariable\x12\".littlehorse.SearchVariableRequest\x1a\x1b.littlehorse.VariableIdList\"\x00\x12\x62\n\x13SearchExternalEvent\x12\'.littlehorse.SearchExternalEventRequest\x1a .littlehorse.ExternalEventIdList\"\x00\x12\x62\n\x13SearchWorkflowEvent\x12\'.littlehorse.SearchWorkflowEventRequest\x1a .littlehorse.WorkflowEventIdList\"\x00\x12P\n\rSearchTaskDef\x12!.littlehorse.SearchTaskDefRequest\x1a\x1a.littlehorse.TaskDefIdList\"\x00\x12\\\n\x11SearchUserTaskDef\x12%.littlehorse.SearchUserTaskDefRequest\x1a\x1e.littlehorse.UserTaskDefIdList\"\x00\x12M\n\x0cSearchWfSpec\x12 .littlehorse.SearchWfSpecRequest\x1a\x19.littlehorse.WfSpecIdList\"\x00\x12k\n\x16SearchExternalEventDef\x12*.littlehorse.SearchExternalEventDefRequest\x1a#.littlehorse.ExternalEventDefIdList\"\x00\x12k\n\x16SearchWorkflowEventDef\x12*.littlehorse.SearchWorkflowEventDefRequest\x1a#.littlehorse.WorkflowEventDefIdList\"\x00\x12M\n\x0cSearchTenant\x12 .littlehorse.SearchTenantRequest\x1a\x19.littlehorse.TenantIdList\"\x00\x12V\n\x0fSearchPrincipal\x12#.littlehorse.SearchPrincipalRequest\x1a\x1c.littlehorse.PrincipalIdList\"\x00\x12g\n\x12RegisterTaskWorker\x12&.littlehorse.RegisterTaskWorkerRequest\x1a\'.littlehorse.RegisterTaskWorkerResponse\"\x00\x12M\n\x08PollTask\x12\x1c.littlehorse.PollTaskRequest\x1a\x1d.littlehorse.PollTaskResponse\"\x00(\x01\x30\x01\x12\x42\n\nReportTask\x12\x1a.littlehorse.ReportTaskRun\x1a\x16.google.protobuf.Empty\"\x00\x12\x44\n\tStopWfRun\x12\x1d.littlehorse.StopWfRunRequest\x1a\x16.google.protobuf.Empty\"\x00\x12H\n\x0bResumeWfRun\x12\x1f.littlehorse.ResumeWfRunRequest\x1a\x16.google.protobuf.Empty\"\x00\x12L\n\x0fRescueThreadRun\x12#.littlehorse.RescueThreadRunRequest\x1a\x12.littlehorse.WfRun\"\x00\x12H\n\x0b\x44\x65leteWfRun\x12\x1f.littlehorse.DeleteWfRunRequest\x1a\x16.google.protobuf.Empty\"\x00\x12L\n\rDeleteTaskDef\x12!.littlehorse.DeleteTaskDefRequest\x1a\x16.google.protobuf.Empty\"\x00\x12J\n\x0c\x44\x65leteWfSpec\x12 .littlehorse.DeleteWfSpecRequest\x1a\x16.google.protobuf.Empty\"\x00\x12T\n\x11\x44\x65leteUserTaskDef\x12%.littlehorse.DeleteUserTaskDefRequest\x1a\x16.google.protobuf.Empty\"\x00\x12^\n\x16\x44\x65leteExternalEventDef\x12*.littlehorse.DeleteExternalEventDefRequest\x1a\x16.google.protobuf.Empty\"\x00\x12^\n\x16\x44\x65leteWorkflowEventDef\x12*.littlehorse.DeleteWorkflowEventDefRequest\x1a\x16.google.protobuf.Empty\"\x00\x12P\n\x0f\x44\x65letePrincipal\x12#.littlehorse.DeletePrincipalRequest\x1a\x16.google.protobuf.Empty\"\x00\x12Z\n\x14\x44\x65leteScheduledWfRun\x12(.littlehorse.DeleteScheduledWfRunRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x61\n\x17GetTaskDefMetricsWindow\x12\'.littlehorse.TaskDefMetricsQueryRequest\x1a\x1b.littlehorse.TaskDefMetrics\"\x00\x12^\n\x16GetWfSpecMetricsWindow\x12&.littlehorse.WfSpecMetricsQueryRequest\x1a\x1a.littlehorse.WfSpecMetrics\"\x00\x12\x61\n\x12ListTaskDefMetrics\x12#.littlehorse.ListTaskMetricsRequest\x1a$.littlehorse.ListTaskMetricsResponse\"\x00\x12\\\n\x11ListWfSpecMetrics\x12!.littlehorse.ListWfMetricsRequest\x1a\".littlehorse.ListWfMetricsResponse\"\x00\x12\x41\n\tPutTenant\x12\x1d.littlehorse.PutTenantRequest\x1a\x13.littlehorse.Tenant\"\x00\x12\x39\n\tGetTenant\x12\x15.littlehorse.TenantId\x1a\x13.littlehorse.Tenant\"\x00\x12J\n\x0cPutPrincipal\x12 .littlehorse.PutPrincipalRequest\x1a\x16.littlehorse.Principal\"\x00\x12:\n\x06Whoami\x12\x16.google.protobuf.Empty\x1a\x16.littlehorse.Principal\"\x00\x12H\n\x10GetServerVersion\x12\x16.google.protobuf.Empty\x1a\x1a.littlehorse.ServerVersion\"\x00\x42I\n\x1fio.littlehorse.sdk.common.protoP\x01Z\t.;lhproto\xaa\x02\x18LittleHorse.Common.Protob\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\rservice.proto\x12\x0blittlehorse\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x13\x63ommon_wfspec.proto\x1a\x12\x63ommon_enums.proto\x1a\x0fobject_id.proto\x1a\x0evariable.proto\x1a\x14\x65xternal_event.proto\x1a\x0cwf_run.proto\x1a\x0enode_run.proto\x1a\x0etask_run.proto\x1a\x10user_tasks.proto\x1a\rwf_spec.proto\x1a\x0etask_def.proto\x1a\nacls.proto\x1a\x14workflow_event.proto\x1a\x16scheduled_wf_run.proto\"+\n\x1bGetLatestUserTaskDefRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\xd3\x03\n\x10PutWfSpecRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x44\n\x0cthread_specs\x18\x05 \x03(\x0b\x32..littlehorse.PutWfSpecRequest.ThreadSpecsEntry\x12\x1e\n\x16\x65ntrypoint_thread_name\x18\x06 \x01(\t\x12\x43\n\x10retention_policy\x18\x08 \x01(\x0b\x32$.littlehorse.WorkflowRetentionPolicyH\x00\x88\x01\x01\x12\x46\n\x0eparent_wf_spec\x18\t \x01(\x0b\x32).littlehorse.WfSpec.ParentWfSpecReferenceH\x01\x88\x01\x01\x12\x37\n\x0f\x61llowed_updates\x18\n \x01(\x0e\x32\x1e.littlehorse.AllowedUpdateType\x1aK\n\x10ThreadSpecsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12&\n\x05value\x18\x02 \x01(\x0b\x32\x17.littlehorse.ThreadSpec:\x02\x38\x01\x42\x13\n\x11_retention_policyB\x11\n\x0f_parent_wf_specJ\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04J\x04\x08\x04\x10\x05\"\x9f\x01\n\x11PutTaskDefRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12,\n\ninput_vars\x18\x02 \x03(\x0b\x32\x18.littlehorse.VariableDef\x12<\n\routput_schema\x18\x03 \x01(\x0b\x32 .littlehorse.TaskDefOutputSchemaH\x00\x88\x01\x01\x42\x10\n\x0e_output_schema\"S\n\x1aPutWorkflowEventDefRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\'\n\x04type\x18\x02 \x01(\x0e\x32\x19.littlehorse.VariableType\"{\n\x15PutUserTaskDefRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12*\n\x06\x66ields\x18\x02 \x03(\x0b\x32\x1a.littlehorse.UserTaskField\x12\x18\n\x0b\x64\x65scription\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\x0e\n\x0c_description\"o\n\x1aPutExternalEventDefRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x43\n\x10retention_policy\x18\x02 \x01(\x0b\x32).littlehorse.ExternalEventRetentionPolicy\"\xc3\x02\n\x17PutExternalEventRequest\x12\'\n\twf_run_id\x18\x01 \x01(\x0b\x32\x14.littlehorse.WfRunId\x12>\n\x15\x65xternal_event_def_id\x18\x02 \x01(\x0b\x32\x1f.littlehorse.ExternalEventDefId\x12\x11\n\x04guid\x18\x03 \x01(\tH\x00\x88\x01\x01\x12+\n\x07\x63ontent\x18\x05 \x01(\x0b\x32\x1a.littlehorse.VariableValue\x12\x1e\n\x11thread_run_number\x18\x06 \x01(\x05H\x01\x88\x01\x01\x12\x1e\n\x11node_run_position\x18\x07 \x01(\x05H\x02\x88\x01\x01\x42\x07\n\x05_guidB\x14\n\x12_thread_run_numberB\x14\n\x12_node_run_positionJ\x04\x08\x04\x10\x05J\x04\x08\x08\x10\t\"F\n\x1a\x44\x65leteExternalEventRequest\x12(\n\x02id\x18\x01 \x01(\x0b\x32\x1c.littlehorse.ExternalEventId\"H\n\x1b\x44\x65leteScheduledWfRunRequest\x12)\n\x02id\x18\x01 \x01(\x0b\x32\x1d.littlehorse.ScheduledWfRunId\"6\n\x12\x44\x65leteWfRunRequest\x12 \n\x02id\x18\x01 \x01(\x0b\x32\x14.littlehorse.WfRunId\":\n\x14\x44\x65leteTaskDefRequest\x12\"\n\x02id\x18\x01 \x01(\x0b\x32\x16.littlehorse.TaskDefId\"B\n\x18\x44\x65leteUserTaskDefRequest\x12&\n\x02id\x18\x01 \x01(\x0b\x32\x1a.littlehorse.UserTaskDefId\"8\n\x13\x44\x65leteWfSpecRequest\x12!\n\x02id\x18\x01 \x01(\x0b\x32\x15.littlehorse.WfSpecId\"L\n\x1d\x44\x65leteExternalEventDefRequest\x12+\n\x02id\x18\x01 \x01(\x0b\x32\x1f.littlehorse.ExternalEventDefId\"L\n\x1d\x44\x65leteWorkflowEventDefRequest\x12+\n\x02id\x18\x01 \x01(\x0b\x32\x1f.littlehorse.WorkflowEventDefId\"\xe3\x02\n\x0cRunWfRequest\x12\x14\n\x0cwf_spec_name\x18\x01 \x01(\t\x12\x1a\n\rmajor_version\x18\x02 \x01(\x05H\x00\x88\x01\x01\x12\x15\n\x08revision\x18\x03 \x01(\x05H\x01\x88\x01\x01\x12;\n\tvariables\x18\x04 \x03(\x0b\x32(.littlehorse.RunWfRequest.VariablesEntry\x12\x0f\n\x02id\x18\x05 \x01(\tH\x02\x88\x01\x01\x12\x33\n\x10parent_wf_run_id\x18\x06 \x01(\x0b\x32\x14.littlehorse.WfRunIdH\x03\x88\x01\x01\x1aL\n\x0eVariablesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12)\n\x05value\x18\x02 \x01(\x0b\x32\x1a.littlehorse.VariableValue:\x02\x38\x01\x42\x10\n\x0e_major_versionB\x0b\n\t_revisionB\x05\n\x03_idB\x13\n\x11_parent_wf_run_id\"\x86\x03\n\x11ScheduleWfRequest\x12\x0f\n\x02id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x0cwf_spec_name\x18\x02 \x01(\t\x12\x1a\n\rmajor_version\x18\x03 \x01(\x05H\x01\x88\x01\x01\x12\x15\n\x08revision\x18\x04 \x01(\x05H\x02\x88\x01\x01\x12@\n\tvariables\x18\x05 \x03(\x0b\x32-.littlehorse.ScheduleWfRequest.VariablesEntry\x12\x33\n\x10parent_wf_run_id\x18\x06 \x01(\x0b\x32\x14.littlehorse.WfRunIdH\x03\x88\x01\x01\x12\x17\n\x0f\x63ron_expression\x18\x07 \x01(\t\x1aL\n\x0eVariablesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12)\n\x05value\x18\x02 \x01(\x0b\x32\x1a.littlehorse.VariableValue:\x02\x38\x01\x42\x05\n\x03_idB\x10\n\x0e_major_versionB\x0b\n\t_revisionB\x13\n\x11_parent_wf_run_id\"L\n\rVariableMatch\x12\x10\n\x08var_name\x18\x01 \x01(\t\x12)\n\x05value\x18\x02 \x01(\x0b\x32\x1a.littlehorse.VariableValue\"\xbd\x01\n\x19\x41waitWorkflowEventRequest\x12\'\n\twf_run_id\x18\x01 \x01(\x0b\x32\x14.littlehorse.WfRunId\x12\x36\n\revent_def_ids\x18\x02 \x03(\x0b\x32\x1f.littlehorse.WorkflowEventDefId\x12?\n\x19workflow_events_to_ignore\x18\x03 \x03(\x0b\x32\x1c.littlehorse.WorkflowEventId\"\xdf\x03\n\x12SearchWfRunRequest\x12\x15\n\x08\x62ookmark\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12\x14\n\x0cwf_spec_name\x18\x03 \x01(\t\x12\"\n\x15wf_spec_major_version\x18\x04 \x01(\x05H\x02\x88\x01\x01\x12\x1d\n\x10wf_spec_revision\x18\x05 \x01(\x05H\x03\x88\x01\x01\x12*\n\x06status\x18\x06 \x01(\x0e\x32\x15.littlehorse.LHStatusH\x04\x88\x01\x01\x12\x37\n\x0e\x65\x61rliest_start\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x05\x88\x01\x01\x12\x35\n\x0clatest_start\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x06\x88\x01\x01\x12\x34\n\x10variable_filters\x18\t \x03(\x0b\x32\x1a.littlehorse.VariableMatchB\x0b\n\t_bookmarkB\x08\n\x06_limitB\x18\n\x16_wf_spec_major_versionB\x13\n\x11_wf_spec_revisionB\t\n\x07_statusB\x11\n\x0f_earliest_startB\x0f\n\r_latest_start\"X\n\x0bWfRunIdList\x12%\n\x07results\x18\x01 \x03(\x0b\x32\x14.littlehorse.WfRunId\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_bookmark\"\xbc\x02\n\x14SearchTaskRunRequest\x12\x15\n\x08\x62ookmark\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12\x15\n\rtask_def_name\x18\x03 \x01(\t\x12,\n\x06status\x18\x04 \x01(\x0e\x32\x17.littlehorse.TaskStatusH\x02\x88\x01\x01\x12\x37\n\x0e\x65\x61rliest_start\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x03\x88\x01\x01\x12\x35\n\x0clatest_start\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x04\x88\x01\x01\x42\x0b\n\t_bookmarkB\x08\n\x06_limitB\t\n\x07_statusB\x11\n\x0f_earliest_startB\x0f\n\r_latest_start\"\\\n\rTaskRunIdList\x12\'\n\x07results\x18\x01 \x03(\x0b\x32\x16.littlehorse.TaskRunId\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_bookmark\"\xf1\x03\n\x14SearchNodeRunRequest\x12\x15\n\x08\x62ookmark\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12\x37\n\x0e\x65\x61rliest_start\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x02\x88\x01\x01\x12\x35\n\x0clatest_start\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x03\x88\x01\x01\x12=\n\tnode_type\x18\x05 \x01(\x0e\x32*.littlehorse.SearchNodeRunRequest.NodeType\x12%\n\x06status\x18\x06 \x01(\x0e\x32\x15.littlehorse.LHStatus\"\x9c\x01\n\x08NodeType\x12\x08\n\x04TASK\x10\x00\x12\x12\n\x0e\x45XTERNAL_EVENT\x10\x01\x12\x0e\n\nENTRYPOINT\x10\x02\x12\x08\n\x04\x45XIT\x10\x03\x12\x10\n\x0cSTART_THREAD\x10\x04\x12\x10\n\x0cWAIT_THREADS\x10\x05\x12\t\n\x05SLEEP\x10\x06\x12\r\n\tUSER_TASK\x10\x07\x12\x1a\n\x16START_MULTIPLE_THREADS\x10\x08\x42\x0b\n\t_bookmarkB\x08\n\x06_limitB\x11\n\x0f_earliest_startB\x0f\n\r_latest_start\"\\\n\rNodeRunIdList\x12\'\n\x07results\x18\x01 \x03(\x0b\x32\x16.littlehorse.NodeRunId\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_bookmark\"\xb2\x03\n\x18SearchUserTaskRunRequest\x12\x15\n\x08\x62ookmark\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12\x33\n\x06status\x18\x03 \x01(\x0e\x32\x1e.littlehorse.UserTaskRunStatusH\x02\x88\x01\x01\x12\x1f\n\x12user_task_def_name\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x14\n\x07user_id\x18\x05 \x01(\tH\x04\x88\x01\x01\x12\x17\n\nuser_group\x18\x06 \x01(\tH\x05\x88\x01\x01\x12\x37\n\x0e\x65\x61rliest_start\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x06\x88\x01\x01\x12\x35\n\x0clatest_start\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x07\x88\x01\x01\x42\x0b\n\t_bookmarkB\x08\n\x06_limitB\t\n\x07_statusB\x15\n\x13_user_task_def_nameB\n\n\x08_user_idB\r\n\x0b_user_groupB\x11\n\x0f_earliest_startB\x0f\n\r_latest_start\"d\n\x11UserTaskRunIdList\x12+\n\x07results\x18\x01 \x03(\x0b\x32\x1a.littlehorse.UserTaskRunId\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_bookmark\"\x9e\x02\n\x15SearchVariableRequest\x12\x15\n\x08\x62ookmark\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12)\n\x05value\x18\x03 \x01(\x0b\x32\x1a.littlehorse.VariableValue\x12\"\n\x15wf_spec_major_version\x18\x04 \x01(\x05H\x02\x88\x01\x01\x12\x1d\n\x10wf_spec_revision\x18\x05 \x01(\x05H\x03\x88\x01\x01\x12\x10\n\x08var_name\x18\x06 \x01(\t\x12\x14\n\x0cwf_spec_name\x18\x07 \x01(\tB\x0b\n\t_bookmarkB\x08\n\x06_limitB\x18\n\x16_wf_spec_major_versionB\x13\n\x11_wf_spec_revision\"^\n\x0eVariableIdList\x12(\n\x07results\x18\x01 \x03(\x0b\x32\x17.littlehorse.VariableId\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_bookmark\"x\n\x14SearchTaskDefRequest\x12\x15\n\x08\x62ookmark\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12\x13\n\x06prefix\x18\x03 \x01(\tH\x02\x88\x01\x01\x42\x0b\n\t_bookmarkB\x08\n\x06_limitB\t\n\x07_prefix\"\\\n\rTaskDefIdList\x12\'\n\x07results\x18\x01 \x03(\x0b\x32\x16.littlehorse.TaskDefId\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_bookmark\"\x98\x01\n\x18SearchUserTaskDefRequest\x12\x15\n\x08\x62ookmark\x18\x01 \x01(\x0cH\x01\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\x05H\x02\x88\x01\x01\x12\x10\n\x06prefix\x18\x03 \x01(\tH\x00\x12\x0e\n\x04name\x18\x04 \x01(\tH\x00\x42\x18\n\x16user_task_def_criteriaB\x0b\n\t_bookmarkB\x08\n\x06_limit\"d\n\x11UserTaskDefIdList\x12+\n\x07results\x18\x01 \x03(\x0b\x32\x1a.littlehorse.UserTaskDefId\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_bookmark\"\xa6\x01\n\x13SearchWfSpecRequest\x12\x15\n\x08\x62ookmark\x18\x01 \x01(\x0cH\x01\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\x05H\x02\x88\x01\x01\x12\x0e\n\x04name\x18\x03 \x01(\tH\x00\x12\x10\n\x06prefix\x18\x04 \x01(\tH\x00\x12\x17\n\rtask_def_name\x18\x05 \x01(\tH\x00\x42\x12\n\x10wf_spec_criteriaB\x0b\n\t_bookmarkB\x08\n\x06_limit\"Z\n\x0cWfSpecIdList\x12&\n\x07results\x18\x01 \x03(\x0b\x32\x15.littlehorse.WfSpecId\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_bookmark\"\x81\x01\n\x1dSearchExternalEventDefRequest\x12\x15\n\x08\x62ookmark\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12\x13\n\x06prefix\x18\x03 \x01(\tH\x02\x88\x01\x01\x42\x0b\n\t_bookmarkB\x08\n\x06_limitB\t\n\x07_prefix\"n\n\x16\x45xternalEventDefIdList\x12\x30\n\x07results\x18\x01 \x03(\x0b\x32\x1f.littlehorse.ExternalEventDefId\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_bookmark\"\x81\x01\n\x1dSearchWorkflowEventDefRequest\x12\x15\n\x08\x62ookmark\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12\x13\n\x06prefix\x18\x03 \x01(\tH\x02\x88\x01\x01\x42\x0b\n\t_bookmarkB\x08\n\x06_limitB\t\n\x07_prefix\"n\n\x16WorkflowEventDefIdList\x12\x30\n\x07results\x18\x01 \x03(\x0b\x32\x1f.littlehorse.WorkflowEventDefId\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_bookmark\"W\n\x13SearchTenantRequest\x12\x12\n\x05limit\x18\x01 \x01(\x05H\x00\x88\x01\x01\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x01\x88\x01\x01\x42\x08\n\x06_limitB\x0b\n\t_bookmark\"Z\n\x0cTenantIdList\x12&\n\x07results\x18\x01 \x03(\x0b\x32\x15.littlehorse.TenantId\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_bookmark\"\xab\x02\n\x16SearchPrincipalRequest\x12\x15\n\x08\x62ookmark\x18\x01 \x01(\x0cH\x01\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\x05H\x02\x88\x01\x01\x12\x37\n\x0e\x65\x61rliest_start\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x03\x88\x01\x01\x12\x35\n\x0clatest_start\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x04\x88\x01\x01\x12\x11\n\x07isAdmin\x18\x05 \x01(\x08H\x00\x12\x12\n\x08tenantId\x18\x06 \x01(\tH\x00\x42\x14\n\x12principal_criteriaB\x0b\n\t_bookmarkB\x08\n\x06_limitB\x11\n\x0f_earliest_startB\x0f\n\r_latest_start\"`\n\x0fPrincipalIdList\x12)\n\x07results\x18\x01 \x03(\x0b\x32\x18.littlehorse.PrincipalId\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_bookmark\"\xda\x02\n\x1aSearchExternalEventRequest\x12\x15\n\x08\x62ookmark\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12\x37\n\x0e\x65\x61rliest_start\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x02\x88\x01\x01\x12\x35\n\x0clatest_start\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x03\x88\x01\x01\x12>\n\x15\x65xternal_event_def_id\x18\x05 \x01(\x0b\x32\x1f.littlehorse.ExternalEventDefId\x12\x17\n\nis_claimed\x18\x06 \x01(\x08H\x04\x88\x01\x01\x42\x0b\n\t_bookmarkB\x08\n\x06_limitB\x11\n\x0f_earliest_startB\x0f\n\r_latest_startB\r\n\x0b_is_claimed\"h\n\x13\x45xternalEventIdList\x12-\n\x07results\x18\x01 \x03(\x0b\x32\x1c.littlehorse.ExternalEventId\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_bookmark\"\xb2\x02\n\x1aSearchWorkflowEventRequest\x12\x15\n\x08\x62ookmark\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12\x37\n\x0e\x65\x61rliest_start\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x02\x88\x01\x01\x12\x35\n\x0clatest_start\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x03\x88\x01\x01\x12>\n\x15workflow_event_def_id\x18\x05 \x01(\x0b\x32\x1f.littlehorse.WorkflowEventDefIdB\x0b\n\t_bookmarkB\x08\n\x06_limitB\x11\n\x0f_earliest_startB\x0f\n\r_latest_start\"h\n\x13WorkflowEventIdList\x12-\n\x07results\x18\x01 \x03(\x0b\x32\x1c.littlehorse.WorkflowEventId\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_bookmark\"\xb6\x01\n\x13ListNodeRunsRequest\x12\'\n\twf_run_id\x18\x01 \x01(\x0b\x32\x14.littlehorse.WfRunId\x12\x1e\n\x11thread_run_number\x18\x02 \x01(\x05H\x00\x88\x01\x01\x12\x15\n\x08\x62ookmark\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x12\x12\n\x05limit\x18\x04 \x01(\x05H\x02\x88\x01\x01\x42\x14\n\x12_thread_run_numberB\x0b\n\t_bookmarkB\x08\n\x06_limit\"X\n\x0bNodeRunList\x12%\n\x07results\x18\x01 \x03(\x0b\x32\x14.littlehorse.NodeRun\x12\x15\n\x08\x62ookmark\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_bookmark\"?\n\x14ListVariablesRequest\x12\'\n\twf_run_id\x18\x01 \x01(\x0b\x32\x14.littlehorse.WfRunId\"6\n\x0cVariableList\x12&\n\x07results\x18\x01 \x03(\x0b\x32\x15.littlehorse.Variable\"D\n\x19ListExternalEventsRequest\x12\'\n\twf_run_id\x18\x01 \x01(\x0b\x32\x14.littlehorse.WfRunId\"@\n\x11\x45xternalEventList\x12+\n\x07results\x18\x01 \x03(\x0b\x32\x1a.littlehorse.ExternalEvent\"D\n\x19ListWorkflowEventsRequest\x12\'\n\twf_run_id\x18\x01 \x01(\x0b\x32\x14.littlehorse.WfRunId\"@\n\x11WorkflowEventList\x12+\n\x07results\x18\x01 \x03(\x0b\x32\x1a.littlehorse.WorkflowEvent\"`\n\x19RegisterTaskWorkerRequest\x12\x16\n\x0etask_worker_id\x18\x01 \x01(\t\x12+\n\x0btask_def_id\x18\x02 \x01(\x0b\x32\x16.littlehorse.TaskDefId\"s\n\x1aTaskWorkerHeartBeatRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12+\n\x0btask_def_id\x18\x02 \x01(\x0b\x32\x16.littlehorse.TaskDefId\x12\x15\n\rlistener_name\x18\x03 \x01(\t\"\x81\x01\n\x1aRegisterTaskWorkerResponse\x12+\n\nyour_hosts\x18\x01 \x03(\x0b\x32\x17.littlehorse.LHHostInfo\x12\x1f\n\x12is_cluster_healthy\x18\x02 \x01(\x08H\x00\x88\x01\x01\x42\x15\n\x13_is_cluster_healthy\"(\n\nLHHostInfo\x12\x0c\n\x04host\x18\x01 \x01(\t\x12\x0c\n\x04port\x18\x02 \x01(\x05\"\x8b\x01\n\x0fPollTaskRequest\x12+\n\x0btask_def_id\x18\x01 \x01(\x0b\x32\x16.littlehorse.TaskDefId\x12\x11\n\tclient_id\x18\x02 \x01(\t\x12 \n\x13task_worker_version\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\x16\n\x14_task_worker_version\"\x8c\x02\n\rScheduledTask\x12+\n\x0btask_run_id\x18\x01 \x01(\x0b\x32\x16.littlehorse.TaskRunId\x12+\n\x0btask_def_id\x18\x02 \x01(\x0b\x32\x16.littlehorse.TaskDefId\x12\x16\n\x0e\x61ttempt_number\x18\x03 \x01(\x05\x12-\n\tvariables\x18\x04 \x03(\x0b\x32\x1a.littlehorse.VarNameAndVal\x12.\n\ncreated_at\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12*\n\x06source\x18\x06 \x01(\x0b\x32\x1a.littlehorse.TaskRunSource\"N\n\x10PollTaskResponse\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1a.littlehorse.ScheduledTaskH\x00\x88\x01\x01\x42\t\n\x07_result\"\x81\x03\n\rReportTaskRun\x12+\n\x0btask_run_id\x18\x01 \x01(\x0b\x32\x16.littlehorse.TaskRunId\x12(\n\x04time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\'\n\x06status\x18\x03 \x01(\x0e\x32\x17.littlehorse.TaskStatus\x12\x33\n\nlog_output\x18\x05 \x01(\x0b\x32\x1a.littlehorse.VariableValueH\x01\x88\x01\x01\x12\x16\n\x0e\x61ttempt_number\x18\x06 \x01(\x05\x12,\n\x06output\x18\x04 \x01(\x0b\x32\x1a.littlehorse.VariableValueH\x00\x12)\n\x05\x65rror\x18\x07 \x01(\x0b\x32\x18.littlehorse.LHTaskErrorH\x00\x12\x31\n\texception\x18\x08 \x01(\x0b\x32\x1c.littlehorse.LHTaskExceptionH\x00\x42\x08\n\x06resultB\r\n\x0b_log_output\"V\n\x10StopWfRunRequest\x12\'\n\twf_run_id\x18\x01 \x01(\x0b\x32\x14.littlehorse.WfRunId\x12\x19\n\x11thread_run_number\x18\x02 \x01(\x05\"X\n\x12ResumeWfRunRequest\x12\'\n\twf_run_id\x18\x01 \x01(\x0b\x32\x14.littlehorse.WfRunId\x12\x19\n\x11thread_run_number\x18\x02 \x01(\x05\"w\n\x16RescueThreadRunRequest\x12\'\n\twf_run_id\x18\x01 \x01(\x0b\x32\x14.littlehorse.WfRunId\x12\x19\n\x11thread_run_number\x18\x02 \x01(\x05\x12\x19\n\x11skip_current_node\x18\x03 \x01(\x08\"\xb3\x01\n\x1aTaskDefMetricsQueryRequest\x12\x30\n\x0cwindow_start\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x35\n\x0bwindow_type\x18\x02 \x01(\x0e\x32 .littlehorse.MetricsWindowLength\x12\x1a\n\rtask_def_name\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\x10\n\x0e_task_def_name\"\xca\x01\n\x16ListTaskMetricsRequest\x12+\n\x0btask_def_id\x18\x01 \x01(\x0b\x32\x16.littlehorse.TaskDefId\x12\x35\n\x11last_window_start\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\rwindow_length\x18\x03 \x01(\x0e\x32 .littlehorse.MetricsWindowLength\x12\x13\n\x0bnum_windows\x18\x04 \x01(\x05\"G\n\x17ListTaskMetricsResponse\x12,\n\x07results\x18\x01 \x03(\x0b\x32\x1b.littlehorse.TaskDefMetrics\"\xb1\x01\n\x19WfSpecMetricsQueryRequest\x12)\n\nwf_spec_id\x18\x01 \x01(\x0b\x32\x15.littlehorse.WfSpecId\x12\x30\n\x0cwindow_start\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\rwindow_length\x18\x03 \x01(\x0e\x32 .littlehorse.MetricsWindowLength\"\xc6\x01\n\x14ListWfMetricsRequest\x12)\n\nwf_spec_id\x18\x01 \x01(\x0b\x32\x15.littlehorse.WfSpecId\x12\x35\n\x11last_window_start\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\rwindow_length\x18\x03 \x01(\x0e\x32 .littlehorse.MetricsWindowLength\x12\x13\n\x0bnum_windows\x18\x04 \x01(\x05\"D\n\x15ListWfMetricsResponse\x12+\n\x07results\x18\x01 \x03(\x0b\x32\x1a.littlehorse.WfSpecMetrics\"\xfb\x02\n\x0eTaskDefMetrics\x12+\n\x0btask_def_id\x18\x01 \x01(\x0b\x32\x16.littlehorse.TaskDefId\x12\x30\n\x0cwindow_start\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\x04type\x18\x03 \x01(\x0e\x32 .littlehorse.MetricsWindowLength\x12\x1d\n\x15schedule_to_start_max\x18\x04 \x01(\x03\x12\x1d\n\x15schedule_to_start_avg\x18\x05 \x01(\x03\x12\x1d\n\x15start_to_complete_max\x18\x06 \x01(\x03\x12\x1d\n\x15start_to_complete_avg\x18\x07 \x01(\x03\x12\x17\n\x0ftotal_completed\x18\x08 \x01(\x03\x12\x15\n\rtotal_errored\x18\t \x01(\x03\x12\x15\n\rtotal_started\x18\n \x01(\x03\x12\x17\n\x0ftotal_scheduled\x18\x0b \x01(\x03\"\xa1\x02\n\rWfSpecMetrics\x12)\n\nwf_spec_id\x18\x01 \x01(\x0b\x32\x15.littlehorse.WfSpecId\x12\x30\n\x0cwindow_start\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\x04type\x18\x03 \x01(\x0e\x32 .littlehorse.MetricsWindowLength\x12\x15\n\rtotal_started\x18\x04 \x01(\x03\x12\x17\n\x0ftotal_completed\x18\x05 \x01(\x03\x12\x15\n\rtotal_errored\x18\x06 \x01(\x03\x12\x1d\n\x15start_to_complete_max\x18\x07 \x01(\x03\x12\x1d\n\x15start_to_complete_avg\x18\x08 \x01(\x03\"A\n\x16ListUserTaskRunRequest\x12\'\n\twf_run_id\x18\x01 \x01(\x0b\x32\x14.littlehorse.WfRunId\"<\n\x0fUserTaskRunList\x12)\n\x07results\x18\x01 \x03(\x0b\x32\x18.littlehorse.UserTaskRun\"F\n\x14ScheduledWfRunIdList\x12.\n\x07results\x18\x01 \x03(\x0b\x32\x1d.littlehorse.ScheduledWfRunId\"\x85\x01\n\x1bSearchScheduledWfRunRequest\x12\x14\n\x0cwf_spec_name\x18\x01 \x01(\t\x12\x1a\n\rmajor_version\x18\x02 \x01(\x05H\x00\x88\x01\x01\x12\x15\n\x08revision\x18\x03 \x01(\x05H\x01\x88\x01\x01\x42\x10\n\x0e_major_versionB\x0b\n\t_revision\"\x8a\x01\n\x12TaskWorkerMetadata\x12\x16\n\x0etask_worker_id\x18\x01 \x01(\t\x12\x34\n\x10latest_heartbeat\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12&\n\x05hosts\x18\x03 \x03(\x0b\x32\x17.littlehorse.LHHostInfo\"\x87\x02\n\x0fTaskWorkerGroup\x12*\n\x02id\x18\x01 \x01(\x0b\x32\x1e.littlehorse.TaskWorkerGroupId\x12.\n\ncreated_at\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x43\n\x0ctask_workers\x18\x03 \x03(\x0b\x32-.littlehorse.TaskWorkerGroup.TaskWorkersEntry\x1aS\n\x10TaskWorkersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.littlehorse.TaskWorkerMetadata:\x02\x38\x01\">\n\x13ListTaskRunsRequest\x12\'\n\twf_run_id\x18\x01 \x01(\x0b\x32\x14.littlehorse.WfRunId\"4\n\x0bTaskRunList\x12%\n\x07results\x18\x01 \x03(\x0b\x32\x14.littlehorse.TaskRun\"z\n\x14MigrateWfSpecRequest\x12*\n\x0bold_wf_spec\x18\x01 \x01(\x0b\x32\x15.littlehorse.WfSpecId\x12\x36\n\tmigration\x18\x02 \x01(\x0b\x32#.littlehorse.WfSpecVersionMigration\"T\n\x16GetLatestWfSpecRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1a\n\rmajor_version\x18\x02 \x01(\x05H\x00\x88\x01\x01\x42\x10\n\x0e_major_version\"\x94\x01\n\rServerVersion\x12\x15\n\rmajor_version\x18\x01 \x01(\x05\x12\x15\n\rminor_version\x18\x02 \x01(\x05\x12\x15\n\rpatch_version\x18\x03 \x01(\x05\x12#\n\x16pre_release_identifier\x18\x04 \x01(\tH\x00\x88\x01\x01\x42\x19\n\x17_pre_release_identifier*P\n\x11\x41llowedUpdateType\x12\x0f\n\x0b\x41LL_UPDATES\x10\x00\x12\x1a\n\x16MINOR_REVISION_UPDATES\x10\x01\x12\x0e\n\nNO_UPDATES\x10\x02\x32\xae\x30\n\x0bLittleHorse\x12\x44\n\nPutTaskDef\x12\x1e.littlehorse.PutTaskDefRequest\x1a\x14.littlehorse.TaskDef\"\x00\x12<\n\nGetTaskDef\x12\x16.littlehorse.TaskDefId\x1a\x14.littlehorse.TaskDef\"\x00\x12L\n\x12GetTaskWorkerGroup\x12\x16.littlehorse.TaskDefId\x1a\x1c.littlehorse.TaskWorkerGroup\"\x00\x12_\n\x13PutExternalEventDef\x12\'.littlehorse.PutExternalEventDefRequest\x1a\x1d.littlehorse.ExternalEventDef\"\x00\x12W\n\x13GetExternalEventDef\x12\x1f.littlehorse.ExternalEventDefId\x1a\x1d.littlehorse.ExternalEventDef\"\x00\x12_\n\x13PutWorkflowEventDef\x12\'.littlehorse.PutWorkflowEventDefRequest\x1a\x1d.littlehorse.WorkflowEventDef\"\x00\x12\x41\n\tPutWfSpec\x12\x1d.littlehorse.PutWfSpecRequest\x1a\x13.littlehorse.WfSpec\"\x00\x12\x39\n\tGetWfSpec\x12\x15.littlehorse.WfSpecId\x1a\x13.littlehorse.WfSpec\"\x00\x12M\n\x0fGetLatestWfSpec\x12#.littlehorse.GetLatestWfSpecRequest\x1a\x13.littlehorse.WfSpec\"\x00\x12I\n\rMigrateWfSpec\x12!.littlehorse.MigrateWfSpecRequest\x1a\x13.littlehorse.WfSpec\"\x00\x12P\n\x0ePutUserTaskDef\x12\".littlehorse.PutUserTaskDefRequest\x1a\x18.littlehorse.UserTaskDef\"\x00\x12H\n\x0eGetUserTaskDef\x12\x1a.littlehorse.UserTaskDefId\x1a\x18.littlehorse.UserTaskDef\"\x00\x12\\\n\x14GetLatestUserTaskDef\x12(.littlehorse.GetLatestUserTaskDefRequest\x1a\x18.littlehorse.UserTaskDef\"\x00\x12\x38\n\x05RunWf\x12\x19.littlehorse.RunWfRequest\x1a\x12.littlehorse.WfRun\"\x00\x12K\n\nScheduleWf\x12\x1e.littlehorse.ScheduleWfRequest\x1a\x1b.littlehorse.ScheduledWfRun\"\x00\x12\x65\n\x14SearchScheduledWfRun\x12(.littlehorse.SearchScheduledWfRunRequest\x1a!.littlehorse.ScheduledWfRunIdList\"\x00\x12Q\n\x11GetScheduledWfRun\x12\x1d.littlehorse.ScheduledWfRunId\x1a\x1b.littlehorse.ScheduledWfRun\"\x00\x12\x36\n\x08GetWfRun\x12\x14.littlehorse.WfRunId\x1a\x12.littlehorse.WfRun\"\x00\x12H\n\x0eGetUserTaskRun\x12\x1a.littlehorse.UserTaskRunId\x1a\x18.littlehorse.UserTaskRun\"\x00\x12T\n\x11\x41ssignUserTaskRun\x12%.littlehorse.AssignUserTaskRunRequest\x1a\x16.google.protobuf.Empty\"\x00\x12X\n\x13\x43ompleteUserTaskRun\x12\'.littlehorse.CompleteUserTaskRunRequest\x1a\x16.google.protobuf.Empty\"\x00\x12T\n\x11\x43\x61ncelUserTaskRun\x12%.littlehorse.CancelUserTaskRunRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x62\n\x17SaveUserTaskRunProgress\x12+.littlehorse.SaveUserTaskRunProgressRequest\x1a\x18.littlehorse.UserTaskRun\"\x00\x12W\n\x10ListUserTaskRuns\x12#.littlehorse.ListUserTaskRunRequest\x1a\x1c.littlehorse.UserTaskRunList\"\x00\x12<\n\nGetNodeRun\x12\x16.littlehorse.NodeRunId\x1a\x14.littlehorse.NodeRun\"\x00\x12L\n\x0cListNodeRuns\x12 .littlehorse.ListNodeRunsRequest\x1a\x18.littlehorse.NodeRunList\"\x00\x12<\n\nGetTaskRun\x12\x16.littlehorse.TaskRunId\x1a\x14.littlehorse.TaskRun\"\x00\x12L\n\x0cListTaskRuns\x12 .littlehorse.ListTaskRunsRequest\x1a\x18.littlehorse.TaskRunList\"\x00\x12?\n\x0bGetVariable\x12\x17.littlehorse.VariableId\x1a\x15.littlehorse.Variable\"\x00\x12O\n\rListVariables\x12!.littlehorse.ListVariablesRequest\x1a\x19.littlehorse.VariableList\"\x00\x12V\n\x10PutExternalEvent\x12$.littlehorse.PutExternalEventRequest\x1a\x1a.littlehorse.ExternalEvent\"\x00\x12N\n\x10GetExternalEvent\x12\x1c.littlehorse.ExternalEventId\x1a\x1a.littlehorse.ExternalEvent\"\x00\x12Z\n\x12\x41waitWorkflowEvent\x12&.littlehorse.AwaitWorkflowEventRequest\x1a\x1a.littlehorse.WorkflowEvent\"\x00\x12W\n\x13GetWorkflowEventDef\x12\x1f.littlehorse.WorkflowEventDefId\x1a\x1d.littlehorse.WorkflowEventDef\"\x00\x12N\n\x10GetWorkflowEvent\x12\x1c.littlehorse.WorkflowEventId\x1a\x1a.littlehorse.WorkflowEvent\"\x00\x12^\n\x12ListExternalEvents\x12&.littlehorse.ListExternalEventsRequest\x1a\x1e.littlehorse.ExternalEventList\"\x00\x12^\n\x12ListWorkflowEvents\x12&.littlehorse.ListWorkflowEventsRequest\x1a\x1e.littlehorse.WorkflowEventList\"\x00\x12J\n\x0bSearchWfRun\x12\x1f.littlehorse.SearchWfRunRequest\x1a\x18.littlehorse.WfRunIdList\"\x00\x12P\n\rSearchNodeRun\x12!.littlehorse.SearchNodeRunRequest\x1a\x1a.littlehorse.NodeRunIdList\"\x00\x12P\n\rSearchTaskRun\x12!.littlehorse.SearchTaskRunRequest\x1a\x1a.littlehorse.TaskRunIdList\"\x00\x12\\\n\x11SearchUserTaskRun\x12%.littlehorse.SearchUserTaskRunRequest\x1a\x1e.littlehorse.UserTaskRunIdList\"\x00\x12S\n\x0eSearchVariable\x12\".littlehorse.SearchVariableRequest\x1a\x1b.littlehorse.VariableIdList\"\x00\x12\x62\n\x13SearchExternalEvent\x12\'.littlehorse.SearchExternalEventRequest\x1a .littlehorse.ExternalEventIdList\"\x00\x12\x62\n\x13SearchWorkflowEvent\x12\'.littlehorse.SearchWorkflowEventRequest\x1a .littlehorse.WorkflowEventIdList\"\x00\x12P\n\rSearchTaskDef\x12!.littlehorse.SearchTaskDefRequest\x1a\x1a.littlehorse.TaskDefIdList\"\x00\x12\\\n\x11SearchUserTaskDef\x12%.littlehorse.SearchUserTaskDefRequest\x1a\x1e.littlehorse.UserTaskDefIdList\"\x00\x12M\n\x0cSearchWfSpec\x12 .littlehorse.SearchWfSpecRequest\x1a\x19.littlehorse.WfSpecIdList\"\x00\x12k\n\x16SearchExternalEventDef\x12*.littlehorse.SearchExternalEventDefRequest\x1a#.littlehorse.ExternalEventDefIdList\"\x00\x12k\n\x16SearchWorkflowEventDef\x12*.littlehorse.SearchWorkflowEventDefRequest\x1a#.littlehorse.WorkflowEventDefIdList\"\x00\x12M\n\x0cSearchTenant\x12 .littlehorse.SearchTenantRequest\x1a\x19.littlehorse.TenantIdList\"\x00\x12V\n\x0fSearchPrincipal\x12#.littlehorse.SearchPrincipalRequest\x1a\x1c.littlehorse.PrincipalIdList\"\x00\x12g\n\x12RegisterTaskWorker\x12&.littlehorse.RegisterTaskWorkerRequest\x1a\'.littlehorse.RegisterTaskWorkerResponse\"\x00\x12M\n\x08PollTask\x12\x1c.littlehorse.PollTaskRequest\x1a\x1d.littlehorse.PollTaskResponse\"\x00(\x01\x30\x01\x12\x42\n\nReportTask\x12\x1a.littlehorse.ReportTaskRun\x1a\x16.google.protobuf.Empty\"\x00\x12\x44\n\tStopWfRun\x12\x1d.littlehorse.StopWfRunRequest\x1a\x16.google.protobuf.Empty\"\x00\x12H\n\x0bResumeWfRun\x12\x1f.littlehorse.ResumeWfRunRequest\x1a\x16.google.protobuf.Empty\"\x00\x12L\n\x0fRescueThreadRun\x12#.littlehorse.RescueThreadRunRequest\x1a\x12.littlehorse.WfRun\"\x00\x12H\n\x0b\x44\x65leteWfRun\x12\x1f.littlehorse.DeleteWfRunRequest\x1a\x16.google.protobuf.Empty\"\x00\x12L\n\rDeleteTaskDef\x12!.littlehorse.DeleteTaskDefRequest\x1a\x16.google.protobuf.Empty\"\x00\x12J\n\x0c\x44\x65leteWfSpec\x12 .littlehorse.DeleteWfSpecRequest\x1a\x16.google.protobuf.Empty\"\x00\x12T\n\x11\x44\x65leteUserTaskDef\x12%.littlehorse.DeleteUserTaskDefRequest\x1a\x16.google.protobuf.Empty\"\x00\x12^\n\x16\x44\x65leteExternalEventDef\x12*.littlehorse.DeleteExternalEventDefRequest\x1a\x16.google.protobuf.Empty\"\x00\x12^\n\x16\x44\x65leteWorkflowEventDef\x12*.littlehorse.DeleteWorkflowEventDefRequest\x1a\x16.google.protobuf.Empty\"\x00\x12P\n\x0f\x44\x65letePrincipal\x12#.littlehorse.DeletePrincipalRequest\x1a\x16.google.protobuf.Empty\"\x00\x12Z\n\x14\x44\x65leteScheduledWfRun\x12(.littlehorse.DeleteScheduledWfRunRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x61\n\x17GetTaskDefMetricsWindow\x12\'.littlehorse.TaskDefMetricsQueryRequest\x1a\x1b.littlehorse.TaskDefMetrics\"\x00\x12^\n\x16GetWfSpecMetricsWindow\x12&.littlehorse.WfSpecMetricsQueryRequest\x1a\x1a.littlehorse.WfSpecMetrics\"\x00\x12\x61\n\x12ListTaskDefMetrics\x12#.littlehorse.ListTaskMetricsRequest\x1a$.littlehorse.ListTaskMetricsResponse\"\x00\x12\\\n\x11ListWfSpecMetrics\x12!.littlehorse.ListWfMetricsRequest\x1a\".littlehorse.ListWfMetricsResponse\"\x00\x12\x41\n\tPutTenant\x12\x1d.littlehorse.PutTenantRequest\x1a\x13.littlehorse.Tenant\"\x00\x12\x39\n\tGetTenant\x12\x15.littlehorse.TenantId\x1a\x13.littlehorse.Tenant\"\x00\x12J\n\x0cPutPrincipal\x12 .littlehorse.PutPrincipalRequest\x1a\x16.littlehorse.Principal\"\x00\x12\x42\n\x0cGetPrincipal\x12\x18.littlehorse.PrincipalId\x1a\x16.littlehorse.Principal\"\x00\x12:\n\x06Whoami\x12\x16.google.protobuf.Empty\x1a\x16.littlehorse.Principal\"\x00\x12H\n\x10GetServerVersion\x12\x16.google.protobuf.Empty\x1a\x1a.littlehorse.ServerVersion\"\x00\x42I\n\x1fio.littlehorse.sdk.common.protoP\x01Z\t.;lhproto\xaa\x02\x18LittleHorse.Common.Protob\x06proto3')
 
 _globals = globals()
 _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -229,5 +229,5 @@
   _globals['_SERVERVERSION']._serialized_start=13303
   _globals['_SERVERVERSION']._serialized_end=13451
   _globals['_LITTLEHORSE']._serialized_start=13536
-  _globals['_LITTLEHORSE']._serialized_end=19658
+  _globals['_LITTLEHORSE']._serialized_end=19726
 # @@protoc_insertion_point(module_scope)
diff --git a/sdk-python/littlehorse/model/service_pb2_grpc.py b/sdk-python/littlehorse/model/service_pb2_grpc.py
index 0f88f23f3..1fcee5ee9 100644
--- a/sdk-python/littlehorse/model/service_pb2_grpc.py
+++ b/sdk-python/littlehorse/model/service_pb2_grpc.py
@@ -387,6 +387,11 @@ def __init__(self, channel):
                 request_serializer=acls__pb2.PutPrincipalRequest.SerializeToString,
                 response_deserializer=acls__pb2.Principal.FromString,
                 )
+        self.GetPrincipal = channel.unary_unary(
+                '/littlehorse.LittleHorse/GetPrincipal',
+                request_serializer=object__id__pb2.PrincipalId.SerializeToString,
+                response_deserializer=acls__pb2.Principal.FromString,
+                )
         self.Whoami = channel.unary_unary(
                 '/littlehorse.LittleHorse/Whoami',
                 request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
@@ -961,6 +966,12 @@ def PutPrincipal(self, request, context):
         context.set_details('Method not implemented!')
         raise NotImplementedError('Method not implemented!')
 
+    def GetPrincipal(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
     def Whoami(self, request, context):
         """Returns the Principal of the caller.
         """
@@ -1338,6 +1349,11 @@ def add_LittleHorseServicer_to_server(servicer, server):
                     request_deserializer=acls__pb2.PutPrincipalRequest.FromString,
                     response_serializer=acls__pb2.Principal.SerializeToString,
             ),
+            'GetPrincipal': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetPrincipal,
+                    request_deserializer=object__id__pb2.PrincipalId.FromString,
+                    response_serializer=acls__pb2.Principal.SerializeToString,
+            ),
             'Whoami': grpc.unary_unary_rpc_method_handler(
                     servicer.Whoami,
                     request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
@@ -2582,6 +2598,23 @@ def PutPrincipal(request,
             options, channel_credentials,
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
+    @staticmethod
+    def GetPrincipal(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/littlehorse.LittleHorse/GetPrincipal',
+            object__id__pb2.PrincipalId.SerializeToString,
+            acls__pb2.Principal.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
     @staticmethod
     def Whoami(request,
             target,
diff --git a/server/src/main/java/io/littlehorse/server/LHServerListener.java b/server/src/main/java/io/littlehorse/server/LHServerListener.java
index 85e3fb3bd..3cf8b6aad 100644
--- a/server/src/main/java/io/littlehorse/server/LHServerListener.java
+++ b/server/src/main/java/io/littlehorse/server/LHServerListener.java
@@ -126,6 +126,7 @@
 import io.littlehorse.sdk.common.proto.PollTaskRequest;
 import io.littlehorse.sdk.common.proto.PollTaskResponse;
 import io.littlehorse.sdk.common.proto.Principal;
+import io.littlehorse.sdk.common.proto.PrincipalId;
 import io.littlehorse.sdk.common.proto.PrincipalIdList;
 import io.littlehorse.sdk.common.proto.PutExternalEventDefRequest;
 import io.littlehorse.sdk.common.proto.PutExternalEventRequest;
@@ -1046,6 +1047,23 @@ public void getTenant(TenantId req, StreamObserver ctx) {
         ctx.onCompleted();
     }
 
+    @Override
+    @Authorize(
+            resources = {ACLResource.ACL_PRINCIPAL},
+            actions = ACLAction.READ)
+    public void getPrincipal(PrincipalId req, StreamObserver ctx) {
+        RequestExecutionContext reqContext = requestContext();
+        PrincipalIdModel principalId = PrincipalIdModel.fromProto(req, PrincipalIdModel.class, reqContext);
+        PrincipalModel result = reqContext
+                .metadataManager()
+                .getOrThrow(
+                        principalId,
+                        () -> new LHApiException(
+                                Status.NOT_FOUND, "Could not find Principal %s".formatted(principalId)));
+        ctx.onNext(result.toProto().build());
+        ctx.onCompleted();
+    }
+
     @Override
     @Authorize(
             resources = {},
diff --git a/server/src/main/java/io/littlehorse/server/streams/lhinternalscan/publicrequests/SearchPrincipalRequestModel.java b/server/src/main/java/io/littlehorse/server/streams/lhinternalscan/publicrequests/SearchPrincipalRequestModel.java
index 1f6410464..72d8d40b5 100644
--- a/server/src/main/java/io/littlehorse/server/streams/lhinternalscan/publicrequests/SearchPrincipalRequestModel.java
+++ b/server/src/main/java/io/littlehorse/server/streams/lhinternalscan/publicrequests/SearchPrincipalRequestModel.java
@@ -2,7 +2,6 @@
 
 import com.google.protobuf.InvalidProtocolBufferException;
 import com.google.protobuf.Message;
-import io.grpc.Status;
 import io.littlehorse.common.LHStore;
 import io.littlehorse.common.exceptions.LHApiException;
 import io.littlehorse.common.model.getable.objectId.PrincipalIdModel;
@@ -76,8 +75,8 @@ public SearchPrincipalRequest.Builder toProto() throws LHApiException {
             case TENANTID:
                 builder.setTenantId(tenantId);
                 break;
-            case PRINCIPALCRITERIA_NOT_SET:
-                throw new LHApiException(Status.FAILED_PRECONDITION, "Principal query criteria is not valid.");
+            default:
+                break;
         }
 
         return builder;
@@ -109,8 +108,8 @@ public void initFrom(Message proto, ExecutionContext context) throws LHSerdeErro
             case TENANTID:
                 tenantId = p.getTenantId();
                 break;
-            case PRINCIPALCRITERIA_NOT_SET:
-                throw new LHSerdeError("Principal query criteria is not valid.");
+            default:
+                break;
         }
     }