You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@beam.apache.org by pa...@apache.org on 2021/12/08 03:39:04 UTC

[beam] branch master updated: Merge pull request #16127 from [BEAM-13366] [Playground] Add support Pipeline Options for Backend

This is an automated email from the ASF dual-hosted git repository.

pabloem pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/beam.git


The following commit(s) were added to refs/heads/master by this push:
     new dc5bd89  Merge pull request #16127 from [BEAM-13366] [Playground] Add support Pipeline Options for Backend
dc5bd89 is described below

commit dc5bd89b1f4f726f7c781dfeb1c66bc711b32c77
Author: Pavel Avilov <av...@gmail.com>
AuthorDate: Wed Dec 8 06:37:49 2021 +0300

    Merge pull request #16127 from [BEAM-13366] [Playground] Add support Pipeline Options for Backend
    
    * Add support Pipeline Options for Backend;
    Update gRPC client in ci/cd;
    
    * Add licenses;
    
    * Refactoring code
    
    * Edit comments
    
    * Edit comment for SpacesToEqualsOptions method
    
    * Update protofiles
    
    * Fix test
    
    * Add licenses
    
    * Edit ReplaceSpacesWithEquals
    
    * Update protofiles
    
    * Replace reduce white spaces logic with regexp and move from executor.go
    
    * Fix backend failures;
    Add comment to protofile;
    Remove 'RemoveEmptyValue' func;
    
    * Fix tests
    
    Co-authored-by: Ilya Kozyrev <il...@akvelon.com>
---
 playground/api/v1/api.proto                        |    2 +
 playground/backend/cmd/server/controller.go        |    2 +-
 playground/backend/internal/api/v1/api.pb.go       |  369 ++--
 .../internal/code_processing/code_processing.go    |    4 +-
 .../code_processing/code_processing_test.go        |   68 +-
 playground/backend/internal/executors/executor.go  |   17 +-
 .../backend/internal/executors/executor_builder.go |    8 +
 .../backend/internal/executors/executor_test.go    |   10 +-
 .../internal/setup_tools/builder/setup_builder.go  |    7 +-
 .../setup_tools/builder/setup_builder_test.go      |   18 +-
 .../setup_tools/life_cycle/life_cycle_setuper.go   |    5 +-
 .../life_cycle/life_cycle_setuper_test.go          |    1 -
 .../utils/{system_utils_test.go => common.go}      |   27 +-
 .../utils/{system_utils_test.go => common_test.go} |   15 +-
 .../backend/internal/utils/preparators_utils.go    |    7 +
 ...tem_utils_test.go => preparators_utils_test.go} |   24 +-
 .../backend/internal/utils/system_utils_test.go    |    4 +-
 playground/frontend/lib/api/v1/api.pb.dart         |  229 +--
 playground/frontend/lib/api/v1/api.pbenum.dart     |    2 +-
 playground/frontend/lib/api/v1/api.pbgrpc.dart     |  122 +-
 playground/frontend/lib/api/v1/api.pbjson.dart     |   80 +-
 playground/infrastructure/api/v1/api_pb2.py        | 1948 +++++++++++---------
 playground/infrastructure/api/v1/api_pb2_grpc.py   |  437 +++--
 playground/infrastructure/grpc_client.py           |    7 +-
 playground/infrastructure/helper.py                |    3 +-
 playground/infrastructure/test_grpc_client.py      |    2 +-
 26 files changed, 1732 insertions(+), 1686 deletions(-)

diff --git a/playground/api/v1/api.proto b/playground/api/v1/api.proto
index c36eccf..599e6a2 100644
--- a/playground/api/v1/api.proto
+++ b/playground/api/v1/api.proto
@@ -56,6 +56,8 @@ enum PrecompiledObjectType {
 message RunCodeRequest {
   string code = 1;
   Sdk sdk = 2;
+  // The pipeline options as they would be passed to the program (e.g. "--option1 value1 --option2 value2")
+  string pipeline_options = 3;
 }
 
 // RunCodeResponse contains information of the pipeline uuid.
diff --git a/playground/backend/cmd/server/controller.go b/playground/backend/cmd/server/controller.go
index d4be013..64f2d3d 100644
--- a/playground/backend/cmd/server/controller.go
+++ b/playground/backend/cmd/server/controller.go
@@ -81,7 +81,7 @@ func (controller *playgroundController) RunCode(ctx context.Context, info *pb.Ru
 	}
 
 	// TODO change using of context.TODO() to context.Background()
-	go code_processing.Process(context.TODO(), controller.cacheService, lc, pipelineId, &controller.env.ApplicationEnvs, &controller.env.BeamSdkEnvs)
+	go code_processing.Process(context.TODO(), controller.cacheService, lc, pipelineId, &controller.env.ApplicationEnvs, &controller.env.BeamSdkEnvs, info.PipelineOptions)
 
 	pipelineInfo := pb.RunCodeResponse{PipelineUuid: pipelineId.String()}
 	return &pipelineInfo, nil
diff --git a/playground/backend/internal/api/v1/api.pb.go b/playground/backend/internal/api/v1/api.pb.go
index 5e7028a..0de8365 100644
--- a/playground/backend/internal/api/v1/api.pb.go
+++ b/playground/backend/internal/api/v1/api.pb.go
@@ -17,7 +17,7 @@
 
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.25.0-devel
+// 	protoc-gen-go v1.26.0
 // 	protoc        v3.19.1
 // source: api/v1/api.proto
 
@@ -229,8 +229,9 @@ type RunCodeRequest struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Code string `protobuf:"bytes,1,opt,name=code,proto3" json:"code,omitempty"`
-	Sdk  Sdk    `protobuf:"varint,2,opt,name=sdk,proto3,enum=api.v1.Sdk" json:"sdk,omitempty"`
+	Code            string `protobuf:"bytes,1,opt,name=code,proto3" json:"code,omitempty"`
+	Sdk             Sdk    `protobuf:"varint,2,opt,name=sdk,proto3,enum=api.v1.Sdk" json:"sdk,omitempty"`
+	PipelineOptions string `protobuf:"bytes,3,opt,name=pipeline_options,json=pipelineOptions,proto3" json:"pipeline_options,omitempty"`
 }
 
 func (x *RunCodeRequest) Reset() {
@@ -279,6 +280,13 @@ func (x *RunCodeRequest) GetSdk() Sdk {
 	return Sdk_SDK_UNSPECIFIED
 }
 
+func (x *RunCodeRequest) GetPipelineOptions() string {
+	if x != nil {
+		return x.PipelineOptions
+	}
+	return ""
+}
+
 // RunCodeResponse contains information of the pipeline uuid.
 type RunCodeResponse struct {
 	state         protoimpl.MessageState
@@ -1297,194 +1305,197 @@ var File_api_v1_api_proto protoreflect.FileDescriptor
 
 var file_api_v1_api_proto_rawDesc = []byte{
 	0x0a, 0x10, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x12, 0x06, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x22, 0x43, 0x0a, 0x0e, 0x52, 0x75,
+	0x74, 0x6f, 0x12, 0x06, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x22, 0x6e, 0x0a, 0x0e, 0x52, 0x75,
 	0x6e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04,
 	0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65,
 	0x12, 0x1d, 0x0a, 0x03, 0x73, 0x64, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0b, 0x2e,
-	0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x64, 0x6b, 0x52, 0x03, 0x73, 0x64, 0x6b, 0x22,
-	0x36, 0x0a, 0x0f, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x75,
-	0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x69, 0x70, 0x65, 0x6c,
-	0x69, 0x6e, 0x65, 0x55, 0x75, 0x69, 0x64, 0x22, 0x39, 0x0a, 0x12, 0x43, 0x68, 0x65, 0x63, 0x6b,
-	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a,
+	0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x64, 0x6b, 0x52, 0x03, 0x73, 0x64, 0x6b, 0x12,
+	0x29, 0x0a, 0x10, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x69,
+	0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x69, 0x70, 0x65, 0x6c,
+	0x69, 0x6e, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x36, 0x0a, 0x0f, 0x52, 0x75,
+	0x6e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a,
 	0x0d, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01,
 	0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x75,
-	0x69, 0x64, 0x22, 0x3d, 0x0a, 0x13, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75,
-	0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x73, 0x74, 0x61,
-	0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e,
-	0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,
-	0x73, 0x22, 0x3e, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x4f,
-	0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d,
-	0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x75, 0x69,
-	0x64, 0x22, 0x71, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x4f,
-	0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a,
-	0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f,
-	0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x3d, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x61,
-	0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28,
-	0x0e, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75,
-	0x73, 0x52, 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74,
-	0x61, 0x74, 0x75, 0x73, 0x22, 0x3a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4f, 0x75,
-	0x74, 0x70, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x70,
-	0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x0c, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x75, 0x69, 0x64,
-	0x22, 0x2e, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74,
+	0x69, 0x64, 0x22, 0x39, 0x0a, 0x12, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75,
+	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x69, 0x70, 0x65,
+	0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x0c, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x75, 0x69, 0x64, 0x22, 0x3d, 0x0a,
+	0x13, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x3e, 0x0a, 0x17,
+	0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x69, 0x70, 0x65, 0x6c,
+	0x69, 0x6e, 0x65, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c,
+	0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x75, 0x69, 0x64, 0x22, 0x71, 0x0a, 0x18,
+	0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74,
 	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70,
 	0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74,
-	0x22, 0x39, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52,
+	0x12, 0x3d, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
+	0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x61,
+	0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x11, 0x63, 0x6f,
+	0x6d, 0x70, 0x69, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22,
+	0x3a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52,
 	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69,
 	0x6e, 0x65, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70,
-	0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x75, 0x69, 0x64, 0x22, 0x2d, 0x0a, 0x13, 0x47,
-	0x65, 0x74, 0x52, 0x75, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x35, 0x0a, 0x0e, 0x47, 0x65,
-	0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d,
-	0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x75, 0x69,
-	0x64, 0x22, 0x29, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x34, 0x0a, 0x0d,
-	0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a,
-	0x0d, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x75,
-	0x69, 0x64, 0x22, 0x10, 0x0a, 0x0e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x59, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f,
-	0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x03, 0x73, 0x64, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28,
-	0x0e, 0x32, 0x0b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x64, 0x6b, 0x52, 0x03,
-	0x73, 0x64, 0x6b, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x22,
-	0xc6, 0x01, 0x0a, 0x11, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x4f,
-	0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70,
-	0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x6f, 0x75, 0x64,
-	0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63,
-	0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64,
-	0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x04, 0x74, 0x79,
-	0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76,
-	0x31, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a,
-	0x65, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a,
-	0x10, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
-	0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e,
-	0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xe5, 0x01, 0x0a, 0x0a, 0x43, 0x61, 0x74,
-	0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x03, 0x73, 0x64, 0x6b, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x0e, 0x32, 0x0b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x64,
-	0x6b, 0x52, 0x03, 0x73, 0x64, 0x6b, 0x12, 0x3b, 0x0a, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f,
-	0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69,
-	0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x2e, 0x43,
-	0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72,
-	0x69, 0x65, 0x73, 0x1a, 0x7b, 0x0a, 0x08, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12,
-	0x23, 0x0a, 0x0d, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79,
-	0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4a, 0x0a, 0x13, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x69,
-	0x6c, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,
-	0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f,
-	0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x12, 0x70, 0x72,
-	0x65, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73,
-	0x22, 0x5a, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c,
-	0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x12, 0x39, 0x0a, 0x0e, 0x73, 0x64, 0x6b, 0x5f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72,
-	0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e,
-	0x76, 0x31, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, 0x0d, 0x73,
-	0x64, 0x6b, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x22, 0x3c, 0x0a, 0x1b,
-	0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x62,
-	0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63,
-	0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x09, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x61, 0x74, 0x68, 0x22, 0x36, 0x0a, 0x20, 0x47, 0x65,
-	0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65,
-	0x63, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12,
-	0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f,
-	0x64, 0x65, 0x2a, 0x52, 0x0a, 0x03, 0x53, 0x64, 0x6b, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x44, 0x4b,
-	0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0c,
-	0x0a, 0x08, 0x53, 0x44, 0x4b, 0x5f, 0x4a, 0x41, 0x56, 0x41, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06,
-	0x53, 0x44, 0x4b, 0x5f, 0x47, 0x4f, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x44, 0x4b, 0x5f,
-	0x50, 0x59, 0x54, 0x48, 0x4f, 0x4e, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x44, 0x4b, 0x5f,
-	0x53, 0x43, 0x49, 0x4f, 0x10, 0x04, 0x2a, 0xb8, 0x02, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75,
-	0x73, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50,
-	0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x54, 0x41,
-	0x54, 0x55, 0x53, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x01,
-	0x12, 0x1b, 0x0a, 0x17, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44,
-	0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x12, 0x14, 0x0a,
-	0x10, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x49, 0x4e,
-	0x47, 0x10, 0x03, 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x52,
-	0x45, 0x50, 0x41, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10,
-	0x04, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x4d, 0x50,
-	0x49, 0x4c, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x54, 0x41, 0x54, 0x55,
-	0x53, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x49, 0x4c, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10,
-	0x06, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x45, 0x58, 0x45, 0x43,
-	0x55, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, 0x55,
-	0x53, 0x5f, 0x46, 0x49, 0x4e, 0x49, 0x53, 0x48, 0x45, 0x44, 0x10, 0x08, 0x12, 0x14, 0x0a, 0x10,
-	0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x55, 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52,
-	0x10, 0x09, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x45, 0x52, 0x52,
-	0x4f, 0x52, 0x10, 0x0a, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52,
-	0x55, 0x4e, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x0b, 0x12, 0x13, 0x0a, 0x0f,
-	0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x45, 0x44, 0x10,
-	0x0c, 0x2a, 0xae, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65,
-	0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x27, 0x0a, 0x23, 0x50,
-	0x52, 0x45, 0x43, 0x4f, 0x4d, 0x50, 0x49, 0x4c, 0x45, 0x44, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43,
-	0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49,
-	0x45, 0x44, 0x10, 0x00, 0x12, 0x23, 0x0a, 0x1f, 0x50, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x50, 0x49,
+	0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x75, 0x69, 0x64, 0x22, 0x2e, 0x0a, 0x14, 0x47,
+	0x65, 0x74, 0x52, 0x75, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x39, 0x0a, 0x12, 0x47,
+	0x65, 0x74, 0x52, 0x75, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x75, 0x75,
+	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69,
+	0x6e, 0x65, 0x55, 0x75, 0x69, 0x64, 0x22, 0x2d, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e,
+	0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a,
+	0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f,
+	0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x35, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x67, 0x73,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x69, 0x70, 0x65, 0x6c,
+	0x69, 0x6e, 0x65, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c,
+	0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x75, 0x69, 0x64, 0x22, 0x29, 0x0a, 0x0f,
+	0x47, 0x65, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+	0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x34, 0x0a, 0x0d, 0x43, 0x61, 0x6e, 0x63, 0x65,
+	0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x69, 0x70, 0x65,
+	0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x0c, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x75, 0x69, 0x64, 0x22, 0x10, 0x0a,
+	0x0e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+	0x59, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65,
+	0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
+	0x1d, 0x0a, 0x03, 0x73, 0x64, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0b, 0x2e, 0x61,
+	0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x64, 0x6b, 0x52, 0x03, 0x73, 0x64, 0x6b, 0x12, 0x1a,
+	0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x22, 0xc6, 0x01, 0x0a, 0x11, 0x50,
+	0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+	0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x61, 0x74, 0x68, 0x12,
+	0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
+	0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
+	0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69,
+	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20,
+	0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65,
+	0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x79,
+	0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x69, 0x70, 0x65,
+	0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x0f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4f, 0x70, 0x74, 0x69,
+	0x6f, 0x6e, 0x73, 0x22, 0xe5, 0x01, 0x0a, 0x0a, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69,
+	0x65, 0x73, 0x12, 0x1d, 0x0a, 0x03, 0x73, 0x64, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32,
+	0x0b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x64, 0x6b, 0x52, 0x03, 0x73, 0x64,
+	0x6b, 0x12, 0x3b, 0x0a, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18,
+	0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43,
+	0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f,
+	0x72, 0x79, 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x1a, 0x7b,
+	0x0a, 0x08, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x61,
+	0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12,
+	0x4a, 0x0a, 0x13, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x6f,
+	0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61,
+	0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65,
+	0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x12, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70,
+	0x69, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x5a, 0x0a, 0x1d, 0x47,
+	0x65, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a,
+	0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x0e,
+	0x73, 0x64, 0x6b, 0x5f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01,
+	0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61,
+	0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, 0x0d, 0x73, 0x64, 0x6b, 0x43, 0x61, 0x74,
+	0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x22, 0x3c, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x50, 0x72,
+	0x65, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f,
+	0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x6f, 0x75,
+	0x64, 0x50, 0x61, 0x74, 0x68, 0x22, 0x36, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x63,
+	0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x64,
+	0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64,
+	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x2a, 0x52, 0x0a,
+	0x03, 0x53, 0x64, 0x6b, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x44, 0x4b, 0x5f, 0x55, 0x4e, 0x53, 0x50,
+	0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x44, 0x4b,
+	0x5f, 0x4a, 0x41, 0x56, 0x41, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x44, 0x4b, 0x5f, 0x47,
+	0x4f, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x44, 0x4b, 0x5f, 0x50, 0x59, 0x54, 0x48, 0x4f,
+	0x4e, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x44, 0x4b, 0x5f, 0x53, 0x43, 0x49, 0x4f, 0x10,
+	0x04, 0x2a, 0xb8, 0x02, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x12,
+	0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49,
+	0x45, 0x44, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x56,
+	0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x53,
+	0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e,
+	0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54,
+	0x55, 0x53, 0x5f, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x1c,
+	0x0a, 0x18, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x41,
+	0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x12, 0x14, 0x0a, 0x10,
+	0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x49, 0x4c, 0x49, 0x4e, 0x47,
+	0x10, 0x05, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x4d,
+	0x50, 0x49, 0x4c, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x06, 0x12, 0x14, 0x0a, 0x10,
+	0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x49, 0x4e, 0x47,
+	0x10, 0x07, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x49, 0x4e,
+	0x49, 0x53, 0x48, 0x45, 0x44, 0x10, 0x08, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54, 0x55,
+	0x53, 0x5f, 0x52, 0x55, 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x09, 0x12, 0x10, 0x0a,
+	0x0c, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x0a, 0x12,
+	0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x49,
+	0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x0b, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, 0x55,
+	0x53, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x45, 0x44, 0x10, 0x0c, 0x2a, 0xae, 0x01, 0x0a,
+	0x15, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65,
+	0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x27, 0x0a, 0x23, 0x50, 0x52, 0x45, 0x43, 0x4f, 0x4d,
+	0x50, 0x49, 0x4c, 0x45, 0x44, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x54, 0x59, 0x50,
+	0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12,
+	0x23, 0x0a, 0x1f, 0x50, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x50, 0x49, 0x4c, 0x45, 0x44, 0x5f, 0x4f,
+	0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x58, 0x41, 0x4d, 0x50,
+	0x4c, 0x45, 0x10, 0x01, 0x12, 0x20, 0x0a, 0x1c, 0x50, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x50, 0x49,
 	0x4c, 0x45, 0x44, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f,
-	0x45, 0x58, 0x41, 0x4d, 0x50, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x20, 0x0a, 0x1c, 0x50, 0x52, 0x45,
-	0x43, 0x4f, 0x4d, 0x50, 0x49, 0x4c, 0x45, 0x44, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f,
-	0x54, 0x59, 0x50, 0x45, 0x5f, 0x4b, 0x41, 0x54, 0x41, 0x10, 0x02, 0x12, 0x25, 0x0a, 0x21, 0x50,
-	0x52, 0x45, 0x43, 0x4f, 0x4d, 0x50, 0x49, 0x4c, 0x45, 0x44, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43,
-	0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x49, 0x54, 0x5f, 0x54, 0x45, 0x53, 0x54,
-	0x10, 0x03, 0x32, 0xa8, 0x06, 0x0a, 0x11, 0x50, 0x6c, 0x61, 0x79, 0x67, 0x72, 0x6f, 0x75, 0x6e,
-	0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x43,
-	0x6f, 0x64, 0x65, 0x12, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e,
-	0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x61, 0x70,
-	0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x0b, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x74, 0x61,
-	0x74, 0x75, 0x73, 0x12, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65,
-	0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
-	0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x74,
-	0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0c,
-	0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x1b, 0x2e, 0x61,
-	0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4f, 0x75, 0x74, 0x70,
-	0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e,
-	0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4c, 0x6f,
-	0x67, 0x73, 0x12, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c,
-	0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x61, 0x70, 0x69,
-	0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
-	0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x45, 0x72, 0x72,
-	0x6f, 0x72, 0x12, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52,
-	0x75, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b,
-	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x45, 0x72,
-	0x72, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x10, 0x47,
-	0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12,
-	0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70,
-	0x69, 0x6c, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x1a, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d,
-	0x70, 0x69, 0x6c, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x12, 0x37, 0x0a, 0x06, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x12, 0x15, 0x2e, 0x61,
-	0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75,
-	0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e,
-	0x63, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x15, 0x47,
+	0x4b, 0x41, 0x54, 0x41, 0x10, 0x02, 0x12, 0x25, 0x0a, 0x21, 0x50, 0x52, 0x45, 0x43, 0x4f, 0x4d,
+	0x50, 0x49, 0x4c, 0x45, 0x44, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x54, 0x59, 0x50,
+	0x45, 0x5f, 0x55, 0x4e, 0x49, 0x54, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x10, 0x03, 0x32, 0xa8, 0x06,
+	0x0a, 0x11, 0x50, 0x6c, 0x61, 0x79, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x16,
+	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e,
+	0x52, 0x75, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+	0x46, 0x0a, 0x0b, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a,
+	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x74, 0x61,
+	0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69,
+	0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x52, 0x75,
+	0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31,
+	0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65,
+	0x74, 0x52, 0x75, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x16, 0x2e,
+	0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47,
+	0x65, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46,
+	0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1a, 0x2e,
+	0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x45, 0x72, 0x72,
+	0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e,
+	0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d,
+	0x70, 0x69, 0x6c, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69,
+	0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x4f, 0x75,
+	0x74, 0x70, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70,
+	0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x4f,
+	0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a,
+	0x06, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x12, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31,
+	0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16,
+	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65,
+	0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12,
+	0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x63,
+	0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47,
 	0x65, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a,
-	0x65, 0x63, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65,
-	0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65,
-	0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x61, 0x70, 0x69,
-	0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c,
-	0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x12, 0x69, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x69,
-	0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x2e,
-	0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6d,
-	0x70, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50,
-	0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74,
-	0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x1a,
+	0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x69, 0x0a, 0x18,
 	0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x62,
-	0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69,
-	0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c,
-	0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
-	0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4f,
-	0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x38, 0x5a,
-	0x36, 0x62, 0x65, 0x61, 0x6d, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x6f, 0x72, 0x67,
-	0x2f, 0x70, 0x6c, 0x61, 0x79, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2f, 0x62, 0x61, 0x63, 0x6b,
-	0x65, 0x6e, 0x64, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x3b, 0x70, 0x6c, 0x61,
-	0x79, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76,
+	0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64,
+	0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e,
+	0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6d,
+	0x70, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x50, 0x72,
+	0x65, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f,
+	0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47,
+	0x65, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a,
+	0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x69,
+	0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x38, 0x5a, 0x36, 0x62, 0x65, 0x61, 0x6d,
+	0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x70, 0x6c, 0x61, 0x79,
+	0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x3b, 0x70, 0x6c, 0x61, 0x79, 0x67, 0x72, 0x6f, 0x75,
+	0x6e, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/playground/backend/internal/code_processing/code_processing.go b/playground/backend/internal/code_processing/code_processing.go
index 917eae6..63b7bfb 100644
--- a/playground/backend/internal/code_processing/code_processing.go
+++ b/playground/backend/internal/code_processing/code_processing.go
@@ -53,7 +53,7 @@ const (
 // - In case of run step is failed saves playground.Status_STATUS_RUN_ERROR as cache.Status and run logs as cache.RunError into cache.
 // - In case of run step is completed with no errors saves playground.Status_STATUS_FINISHED as cache.Status and run output as cache.RunOutput into cache.
 // At the end of this method deletes all created folders.
-func Process(ctx context.Context, cacheService cache.Cache, lc *fs_tool.LifeCycle, pipelineId uuid.UUID, appEnv *environment.ApplicationEnvs, sdkEnv *environment.BeamEnvs) {
+func Process(ctx context.Context, cacheService cache.Cache, lc *fs_tool.LifeCycle, pipelineId uuid.UUID, appEnv *environment.ApplicationEnvs, sdkEnv *environment.BeamEnvs, pipelineOptions string) {
 	ctxWithTimeout, finishCtxFunc := context.WithTimeout(ctx, appEnv.PipelineExecuteTimeout())
 	defer func(lc *fs_tool.LifeCycle) {
 		finishCtxFunc()
@@ -69,7 +69,7 @@ func Process(ctx context.Context, cacheService cache.Cache, lc *fs_tool.LifeCycl
 
 	go cancelCheck(ctxWithTimeout, pipelineId, cancelChannel, cacheService)
 
-	executorBuilder, err := builder.SetupExecutorBuilder(lc.GetAbsoluteSourceFilePath(), lc.GetAbsoluteBaseFolderPath(), lc.GetAbsoluteExecutableFilePath(), sdkEnv)
+	executorBuilder, err := builder.SetupExecutorBuilder(lc.GetAbsoluteSourceFilePath(), lc.GetAbsoluteBaseFolderPath(), lc.GetAbsoluteExecutableFilePath(), utils.ReduceWhiteSpacesToSinge(pipelineOptions), sdkEnv)
 	if err != nil {
 		_ = processSetupError(err, pipelineId, cacheService, ctxWithTimeout)
 		return
diff --git a/playground/backend/internal/code_processing/code_processing_test.go b/playground/backend/internal/code_processing/code_processing_test.go
index 7835376..69ae4b3 100644
--- a/playground/backend/internal/code_processing/code_processing_test.go
+++ b/playground/backend/internal/code_processing/code_processing_test.go
@@ -106,10 +106,11 @@ func Test_Process(t *testing.T) {
 	}
 
 	type args struct {
-		ctx        context.Context
-		appEnv     *environment.ApplicationEnvs
-		sdkEnv     *environment.BeamEnvs
-		pipelineId uuid.UUID
+		ctx             context.Context
+		appEnv          *environment.ApplicationEnvs
+		sdkEnv          *environment.BeamEnvs
+		pipelineId      uuid.UUID
+		pipelineOptions string
 	}
 	tests := []struct {
 		name                  string
@@ -134,10 +135,11 @@ func Test_Process(t *testing.T) {
 			expectedRunOutput:     nil,
 			expectedRunError:      nil,
 			args: args{
-				ctx:        context.Background(),
-				appEnv:     &environment.ApplicationEnvs{},
-				sdkEnv:     sdkEnv,
-				pipelineId: uuid.New(),
+				ctx:             context.Background(),
+				appEnv:          &environment.ApplicationEnvs{},
+				sdkEnv:          sdkEnv,
+				pipelineId:      uuid.New(),
+				pipelineOptions: "",
 			},
 		},
 		{
@@ -152,10 +154,11 @@ func Test_Process(t *testing.T) {
 			expectedRunOutput:     nil,
 			expectedRunError:      nil,
 			args: args{
-				ctx:        context.Background(),
-				appEnv:     appEnvs,
-				sdkEnv:     sdkEnv,
-				pipelineId: uuid.New(),
+				ctx:             context.Background(),
+				appEnv:          appEnvs,
+				sdkEnv:          sdkEnv,
+				pipelineId:      uuid.New(),
+				pipelineOptions: "",
 			},
 		},
 		{
@@ -170,10 +173,11 @@ func Test_Process(t *testing.T) {
 			expectedRunOutput:     nil,
 			expectedRunError:      nil,
 			args: args{
-				ctx:        context.Background(),
-				appEnv:     appEnvs,
-				sdkEnv:     sdkEnv,
-				pipelineId: uuid.New(),
+				ctx:             context.Background(),
+				appEnv:          appEnvs,
+				sdkEnv:          sdkEnv,
+				pipelineId:      uuid.New(),
+				pipelineOptions: "",
 			},
 		},
 		{
@@ -188,10 +192,11 @@ func Test_Process(t *testing.T) {
 			expectedRunOutput:     "",
 			expectedRunError:      "error: exit status 1, output: Exception in thread \"main\" java.lang.ArithmeticException: / by zero\n\tat HelloWorld.main(%s.java:3)\n",
 			args: args{
-				ctx:        context.Background(),
-				appEnv:     appEnvs,
-				sdkEnv:     sdkEnv,
-				pipelineId: uuid.New(),
+				ctx:             context.Background(),
+				appEnv:          appEnvs,
+				sdkEnv:          sdkEnv,
+				pipelineId:      uuid.New(),
+				pipelineOptions: "",
 			},
 		},
 		{
@@ -205,10 +210,11 @@ func Test_Process(t *testing.T) {
 			expectedCompileOutput: "",
 			expectedRunOutput:     "",
 			args: args{
-				ctx:        context.Background(),
-				appEnv:     appEnvs,
-				sdkEnv:     sdkEnv,
-				pipelineId: uuid.New(),
+				ctx:             context.Background(),
+				appEnv:          appEnvs,
+				sdkEnv:          sdkEnv,
+				pipelineId:      uuid.New(),
+				pipelineOptions: "",
 			},
 		},
 		{
@@ -223,10 +229,11 @@ func Test_Process(t *testing.T) {
 			expectedRunOutput:     "Hello world!\n",
 			expectedRunError:      nil,
 			args: args{
-				ctx:        context.Background(),
-				appEnv:     appEnvs,
-				sdkEnv:     sdkEnv,
-				pipelineId: uuid.New(),
+				ctx:             context.Background(),
+				appEnv:          appEnvs,
+				sdkEnv:          sdkEnv,
+				pipelineId:      uuid.New(),
+				pipelineOptions: "",
 			},
 		},
 	}
@@ -248,7 +255,7 @@ func Test_Process(t *testing.T) {
 					cacheService.SetValue(ctx, pipelineId, cache.Canceled, true)
 				}(tt.args.ctx, tt.args.pipelineId)
 			}
-			Process(tt.args.ctx, cacheService, lc, tt.args.pipelineId, tt.args.appEnv, tt.args.sdkEnv)
+			Process(tt.args.ctx, cacheService, lc, tt.args.pipelineId, tt.args.appEnv, tt.args.sdkEnv, tt.args.pipelineOptions)
 
 			status, _ := cacheService.GetValue(tt.args.ctx, tt.args.pipelineId, cache.Status)
 			if !reflect.DeepEqual(status, tt.expectedStatus) {
@@ -586,6 +593,7 @@ func Test_getRunOrTestCmd(t *testing.T) {
 		WithRunner().
 		WithCommand("runCommand").
 		WithArgs([]string{"arg1"}).
+		WithPipelineOptions([]string{""}).
 		Build()
 
 	testEx := executors.NewExecutorBuilder().
@@ -594,7 +602,7 @@ func Test_getRunOrTestCmd(t *testing.T) {
 		WithArgs([]string{"arg1"}).
 		Build()
 
-	wantRunExec := exec.CommandContext(context.Background(), "runCommand", "arg1", "")
+	wantRunExec := exec.CommandContext(context.Background(), "runCommand", "arg1")
 	wantTestExec := exec.CommandContext(context.Background(), "testCommand", "arg1", "")
 
 	type args struct {
diff --git a/playground/backend/internal/executors/executor.go b/playground/backend/internal/executors/executor.go
index 26e7747..3bc60f1 100644
--- a/playground/backend/internal/executors/executor.go
+++ b/playground/backend/internal/executors/executor.go
@@ -32,10 +32,11 @@ const (
 
 //CmdConfiguration for base cmd code execution
 type CmdConfiguration struct {
-	fileName    string
-	workingDir  string
-	commandName string
-	commandArgs []string
+	fileName        string
+	workingDir      string
+	commandName     string
+	commandArgs     []string
+	pipelineOptions []string
 }
 
 // Executor struct for all sdks (Java/Python/Go/SCIO)
@@ -101,7 +102,13 @@ func (ex *Executor) Compile(ctx context.Context) *exec.Cmd {
 // Run prepares the Cmd for execution of the code
 // Returns Cmd instance
 func (ex *Executor) Run(ctx context.Context) *exec.Cmd {
-	args := append(ex.runArgs.commandArgs, ex.runArgs.fileName)
+	args := ex.runArgs.commandArgs
+	if ex.runArgs.fileName != "" {
+		args = append(args, ex.runArgs.fileName)
+	}
+	if ex.runArgs.pipelineOptions[0] != "" {
+		args = append(args, ex.runArgs.pipelineOptions...)
+	}
 	cmd := exec.CommandContext(ctx, ex.runArgs.commandName, args...)
 	cmd.Dir = ex.runArgs.workingDir
 	return cmd
diff --git a/playground/backend/internal/executors/executor_builder.go b/playground/backend/internal/executors/executor_builder.go
index 44fabff..c0e2dd0 100644
--- a/playground/backend/internal/executors/executor_builder.go
+++ b/playground/backend/internal/executors/executor_builder.go
@@ -197,3 +197,11 @@ func (b *ExecutorBuilder) Build() Executor {
 	}
 	return executor
 }
+
+//WithPipelineOptions adds pipeline options to executor
+func (b *RunBuilder) WithPipelineOptions(pipelineOptions []string) *RunBuilder {
+	b.actions = append(b.actions, func(e *Executor) {
+		e.runArgs.pipelineOptions = pipelineOptions
+	})
+	return b
+}
diff --git a/playground/backend/internal/executors/executor_test.go b/playground/backend/internal/executors/executor_test.go
index b1ac6c9..31df7fc 100644
--- a/playground/backend/internal/executors/executor_test.go
+++ b/playground/backend/internal/executors/executor_test.go
@@ -85,10 +85,11 @@ func TestExecutor_Compile(t *testing.T) {
 			name: "TestCompile",
 			fields: fields{
 				compileArgs: CmdConfiguration{
-					fileName:    "filePath",
-					workingDir:  "./",
-					commandName: "testCommand",
-					commandArgs: []string{"-d", "bin", "-classpath", "/opt/apache/beam/jars/beam-sdks-java-harness.jar"},
+					fileName:        "filePath",
+					workingDir:      "./",
+					commandName:     "testCommand",
+					commandArgs:     []string{"-d", "bin", "-classpath", "/opt/apache/beam/jars/beam-sdks-java-harness.jar"},
+					pipelineOptions: []string{""},
 				},
 			},
 			want: &exec.Cmd{
@@ -140,6 +141,7 @@ func TestExecutor_Run(t *testing.T) {
 					commandName: "testCommand",
 					commandArgs: []string{"-cp", "bin:/opt/apache/beam/jars/beam-sdks-java-harness.jar:" +
 						"/opt/apache/beam/jars/beam-runners-direct.jar:/opt/apache/beam/jars/slf4j-jdk14.jar"},
+					pipelineOptions: []string{""},
 				},
 			},
 			want: &exec.Cmd{
diff --git a/playground/backend/internal/setup_tools/builder/setup_builder.go b/playground/backend/internal/setup_tools/builder/setup_builder.go
index fb65aa3..15c9261 100644
--- a/playground/backend/internal/setup_tools/builder/setup_builder.go
+++ b/playground/backend/internal/setup_tools/builder/setup_builder.go
@@ -31,9 +31,13 @@ const (
 )
 
 // SetupExecutorBuilder return executor with set args for validator, preparator, compiler and runner
-func SetupExecutorBuilder(srcFilePath, baseFolderPath, execFilePath string, sdkEnv *environment.BeamEnvs) (*executors.ExecutorBuilder, error) {
+func SetupExecutorBuilder(srcFilePath, baseFolderPath, execFilePath, pipelineOptions string, sdkEnv *environment.BeamEnvs) (*executors.ExecutorBuilder, error) {
 	sdk := sdkEnv.ApacheBeamSdk
 
+	if sdk == pb.Sdk_SDK_JAVA {
+		pipelineOptions = utils.ReplaceSpacesWithEquals(pipelineOptions)
+	}
+
 	val, err := utils.GetValidators(sdk, srcFilePath)
 	if err != nil {
 		return nil, err
@@ -57,6 +61,7 @@ func SetupExecutorBuilder(srcFilePath, baseFolderPath, execFilePath string, sdkE
 		WithRunner().
 		WithCommand(executorConfig.RunCmd).
 		WithArgs(executorConfig.RunArgs).
+		WithPipelineOptions(strings.Split(pipelineOptions, " ")).
 		WithTestRunner().
 		WithCommand(executorConfig.TestCmd).
 		WithArgs(executorConfig.TestArgs).
diff --git a/playground/backend/internal/setup_tools/builder/setup_builder_test.go b/playground/backend/internal/setup_tools/builder/setup_builder_test.go
index 46a64cc..a333915 100644
--- a/playground/backend/internal/setup_tools/builder/setup_builder_test.go
+++ b/playground/backend/internal/setup_tools/builder/setup_builder_test.go
@@ -23,6 +23,7 @@ import (
 	"beam.apache.org/playground/backend/internal/utils"
 	"fmt"
 	"github.com/google/uuid"
+	"strings"
 	"testing"
 )
 
@@ -30,6 +31,7 @@ func TestSetupExecutor(t *testing.T) {
 	pipelineId := uuid.New()
 	sdk := pb.Sdk_SDK_JAVA
 	lc, err := fs_tool.NewLifeCycle(sdk, pipelineId, "")
+	pipelineOptions := ""
 	executorConfig := &environment.ExecutorConfig{
 		CompileCmd:  "MOCK_COMPILE_CMD",
 		RunCmd:      "MOCK_RUN_CMD",
@@ -68,16 +70,18 @@ func TestSetupExecutor(t *testing.T) {
 		WithRunner().
 		WithCommand(executorConfig.RunCmd).
 		WithArgs(executorConfig.RunArgs).
+		WithPipelineOptions(strings.Split(pipelineOptions, " ")).
 		WithTestRunner().
 		WithCommand(executorConfig.TestCmd).
 		WithArgs(executorConfig.TestArgs).
 		ExecutorBuilder
 
 	type args struct {
-		srcFilePath    string
-		baseFolderPath string
-		execFilePath   string
-		sdkEnv         *environment.BeamEnvs
+		srcFilePath     string
+		baseFolderPath  string
+		execFilePath    string
+		pipelineOptions string
+		sdkEnv          *environment.BeamEnvs
 	}
 	tests := []struct {
 		name    string
@@ -89,7 +93,7 @@ func TestSetupExecutor(t *testing.T) {
 			// Test case with calling Setup with incorrect SDK.
 			// As a result, want to receive an error.
 			name:    "incorrect sdk",
-			args:    args{lc.GetAbsoluteSourceFilePath(), lc.GetAbsoluteBaseFolderPath(), lc.GetAbsoluteExecutableFilePath(), environment.NewBeamEnvs(pb.Sdk_SDK_UNSPECIFIED, executorConfig, "")},
+			args:    args{lc.GetAbsoluteSourceFilePath(), lc.GetAbsoluteBaseFolderPath(), lc.GetAbsoluteExecutableFilePath(), pipelineOptions, environment.NewBeamEnvs(pb.Sdk_SDK_UNSPECIFIED, executorConfig, "")},
 			want:    nil,
 			wantErr: true,
 		},
@@ -97,14 +101,14 @@ func TestSetupExecutor(t *testing.T) {
 			// Test case with calling Setup with correct SDK.
 			// As a result, want to receive an expected builder.
 			name:    "correct sdk",
-			args:    args{lc.GetAbsoluteSourceFilePath(), lc.GetAbsoluteBaseFolderPath(), lc.GetAbsoluteExecutableFilePath(), sdkEnv},
+			args:    args{lc.GetAbsoluteSourceFilePath(), lc.GetAbsoluteBaseFolderPath(), lc.GetAbsoluteExecutableFilePath(), pipelineOptions, sdkEnv},
 			want:    &wantExecutor,
 			wantErr: false,
 		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			got, err := SetupExecutorBuilder(tt.args.srcFilePath, tt.args.baseFolderPath, tt.args.execFilePath, tt.args.sdkEnv)
+			got, err := SetupExecutorBuilder(tt.args.srcFilePath, tt.args.baseFolderPath, tt.args.execFilePath, tt.args.pipelineOptions, tt.args.sdkEnv)
 			if (err != nil) != tt.wantErr {
 				t.Errorf("SetupExecutorBuilder() error = %v, wantErr %v", err, tt.wantErr)
 				return
diff --git a/playground/backend/internal/setup_tools/life_cycle/life_cycle_setuper.go b/playground/backend/internal/setup_tools/life_cycle/life_cycle_setuper.go
index aade84f..35cbcab 100644
--- a/playground/backend/internal/setup_tools/life_cycle/life_cycle_setuper.go
+++ b/playground/backend/internal/setup_tools/life_cycle/life_cycle_setuper.go
@@ -33,6 +33,7 @@ const (
 	javaLogFilePlaceholder = "{logFilePath}"
 	goModFileName          = "go.mod"
 	goSumFileName          = "go.sum"
+	baseFileFolder         = "executable_files"
 )
 
 // Setup returns fs_tool.LifeCycle.
@@ -79,11 +80,11 @@ func Setup(sdk pb.Sdk, code string, pipelineId uuid.UUID, workingDir string, pre
 // prepareGoFiles prepares file for Go environment.
 // Copy go.mod and go.sum file from /path/to/preparedModDir to /path/to/workingDir.
 func prepareGoFiles(lc *fs_tool.LifeCycle, preparedModDir, workingDir string, pipelineId uuid.UUID) error {
-	if err := lc.CopyFile(goModFileName, preparedModDir, workingDir); err != nil {
+	if err := lc.CopyFile(goModFileName, preparedModDir, filepath.Join(workingDir, baseFileFolder)); err != nil {
 		logger.Errorf("%s: error during copying %s file: %s\n", pipelineId, goModFileName, err.Error())
 		return err
 	}
-	if err := lc.CopyFile(goSumFileName, preparedModDir, workingDir); err != nil {
+	if err := lc.CopyFile(goSumFileName, preparedModDir, filepath.Join(workingDir, baseFileFolder)); err != nil {
 		logger.Errorf("%s: error during copying %s file: %s\n", pipelineId, goSumFileName, err.Error())
 		return err
 	}
diff --git a/playground/backend/internal/setup_tools/life_cycle/life_cycle_setuper_test.go b/playground/backend/internal/setup_tools/life_cycle/life_cycle_setuper_test.go
index 1f65b29..be1d638 100644
--- a/playground/backend/internal/setup_tools/life_cycle/life_cycle_setuper_test.go
+++ b/playground/backend/internal/setup_tools/life_cycle/life_cycle_setuper_test.go
@@ -28,7 +28,6 @@ import (
 
 const (
 	workingDir              = "workingDir"
-	baseFileFolder          = "executable_files"
 	sourceFolder            = "src"
 	executableFolder        = "bin"
 	javaSourceFileExtension = ".java"
diff --git a/playground/backend/internal/utils/system_utils_test.go b/playground/backend/internal/utils/common.go
similarity index 64%
copy from playground/backend/internal/utils/system_utils_test.go
copy to playground/backend/internal/utils/common.go
index 495196d..ac0bdfd 100644
--- a/playground/backend/internal/utils/system_utils_test.go
+++ b/playground/backend/internal/utils/common.go
@@ -15,28 +15,9 @@
 
 package utils
 
-import "testing"
+import "regexp"
 
-func TestGetFuncName(t *testing.T) {
-	type args struct {
-		i interface{}
-	}
-	tests := []struct {
-		name string
-		args args
-		want string
-	}{
-		{
-			name: "get function name",
-			args: args{i: TestGetFuncName},
-			want: "TestGetFuncName",
-		},
-	}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			if got := GetFuncName(tt.args.i); got != tt.want {
-				t.Errorf("GetFuncName() = %v, want %v", got, tt.want)
-			}
-		})
-	}
+func ReduceWhiteSpacesToSinge(s string) string {
+	re := regexp.MustCompile(`\s+`)
+	return re.ReplaceAllString(s, " ")
 }
diff --git a/playground/backend/internal/utils/system_utils_test.go b/playground/backend/internal/utils/common_test.go
similarity index 71%
copy from playground/backend/internal/utils/system_utils_test.go
copy to playground/backend/internal/utils/common_test.go
index 495196d..ffbc4b6 100644
--- a/playground/backend/internal/utils/system_utils_test.go
+++ b/playground/backend/internal/utils/common_test.go
@@ -17,25 +17,22 @@ package utils
 
 import "testing"
 
-func TestGetFuncName(t *testing.T) {
+func TestReduceWhiteSpacesToSinge(t *testing.T) {
 	type args struct {
-		i interface{}
+		s string
 	}
 	tests := []struct {
 		name string
 		args args
 		want string
 	}{
-		{
-			name: "get function name",
-			args: args{i: TestGetFuncName},
-			want: "TestGetFuncName",
-		},
+		{name: "reduce white spaces to single", args: args{"--option1         option"}, want: "--option1 option"},
+		{name: "nothing to reduce", args: args{"--option1 option"}, want: "--option1 option"},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			if got := GetFuncName(tt.args.i); got != tt.want {
-				t.Errorf("GetFuncName() = %v, want %v", got, tt.want)
+			if got := ReduceWhiteSpacesToSinge(tt.args.s); got != tt.want {
+				t.Errorf("ReduceWhiteSpacesToSinge() = %v, want %v", got, tt.want)
 			}
 		})
 	}
diff --git a/playground/backend/internal/utils/preparators_utils.go b/playground/backend/internal/utils/preparators_utils.go
index cefff33..b8b3d41 100644
--- a/playground/backend/internal/utils/preparators_utils.go
+++ b/playground/backend/internal/utils/preparators_utils.go
@@ -19,6 +19,7 @@ import (
 	pb "beam.apache.org/playground/backend/internal/api/v1"
 	"beam.apache.org/playground/backend/internal/preparators"
 	"fmt"
+	"regexp"
 )
 
 // GetPreparators returns slice of preparators.Preparator according to sdk
@@ -36,3 +37,9 @@ func GetPreparators(sdk pb.Sdk, filepath string) (*[]preparators.Preparator, err
 	}
 	return prep, nil
 }
+
+// ReplaceSpacesWithEquals prepares pipelineOptions by replacing spaces between option and them value to equals.
+func ReplaceSpacesWithEquals(pipelineOptions string) string {
+	re := regexp.MustCompile(`(--[A-z0-9]+)\s([A-z0-9]+)`)
+	return re.ReplaceAllString(pipelineOptions, "$1=$2")
+}
diff --git a/playground/backend/internal/utils/system_utils_test.go b/playground/backend/internal/utils/preparators_utils_test.go
similarity index 62%
copy from playground/backend/internal/utils/system_utils_test.go
copy to playground/backend/internal/utils/preparators_utils_test.go
index 495196d..2140eda 100644
--- a/playground/backend/internal/utils/system_utils_test.go
+++ b/playground/backend/internal/utils/preparators_utils_test.go
@@ -17,9 +17,9 @@ package utils
 
 import "testing"
 
-func TestGetFuncName(t *testing.T) {
+func TestSpacesToEqualsOption(t *testing.T) {
 	type args struct {
-		i interface{}
+		pipelineOptions string
 	}
 	tests := []struct {
 		name string
@@ -27,15 +27,25 @@ func TestGetFuncName(t *testing.T) {
 		want string
 	}{
 		{
-			name: "get function name",
-			args: args{i: TestGetFuncName},
-			want: "TestGetFuncName",
+			name: "args is empty string",
+			args: args{pipelineOptions: ""},
+			want: "",
+		},
+		{
+			name: "args with one option",
+			args: args{pipelineOptions: "--opt1 valOpt"},
+			want: "--opt1=valOpt",
+		},
+		{
+			name: "args with some options",
+			args: args{pipelineOptions: "--opt1 valOpt --opt2 valOpt --opt3 valOpt"},
+			want: "--opt1=valOpt --opt2=valOpt --opt3=valOpt",
 		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			if got := GetFuncName(tt.args.i); got != tt.want {
-				t.Errorf("GetFuncName() = %v, want %v", got, tt.want)
+			if got := ReplaceSpacesWithEquals(tt.args.pipelineOptions); got != tt.want {
+				t.Errorf("ReplaceSpacesWithEquals() = %v, want %v", got, tt.want)
 			}
 		})
 	}
diff --git a/playground/backend/internal/utils/system_utils_test.go b/playground/backend/internal/utils/system_utils_test.go
index 495196d..7c47b03 100644
--- a/playground/backend/internal/utils/system_utils_test.go
+++ b/playground/backend/internal/utils/system_utils_test.go
@@ -15,7 +15,9 @@
 
 package utils
 
-import "testing"
+import (
+	"testing"
+)
 
 func TestGetFuncName(t *testing.T) {
 	type args struct {
diff --git a/playground/frontend/lib/api/v1/api.pb.dart b/playground/frontend/lib/api/v1/api.pb.dart
index de4347d..7bacd58 100644
--- a/playground/frontend/lib/api/v1/api.pb.dart
+++ b/playground/frontend/lib/api/v1/api.pb.dart
@@ -1,4 +1,4 @@
-/*
+*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -35,6 +35,7 @@ class RunCodeRequest extends $pb.GeneratedMessage {
   static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RunCodeRequest', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'api.v1'), createEmptyInstance: create)
     ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'code')
     ..e<Sdk>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'sdk', $pb.PbFieldType.OE, defaultOrMaker: Sdk.SDK_UNSPECIFIED, valueOf: Sdk.valueOf, enumValues: Sdk.values)
+    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'pipelineOptions')
     ..hasRequiredFields = false
   ;
 
@@ -42,6 +43,7 @@ class RunCodeRequest extends $pb.GeneratedMessage {
   factory RunCodeRequest({
     $core.String? code,
     Sdk? sdk,
+    $core.String? pipelineOptions,
   }) {
     final _result = create();
     if (code != null) {
@@ -50,6 +52,9 @@ class RunCodeRequest extends $pb.GeneratedMessage {
     if (sdk != null) {
       _result.sdk = sdk;
     }
+    if (pipelineOptions != null) {
+      _result.pipelineOptions = pipelineOptions;
+    }
     return _result;
   }
   factory RunCodeRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
@@ -90,6 +95,15 @@ class RunCodeRequest extends $pb.GeneratedMessage {
   $core.bool hasSdk() => $_has(1);
   @$pb.TagNumber(2)
   void clearSdk() => clearField(2);
+
+  @$pb.TagNumber(3)
+  $core.String get pipelineOptions => $_getSZ(2);
+  @$pb.TagNumber(3)
+  set pipelineOptions($core.String v) { $_setString(2, v); }
+  @$pb.TagNumber(3)
+  $core.bool hasPipelineOptions() => $_has(2);
+  @$pb.TagNumber(3)
+  void clearPipelineOptions() => clearField(3);
 }
 
 class RunCodeResponse extends $pb.GeneratedMessage {
@@ -489,7 +503,6 @@ class GetRunErrorResponse extends $pb.GeneratedMessage {
   ;
 
   GetRunErrorResponse._() : super();
-
   factory GetRunErrorResponse({
     $core.String? output,
   }) {
@@ -499,54 +512,31 @@ class GetRunErrorResponse extends $pb.GeneratedMessage {
     }
     return _result;
   }
-
-  factory GetRunErrorResponse.fromBuffer($core.List<$core.int> i,
-      [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()
-        ..mergeFromBuffer(i, r);
-
-  factory GetRunErrorResponse.fromJson($core.String i,
-      [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()
-        ..mergeFromJson(i, r);
-
+  factory GetRunErrorResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory GetRunErrorResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
   @$core.Deprecated(
-      'Using this can add significant overhead to your binary. '
-          'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-          'Will be removed in next major version')
-  GetRunErrorResponse clone() =>
-      GetRunErrorResponse()
-        ..mergeFromMessage(this);
-
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+  'Will be removed in next major version')
+  GetRunErrorResponse clone() => GetRunErrorResponse()..mergeFromMessage(this);
   @$core.Deprecated(
-      'Using this can add significant overhead to your binary. '
-          'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-          'Will be removed in next major version')
-  GetRunErrorResponse copyWith(void Function(GetRunErrorResponse) updates) =>
-      super.copyWith((message) => updates(
-          message as GetRunErrorResponse)) as GetRunErrorResponse; // ignore: deprecated_member_use
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+  'Will be removed in next major version')
+  GetRunErrorResponse copyWith(void Function(GetRunErrorResponse) updates) => super.copyWith((message) => updates(message as GetRunErrorResponse)) as GetRunErrorResponse; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
-
   @$core.pragma('dart2js:noInline')
   static GetRunErrorResponse create() => GetRunErrorResponse._();
-
   GetRunErrorResponse createEmptyInstance() => create();
-
-  static $pb.PbList<GetRunErrorResponse> createRepeated() =>
-      $pb.PbList<GetRunErrorResponse>();
-
+  static $pb.PbList<GetRunErrorResponse> createRepeated() => $pb.PbList<GetRunErrorResponse>();
   @$core.pragma('dart2js:noInline')
-  static GetRunErrorResponse getDefault() => _defaultInstance ??=
-      $pb.GeneratedMessage.$_defaultFor<GetRunErrorResponse>(create);
+  static GetRunErrorResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<GetRunErrorResponse>(create);
   static GetRunErrorResponse? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.String get output => $_getSZ(0);
-
   @$pb.TagNumber(1)
-  set output($core.String v) {
-    $_setString(0, v);
-  }
+  set output($core.String v) { $_setString(0, v); }
   @$pb.TagNumber(1)
   $core.bool hasOutput() => $_has(0);
   @$pb.TagNumber(1)
@@ -554,21 +544,12 @@ class GetRunErrorResponse extends $pb.GeneratedMessage {
 }
 
 class GetLogsRequest extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'GetLogsRequest', package: const $pb.PackageName(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'api.v1'), createEmptyInstance: create)
-    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names')
-        ? ''
-        : 'pipelineUuid')
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'GetLogsRequest', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'api.v1'), createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'pipelineUuid')
     ..hasRequiredFields = false
   ;
 
   GetLogsRequest._() : super();
-
   factory GetLogsRequest({
     $core.String? pipelineUuid,
   }) {
@@ -578,54 +559,31 @@ class GetLogsRequest extends $pb.GeneratedMessage {
     }
     return _result;
   }
-
-  factory GetLogsRequest.fromBuffer($core.List<$core.int> i,
-      [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()
-        ..mergeFromBuffer(i, r);
-
-  factory GetLogsRequest.fromJson($core.String i,
-      [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()
-        ..mergeFromJson(i, r);
-
+  factory GetLogsRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory GetLogsRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
   @$core.Deprecated(
-      'Using this can add significant overhead to your binary. '
-          'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-          'Will be removed in next major version')
-  GetLogsRequest clone() =>
-      GetLogsRequest()
-        ..mergeFromMessage(this);
-
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+  'Will be removed in next major version')
+  GetLogsRequest clone() => GetLogsRequest()..mergeFromMessage(this);
   @$core.Deprecated(
-      'Using this can add significant overhead to your binary. '
-          'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-          'Will be removed in next major version')
-  GetLogsRequest copyWith(void Function(GetLogsRequest) updates) =>
-      super.copyWith((message) => updates(
-          message as GetLogsRequest)) as GetLogsRequest; // ignore: deprecated_member_use
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+  'Will be removed in next major version')
+  GetLogsRequest copyWith(void Function(GetLogsRequest) updates) => super.copyWith((message) => updates(message as GetLogsRequest)) as GetLogsRequest; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
-
   @$core.pragma('dart2js:noInline')
   static GetLogsRequest create() => GetLogsRequest._();
-
   GetLogsRequest createEmptyInstance() => create();
-
-  static $pb.PbList<GetLogsRequest> createRepeated() =>
-      $pb.PbList<GetLogsRequest>();
-
+  static $pb.PbList<GetLogsRequest> createRepeated() => $pb.PbList<GetLogsRequest>();
   @$core.pragma('dart2js:noInline')
-  static GetLogsRequest getDefault() => _defaultInstance ??=
-      $pb.GeneratedMessage.$_defaultFor<GetLogsRequest>(create);
+  static GetLogsRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<GetLogsRequest>(create);
   static GetLogsRequest? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.String get pipelineUuid => $_getSZ(0);
-
   @$pb.TagNumber(1)
-  set pipelineUuid($core.String v) {
-    $_setString(0, v);
-  }
+  set pipelineUuid($core.String v) { $_setString(0, v); }
   @$pb.TagNumber(1)
   $core.bool hasPipelineUuid() => $_has(0);
   @$pb.TagNumber(1)
@@ -633,21 +591,12 @@ class GetLogsRequest extends $pb.GeneratedMessage {
 }
 
 class GetLogsResponse extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'GetLogsResponse', package: const $pb.PackageName(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'api.v1'), createEmptyInstance: create)
-    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names')
-        ? ''
-        : 'output')
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'GetLogsResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'api.v1'), createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'output')
     ..hasRequiredFields = false
   ;
 
   GetLogsResponse._() : super();
-
   factory GetLogsResponse({
     $core.String? output,
   }) {
@@ -657,54 +606,31 @@ class GetLogsResponse extends $pb.GeneratedMessage {
     }
     return _result;
   }
-
-  factory GetLogsResponse.fromBuffer($core.List<$core.int> i,
-      [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()
-        ..mergeFromBuffer(i, r);
-
-  factory GetLogsResponse.fromJson($core.String i,
-      [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()
-        ..mergeFromJson(i, r);
-
+  factory GetLogsResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory GetLogsResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
   @$core.Deprecated(
-      'Using this can add significant overhead to your binary. '
-          'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-          'Will be removed in next major version')
-  GetLogsResponse clone() =>
-      GetLogsResponse()
-        ..mergeFromMessage(this);
-
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+  'Will be removed in next major version')
+  GetLogsResponse clone() => GetLogsResponse()..mergeFromMessage(this);
   @$core.Deprecated(
-      'Using this can add significant overhead to your binary. '
-          'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-          'Will be removed in next major version')
-  GetLogsResponse copyWith(void Function(GetLogsResponse) updates) =>
-      super.copyWith((message) => updates(
-          message as GetLogsResponse)) as GetLogsResponse; // ignore: deprecated_member_use
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+  'Will be removed in next major version')
+  GetLogsResponse copyWith(void Function(GetLogsResponse) updates) => super.copyWith((message) => updates(message as GetLogsResponse)) as GetLogsResponse; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
-
   @$core.pragma('dart2js:noInline')
   static GetLogsResponse create() => GetLogsResponse._();
-
   GetLogsResponse createEmptyInstance() => create();
-
-  static $pb.PbList<GetLogsResponse> createRepeated() =>
-      $pb.PbList<GetLogsResponse>();
-
+  static $pb.PbList<GetLogsResponse> createRepeated() => $pb.PbList<GetLogsResponse>();
   @$core.pragma('dart2js:noInline')
-  static GetLogsResponse getDefault() => _defaultInstance ??=
-      $pb.GeneratedMessage.$_defaultFor<GetLogsResponse>(create);
+  static GetLogsResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<GetLogsResponse>(create);
   static GetLogsResponse? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.String get output => $_getSZ(0);
-
   @$pb.TagNumber(1)
-  set output($core.String v) {
-    $_setString(0, v);
-  }
+  set output($core.String v) { $_setString(0, v); }
   @$pb.TagNumber(1)
   $core.bool hasOutput() => $_has(0);
   @$pb.TagNumber(1)
@@ -712,21 +638,12 @@ class GetLogsResponse extends $pb.GeneratedMessage {
 }
 
 class CancelRequest extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'CancelRequest', package: const $pb.PackageName(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'api.v1'), createEmptyInstance: create)
-    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names')
-        ? ''
-        : 'pipelineUuid')
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CancelRequest', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'api.v1'), createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'pipelineUuid')
     ..hasRequiredFields = false
   ;
 
   CancelRequest._() : super();
-
   factory CancelRequest({
     $core.String? pipelineUuid,
   }) {
@@ -862,16 +779,8 @@ class PrecompiledObject extends $pb.GeneratedMessage {
     ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'cloudPath')
     ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name')
     ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'description')
-    ..e<PrecompiledObjectType>(4,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'type', $pb.PbFieldType.OE, defaultOrMaker: PrecompiledObjectType
-            .PRECOMPILED_OBJECT_TYPE_UNSPECIFIED,
-        valueOf: PrecompiledObjectType.valueOf,
-        enumValues: PrecompiledObjectType.values)
-    ..aOS(5, const $core.bool.fromEnvironment('protobuf.omit_field_names')
-        ? ''
-        : 'pipelineOptions')
+    ..e<PrecompiledObjectType>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'type', $pb.PbFieldType.OE, defaultOrMaker: PrecompiledObjectType.PRECOMPILED_OBJECT_TYPE_UNSPECIFIED, valueOf: PrecompiledObjectType.valueOf, enumValues: PrecompiledObjectType.values)
+    ..aOS(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'pipelineOptions')
     ..hasRequiredFields = false
   ;
 
@@ -951,29 +860,19 @@ class PrecompiledObject extends $pb.GeneratedMessage {
 
   @$pb.TagNumber(4)
   PrecompiledObjectType get type => $_getN(3);
-
   @$pb.TagNumber(4)
-  set type(PrecompiledObjectType v) {
-    setField(4, v);
-  }
-
+  set type(PrecompiledObjectType v) { setField(4, v); }
   @$pb.TagNumber(4)
   $core.bool hasType() => $_has(3);
-
   @$pb.TagNumber(4)
   void clearType() => clearField(4);
 
   @$pb.TagNumber(5)
   $core.String get pipelineOptions => $_getSZ(4);
-
   @$pb.TagNumber(5)
-  set pipelineOptions($core.String v) {
-    $_setString(4, v);
-  }
-
+  set pipelineOptions($core.String v) { $_setString(4, v); }
   @$pb.TagNumber(5)
   $core.bool hasPipelineOptions() => $_has(4);
-
   @$pb.TagNumber(5)
   void clearPipelineOptions() => clearField(5);
 }
diff --git a/playground/frontend/lib/api/v1/api.pbenum.dart b/playground/frontend/lib/api/v1/api.pbenum.dart
index c4aa4bd..1553627 100644
--- a/playground/frontend/lib/api/v1/api.pbenum.dart
+++ b/playground/frontend/lib/api/v1/api.pbenum.dart
@@ -1,4 +1,4 @@
-/*
+*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
diff --git a/playground/frontend/lib/api/v1/api.pbgrpc.dart b/playground/frontend/lib/api/v1/api.pbgrpc.dart
index ec42a43..a784e4e 100644
--- a/playground/frontend/lib/api/v1/api.pbgrpc.dart
+++ b/playground/frontend/lib/api/v1/api.pbgrpc.dart
@@ -1,4 +1,4 @@
-/*
+*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -33,45 +33,44 @@ export 'api.pb.dart';
 
 class PlaygroundServiceClient extends $grpc.Client {
   static final _$runCode =
-  $grpc.ClientMethod<$0.RunCodeRequest, $0.RunCodeResponse>(
-      '/api.v1.PlaygroundService/RunCode',
+      $grpc.ClientMethod<$0.RunCodeRequest, $0.RunCodeResponse>(
+          '/api.v1.PlaygroundService/RunCode',
           ($0.RunCodeRequest value) => value.writeToBuffer(),
           ($core.List<$core.int> value) =>
-          $0.RunCodeResponse.fromBuffer(value));
+              $0.RunCodeResponse.fromBuffer(value));
   static final _$checkStatus =
-  $grpc.ClientMethod<$0.CheckStatusRequest, $0.CheckStatusResponse>(
-      '/api.v1.PlaygroundService/CheckStatus',
+      $grpc.ClientMethod<$0.CheckStatusRequest, $0.CheckStatusResponse>(
+          '/api.v1.PlaygroundService/CheckStatus',
           ($0.CheckStatusRequest value) => value.writeToBuffer(),
           ($core.List<$core.int> value) =>
-          $0.CheckStatusResponse.fromBuffer(value));
+              $0.CheckStatusResponse.fromBuffer(value));
   static final _$getRunOutput =
-  $grpc.ClientMethod<$0.GetRunOutputRequest, $0.GetRunOutputResponse>(
-      '/api.v1.PlaygroundService/GetRunOutput',
+      $grpc.ClientMethod<$0.GetRunOutputRequest, $0.GetRunOutputResponse>(
+          '/api.v1.PlaygroundService/GetRunOutput',
           ($0.GetRunOutputRequest value) => value.writeToBuffer(),
           ($core.List<$core.int> value) =>
-          $0.GetRunOutputResponse.fromBuffer(value));
+              $0.GetRunOutputResponse.fromBuffer(value));
   static final _$getLogs =
-  $grpc.ClientMethod<$0.GetLogsRequest, $0.GetLogsResponse>(
-      '/api.v1.PlaygroundService/GetLogs',
+      $grpc.ClientMethod<$0.GetLogsRequest, $0.GetLogsResponse>(
+          '/api.v1.PlaygroundService/GetLogs',
           ($0.GetLogsRequest value) => value.writeToBuffer(),
           ($core.List<$core.int> value) =>
-          $0.GetLogsResponse.fromBuffer(value));
+              $0.GetLogsResponse.fromBuffer(value));
   static final _$getRunError =
-  $grpc.ClientMethod<$0.GetRunErrorRequest, $0.GetRunErrorResponse>(
-      '/api.v1.PlaygroundService/GetRunError',
+      $grpc.ClientMethod<$0.GetRunErrorRequest, $0.GetRunErrorResponse>(
+          '/api.v1.PlaygroundService/GetRunError',
           ($0.GetRunErrorRequest value) => value.writeToBuffer(),
           ($core.List<$core.int> value) =>
-          $0.GetRunErrorResponse.fromBuffer(value));
+              $0.GetRunErrorResponse.fromBuffer(value));
   static final _$getCompileOutput = $grpc.ClientMethod<
-      $0.GetCompileOutputRequest,
-      $0.GetCompileOutputResponse>(
+          $0.GetCompileOutputRequest, $0.GetCompileOutputResponse>(
       '/api.v1.PlaygroundService/GetCompileOutput',
-          ($0.GetCompileOutputRequest value) => value.writeToBuffer(),
-          ($core.List<$core.int> value) =>
+      ($0.GetCompileOutputRequest value) => value.writeToBuffer(),
+      ($core.List<$core.int> value) =>
           $0.GetCompileOutputResponse.fromBuffer(value));
   static final _$cancel =
-  $grpc.ClientMethod<$0.CancelRequest, $0.CancelResponse>(
-      '/api.v1.PlaygroundService/Cancel',
+      $grpc.ClientMethod<$0.CancelRequest, $0.CancelResponse>(
+          '/api.v1.PlaygroundService/Cancel',
           ($0.CancelRequest value) => value.writeToBuffer(),
           ($core.List<$core.int> value) => $0.CancelResponse.fromBuffer(value));
   static final _$getPrecompiledObjects = $grpc.ClientMethod<
@@ -167,69 +166,67 @@ abstract class PlaygroundServiceBase extends $grpc.Service {
         runCode_Pre,
         false,
         false,
-            ($core.List<$core.int> value) =>
-            $0.RunCodeRequest.fromBuffer(value),
-            ($0.RunCodeResponse value) => value.writeToBuffer()));
+        ($core.List<$core.int> value) => $0.RunCodeRequest.fromBuffer(value),
+        ($0.RunCodeResponse value) => value.writeToBuffer()));
     $addMethod(
         $grpc.ServiceMethod<$0.CheckStatusRequest, $0.CheckStatusResponse>(
             'CheckStatus',
             checkStatus_Pre,
             false,
             false,
-                ($core.List<$core.int> value) =>
+            ($core.List<$core.int> value) =>
                 $0.CheckStatusRequest.fromBuffer(value),
-                ($0.CheckStatusResponse value) => value.writeToBuffer()));
+            ($0.CheckStatusResponse value) => value.writeToBuffer()));
     $addMethod(
         $grpc.ServiceMethod<$0.GetRunOutputRequest, $0.GetRunOutputResponse>(
             'GetRunOutput',
             getRunOutput_Pre,
             false,
             false,
-                ($core.List<$core.int> value) =>
+            ($core.List<$core.int> value) =>
                 $0.GetRunOutputRequest.fromBuffer(value),
-                ($0.GetRunOutputResponse value) => value.writeToBuffer()));
+            ($0.GetRunOutputResponse value) => value.writeToBuffer()));
     $addMethod($grpc.ServiceMethod<$0.GetLogsRequest, $0.GetLogsResponse>(
         'GetLogs',
         getLogs_Pre,
         false,
         false,
-            ($core.List<$core.int> value) =>
-            $0.GetLogsRequest.fromBuffer(value),
-            ($0.GetLogsResponse value) => value.writeToBuffer()));
+        ($core.List<$core.int> value) => $0.GetLogsRequest.fromBuffer(value),
+        ($0.GetLogsResponse value) => value.writeToBuffer()));
     $addMethod(
         $grpc.ServiceMethod<$0.GetRunErrorRequest, $0.GetRunErrorResponse>(
             'GetRunError',
             getRunError_Pre,
             false,
             false,
-                ($core.List<$core.int> value) =>
+            ($core.List<$core.int> value) =>
                 $0.GetRunErrorRequest.fromBuffer(value),
-                ($0.GetRunErrorResponse value) => value.writeToBuffer()));
+            ($0.GetRunErrorResponse value) => value.writeToBuffer()));
     $addMethod($grpc.ServiceMethod<$0.GetCompileOutputRequest,
-        $0.GetCompileOutputResponse>(
+            $0.GetCompileOutputResponse>(
         'GetCompileOutput',
         getCompileOutput_Pre,
         false,
         false,
-            ($core.List<$core.int> value) =>
+        ($core.List<$core.int> value) =>
             $0.GetCompileOutputRequest.fromBuffer(value),
-            ($0.GetCompileOutputResponse value) => value.writeToBuffer()));
+        ($0.GetCompileOutputResponse value) => value.writeToBuffer()));
     $addMethod($grpc.ServiceMethod<$0.CancelRequest, $0.CancelResponse>(
         'Cancel',
         cancel_Pre,
         false,
         false,
-            ($core.List<$core.int> value) => $0.CancelRequest.fromBuffer(value),
-            ($0.CancelResponse value) => value.writeToBuffer()));
+        ($core.List<$core.int> value) => $0.CancelRequest.fromBuffer(value),
+        ($0.CancelResponse value) => value.writeToBuffer()));
     $addMethod($grpc.ServiceMethod<$0.GetPrecompiledObjectsRequest,
-        $0.GetPrecompiledObjectsResponse>(
+            $0.GetPrecompiledObjectsResponse>(
         'GetPrecompiledObjects',
         getPrecompiledObjects_Pre,
         false,
         false,
-            ($core.List<$core.int> value) =>
+        ($core.List<$core.int> value) =>
             $0.GetPrecompiledObjectsRequest.fromBuffer(value),
-            ($0.GetPrecompiledObjectsResponse value) => value.writeToBuffer()));
+        ($0.GetPrecompiledObjectsResponse value) => value.writeToBuffer()));
     $addMethod($grpc.ServiceMethod<$0.GetPrecompiledObjectRequest,
             $0.GetPrecompiledObjectCodeResponse>(
         'GetPrecompiledObjectCode',
@@ -266,8 +263,8 @@ abstract class PlaygroundServiceBase extends $grpc.Service {
     return getRunOutput(call, await request);
   }
 
-  $async.Future<$0.GetLogsResponse> getLogs_Pre($grpc.ServiceCall call,
-      $async.Future<$0.GetLogsRequest> request) async {
+  $async.Future<$0.GetLogsResponse> getLogs_Pre(
+      $grpc.ServiceCall call, $async.Future<$0.GetLogsRequest> request) async {
     return getLogs(call, await request);
   }
 
@@ -294,8 +291,8 @@ abstract class PlaygroundServiceBase extends $grpc.Service {
   }
 
   $async.Future<$0.GetPrecompiledObjectCodeResponse>
-  getPrecompiledObjectCode_Pre($grpc.ServiceCall call,
-      $async.Future<$0.GetPrecompiledObjectRequest> request) async {
+      getPrecompiledObjectCode_Pre($grpc.ServiceCall call,
+          $async.Future<$0.GetPrecompiledObjectRequest> request) async {
     return getPrecompiledObjectCode(call, await request);
   }
 
@@ -305,33 +302,24 @@ abstract class PlaygroundServiceBase extends $grpc.Service {
     return getPrecompiledObjectOutput(call, await request);
   }
 
-  $async.Future<$0.RunCodeResponse> runCode($grpc.ServiceCall call,
-      $0.RunCodeRequest request);
-
-  $async.Future<$0.CheckStatusResponse> checkStatus($grpc.ServiceCall call,
-      $0.CheckStatusRequest request);
-
-  $async.Future<$0.GetRunOutputResponse> getRunOutput($grpc.ServiceCall call,
-      $0.GetRunOutputRequest request);
-
-  $async.Future<$0.GetLogsResponse> getLogs($grpc.ServiceCall call,
-      $0.GetLogsRequest request);
-
-  $async.Future<$0.GetRunErrorResponse> getRunError($grpc.ServiceCall call,
-      $0.GetRunErrorRequest request);
-
+  $async.Future<$0.RunCodeResponse> runCode(
+      $grpc.ServiceCall call, $0.RunCodeRequest request);
+  $async.Future<$0.CheckStatusResponse> checkStatus(
+      $grpc.ServiceCall call, $0.CheckStatusRequest request);
+  $async.Future<$0.GetRunOutputResponse> getRunOutput(
+      $grpc.ServiceCall call, $0.GetRunOutputRequest request);
+  $async.Future<$0.GetLogsResponse> getLogs(
+      $grpc.ServiceCall call, $0.GetLogsRequest request);
+  $async.Future<$0.GetRunErrorResponse> getRunError(
+      $grpc.ServiceCall call, $0.GetRunErrorRequest request);
   $async.Future<$0.GetCompileOutputResponse> getCompileOutput(
       $grpc.ServiceCall call, $0.GetCompileOutputRequest request);
-
-  $async.Future<$0.CancelResponse> cancel($grpc.ServiceCall call,
-      $0.CancelRequest request);
-
+  $async.Future<$0.CancelResponse> cancel(
+      $grpc.ServiceCall call, $0.CancelRequest request);
   $async.Future<$0.GetPrecompiledObjectsResponse> getPrecompiledObjects(
       $grpc.ServiceCall call, $0.GetPrecompiledObjectsRequest request);
-
   $async.Future<$0.GetPrecompiledObjectCodeResponse> getPrecompiledObjectCode(
       $grpc.ServiceCall call, $0.GetPrecompiledObjectRequest request);
-
   $async.Future<$0.GetRunOutputResponse> getPrecompiledObjectOutput(
       $grpc.ServiceCall call, $0.GetPrecompiledObjectRequest request);
 }
diff --git a/playground/frontend/lib/api/v1/api.pbjson.dart b/playground/frontend/lib/api/v1/api.pbjson.dart
index fe42ae4..c455504 100644
--- a/playground/frontend/lib/api/v1/api.pbjson.dart
+++ b/playground/frontend/lib/api/v1/api.pbjson.dart
@@ -1,4 +1,4 @@
-/*
+*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -81,11 +81,12 @@ const RunCodeRequest$json = const {
   '2': const [
     const {'1': 'code', '3': 1, '4': 1, '5': 9, '10': 'code'},
     const {'1': 'sdk', '3': 2, '4': 1, '5': 14, '6': '.api.v1.Sdk', '10': 'sdk'},
+    const {'1': 'pipeline_options', '3': 3, '4': 1, '5': 9, '10': 'pipelineOptions'},
   ],
 };
 
 /// Descriptor for `RunCodeRequest`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List runCodeRequestDescriptor = $convert.base64Decode('Cg5SdW5Db2RlUmVxdWVzdBISCgRjb2RlGAEgASgJUgRjb2RlEh0KA3NkaxgCIAEoDjILLmFwaS52MS5TZGtSA3Nkaw==');
+final $typed_data.Uint8List runCodeRequestDescriptor = $convert.base64Decode('Cg5SdW5Db2RlUmVxdWVzdBISCgRjb2RlGAEgASgJUgRjb2RlEh0KA3NkaxgCIAEoDjILLmFwaS52MS5TZGtSA3NkaxIpChBwaXBlbGluZV9vcHRpb25zGAMgASgJUg9waXBlbGluZU9wdGlvbnM=');
 @$core.Deprecated('Use runCodeResponseDescriptor instead')
 const RunCodeResponse$json = const {
   '1': 'RunCodeResponse',
@@ -146,9 +147,7 @@ const GetRunOutputRequest$json = const {
 };
 
 /// Descriptor for `GetRunOutputRequest`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List getRunOutputRequestDescriptor = $convert
-    .base64Decode(
-    'ChNHZXRSdW5PdXRwdXRSZXF1ZXN0EiMKDXBpcGVsaW5lX3V1aWQYASABKAlSDHBpcGVsaW5lVXVpZA==');
+final $typed_data.Uint8List getRunOutputRequestDescriptor = $convert.base64Decode('ChNHZXRSdW5PdXRwdXRSZXF1ZXN0EiMKDXBpcGVsaW5lX3V1aWQYASABKAlSDHBpcGVsaW5lVXVpZA==');
 @$core.Deprecated('Use getRunOutputResponseDescriptor instead')
 const GetRunOutputResponse$json = const {
   '1': 'GetRunOutputResponse',
@@ -158,9 +157,7 @@ const GetRunOutputResponse$json = const {
 };
 
 /// Descriptor for `GetRunOutputResponse`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List getRunOutputResponseDescriptor = $convert
-    .base64Decode(
-    'ChRHZXRSdW5PdXRwdXRSZXNwb25zZRIWCgZvdXRwdXQYASABKAlSBm91dHB1dA==');
+final $typed_data.Uint8List getRunOutputResponseDescriptor = $convert.base64Decode('ChRHZXRSdW5PdXRwdXRSZXNwb25zZRIWCgZvdXRwdXQYASABKAlSBm91dHB1dA==');
 @$core.Deprecated('Use getRunErrorRequestDescriptor instead')
 const GetRunErrorRequest$json = const {
   '1': 'GetRunErrorRequest',
@@ -170,9 +167,7 @@ const GetRunErrorRequest$json = const {
 };
 
 /// Descriptor for `GetRunErrorRequest`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List getRunErrorRequestDescriptor = $convert
-    .base64Decode(
-    'ChJHZXRSdW5FcnJvclJlcXVlc3QSIwoNcGlwZWxpbmVfdXVpZBgBIAEoCVIMcGlwZWxpbmVVdWlk');
+final $typed_data.Uint8List getRunErrorRequestDescriptor = $convert.base64Decode('ChJHZXRSdW5FcnJvclJlcXVlc3QSIwoNcGlwZWxpbmVfdXVpZBgBIAEoCVIMcGlwZWxpbmVVdWlk');
 @$core.Deprecated('Use getRunErrorResponseDescriptor instead')
 const GetRunErrorResponse$json = const {
   '1': 'GetRunErrorResponse',
@@ -182,9 +177,7 @@ const GetRunErrorResponse$json = const {
 };
 
 /// Descriptor for `GetRunErrorResponse`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List getRunErrorResponseDescriptor = $convert
-    .base64Decode(
-    'ChNHZXRSdW5FcnJvclJlc3BvbnNlEhYKBm91dHB1dBgBIAEoCVIGb3V0cHV0');
+final $typed_data.Uint8List getRunErrorResponseDescriptor = $convert.base64Decode('ChNHZXRSdW5FcnJvclJlc3BvbnNlEhYKBm91dHB1dBgBIAEoCVIGb3V0cHV0');
 @$core.Deprecated('Use getLogsRequestDescriptor instead')
 const GetLogsRequest$json = const {
   '1': 'GetLogsRequest',
@@ -194,8 +187,7 @@ const GetLogsRequest$json = const {
 };
 
 /// Descriptor for `GetLogsRequest`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List getLogsRequestDescriptor = $convert.base64Decode(
-    'Cg5HZXRMb2dzUmVxdWVzdBIjCg1waXBlbGluZV91dWlkGAEgASgJUgxwaXBlbGluZVV1aWQ=');
+final $typed_data.Uint8List getLogsRequestDescriptor = $convert.base64Decode('Cg5HZXRMb2dzUmVxdWVzdBIjCg1waXBlbGluZV91dWlkGAEgASgJUgxwaXBlbGluZVV1aWQ=');
 @$core.Deprecated('Use getLogsResponseDescriptor instead')
 const GetLogsResponse$json = const {
   '1': 'GetLogsResponse',
@@ -205,8 +197,7 @@ const GetLogsResponse$json = const {
 };
 
 /// Descriptor for `GetLogsResponse`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List getLogsResponseDescriptor = $convert.base64Decode(
-    'Cg9HZXRMb2dzUmVzcG9uc2USFgoGb3V0cHV0GAEgASgJUgZvdXRwdXQ=');
+final $typed_data.Uint8List getLogsResponseDescriptor = $convert.base64Decode('Cg9HZXRMb2dzUmVzcG9uc2USFgoGb3V0cHV0GAEgASgJUgZvdXRwdXQ=');
 @$core.Deprecated('Use cancelRequestDescriptor instead')
 const CancelRequest$json = const {
   '1': 'CancelRequest',
@@ -216,28 +207,19 @@ const CancelRequest$json = const {
 };
 
 /// Descriptor for `CancelRequest`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List cancelRequestDescriptor = $convert.base64Decode(
-    'Cg1DYW5jZWxSZXF1ZXN0EiMKDXBpcGVsaW5lX3V1aWQYASABKAlSDHBpcGVsaW5lVXVpZA==');
+final $typed_data.Uint8List cancelRequestDescriptor = $convert.base64Decode('Cg1DYW5jZWxSZXF1ZXN0EiMKDXBpcGVsaW5lX3V1aWQYASABKAlSDHBpcGVsaW5lVXVpZA==');
 @$core.Deprecated('Use cancelResponseDescriptor instead')
 const CancelResponse$json = const {
   '1': 'CancelResponse',
 };
 
 /// Descriptor for `CancelResponse`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List cancelResponseDescriptor = $convert.base64Decode(
-    'Cg5DYW5jZWxSZXNwb25zZQ==');
+final $typed_data.Uint8List cancelResponseDescriptor = $convert.base64Decode('Cg5DYW5jZWxSZXNwb25zZQ==');
 @$core.Deprecated('Use getPrecompiledObjectsRequestDescriptor instead')
 const GetPrecompiledObjectsRequest$json = const {
   '1': 'GetPrecompiledObjectsRequest',
   '2': const [
-    const {
-      '1': 'sdk',
-      '3': 1,
-      '4': 1,
-      '5': 14,
-      '6': '.api.v1.Sdk',
-      '10': 'sdk'
-    },
+    const {'1': 'sdk', '3': 1, '4': 1, '5': 14, '6': '.api.v1.Sdk', '10': 'sdk'},
     const {'1': 'category', '3': 2, '4': 1, '5': 9, '10': 'category'},
   ],
 };
@@ -251,47 +233,19 @@ const PrecompiledObject$json = const {
     const {'1': 'cloud_path', '3': 1, '4': 1, '5': 9, '10': 'cloudPath'},
     const {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},
     const {'1': 'description', '3': 3, '4': 1, '5': 9, '10': 'description'},
-    const {
-      '1': 'type',
-      '3': 4,
-      '4': 1,
-      '5': 14,
-      '6': '.api.v1.PrecompiledObjectType',
-      '10': 'type'
-    },
-    const {
-      '1': 'pipeline_options',
-      '3': 5,
-      '4': 1,
-      '5': 9,
-      '10': 'pipelineOptions'
-    },
+    const {'1': 'type', '3': 4, '4': 1, '5': 14, '6': '.api.v1.PrecompiledObjectType', '10': 'type'},
+    const {'1': 'pipeline_options', '3': 5, '4': 1, '5': 9, '10': 'pipelineOptions'},
   ],
 };
 
 /// Descriptor for `PrecompiledObject`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List precompiledObjectDescriptor = $convert.base64Decode(
-    'ChFQcmVjb21waWxlZE9iamVjdBIdCgpjbG91ZF9wYXRoGAEgASgJUgljbG91ZFBhdGgSEgoEbmFtZRgCIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgDIAEoCVILZGVzY3JpcHRpb24SMQoEdHlwZRgEIAEoDjIdLmFwaS52MS5QcmVjb21waWxlZE9iamVjdFR5cGVSBHR5cGUSKQoQcGlwZWxpbmVfb3B0aW9ucxgFIAEoCVIPcGlwZWxpbmVPcHRpb25z');
+final $typed_data.Uint8List precompiledObjectDescriptor = $convert.base64Decode('ChFQcmVjb21waWxlZE9iamVjdBIdCgpjbG91ZF9wYXRoGAEgASgJUgljbG91ZFBhdGgSEgoEbmFtZRgCIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgDIAEoCVILZGVzY3JpcHRpb24SMQoEdHlwZRgEIAEoDjIdLmFwaS52MS5QcmVjb21waWxlZE9iamVjdFR5cGVSBHR5cGUSKQoQcGlwZWxpbmVfb3B0aW9ucxgFIAEoCVIPcGlwZWxpbmVPcHRpb25z');
 @$core.Deprecated('Use categoriesDescriptor instead')
 const Categories$json = const {
   '1': 'Categories',
   '2': const [
-    const {
-      '1': 'sdk',
-      '3': 1,
-      '4': 1,
-      '5': 14,
-      '6': '.api.v1.Sdk',
-      '10': 'sdk'
-    },
-    const {
-      '1': 'categories',
-      '3': 2,
-      '4': 3,
-      '5': 11,
-      '6': '.api.v1.Categories.Category',
-      '10': 'categories'
-    },
+    const {'1': 'sdk', '3': 1, '4': 1, '5': 14, '6': '.api.v1.Sdk', '10': 'sdk'},
+    const {'1': 'categories', '3': 2, '4': 3, '5': 11, '6': '.api.v1.Categories.Category', '10': 'categories'},
   ],
   '3': const [Categories_Category$json],
 };
diff --git a/playground/infrastructure/api/v1/api_pb2.py b/playground/infrastructure/api/v1/api_pb2.py
index dd5aa0f..8358ee9 100644
--- a/playground/infrastructure/api/v1/api_pb2.py
+++ b/playground/infrastructure/api/v1/api_pb2.py
@@ -22,174 +22,176 @@ from google.protobuf import descriptor as _descriptor
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
-
 # @@protoc_insertion_point(imports)
 
 _sym_db = _symbol_database.Default()
 
+
+
+
 DESCRIPTOR = _descriptor.FileDescriptor(
-    name='api.proto',
-    package='api.v1',
-    syntax='proto3',
-    serialized_options=b'Z6beam.apache.org/playground/backend/internal;playground',
-    create_key=_descriptor._internal_create_key,
-    serialized_pb=b'\n\tapi.proto\x12\x06\x61pi.v1\"8\n\x0eRunCodeRequest\x12\x0c\n\x04\x63ode\x18\x01 \x01(\t\x12\x18\n\x03sdk\x18\x02 \x01(\x0e\x32\x0b.api.v1.Sdk\"(\n\x0fRunCodeResponse\x12\x15\n\rpipeline_uuid\x18\x01 \x01(\t\"+\n\x12\x43heckStatusRequest\x12\x15\n\rpipeline_uuid\x18\x01 \x01(\t\"5\n\x13\x43heckStatusResponse\x12\x1e\n\x06status\x18\x01 \x01(\x0e\x32\x0e.api.v1.Status\"0\n\x17GetCompileOutputRequest\x12\x15\n\rpipeline_uuid\x18\x01 \x01(\t\"V\n\x18GetCompileOutputRes [...]
+  name='api.proto',
+  package='api.v1',
+  syntax='proto3',
+  serialized_options=b'Z6beam.apache.org/playground/backend/internal;playground',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\tapi.proto\x12\x06\x61pi.v1\"R\n\x0eRunCodeRequest\x12\x0c\n\x04\x63ode\x18\x01 \x01(\t\x12\x18\n\x03sdk\x18\x02 \x01(\x0e\x32\x0b.api.v1.Sdk\x12\x18\n\x10pipeline_options\x18\x03 \x01(\t\"(\n\x0fRunCodeResponse\x12\x15\n\rpipeline_uuid\x18\x01 \x01(\t\"+\n\x12\x43heckStatusRequest\x12\x15\n\rpipeline_uuid\x18\x01 \x01(\t\"5\n\x13\x43heckStatusResponse\x12\x1e\n\x06status\x18\x01 \x01(\x0e\x32\x0e.api.v1.Status\"0\n\x17GetCompileOutputRequest\x12\x15\n\rpipeline_uuid [...]
 )
 
 _SDK = _descriptor.EnumDescriptor(
-    name='Sdk',
-    full_name='api.v1.Sdk',
-    filename=None,
-    file=DESCRIPTOR,
-    create_key=_descriptor._internal_create_key,
-    values=[
-        _descriptor.EnumValueDescriptor(
-            name='SDK_UNSPECIFIED', index=0, number=0,
-            serialized_options=None,
-            type=None,
-            create_key=_descriptor._internal_create_key),
-        _descriptor.EnumValueDescriptor(
-            name='SDK_JAVA', index=1, number=1,
-            serialized_options=None,
-            type=None,
-            create_key=_descriptor._internal_create_key),
-        _descriptor.EnumValueDescriptor(
-            name='SDK_GO', index=2, number=2,
-            serialized_options=None,
-            type=None,
-            create_key=_descriptor._internal_create_key),
-        _descriptor.EnumValueDescriptor(
-            name='SDK_PYTHON', index=3, number=3,
-            serialized_options=None,
-            type=None,
-            create_key=_descriptor._internal_create_key),
-        _descriptor.EnumValueDescriptor(
-            name='SDK_SCIO', index=4, number=4,
-            serialized_options=None,
-            type=None,
-            create_key=_descriptor._internal_create_key),
-    ],
-    containing_type=None,
-    serialized_options=None,
-    serialized_start=1143,
-    serialized_end=1225,
+  name='Sdk',
+  full_name='api.v1.Sdk',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='SDK_UNSPECIFIED', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='SDK_JAVA', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='SDK_GO', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='SDK_PYTHON', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='SDK_SCIO', index=4, number=4,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=1272,
+  serialized_end=1354,
 )
 _sym_db.RegisterEnumDescriptor(_SDK)
 
 Sdk = enum_type_wrapper.EnumTypeWrapper(_SDK)
 _STATUS = _descriptor.EnumDescriptor(
-    name='Status',
-    full_name='api.v1.Status',
-    filename=None,
-    file=DESCRIPTOR,
-    create_key=_descriptor._internal_create_key,
-    values=[
-        _descriptor.EnumValueDescriptor(
-            name='STATUS_UNSPECIFIED', index=0, number=0,
-            serialized_options=None,
-            type=None,
-            create_key=_descriptor._internal_create_key),
-        _descriptor.EnumValueDescriptor(
-            name='STATUS_VALIDATING', index=1, number=1,
-            serialized_options=None,
-            type=None,
-            create_key=_descriptor._internal_create_key),
-        _descriptor.EnumValueDescriptor(
-            name='STATUS_VALIDATION_ERROR', index=2, number=2,
-            serialized_options=None,
-            type=None,
-            create_key=_descriptor._internal_create_key),
-        _descriptor.EnumValueDescriptor(
-            name='STATUS_PREPARING', index=3, number=3,
-            serialized_options=None,
-            type=None,
-            create_key=_descriptor._internal_create_key),
-        _descriptor.EnumValueDescriptor(
-            name='STATUS_PREPARATION_ERROR', index=4, number=4,
-            serialized_options=None,
-            type=None,
-            create_key=_descriptor._internal_create_key),
-        _descriptor.EnumValueDescriptor(
-            name='STATUS_COMPILING', index=5, number=5,
-            serialized_options=None,
-            type=None,
-            create_key=_descriptor._internal_create_key),
-        _descriptor.EnumValueDescriptor(
-            name='STATUS_COMPILE_ERROR', index=6, number=6,
-            serialized_options=None,
-            type=None,
-            create_key=_descriptor._internal_create_key),
-        _descriptor.EnumValueDescriptor(
-            name='STATUS_EXECUTING', index=7, number=7,
-            serialized_options=None,
-            type=None,
-            create_key=_descriptor._internal_create_key),
-        _descriptor.EnumValueDescriptor(
-            name='STATUS_FINISHED', index=8, number=8,
-            serialized_options=None,
-            type=None,
-            create_key=_descriptor._internal_create_key),
-        _descriptor.EnumValueDescriptor(
-            name='STATUS_RUN_ERROR', index=9, number=9,
-            serialized_options=None,
-            type=None,
-            create_key=_descriptor._internal_create_key),
-        _descriptor.EnumValueDescriptor(
-            name='STATUS_ERROR', index=10, number=10,
-            serialized_options=None,
-            type=None,
-            create_key=_descriptor._internal_create_key),
-        _descriptor.EnumValueDescriptor(
-            name='STATUS_RUN_TIMEOUT', index=11, number=11,
-            serialized_options=None,
-            type=None,
-            create_key=_descriptor._internal_create_key),
-        _descriptor.EnumValueDescriptor(
-            name='STATUS_CANCELED', index=12, number=12,
-            serialized_options=None,
-            type=None,
-            create_key=_descriptor._internal_create_key),
-    ],
-    containing_type=None,
-    serialized_options=None,
-    serialized_start=1228,
-    serialized_end=1540,
+  name='Status',
+  full_name='api.v1.Status',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='STATUS_UNSPECIFIED', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='STATUS_VALIDATING', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='STATUS_VALIDATION_ERROR', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='STATUS_PREPARING', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='STATUS_PREPARATION_ERROR', index=4, number=4,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='STATUS_COMPILING', index=5, number=5,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='STATUS_COMPILE_ERROR', index=6, number=6,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='STATUS_EXECUTING', index=7, number=7,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='STATUS_FINISHED', index=8, number=8,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='STATUS_RUN_ERROR', index=9, number=9,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='STATUS_ERROR', index=10, number=10,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='STATUS_RUN_TIMEOUT', index=11, number=11,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='STATUS_CANCELED', index=12, number=12,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=1357,
+  serialized_end=1669,
 )
 _sym_db.RegisterEnumDescriptor(_STATUS)
 
 Status = enum_type_wrapper.EnumTypeWrapper(_STATUS)
 _PRECOMPILEDOBJECTTYPE = _descriptor.EnumDescriptor(
-    name='PrecompiledObjectType',
-    full_name='api.v1.PrecompiledObjectType',
-    filename=None,
-    file=DESCRIPTOR,
-    create_key=_descriptor._internal_create_key,
-    values=[
-        _descriptor.EnumValueDescriptor(
-            name='PRECOMPILED_OBJECT_TYPE_UNSPECIFIED', index=0, number=0,
-            serialized_options=None,
-            type=None,
-            create_key=_descriptor._internal_create_key),
-        _descriptor.EnumValueDescriptor(
-            name='PRECOMPILED_OBJECT_TYPE_EXAMPLE', index=1, number=1,
-            serialized_options=None,
-            type=None,
-            create_key=_descriptor._internal_create_key),
-        _descriptor.EnumValueDescriptor(
-            name='PRECOMPILED_OBJECT_TYPE_KATA', index=2, number=2,
-            serialized_options=None,
-            type=None,
-            create_key=_descriptor._internal_create_key),
-        _descriptor.EnumValueDescriptor(
-            name='PRECOMPILED_OBJECT_TYPE_UNIT_TEST', index=3, number=3,
-            serialized_options=None,
-            type=None,
-            create_key=_descriptor._internal_create_key),
-    ],
-    containing_type=None,
-    serialized_options=None,
-    serialized_start=1543,
-    serialized_end=1717,
+  name='PrecompiledObjectType',
+  full_name='api.v1.PrecompiledObjectType',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='PRECOMPILED_OBJECT_TYPE_UNSPECIFIED', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='PRECOMPILED_OBJECT_TYPE_EXAMPLE', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='PRECOMPILED_OBJECT_TYPE_KATA', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='PRECOMPILED_OBJECT_TYPE_UNIT_TEST', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=1672,
+  serialized_end=1846,
 )
 _sym_db.RegisterEnumDescriptor(_PRECOMPILEDOBJECTTYPE)
 
@@ -217,642 +219,739 @@ PRECOMPILED_OBJECT_TYPE_EXAMPLE = 1
 PRECOMPILED_OBJECT_TYPE_KATA = 2
 PRECOMPILED_OBJECT_TYPE_UNIT_TEST = 3
 
+
+
 _RUNCODEREQUEST = _descriptor.Descriptor(
-    name='RunCodeRequest',
-    full_name='api.v1.RunCodeRequest',
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name='code', full_name='api.v1.RunCodeRequest.code', index=0,
-            number=1, type=9, cpp_type=9, label=1,
-            has_default_value=False, default_value=b"".decode('utf-8'),
-            message_type=None, enum_type=None, containing_type=None,
-            is_extension=False, extension_scope=None,
-            serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
-        _descriptor.FieldDescriptor(
-            name='sdk', full_name='api.v1.RunCodeRequest.sdk', index=1,
-            number=2, type=14, cpp_type=8, label=1,
-            has_default_value=False, default_value=0,
-            message_type=None, enum_type=None, containing_type=None,
-            is_extension=False, extension_scope=None,
-            serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
-    ],
-    extensions=[
-    ],
-    nested_types=[],
-    enum_types=[
-    ],
-    serialized_options=None,
-    is_extendable=False,
-    syntax='proto3',
-    extension_ranges=[],
-    oneofs=[
-    ],
-    serialized_start=21,
-    serialized_end=77,
+  name='RunCodeRequest',
+  full_name='api.v1.RunCodeRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='code', full_name='api.v1.RunCodeRequest.code', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='sdk', full_name='api.v1.RunCodeRequest.sdk', index=1,
+      number=2, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='pipeline_options', full_name='api.v1.RunCodeRequest.pipeline_options', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=21,
+  serialized_end=103,
 )
 
+
 _RUNCODERESPONSE = _descriptor.Descriptor(
-    name='RunCodeResponse',
-    full_name='api.v1.RunCodeResponse',
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name='pipeline_uuid', full_name='api.v1.RunCodeResponse.pipeline_uuid', index=0,
-            number=1, type=9, cpp_type=9, label=1,
-            has_default_value=False, default_value=b"".decode('utf-8'),
-            message_type=None, enum_type=None, containing_type=None,
-            is_extension=False, extension_scope=None,
-            serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
-    ],
-    extensions=[
-    ],
-    nested_types=[],
-    enum_types=[
-    ],
-    serialized_options=None,
-    is_extendable=False,
-    syntax='proto3',
-    extension_ranges=[],
-    oneofs=[
-    ],
-    serialized_start=79,
-    serialized_end=119,
+  name='RunCodeResponse',
+  full_name='api.v1.RunCodeResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='pipeline_uuid', full_name='api.v1.RunCodeResponse.pipeline_uuid', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=105,
+  serialized_end=145,
 )
 
+
 _CHECKSTATUSREQUEST = _descriptor.Descriptor(
-    name='CheckStatusRequest',
-    full_name='api.v1.CheckStatusRequest',
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name='pipeline_uuid', full_name='api.v1.CheckStatusRequest.pipeline_uuid', index=0,
-            number=1, type=9, cpp_type=9, label=1,
-            has_default_value=False, default_value=b"".decode('utf-8'),
-            message_type=None, enum_type=None, containing_type=None,
-            is_extension=False, extension_scope=None,
-            serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
-    ],
-    extensions=[
-    ],
-    nested_types=[],
-    enum_types=[
-    ],
-    serialized_options=None,
-    is_extendable=False,
-    syntax='proto3',
-    extension_ranges=[],
-    oneofs=[
-    ],
-    serialized_start=121,
-    serialized_end=164,
+  name='CheckStatusRequest',
+  full_name='api.v1.CheckStatusRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='pipeline_uuid', full_name='api.v1.CheckStatusRequest.pipeline_uuid', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=147,
+  serialized_end=190,
 )
 
+
 _CHECKSTATUSRESPONSE = _descriptor.Descriptor(
-    name='CheckStatusResponse',
-    full_name='api.v1.CheckStatusResponse',
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name='status', full_name='api.v1.CheckStatusResponse.status', index=0,
-            number=1, type=14, cpp_type=8, label=1,
-            has_default_value=False, default_value=0,
-            message_type=None, enum_type=None, containing_type=None,
-            is_extension=False, extension_scope=None,
-            serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
-    ],
-    extensions=[
-    ],
-    nested_types=[],
-    enum_types=[
-    ],
-    serialized_options=None,
-    is_extendable=False,
-    syntax='proto3',
-    extension_ranges=[],
-    oneofs=[
-    ],
-    serialized_start=166,
-    serialized_end=219,
+  name='CheckStatusResponse',
+  full_name='api.v1.CheckStatusResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='status', full_name='api.v1.CheckStatusResponse.status', index=0,
+      number=1, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=192,
+  serialized_end=245,
 )
 
+
 _GETCOMPILEOUTPUTREQUEST = _descriptor.Descriptor(
-    name='GetCompileOutputRequest',
-    full_name='api.v1.GetCompileOutputRequest',
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name='pipeline_uuid', full_name='api.v1.GetCompileOutputRequest.pipeline_uuid', index=0,
-            number=1, type=9, cpp_type=9, label=1,
-            has_default_value=False, default_value=b"".decode('utf-8'),
-            message_type=None, enum_type=None, containing_type=None,
-            is_extension=False, extension_scope=None,
-            serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
-    ],
-    extensions=[
-    ],
-    nested_types=[],
-    enum_types=[
-    ],
-    serialized_options=None,
-    is_extendable=False,
-    syntax='proto3',
-    extension_ranges=[],
-    oneofs=[
-    ],
-    serialized_start=221,
-    serialized_end=269,
+  name='GetCompileOutputRequest',
+  full_name='api.v1.GetCompileOutputRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='pipeline_uuid', full_name='api.v1.GetCompileOutputRequest.pipeline_uuid', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=247,
+  serialized_end=295,
 )
 
+
 _GETCOMPILEOUTPUTRESPONSE = _descriptor.Descriptor(
-    name='GetCompileOutputResponse',
-    full_name='api.v1.GetCompileOutputResponse',
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name='output', full_name='api.v1.GetCompileOutputResponse.output', index=0,
-            number=1, type=9, cpp_type=9, label=1,
-            has_default_value=False, default_value=b"".decode('utf-8'),
-            message_type=None, enum_type=None, containing_type=None,
-            is_extension=False, extension_scope=None,
-            serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
-        _descriptor.FieldDescriptor(
-            name='compilation_status', full_name='api.v1.GetCompileOutputResponse.compilation_status', index=1,
-            number=2, type=14, cpp_type=8, label=1,
-            has_default_value=False, default_value=0,
-            message_type=None, enum_type=None, containing_type=None,
-            is_extension=False, extension_scope=None,
-            serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
-    ],
-    extensions=[
-    ],
-    nested_types=[],
-    enum_types=[
-    ],
-    serialized_options=None,
-    is_extendable=False,
-    syntax='proto3',
-    extension_ranges=[],
-    oneofs=[
-    ],
-    serialized_start=271,
-    serialized_end=357,
+  name='GetCompileOutputResponse',
+  full_name='api.v1.GetCompileOutputResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='output', full_name='api.v1.GetCompileOutputResponse.output', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='compilation_status', full_name='api.v1.GetCompileOutputResponse.compilation_status', index=1,
+      number=2, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=297,
+  serialized_end=383,
 )
 
+
 _GETRUNOUTPUTREQUEST = _descriptor.Descriptor(
-    name='GetRunOutputRequest',
-    full_name='api.v1.GetRunOutputRequest',
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name='pipeline_uuid', full_name='api.v1.GetRunOutputRequest.pipeline_uuid', index=0,
-            number=1, type=9, cpp_type=9, label=1,
-            has_default_value=False, default_value=b"".decode('utf-8'),
-            message_type=None, enum_type=None, containing_type=None,
-            is_extension=False, extension_scope=None,
-            serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
-    ],
-    extensions=[
-    ],
-    nested_types=[],
-    enum_types=[
-    ],
-    serialized_options=None,
-    is_extendable=False,
-    syntax='proto3',
-    extension_ranges=[],
-    oneofs=[
-    ],
-    serialized_start=359,
-    serialized_end=403,
+  name='GetRunOutputRequest',
+  full_name='api.v1.GetRunOutputRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='pipeline_uuid', full_name='api.v1.GetRunOutputRequest.pipeline_uuid', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=385,
+  serialized_end=429,
 )
 
+
 _GETRUNOUTPUTRESPONSE = _descriptor.Descriptor(
-    name='GetRunOutputResponse',
-    full_name='api.v1.GetRunOutputResponse',
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name='output', full_name='api.v1.GetRunOutputResponse.output', index=0,
-            number=1, type=9, cpp_type=9, label=1,
-            has_default_value=False, default_value=b"".decode('utf-8'),
-            message_type=None, enum_type=None, containing_type=None,
-            is_extension=False, extension_scope=None,
-            serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
-    ],
-    extensions=[
-    ],
-    nested_types=[],
-    enum_types=[
-    ],
-    serialized_options=None,
-    is_extendable=False,
-    syntax='proto3',
-    extension_ranges=[],
-    oneofs=[
-    ],
-    serialized_start=405,
-    serialized_end=443,
+  name='GetRunOutputResponse',
+  full_name='api.v1.GetRunOutputResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='output', full_name='api.v1.GetRunOutputResponse.output', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=431,
+  serialized_end=469,
 )
 
+
 _GETRUNERRORREQUEST = _descriptor.Descriptor(
-    name='GetRunErrorRequest',
-    full_name='api.v1.GetRunErrorRequest',
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name='pipeline_uuid', full_name='api.v1.GetRunErrorRequest.pipeline_uuid', index=0,
-            number=1, type=9, cpp_type=9, label=1,
-            has_default_value=False, default_value=b"".decode('utf-8'),
-            message_type=None, enum_type=None, containing_type=None,
-            is_extension=False, extension_scope=None,
-            serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
-    ],
-    extensions=[
-    ],
-    nested_types=[],
-    enum_types=[
-    ],
-    serialized_options=None,
-    is_extendable=False,
-    syntax='proto3',
-    extension_ranges=[],
-    oneofs=[
-    ],
-    serialized_start=445,
-    serialized_end=488,
+  name='GetRunErrorRequest',
+  full_name='api.v1.GetRunErrorRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='pipeline_uuid', full_name='api.v1.GetRunErrorRequest.pipeline_uuid', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=471,
+  serialized_end=514,
 )
 
+
 _GETRUNERRORRESPONSE = _descriptor.Descriptor(
-    name='GetRunErrorResponse',
-    full_name='api.v1.GetRunErrorResponse',
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name='output', full_name='api.v1.GetRunErrorResponse.output', index=0,
-            number=1, type=9, cpp_type=9, label=1,
-            has_default_value=False, default_value=b"".decode('utf-8'),
-            message_type=None, enum_type=None, containing_type=None,
-            is_extension=False, extension_scope=None,
-            serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
-    ],
-    extensions=[
-    ],
-    nested_types=[],
-    enum_types=[
-    ],
-    serialized_options=None,
-    is_extendable=False,
-    syntax='proto3',
-    extension_ranges=[],
-    oneofs=[
-    ],
-    serialized_start=490,
-    serialized_end=527,
+  name='GetRunErrorResponse',
+  full_name='api.v1.GetRunErrorResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='output', full_name='api.v1.GetRunErrorResponse.output', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=516,
+  serialized_end=553,
+)
+
+
+_GETLOGSREQUEST = _descriptor.Descriptor(
+  name='GetLogsRequest',
+  full_name='api.v1.GetLogsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='pipeline_uuid', full_name='api.v1.GetLogsRequest.pipeline_uuid', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=555,
+  serialized_end=594,
+)
+
+
+_GETLOGSRESPONSE = _descriptor.Descriptor(
+  name='GetLogsResponse',
+  full_name='api.v1.GetLogsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='output', full_name='api.v1.GetLogsResponse.output', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=596,
+  serialized_end=629,
 )
 
+
 _CANCELREQUEST = _descriptor.Descriptor(
-    name='CancelRequest',
-    full_name='api.v1.CancelRequest',
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name='pipeline_uuid', full_name='api.v1.CancelRequest.pipeline_uuid', index=0,
-            number=1, type=9, cpp_type=9, label=1,
-            has_default_value=False, default_value=b"".decode('utf-8'),
-            message_type=None, enum_type=None, containing_type=None,
-            is_extension=False, extension_scope=None,
-            serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
-    ],
-    extensions=[
-    ],
-    nested_types=[],
-    enum_types=[
-    ],
-    serialized_options=None,
-    is_extendable=False,
-    syntax='proto3',
-    extension_ranges=[],
-    oneofs=[
-    ],
-    serialized_start=529,
-    serialized_end=567,
+  name='CancelRequest',
+  full_name='api.v1.CancelRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='pipeline_uuid', full_name='api.v1.CancelRequest.pipeline_uuid', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=631,
+  serialized_end=669,
 )
 
+
 _CANCELRESPONSE = _descriptor.Descriptor(
-    name='CancelResponse',
-    full_name='api.v1.CancelResponse',
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-    ],
-    extensions=[
-    ],
-    nested_types=[],
-    enum_types=[
-    ],
-    serialized_options=None,
-    is_extendable=False,
-    syntax='proto3',
-    extension_ranges=[],
-    oneofs=[
-    ],
-    serialized_start=569,
-    serialized_end=585,
+  name='CancelResponse',
+  full_name='api.v1.CancelResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=671,
+  serialized_end=687,
 )
 
+
 _GETPRECOMPILEDOBJECTSREQUEST = _descriptor.Descriptor(
-    name='GetPrecompiledObjectsRequest',
-    full_name='api.v1.GetPrecompiledObjectsRequest',
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name='sdk', full_name='api.v1.GetPrecompiledObjectsRequest.sdk', index=0,
-            number=1, type=14, cpp_type=8, label=1,
-            has_default_value=False, default_value=0,
-            message_type=None, enum_type=None, containing_type=None,
-            is_extension=False, extension_scope=None,
-            serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
-        _descriptor.FieldDescriptor(
-            name='category', full_name='api.v1.GetPrecompiledObjectsRequest.category', index=1,
-            number=2, type=9, cpp_type=9, label=1,
-            has_default_value=False, default_value=b"".decode('utf-8'),
-            message_type=None, enum_type=None, containing_type=None,
-            is_extension=False, extension_scope=None,
-            serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
-    ],
-    extensions=[
-    ],
-    nested_types=[],
-    enum_types=[
-    ],
-    serialized_options=None,
-    is_extendable=False,
-    syntax='proto3',
-    extension_ranges=[],
-    oneofs=[
-    ],
-    serialized_start=587,
-    serialized_end=661,
+  name='GetPrecompiledObjectsRequest',
+  full_name='api.v1.GetPrecompiledObjectsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='sdk', full_name='api.v1.GetPrecompiledObjectsRequest.sdk', index=0,
+      number=1, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='category', full_name='api.v1.GetPrecompiledObjectsRequest.category', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=689,
+  serialized_end=763,
 )
 
+
 _PRECOMPILEDOBJECT = _descriptor.Descriptor(
-    name='PrecompiledObject',
-    full_name='api.v1.PrecompiledObject',
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name='cloud_path', full_name='api.v1.PrecompiledObject.cloud_path', index=0,
-            number=1, type=9, cpp_type=9, label=1,
-            has_default_value=False, default_value=b"".decode('utf-8'),
-            message_type=None, enum_type=None, containing_type=None,
-            is_extension=False, extension_scope=None,
-            serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
-        _descriptor.FieldDescriptor(
-            name='name', full_name='api.v1.PrecompiledObject.name', index=1,
-            number=2, type=9, cpp_type=9, label=1,
-            has_default_value=False, default_value=b"".decode('utf-8'),
-            message_type=None, enum_type=None, containing_type=None,
-            is_extension=False, extension_scope=None,
-            serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
-        _descriptor.FieldDescriptor(
-            name='description', full_name='api.v1.PrecompiledObject.description', index=2,
-            number=3, type=9, cpp_type=9, label=1,
-            has_default_value=False, default_value=b"".decode('utf-8'),
-            message_type=None, enum_type=None, containing_type=None,
-            is_extension=False, extension_scope=None,
-            serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
-        _descriptor.FieldDescriptor(
-            name='type', full_name='api.v1.PrecompiledObject.type', index=3,
-            number=4, type=14, cpp_type=8, label=1,
-            has_default_value=False, default_value=0,
-            message_type=None, enum_type=None, containing_type=None,
-            is_extension=False, extension_scope=None,
-            serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
-    ],
-    extensions=[
-    ],
-    nested_types=[],
-    enum_types=[
-    ],
-    serialized_options=None,
-    is_extendable=False,
-    syntax='proto3',
-    extension_ranges=[],
-    oneofs=[
-    ],
-    serialized_start=663,
-    serialized_end=782,
+  name='PrecompiledObject',
+  full_name='api.v1.PrecompiledObject',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='cloud_path', full_name='api.v1.PrecompiledObject.cloud_path', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='api.v1.PrecompiledObject.name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='api.v1.PrecompiledObject.description', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='type', full_name='api.v1.PrecompiledObject.type', index=3,
+      number=4, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='pipeline_options', full_name='api.v1.PrecompiledObject.pipeline_options', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=766,
+  serialized_end=911,
 )
 
+
 _CATEGORIES_CATEGORY = _descriptor.Descriptor(
-    name='Category',
-    full_name='api.v1.Categories.Category',
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name='category_name', full_name='api.v1.Categories.Category.category_name', index=0,
-            number=1, type=9, cpp_type=9, label=1,
-            has_default_value=False, default_value=b"".decode('utf-8'),
-            message_type=None, enum_type=None, containing_type=None,
-            is_extension=False, extension_scope=None,
-            serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
-        _descriptor.FieldDescriptor(
-            name='precompiled_objects', full_name='api.v1.Categories.Category.precompiled_objects', index=1,
-            number=2, type=11, cpp_type=10, label=3,
-            has_default_value=False, default_value=[],
-            message_type=None, enum_type=None, containing_type=None,
-            is_extension=False, extension_scope=None,
-            serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
-    ],
-    extensions=[
-    ],
-    nested_types=[],
-    enum_types=[
-    ],
-    serialized_options=None,
-    is_extendable=False,
-    syntax='proto3',
-    extension_ranges=[],
-    oneofs=[
-    ],
-    serialized_start=874,
-    serialized_end=963,
+  name='Category',
+  full_name='api.v1.Categories.Category',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='category_name', full_name='api.v1.Categories.Category.category_name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='precompiled_objects', full_name='api.v1.Categories.Category.precompiled_objects', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1003,
+  serialized_end=1092,
 )
 
 _CATEGORIES = _descriptor.Descriptor(
-    name='Categories',
-    full_name='api.v1.Categories',
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name='sdk', full_name='api.v1.Categories.sdk', index=0,
-            number=1, type=14, cpp_type=8, label=1,
-            has_default_value=False, default_value=0,
-            message_type=None, enum_type=None, containing_type=None,
-            is_extension=False, extension_scope=None,
-            serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
-        _descriptor.FieldDescriptor(
-            name='categories', full_name='api.v1.Categories.categories', index=1,
-            number=2, type=11, cpp_type=10, label=3,
-            has_default_value=False, default_value=[],
-            message_type=None, enum_type=None, containing_type=None,
-            is_extension=False, extension_scope=None,
-            serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
-    ],
-    extensions=[
-    ],
-    nested_types=[_CATEGORIES_CATEGORY, ],
-    enum_types=[
-    ],
-    serialized_options=None,
-    is_extendable=False,
-    syntax='proto3',
-    extension_ranges=[],
-    oneofs=[
-    ],
-    serialized_start=785,
-    serialized_end=963,
+  name='Categories',
+  full_name='api.v1.Categories',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='sdk', full_name='api.v1.Categories.sdk', index=0,
+      number=1, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='categories', full_name='api.v1.Categories.categories', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[_CATEGORIES_CATEGORY, ],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=914,
+  serialized_end=1092,
 )
 
+
 _GETPRECOMPILEDOBJECTSRESPONSE = _descriptor.Descriptor(
-    name='GetPrecompiledObjectsResponse',
-    full_name='api.v1.GetPrecompiledObjectsResponse',
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name='sdk_categories', full_name='api.v1.GetPrecompiledObjectsResponse.sdk_categories', index=0,
-            number=1, type=11, cpp_type=10, label=3,
-            has_default_value=False, default_value=[],
-            message_type=None, enum_type=None, containing_type=None,
-            is_extension=False, extension_scope=None,
-            serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
-    ],
-    extensions=[
-    ],
-    nested_types=[],
-    enum_types=[
-    ],
-    serialized_options=None,
-    is_extendable=False,
-    syntax='proto3',
-    extension_ranges=[],
-    oneofs=[
-    ],
-    serialized_start=965,
-    serialized_end=1040,
+  name='GetPrecompiledObjectsResponse',
+  full_name='api.v1.GetPrecompiledObjectsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='sdk_categories', full_name='api.v1.GetPrecompiledObjectsResponse.sdk_categories', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1094,
+  serialized_end=1169,
 )
 
+
 _GETPRECOMPILEDOBJECTREQUEST = _descriptor.Descriptor(
-    name='GetPrecompiledObjectRequest',
-    full_name='api.v1.GetPrecompiledObjectRequest',
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name='cloud_path', full_name='api.v1.GetPrecompiledObjectRequest.cloud_path', index=0,
-            number=1, type=9, cpp_type=9, label=1,
-            has_default_value=False, default_value=b"".decode('utf-8'),
-            message_type=None, enum_type=None, containing_type=None,
-            is_extension=False, extension_scope=None,
-            serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
-    ],
-    extensions=[
-    ],
-    nested_types=[],
-    enum_types=[
-    ],
-    serialized_options=None,
-    is_extendable=False,
-    syntax='proto3',
-    extension_ranges=[],
-    oneofs=[
-    ],
-    serialized_start=1042,
-    serialized_end=1091,
+  name='GetPrecompiledObjectRequest',
+  full_name='api.v1.GetPrecompiledObjectRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='cloud_path', full_name='api.v1.GetPrecompiledObjectRequest.cloud_path', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1171,
+  serialized_end=1220,
 )
 
+
 _GETPRECOMPILEDOBJECTCODERESPONSE = _descriptor.Descriptor(
-    name='GetPrecompiledObjectCodeResponse',
-    full_name='api.v1.GetPrecompiledObjectCodeResponse',
-    filename=None,
-    file=DESCRIPTOR,
-    containing_type=None,
-    create_key=_descriptor._internal_create_key,
-    fields=[
-        _descriptor.FieldDescriptor(
-            name='code', full_name='api.v1.GetPrecompiledObjectCodeResponse.code', index=0,
-            number=1, type=9, cpp_type=9, label=1,
-            has_default_value=False, default_value=b"".decode('utf-8'),
-            message_type=None, enum_type=None, containing_type=None,
-            is_extension=False, extension_scope=None,
-            serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key),
-    ],
-    extensions=[
-    ],
-    nested_types=[],
-    enum_types=[
-    ],
-    serialized_options=None,
-    is_extendable=False,
-    syntax='proto3',
-    extension_ranges=[],
-    oneofs=[
-    ],
-    serialized_start=1093,
-    serialized_end=1141,
+  name='GetPrecompiledObjectCodeResponse',
+  full_name='api.v1.GetPrecompiledObjectCodeResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='code', full_name='api.v1.GetPrecompiledObjectCodeResponse.code', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1222,
+  serialized_end=1270,
 )
 
 _RUNCODEREQUEST.fields_by_name['sdk'].enum_type = _SDK
@@ -875,6 +974,8 @@ DESCRIPTOR.message_types_by_name['GetRunOutputRequest'] = _GETRUNOUTPUTREQUEST
 DESCRIPTOR.message_types_by_name['GetRunOutputResponse'] = _GETRUNOUTPUTRESPONSE
 DESCRIPTOR.message_types_by_name['GetRunErrorRequest'] = _GETRUNERRORREQUEST
 DESCRIPTOR.message_types_by_name['GetRunErrorResponse'] = _GETRUNERRORRESPONSE
+DESCRIPTOR.message_types_by_name['GetLogsRequest'] = _GETLOGSREQUEST
+DESCRIPTOR.message_types_by_name['GetLogsResponse'] = _GETLOGSRESPONSE
 DESCRIPTOR.message_types_by_name['CancelRequest'] = _CANCELREQUEST
 DESCRIPTOR.message_types_by_name['CancelResponse'] = _CANCELRESPONSE
 DESCRIPTOR.message_types_by_name['GetPrecompiledObjectsRequest'] = _GETPRECOMPILEDOBJECTSREQUEST
@@ -889,246 +990,267 @@ DESCRIPTOR.enum_types_by_name['PrecompiledObjectType'] = _PRECOMPILEDOBJECTTYPE
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
 RunCodeRequest = _reflection.GeneratedProtocolMessageType('RunCodeRequest', (_message.Message,), {
-    'DESCRIPTOR': _RUNCODEREQUEST,
-    '__module__': 'api_pb2'
-    # @@protoc_insertion_point(class_scope:api.v1.RunCodeRequest)
-})
+  'DESCRIPTOR' : _RUNCODEREQUEST,
+  '__module__' : 'api_pb2'
+  # @@protoc_insertion_point(class_scope:api.v1.RunCodeRequest)
+  })
 _sym_db.RegisterMessage(RunCodeRequest)
 
 RunCodeResponse = _reflection.GeneratedProtocolMessageType('RunCodeResponse', (_message.Message,), {
-    'DESCRIPTOR': _RUNCODERESPONSE,
-    '__module__': 'api_pb2'
-    # @@protoc_insertion_point(class_scope:api.v1.RunCodeResponse)
-})
+  'DESCRIPTOR' : _RUNCODERESPONSE,
+  '__module__' : 'api_pb2'
+  # @@protoc_insertion_point(class_scope:api.v1.RunCodeResponse)
+  })
 _sym_db.RegisterMessage(RunCodeResponse)
 
 CheckStatusRequest = _reflection.GeneratedProtocolMessageType('CheckStatusRequest', (_message.Message,), {
-    'DESCRIPTOR': _CHECKSTATUSREQUEST,
-    '__module__': 'api_pb2'
-    # @@protoc_insertion_point(class_scope:api.v1.CheckStatusRequest)
-})
+  'DESCRIPTOR' : _CHECKSTATUSREQUEST,
+  '__module__' : 'api_pb2'
+  # @@protoc_insertion_point(class_scope:api.v1.CheckStatusRequest)
+  })
 _sym_db.RegisterMessage(CheckStatusRequest)
 
 CheckStatusResponse = _reflection.GeneratedProtocolMessageType('CheckStatusResponse', (_message.Message,), {
-    'DESCRIPTOR': _CHECKSTATUSRESPONSE,
-    '__module__': 'api_pb2'
-    # @@protoc_insertion_point(class_scope:api.v1.CheckStatusResponse)
-})
+  'DESCRIPTOR' : _CHECKSTATUSRESPONSE,
+  '__module__' : 'api_pb2'
+  # @@protoc_insertion_point(class_scope:api.v1.CheckStatusResponse)
+  })
 _sym_db.RegisterMessage(CheckStatusResponse)
 
 GetCompileOutputRequest = _reflection.GeneratedProtocolMessageType('GetCompileOutputRequest', (_message.Message,), {
-    'DESCRIPTOR': _GETCOMPILEOUTPUTREQUEST,
-    '__module__': 'api_pb2'
-    # @@protoc_insertion_point(class_scope:api.v1.GetCompileOutputRequest)
-})
+  'DESCRIPTOR' : _GETCOMPILEOUTPUTREQUEST,
+  '__module__' : 'api_pb2'
+  # @@protoc_insertion_point(class_scope:api.v1.GetCompileOutputRequest)
+  })
 _sym_db.RegisterMessage(GetCompileOutputRequest)
 
 GetCompileOutputResponse = _reflection.GeneratedProtocolMessageType('GetCompileOutputResponse', (_message.Message,), {
-    'DESCRIPTOR': _GETCOMPILEOUTPUTRESPONSE,
-    '__module__': 'api_pb2'
-    # @@protoc_insertion_point(class_scope:api.v1.GetCompileOutputResponse)
-})
+  'DESCRIPTOR' : _GETCOMPILEOUTPUTRESPONSE,
+  '__module__' : 'api_pb2'
+  # @@protoc_insertion_point(class_scope:api.v1.GetCompileOutputResponse)
+  })
 _sym_db.RegisterMessage(GetCompileOutputResponse)
 
 GetRunOutputRequest = _reflection.GeneratedProtocolMessageType('GetRunOutputRequest', (_message.Message,), {
-    'DESCRIPTOR': _GETRUNOUTPUTREQUEST,
-    '__module__': 'api_pb2'
-    # @@protoc_insertion_point(class_scope:api.v1.GetRunOutputRequest)
-})
+  'DESCRIPTOR' : _GETRUNOUTPUTREQUEST,
+  '__module__' : 'api_pb2'
+  # @@protoc_insertion_point(class_scope:api.v1.GetRunOutputRequest)
+  })
 _sym_db.RegisterMessage(GetRunOutputRequest)
 
 GetRunOutputResponse = _reflection.GeneratedProtocolMessageType('GetRunOutputResponse', (_message.Message,), {
-    'DESCRIPTOR': _GETRUNOUTPUTRESPONSE,
-    '__module__': 'api_pb2'
-    # @@protoc_insertion_point(class_scope:api.v1.GetRunOutputResponse)
-})
+  'DESCRIPTOR' : _GETRUNOUTPUTRESPONSE,
+  '__module__' : 'api_pb2'
+  # @@protoc_insertion_point(class_scope:api.v1.GetRunOutputResponse)
+  })
 _sym_db.RegisterMessage(GetRunOutputResponse)
 
 GetRunErrorRequest = _reflection.GeneratedProtocolMessageType('GetRunErrorRequest', (_message.Message,), {
-    'DESCRIPTOR': _GETRUNERRORREQUEST,
-    '__module__': 'api_pb2'
-    # @@protoc_insertion_point(class_scope:api.v1.GetRunErrorRequest)
-})
+  'DESCRIPTOR' : _GETRUNERRORREQUEST,
+  '__module__' : 'api_pb2'
+  # @@protoc_insertion_point(class_scope:api.v1.GetRunErrorRequest)
+  })
 _sym_db.RegisterMessage(GetRunErrorRequest)
 
 GetRunErrorResponse = _reflection.GeneratedProtocolMessageType('GetRunErrorResponse', (_message.Message,), {
-    'DESCRIPTOR': _GETRUNERRORRESPONSE,
-    '__module__': 'api_pb2'
-    # @@protoc_insertion_point(class_scope:api.v1.GetRunErrorResponse)
-})
+  'DESCRIPTOR' : _GETRUNERRORRESPONSE,
+  '__module__' : 'api_pb2'
+  # @@protoc_insertion_point(class_scope:api.v1.GetRunErrorResponse)
+  })
 _sym_db.RegisterMessage(GetRunErrorResponse)
 
+GetLogsRequest = _reflection.GeneratedProtocolMessageType('GetLogsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETLOGSREQUEST,
+  '__module__' : 'api_pb2'
+  # @@protoc_insertion_point(class_scope:api.v1.GetLogsRequest)
+  })
+_sym_db.RegisterMessage(GetLogsRequest)
+
+GetLogsResponse = _reflection.GeneratedProtocolMessageType('GetLogsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETLOGSRESPONSE,
+  '__module__' : 'api_pb2'
+  # @@protoc_insertion_point(class_scope:api.v1.GetLogsResponse)
+  })
+_sym_db.RegisterMessage(GetLogsResponse)
+
 CancelRequest = _reflection.GeneratedProtocolMessageType('CancelRequest', (_message.Message,), {
-    'DESCRIPTOR': _CANCELREQUEST,
-    '__module__': 'api_pb2'
-    # @@protoc_insertion_point(class_scope:api.v1.CancelRequest)
-})
+  'DESCRIPTOR' : _CANCELREQUEST,
+  '__module__' : 'api_pb2'
+  # @@protoc_insertion_point(class_scope:api.v1.CancelRequest)
+  })
 _sym_db.RegisterMessage(CancelRequest)
 
 CancelResponse = _reflection.GeneratedProtocolMessageType('CancelResponse', (_message.Message,), {
-    'DESCRIPTOR': _CANCELRESPONSE,
-    '__module__': 'api_pb2'
-    # @@protoc_insertion_point(class_scope:api.v1.CancelResponse)
-})
+  'DESCRIPTOR' : _CANCELRESPONSE,
+  '__module__' : 'api_pb2'
+  # @@protoc_insertion_point(class_scope:api.v1.CancelResponse)
+  })
 _sym_db.RegisterMessage(CancelResponse)
 
-GetPrecompiledObjectsRequest = _reflection.GeneratedProtocolMessageType('GetPrecompiledObjectsRequest',
-                                                                        (_message.Message,), {
-                                                                            'DESCRIPTOR': _GETPRECOMPILEDOBJECTSREQUEST,
-                                                                            '__module__': 'api_pb2'
-                                                                            # @@protoc_insertion_point(class_scope:api.v1.GetPrecompiledObjectsRequest)
-                                                                        })
+GetPrecompiledObjectsRequest = _reflection.GeneratedProtocolMessageType('GetPrecompiledObjectsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETPRECOMPILEDOBJECTSREQUEST,
+  '__module__' : 'api_pb2'
+  # @@protoc_insertion_point(class_scope:api.v1.GetPrecompiledObjectsRequest)
+  })
 _sym_db.RegisterMessage(GetPrecompiledObjectsRequest)
 
 PrecompiledObject = _reflection.GeneratedProtocolMessageType('PrecompiledObject', (_message.Message,), {
-    'DESCRIPTOR': _PRECOMPILEDOBJECT,
-    '__module__': 'api_pb2'
-    # @@protoc_insertion_point(class_scope:api.v1.PrecompiledObject)
-})
+  'DESCRIPTOR' : _PRECOMPILEDOBJECT,
+  '__module__' : 'api_pb2'
+  # @@protoc_insertion_point(class_scope:api.v1.PrecompiledObject)
+  })
 _sym_db.RegisterMessage(PrecompiledObject)
 
 Categories = _reflection.GeneratedProtocolMessageType('Categories', (_message.Message,), {
 
-    'Category': _reflection.GeneratedProtocolMessageType('Category', (_message.Message,), {
-        'DESCRIPTOR': _CATEGORIES_CATEGORY,
-        '__module__': 'api_pb2'
-        # @@protoc_insertion_point(class_scope:api.v1.Categories.Category)
+  'Category' : _reflection.GeneratedProtocolMessageType('Category', (_message.Message,), {
+    'DESCRIPTOR' : _CATEGORIES_CATEGORY,
+    '__module__' : 'api_pb2'
+    # @@protoc_insertion_point(class_scope:api.v1.Categories.Category)
     })
-    ,
-    'DESCRIPTOR': _CATEGORIES,
-    '__module__': 'api_pb2'
-    # @@protoc_insertion_point(class_scope:api.v1.Categories)
-})
+  ,
+  'DESCRIPTOR' : _CATEGORIES,
+  '__module__' : 'api_pb2'
+  # @@protoc_insertion_point(class_scope:api.v1.Categories)
+  })
 _sym_db.RegisterMessage(Categories)
 _sym_db.RegisterMessage(Categories.Category)
 
-GetPrecompiledObjectsResponse = _reflection.GeneratedProtocolMessageType('GetPrecompiledObjectsResponse',
-                                                                         (_message.Message,), {
-                                                                             'DESCRIPTOR': _GETPRECOMPILEDOBJECTSRESPONSE,
-                                                                             '__module__': 'api_pb2'
-                                                                             # @@protoc_insertion_point(class_scope:api.v1.GetPrecompiledObjectsResponse)
-                                                                         })
+GetPrecompiledObjectsResponse = _reflection.GeneratedProtocolMessageType('GetPrecompiledObjectsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETPRECOMPILEDOBJECTSRESPONSE,
+  '__module__' : 'api_pb2'
+  # @@protoc_insertion_point(class_scope:api.v1.GetPrecompiledObjectsResponse)
+  })
 _sym_db.RegisterMessage(GetPrecompiledObjectsResponse)
 
-GetPrecompiledObjectRequest = _reflection.GeneratedProtocolMessageType('GetPrecompiledObjectRequest',
-                                                                       (_message.Message,), {
-                                                                           'DESCRIPTOR': _GETPRECOMPILEDOBJECTREQUEST,
-                                                                           '__module__': 'api_pb2'
-                                                                           # @@protoc_insertion_point(class_scope:api.v1.GetPrecompiledObjectRequest)
-                                                                       })
+GetPrecompiledObjectRequest = _reflection.GeneratedProtocolMessageType('GetPrecompiledObjectRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETPRECOMPILEDOBJECTREQUEST,
+  '__module__' : 'api_pb2'
+  # @@protoc_insertion_point(class_scope:api.v1.GetPrecompiledObjectRequest)
+  })
 _sym_db.RegisterMessage(GetPrecompiledObjectRequest)
 
-GetPrecompiledObjectCodeResponse = _reflection.GeneratedProtocolMessageType('GetPrecompiledObjectCodeResponse',
-                                                                            (_message.Message,), {
-                                                                                'DESCRIPTOR': _GETPRECOMPILEDOBJECTCODERESPONSE,
-                                                                                '__module__': 'api_pb2'
-                                                                                # @@protoc_insertion_point(class_scope:api.v1.GetPrecompiledObjectCodeResponse)
-                                                                            })
+GetPrecompiledObjectCodeResponse = _reflection.GeneratedProtocolMessageType('GetPrecompiledObjectCodeResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETPRECOMPILEDOBJECTCODERESPONSE,
+  '__module__' : 'api_pb2'
+  # @@protoc_insertion_point(class_scope:api.v1.GetPrecompiledObjectCodeResponse)
+  })
 _sym_db.RegisterMessage(GetPrecompiledObjectCodeResponse)
 
+
 DESCRIPTOR._options = None
 
 _PLAYGROUNDSERVICE = _descriptor.ServiceDescriptor(
-    name='PlaygroundService',
-    full_name='api.v1.PlaygroundService',
-    file=DESCRIPTOR,
+  name='PlaygroundService',
+  full_name='api.v1.PlaygroundService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=1849,
+  serialized_end=2657,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='RunCode',
+    full_name='api.v1.PlaygroundService.RunCode',
     index=0,
+    containing_service=None,
+    input_type=_RUNCODEREQUEST,
+    output_type=_RUNCODERESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='CheckStatus',
+    full_name='api.v1.PlaygroundService.CheckStatus',
+    index=1,
+    containing_service=None,
+    input_type=_CHECKSTATUSREQUEST,
+    output_type=_CHECKSTATUSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetRunOutput',
+    full_name='api.v1.PlaygroundService.GetRunOutput',
+    index=2,
+    containing_service=None,
+    input_type=_GETRUNOUTPUTREQUEST,
+    output_type=_GETRUNOUTPUTRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetLogs',
+    full_name='api.v1.PlaygroundService.GetLogs',
+    index=3,
+    containing_service=None,
+    input_type=_GETLOGSREQUEST,
+    output_type=_GETLOGSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetRunError',
+    full_name='api.v1.PlaygroundService.GetRunError',
+    index=4,
+    containing_service=None,
+    input_type=_GETRUNERRORREQUEST,
+    output_type=_GETRUNERRORRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetCompileOutput',
+    full_name='api.v1.PlaygroundService.GetCompileOutput',
+    index=5,
+    containing_service=None,
+    input_type=_GETCOMPILEOUTPUTREQUEST,
+    output_type=_GETCOMPILEOUTPUTRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Cancel',
+    full_name='api.v1.PlaygroundService.Cancel',
+    index=6,
+    containing_service=None,
+    input_type=_CANCELREQUEST,
+    output_type=_CANCELRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetPrecompiledObjects',
+    full_name='api.v1.PlaygroundService.GetPrecompiledObjects',
+    index=7,
+    containing_service=None,
+    input_type=_GETPRECOMPILEDOBJECTSREQUEST,
+    output_type=_GETPRECOMPILEDOBJECTSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetPrecompiledObjectCode',
+    full_name='api.v1.PlaygroundService.GetPrecompiledObjectCode',
+    index=8,
+    containing_service=None,
+    input_type=_GETPRECOMPILEDOBJECTREQUEST,
+    output_type=_GETPRECOMPILEDOBJECTCODERESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetPrecompiledObjectOutput',
+    full_name='api.v1.PlaygroundService.GetPrecompiledObjectOutput',
+    index=9,
+    containing_service=None,
+    input_type=_GETPRECOMPILEDOBJECTREQUEST,
+    output_type=_GETRUNOUTPUTRESPONSE,
     serialized_options=None,
     create_key=_descriptor._internal_create_key,
-    serialized_start=1720,
-    serialized_end=2468,
-    methods=[
-        _descriptor.MethodDescriptor(
-            name='RunCode',
-            full_name='api.v1.PlaygroundService.RunCode',
-            index=0,
-            containing_service=None,
-            input_type=_RUNCODEREQUEST,
-            output_type=_RUNCODERESPONSE,
-            serialized_options=None,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.MethodDescriptor(
-            name='CheckStatus',
-            full_name='api.v1.PlaygroundService.CheckStatus',
-            index=1,
-            containing_service=None,
-            input_type=_CHECKSTATUSREQUEST,
-            output_type=_CHECKSTATUSRESPONSE,
-            serialized_options=None,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.MethodDescriptor(
-            name='GetRunOutput',
-            full_name='api.v1.PlaygroundService.GetRunOutput',
-            index=2,
-            containing_service=None,
-            input_type=_GETRUNOUTPUTREQUEST,
-            output_type=_GETRUNOUTPUTRESPONSE,
-            serialized_options=None,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.MethodDescriptor(
-            name='GetRunError',
-            full_name='api.v1.PlaygroundService.GetRunError',
-            index=3,
-            containing_service=None,
-            input_type=_GETRUNERRORREQUEST,
-            output_type=_GETRUNERRORRESPONSE,
-            serialized_options=None,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.MethodDescriptor(
-            name='GetCompileOutput',
-            full_name='api.v1.PlaygroundService.GetCompileOutput',
-            index=4,
-            containing_service=None,
-            input_type=_GETCOMPILEOUTPUTREQUEST,
-            output_type=_GETCOMPILEOUTPUTRESPONSE,
-            serialized_options=None,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.MethodDescriptor(
-            name='Cancel',
-            full_name='api.v1.PlaygroundService.Cancel',
-            index=5,
-            containing_service=None,
-            input_type=_CANCELREQUEST,
-            output_type=_CANCELRESPONSE,
-            serialized_options=None,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.MethodDescriptor(
-            name='GetPrecompiledObjects',
-            full_name='api.v1.PlaygroundService.GetPrecompiledObjects',
-            index=6,
-            containing_service=None,
-            input_type=_GETPRECOMPILEDOBJECTSREQUEST,
-            output_type=_GETPRECOMPILEDOBJECTSRESPONSE,
-            serialized_options=None,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.MethodDescriptor(
-            name='GetPrecompiledObjectCode',
-            full_name='api.v1.PlaygroundService.GetPrecompiledObjectCode',
-            index=7,
-            containing_service=None,
-            input_type=_GETPRECOMPILEDOBJECTREQUEST,
-            output_type=_GETPRECOMPILEDOBJECTCODERESPONSE,
-            serialized_options=None,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.MethodDescriptor(
-            name='GetPrecompiledObjectOutput',
-            full_name='api.v1.PlaygroundService.GetPrecompiledObjectOutput',
-            index=8,
-            containing_service=None,
-            input_type=_GETPRECOMPILEDOBJECTREQUEST,
-            output_type=_GETRUNOUTPUTRESPONSE,
-            serialized_options=None,
-            create_key=_descriptor._internal_create_key,
-        ),
-    ])
+  ),
+])
 _sym_db.RegisterServiceDescriptor(_PLAYGROUNDSERVICE)
 
 DESCRIPTOR.services_by_name['PlaygroundService'] = _PLAYGROUNDSERVICE
diff --git a/playground/infrastructure/api/v1/api_pb2_grpc.py b/playground/infrastructure/api/v1/api_pb2_grpc.py
index fb19baf..8a9fe60 100644
--- a/playground/infrastructure/api/v1/api_pb2_grpc.py
+++ b/playground/infrastructure/api/v1/api_pb2_grpc.py
@@ -16,7 +16,8 @@
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
 """Client and server classes corresponding to protobuf-defined services."""
 import grpc
-from api.v1 import api_pb2 as api__pb2
+
+import api_pb2 as api__pb2
 
 
 class PlaygroundServiceStub(object):
@@ -29,50 +30,55 @@ class PlaygroundServiceStub(object):
             channel: A grpc.Channel.
         """
         self.RunCode = channel.unary_unary(
-            '/api.v1.PlaygroundService/RunCode',
-            request_serializer=api__pb2.RunCodeRequest.SerializeToString,
-            response_deserializer=api__pb2.RunCodeResponse.FromString,
-        )
+                '/api.v1.PlaygroundService/RunCode',
+                request_serializer=api__pb2.RunCodeRequest.SerializeToString,
+                response_deserializer=api__pb2.RunCodeResponse.FromString,
+                )
         self.CheckStatus = channel.unary_unary(
-            '/api.v1.PlaygroundService/CheckStatus',
-            request_serializer=api__pb2.CheckStatusRequest.SerializeToString,
-            response_deserializer=api__pb2.CheckStatusResponse.FromString,
-        )
+                '/api.v1.PlaygroundService/CheckStatus',
+                request_serializer=api__pb2.CheckStatusRequest.SerializeToString,
+                response_deserializer=api__pb2.CheckStatusResponse.FromString,
+                )
         self.GetRunOutput = channel.unary_unary(
-            '/api.v1.PlaygroundService/GetRunOutput',
-            request_serializer=api__pb2.GetRunOutputRequest.SerializeToString,
-            response_deserializer=api__pb2.GetRunOutputResponse.FromString,
-        )
+                '/api.v1.PlaygroundService/GetRunOutput',
+                request_serializer=api__pb2.GetRunOutputRequest.SerializeToString,
+                response_deserializer=api__pb2.GetRunOutputResponse.FromString,
+                )
+        self.GetLogs = channel.unary_unary(
+                '/api.v1.PlaygroundService/GetLogs',
+                request_serializer=api__pb2.GetLogsRequest.SerializeToString,
+                response_deserializer=api__pb2.GetLogsResponse.FromString,
+                )
         self.GetRunError = channel.unary_unary(
-            '/api.v1.PlaygroundService/GetRunError',
-            request_serializer=api__pb2.GetRunErrorRequest.SerializeToString,
-            response_deserializer=api__pb2.GetRunErrorResponse.FromString,
-        )
+                '/api.v1.PlaygroundService/GetRunError',
+                request_serializer=api__pb2.GetRunErrorRequest.SerializeToString,
+                response_deserializer=api__pb2.GetRunErrorResponse.FromString,
+                )
         self.GetCompileOutput = channel.unary_unary(
-            '/api.v1.PlaygroundService/GetCompileOutput',
-            request_serializer=api__pb2.GetCompileOutputRequest.SerializeToString,
-            response_deserializer=api__pb2.GetCompileOutputResponse.FromString,
-        )
+                '/api.v1.PlaygroundService/GetCompileOutput',
+                request_serializer=api__pb2.GetCompileOutputRequest.SerializeToString,
+                response_deserializer=api__pb2.GetCompileOutputResponse.FromString,
+                )
         self.Cancel = channel.unary_unary(
-            '/api.v1.PlaygroundService/Cancel',
-            request_serializer=api__pb2.CancelRequest.SerializeToString,
-            response_deserializer=api__pb2.CancelResponse.FromString,
-        )
+                '/api.v1.PlaygroundService/Cancel',
+                request_serializer=api__pb2.CancelRequest.SerializeToString,
+                response_deserializer=api__pb2.CancelResponse.FromString,
+                )
         self.GetPrecompiledObjects = channel.unary_unary(
-            '/api.v1.PlaygroundService/GetPrecompiledObjects',
-            request_serializer=api__pb2.GetPrecompiledObjectsRequest.SerializeToString,
-            response_deserializer=api__pb2.GetPrecompiledObjectsResponse.FromString,
-        )
+                '/api.v1.PlaygroundService/GetPrecompiledObjects',
+                request_serializer=api__pb2.GetPrecompiledObjectsRequest.SerializeToString,
+                response_deserializer=api__pb2.GetPrecompiledObjectsResponse.FromString,
+                )
         self.GetPrecompiledObjectCode = channel.unary_unary(
-            '/api.v1.PlaygroundService/GetPrecompiledObjectCode',
-            request_serializer=api__pb2.GetPrecompiledObjectRequest.SerializeToString,
-            response_deserializer=api__pb2.GetPrecompiledObjectCodeResponse.FromString,
-        )
+                '/api.v1.PlaygroundService/GetPrecompiledObjectCode',
+                request_serializer=api__pb2.GetPrecompiledObjectRequest.SerializeToString,
+                response_deserializer=api__pb2.GetPrecompiledObjectCodeResponse.FromString,
+                )
         self.GetPrecompiledObjectOutput = channel.unary_unary(
-            '/api.v1.PlaygroundService/GetPrecompiledObjectOutput',
-            request_serializer=api__pb2.GetPrecompiledObjectRequest.SerializeToString,
-            response_deserializer=api__pb2.GetRunOutputResponse.FromString,
-        )
+                '/api.v1.PlaygroundService/GetPrecompiledObjectOutput',
+                request_serializer=api__pb2.GetPrecompiledObjectRequest.SerializeToString,
+                response_deserializer=api__pb2.GetRunOutputResponse.FromString,
+                )
 
 
 class PlaygroundServiceServicer(object):
@@ -99,6 +105,13 @@ class PlaygroundServiceServicer(object):
         context.set_details('Method not implemented!')
         raise NotImplementedError('Method not implemented!')
 
+    def GetLogs(self, request, context):
+        """Get the logs of pipeline execution.
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
     def GetRunError(self, request, context):
         """Get the error of pipeline execution.
         """
@@ -144,210 +157,232 @@ class PlaygroundServiceServicer(object):
 
 def add_PlaygroundServiceServicer_to_server(servicer, server):
     rpc_method_handlers = {
-        'RunCode': grpc.unary_unary_rpc_method_handler(
-            servicer.RunCode,
-            request_deserializer=api__pb2.RunCodeRequest.FromString,
-            response_serializer=api__pb2.RunCodeResponse.SerializeToString,
-        ),
-        'CheckStatus': grpc.unary_unary_rpc_method_handler(
-            servicer.CheckStatus,
-            request_deserializer=api__pb2.CheckStatusRequest.FromString,
-            response_serializer=api__pb2.CheckStatusResponse.SerializeToString,
-        ),
-        'GetRunOutput': grpc.unary_unary_rpc_method_handler(
-            servicer.GetRunOutput,
-            request_deserializer=api__pb2.GetRunOutputRequest.FromString,
-            response_serializer=api__pb2.GetRunOutputResponse.SerializeToString,
-        ),
-        'GetRunError': grpc.unary_unary_rpc_method_handler(
-            servicer.GetRunError,
-            request_deserializer=api__pb2.GetRunErrorRequest.FromString,
-            response_serializer=api__pb2.GetRunErrorResponse.SerializeToString,
-        ),
-        'GetCompileOutput': grpc.unary_unary_rpc_method_handler(
-            servicer.GetCompileOutput,
-            request_deserializer=api__pb2.GetCompileOutputRequest.FromString,
-            response_serializer=api__pb2.GetCompileOutputResponse.SerializeToString,
-        ),
-        'Cancel': grpc.unary_unary_rpc_method_handler(
-            servicer.Cancel,
-            request_deserializer=api__pb2.CancelRequest.FromString,
-            response_serializer=api__pb2.CancelResponse.SerializeToString,
-        ),
-        'GetPrecompiledObjects': grpc.unary_unary_rpc_method_handler(
-            servicer.GetPrecompiledObjects,
-            request_deserializer=api__pb2.GetPrecompiledObjectsRequest.FromString,
-            response_serializer=api__pb2.GetPrecompiledObjectsResponse.SerializeToString,
-        ),
-        'GetPrecompiledObjectCode': grpc.unary_unary_rpc_method_handler(
-            servicer.GetPrecompiledObjectCode,
-            request_deserializer=api__pb2.GetPrecompiledObjectRequest.FromString,
-            response_serializer=api__pb2.GetPrecompiledObjectCodeResponse.SerializeToString,
-        ),
-        'GetPrecompiledObjectOutput': grpc.unary_unary_rpc_method_handler(
-            servicer.GetPrecompiledObjectOutput,
-            request_deserializer=api__pb2.GetPrecompiledObjectRequest.FromString,
-            response_serializer=api__pb2.GetRunOutputResponse.SerializeToString,
-        ),
+            'RunCode': grpc.unary_unary_rpc_method_handler(
+                    servicer.RunCode,
+                    request_deserializer=api__pb2.RunCodeRequest.FromString,
+                    response_serializer=api__pb2.RunCodeResponse.SerializeToString,
+            ),
+            'CheckStatus': grpc.unary_unary_rpc_method_handler(
+                    servicer.CheckStatus,
+                    request_deserializer=api__pb2.CheckStatusRequest.FromString,
+                    response_serializer=api__pb2.CheckStatusResponse.SerializeToString,
+            ),
+            'GetRunOutput': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetRunOutput,
+                    request_deserializer=api__pb2.GetRunOutputRequest.FromString,
+                    response_serializer=api__pb2.GetRunOutputResponse.SerializeToString,
+            ),
+            'GetLogs': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetLogs,
+                    request_deserializer=api__pb2.GetLogsRequest.FromString,
+                    response_serializer=api__pb2.GetLogsResponse.SerializeToString,
+            ),
+            'GetRunError': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetRunError,
+                    request_deserializer=api__pb2.GetRunErrorRequest.FromString,
+                    response_serializer=api__pb2.GetRunErrorResponse.SerializeToString,
+            ),
+            'GetCompileOutput': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetCompileOutput,
+                    request_deserializer=api__pb2.GetCompileOutputRequest.FromString,
+                    response_serializer=api__pb2.GetCompileOutputResponse.SerializeToString,
+            ),
+            'Cancel': grpc.unary_unary_rpc_method_handler(
+                    servicer.Cancel,
+                    request_deserializer=api__pb2.CancelRequest.FromString,
+                    response_serializer=api__pb2.CancelResponse.SerializeToString,
+            ),
+            'GetPrecompiledObjects': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetPrecompiledObjects,
+                    request_deserializer=api__pb2.GetPrecompiledObjectsRequest.FromString,
+                    response_serializer=api__pb2.GetPrecompiledObjectsResponse.SerializeToString,
+            ),
+            'GetPrecompiledObjectCode': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetPrecompiledObjectCode,
+                    request_deserializer=api__pb2.GetPrecompiledObjectRequest.FromString,
+                    response_serializer=api__pb2.GetPrecompiledObjectCodeResponse.SerializeToString,
+            ),
+            'GetPrecompiledObjectOutput': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetPrecompiledObjectOutput,
+                    request_deserializer=api__pb2.GetPrecompiledObjectRequest.FromString,
+                    response_serializer=api__pb2.GetRunOutputResponse.SerializeToString,
+            ),
     }
     generic_handler = grpc.method_handlers_generic_handler(
-        'api.v1.PlaygroundService', rpc_method_handlers)
+            'api.v1.PlaygroundService', rpc_method_handlers)
     server.add_generic_rpc_handlers((generic_handler,))
 
 
-# This class is part of an EXPERIMENTAL API.
+ # This class is part of an EXPERIMENTAL API.
 class PlaygroundService(object):
     """Missing associated documentation comment in .proto file."""
 
     @staticmethod
     def RunCode(request,
-                target,
-                options=(),
-                channel_credentials=None,
-                call_credentials=None,
-                insecure=False,
-                compression=None,
-                wait_for_ready=None,
-                timeout=None,
-                metadata=None):
+            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, '/api.v1.PlaygroundService/RunCode',
-                                             api__pb2.RunCodeRequest.SerializeToString,
-                                             api__pb2.RunCodeResponse.FromString,
-                                             options, channel_credentials,
-                                             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+            api__pb2.RunCodeRequest.SerializeToString,
+            api__pb2.RunCodeResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
     @staticmethod
     def CheckStatus(request,
-                    target,
-                    options=(),
-                    channel_credentials=None,
-                    call_credentials=None,
-                    insecure=False,
-                    compression=None,
-                    wait_for_ready=None,
-                    timeout=None,
-                    metadata=None):
+            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, '/api.v1.PlaygroundService/CheckStatus',
-                                             api__pb2.CheckStatusRequest.SerializeToString,
-                                             api__pb2.CheckStatusResponse.FromString,
-                                             options, channel_credentials,
-                                             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+            api__pb2.CheckStatusRequest.SerializeToString,
+            api__pb2.CheckStatusResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
     @staticmethod
     def GetRunOutput(request,
-                     target,
-                     options=(),
-                     channel_credentials=None,
-                     call_credentials=None,
-                     insecure=False,
-                     compression=None,
-                     wait_for_ready=None,
-                     timeout=None,
-                     metadata=None):
+            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, '/api.v1.PlaygroundService/GetRunOutput',
-                                             api__pb2.GetRunOutputRequest.SerializeToString,
-                                             api__pb2.GetRunOutputResponse.FromString,
-                                             options, channel_credentials,
-                                             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+            api__pb2.GetRunOutputRequest.SerializeToString,
+            api__pb2.GetRunOutputResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def GetLogs(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, '/api.v1.PlaygroundService/GetLogs',
+            api__pb2.GetLogsRequest.SerializeToString,
+            api__pb2.GetLogsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
     @staticmethod
     def GetRunError(request,
-                    target,
-                    options=(),
-                    channel_credentials=None,
-                    call_credentials=None,
-                    insecure=False,
-                    compression=None,
-                    wait_for_ready=None,
-                    timeout=None,
-                    metadata=None):
+            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, '/api.v1.PlaygroundService/GetRunError',
-                                             api__pb2.GetRunErrorRequest.SerializeToString,
-                                             api__pb2.GetRunErrorResponse.FromString,
-                                             options, channel_credentials,
-                                             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+            api__pb2.GetRunErrorRequest.SerializeToString,
+            api__pb2.GetRunErrorResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
     @staticmethod
     def GetCompileOutput(request,
-                         target,
-                         options=(),
-                         channel_credentials=None,
-                         call_credentials=None,
-                         insecure=False,
-                         compression=None,
-                         wait_for_ready=None,
-                         timeout=None,
-                         metadata=None):
+            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, '/api.v1.PlaygroundService/GetCompileOutput',
-                                             api__pb2.GetCompileOutputRequest.SerializeToString,
-                                             api__pb2.GetCompileOutputResponse.FromString,
-                                             options, channel_credentials,
-                                             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+            api__pb2.GetCompileOutputRequest.SerializeToString,
+            api__pb2.GetCompileOutputResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
     @staticmethod
     def Cancel(request,
-               target,
-               options=(),
-               channel_credentials=None,
-               call_credentials=None,
-               insecure=False,
-               compression=None,
-               wait_for_ready=None,
-               timeout=None,
-               metadata=None):
+            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, '/api.v1.PlaygroundService/Cancel',
-                                             api__pb2.CancelRequest.SerializeToString,
-                                             api__pb2.CancelResponse.FromString,
-                                             options, channel_credentials,
-                                             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+            api__pb2.CancelRequest.SerializeToString,
+            api__pb2.CancelResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
     @staticmethod
     def GetPrecompiledObjects(request,
-                              target,
-                              options=(),
-                              channel_credentials=None,
-                              call_credentials=None,
-                              insecure=False,
-                              compression=None,
-                              wait_for_ready=None,
-                              timeout=None,
-                              metadata=None):
+            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, '/api.v1.PlaygroundService/GetPrecompiledObjects',
-                                             api__pb2.GetPrecompiledObjectsRequest.SerializeToString,
-                                             api__pb2.GetPrecompiledObjectsResponse.FromString,
-                                             options, channel_credentials,
-                                             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+            api__pb2.GetPrecompiledObjectsRequest.SerializeToString,
+            api__pb2.GetPrecompiledObjectsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
     @staticmethod
     def GetPrecompiledObjectCode(request,
-                                 target,
-                                 options=(),
-                                 channel_credentials=None,
-                                 call_credentials=None,
-                                 insecure=False,
-                                 compression=None,
-                                 wait_for_ready=None,
-                                 timeout=None,
-                                 metadata=None):
+            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, '/api.v1.PlaygroundService/GetPrecompiledObjectCode',
-                                             api__pb2.GetPrecompiledObjectRequest.SerializeToString,
-                                             api__pb2.GetPrecompiledObjectCodeResponse.FromString,
-                                             options, channel_credentials,
-                                             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+            api__pb2.GetPrecompiledObjectRequest.SerializeToString,
+            api__pb2.GetPrecompiledObjectCodeResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
     @staticmethod
     def GetPrecompiledObjectOutput(request,
-                                   target,
-                                   options=(),
-                                   channel_credentials=None,
-                                   call_credentials=None,
-                                   insecure=False,
-                                   compression=None,
-                                   wait_for_ready=None,
-                                   timeout=None,
-                                   metadata=None):
+            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, '/api.v1.PlaygroundService/GetPrecompiledObjectOutput',
-                                             api__pb2.GetPrecompiledObjectRequest.SerializeToString,
-                                             api__pb2.GetRunOutputResponse.FromString,
-                                             options, channel_credentials,
-                                             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+            api__pb2.GetPrecompiledObjectRequest.SerializeToString,
+            api__pb2.GetRunOutputResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/playground/infrastructure/grpc_client.py b/playground/infrastructure/grpc_client.py
index 9f2fd42..ceae3c9 100644
--- a/playground/infrastructure/grpc_client.py
+++ b/playground/infrastructure/grpc_client.py
@@ -31,13 +31,15 @@ class GRPCClient:
     self._channel = grpc.aio.insecure_channel(Config.SERVER_ADDRESS)
     self._stub = api_pb2_grpc.PlaygroundServiceStub(self._channel)
 
-  async def run_code(self, code: str, sdk: api_pb2.Sdk) -> str:
+  async def run_code(
+      self, code: str, sdk: api_pb2.Sdk, pipeline_options: str) -> str:
     """
     Run example by his code and SDK
 
     Args:
         code: code of the example.
         sdk: SDK of the example.
+        pipeline_options: pipeline options of the example.
 
     Returns:
         pipeline_uuid: uuid of the pipeline
@@ -47,7 +49,8 @@ class GRPCClient:
       sdks.remove(api_pb2.Sdk.Name(0))  # del SDK_UNSPECIFIED
       raise Exception(
           f'Incorrect sdk: must be from this pool: {", ".join(sdks)}')
-    request = api_pb2.RunCodeRequest(code=code, sdk=sdk)
+    request = api_pb2.RunCodeRequest(
+        code=code, sdk=sdk, pipeline_options=pipeline_options)
     response = await self._stub.RunCode(request)
     return response.pipeline_uuid
 
diff --git a/playground/infrastructure/helper.py b/playground/infrastructure/helper.py
index 19a203b..d9c1d09 100644
--- a/playground/infrastructure/helper.py
+++ b/playground/infrastructure/helper.py
@@ -335,7 +335,8 @@ async def _update_example_status(example: Example, client: GRPCClient):
       example: beam example for processing and updating status and pipeline_id.
       client: client to send requests to the server.
   """
-  pipeline_id = await client.run_code(example.code, example.sdk)
+  pipeline_id = await client.run_code(
+      example.code, example.sdk, example.tag.pipeline_options)
   example.pipeline_id = pipeline_id
   status = await client.check_status(pipeline_id)
   while status in [STATUS_VALIDATING,
diff --git a/playground/infrastructure/test_grpc_client.py b/playground/infrastructure/test_grpc_client.py
index bc40105..c7a7951 100644
--- a/playground/infrastructure/test_grpc_client.py
+++ b/playground/infrastructure/test_grpc_client.py
@@ -61,7 +61,7 @@ def mock_get_compile_output(mocker):
 class TestGRPCClient:
   @pytest.mark.asyncio
   async def test_run_code(self, mock_run_code):
-    result = await GRPCClient().run_code("", api_pb2.SDK_GO)
+    result = await GRPCClient().run_code("", api_pb2.SDK_GO, "")
     assert isinstance(result, str)
 
   @pytest.mark.asyncio