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

dimuthuupe pushed a commit to branch agent-framewok-refactoring
in repository https://gitbox.apache.org/repos/asf/airavata.git


The following commit(s) were added to refs/heads/agent-framewok-refactoring by 
this push:
     new 9367451409 Adding python execution support for agent
9367451409 is described below

commit 9367451409933294b192175ab29e89d5a60d28c1
Author: Dimuthu Wannipurage <[email protected]>
AuthorDate: Thu Dec 5 12:10:34 2024 -0500

    Adding python execution support for agent
---
 .../service/controllers/AgentController.java       |   19 +
 .../service/handlers/AgentConnectionHandler.java   |   72 +-
 .../service/models/AgentPythonRunAck.java          |    4 +
 .../service/models/AgentPythonRunRequest.java      |   61 ++
 .../service/models/AgentPythonRunResponse.java     |   41 +
 .../src/main/proto/agent-communication.proto       |   54 +-
 .../airavata-agent/agent-communication.proto       |   18 +
 modules/agent-framework/airavata-agent/agent.go    |   29 +
 .../protos/agent-communication.pb.go               | 1019 ++++++++++++++------
 .../protos/agent-communication_grpc.pb.go          |   85 +-
 10 files changed, 1079 insertions(+), 323 deletions(-)

diff --git 
a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/controllers/AgentController.java
 
b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/controllers/AgentController.java
index aaa0f30894..c0380f7a2a 100644
--- 
a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/controllers/AgentController.java
+++ 
b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/controllers/AgentController.java
@@ -68,4 +68,23 @@ public class AgentController {
         return 
ResponseEntity.accepted().body(agentConnectionHandler.getJupyterExecutionResponse(executionId));
     }
 
+
+    @PostMapping("/executepythonrequest")
+    public ResponseEntity<AgentPythonRunAck> runPythonOnAgent(@Valid 
@RequestBody AgentPythonRunRequest pythonRunRequest) {
+        logger.info("Received python execution request to run on agent {}", 
pythonRunRequest.getAgentId());
+        if 
(agentConnectionHandler.isAgentUp(pythonRunRequest.getAgentId()).isAgentUp()) {
+            return 
ResponseEntity.accepted().body(agentConnectionHandler.runPythonOnAgent(pythonRunRequest));
+        } else {
+            logger.warn("No agent is available to run on agent {}", 
pythonRunRequest.getAgentId());
+            AgentPythonRunAck ack = new AgentPythonRunAck();
+            ack.setError("Agent not found");
+            return ResponseEntity.accepted().body(ack);
+        }
+    }
+
+    @GetMapping("/executepythonresponse/{executionId}")
+    public ResponseEntity<AgentPythonRunResponse> 
getPythonResponse(@PathVariable("executionId") String executionId) {
+        return 
ResponseEntity.accepted().body(agentConnectionHandler.getPythonExecutionResponse(executionId));
+    }
+
 }
diff --git 
a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentConnectionHandler.java
 
b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentConnectionHandler.java
index 199cff852a..5fdb003c89 100644
--- 
a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentConnectionHandler.java
+++ 
b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentConnectionHandler.java
@@ -30,6 +30,7 @@ public class AgentConnectionHandler extends 
AgentCommunicationServiceGrpc.AgentC
 
     private final Map<String, CommandExecutionResponse> 
COMMAND_EXECUTION_RESPONSE_CACHE = new ConcurrentHashMap<>();
     private final Map<String, JupyterExecutionResponse> 
JUPYTER_EXECUTION_RESPONSE_CACHE = new ConcurrentHashMap<>();
+    private final Map<String, PythonExecutionResponse> 
PYTHON_EXECUTION_RESPONSE_CACHE = new ConcurrentHashMap<>();
 
     private final AiravataFileService airavataFileService;
 
@@ -103,19 +104,69 @@ public class AgentConnectionHandler extends 
AgentCommunicationServiceGrpc.AgentC
         return ack;
     }
 
-    public JupyterExecutionAck runJupyterOnAgent(JupyterExecutionRequest 
jupyterExecutionRequest) {
+    public AgentPythonRunResponse getPythonExecutionResponse(String 
executionId) {
+        AgentPythonRunResponse runResponse = new AgentPythonRunResponse();
+        if (PYTHON_EXECUTION_RESPONSE_CACHE.containsKey(executionId)) {
+            
runResponse.setResponseString(PYTHON_EXECUTION_RESPONSE_CACHE.get(executionId).getResponseString());
+            runResponse.setExecutionId(executionId);
+            runResponse.setAvailable(true);
+            PYTHON_EXECUTION_RESPONSE_CACHE.remove(executionId);
+        } else {
+            runResponse.setAvailable(false);
+        }
+        return runResponse;
+    }
+
+    public AgentPythonRunAck runPythonOnAgent(AgentPythonRunRequest 
pythonRunRequest) {
         String executionId = UUID.randomUUID().toString();
-        JupyterExecutionAck ack = new JupyterExecutionAck();
+        AgentPythonRunAck ack = new AgentPythonRunAck();
         ack.setExecutionId(executionId);
 
-        if 
(AGENT_STREAM_MAPPING.containsKey(jupyterExecutionRequest.getAgentId()) &&
-                
ACTIVE_STREAMS.containsKey(AGENT_STREAM_MAPPING.get(jupyterExecutionRequest.getAgentId())))
 {
-            String streamId = 
AGENT_STREAM_MAPPING.get(jupyterExecutionRequest.getAgentId());
+        Optional<StreamObserver<ServerMessage>> agentStreamObserver = 
getAgentStreamObserver(pythonRunRequest.getAgentId());
+        if (agentStreamObserver.isPresent()) {
+            try {
+                logger.info("Running a python on agent {}", 
pythonRunRequest.getAgentId());
+                
agentStreamObserver.get().onNext(ServerMessage.newBuilder().setPythonExecutionRequest(
+                        PythonExecutionRequest.newBuilder()
+                                .setExecutionId(executionId)
+                                .setKeepAlive(pythonRunRequest.isKeepAlive())
+                                .setCode(pythonRunRequest.getCode())
+                                
.addAllLibraries(pythonRunRequest.getLibraries())
+                                
.setWorkingDir(pythonRunRequest.getParentExperimentId())).build());
+
+            } catch (Exception e) {
+                logger.error("Failed to submit python execution request {} on 
agent {}",
+                        executionId, pythonRunRequest.getAgentId(), e);
+                ack.setError(e.getMessage());
+            }
+        } else {
+            logger.warn("No agent found to run python execution on agent {}", 
pythonRunRequest.getAgentId());
+            ack.setError("No agent found to run python execution on agent " + 
pythonRunRequest.getAgentId());
+        }
+
+        return ack;
+    }
+
+    private Optional<StreamObserver<ServerMessage>> 
getAgentStreamObserver(String agentId) {
+        if (AGENT_STREAM_MAPPING.containsKey(agentId) &&
+                ACTIVE_STREAMS.containsKey(AGENT_STREAM_MAPPING.get(agentId))) 
{
+            String streamId = AGENT_STREAM_MAPPING.get(agentId);
             StreamObserver<ServerMessage> streamObserver = 
ACTIVE_STREAMS.get(streamId);
+            return Optional.ofNullable(streamObserver);
+        } else {
+            return Optional.empty();
+        }
+    }
+    public JupyterExecutionAck runJupyterOnAgent(JupyterExecutionRequest 
jupyterExecutionRequest) {
+        String executionId = UUID.randomUUID().toString();
+        JupyterExecutionAck ack = new JupyterExecutionAck();
+        ack.setExecutionId(executionId);
 
+        Optional<StreamObserver<ServerMessage>> agentStreamObserver = 
getAgentStreamObserver(jupyterExecutionRequest.getAgentId());
+        if (agentStreamObserver.isPresent()) {
             try {
                 logger.info("Running a jupyter on agent {}", 
jupyterExecutionRequest.getAgentId());
-                
streamObserver.onNext(ServerMessage.newBuilder().setJupyterExecutionRequest(
+                
agentStreamObserver.get().onNext(ServerMessage.newBuilder().setJupyterExecutionRequest(
                         
org.apache.airavata.agent.JupyterExecutionRequest.newBuilder().build().newBuilder()
                                 .setExecutionId(executionId)
                                 
.setSessionId(jupyterExecutionRequest.getSessionId())
@@ -189,6 +240,12 @@ public class AgentConnectionHandler extends 
AgentCommunicationServiceGrpc.AgentC
         
JUPYTER_EXECUTION_RESPONSE_CACHE.put(executionResponse.getExecutionId(), 
executionResponse);
     }
 
+    private void handlePythonExecutionResponse (PythonExecutionResponse 
executionResponse) {
+        logger.info("Received python execution response for execution id {}", 
executionResponse.getExecutionId());
+        
PYTHON_EXECUTION_RESPONSE_CACHE.put(executionResponse.getExecutionId(), 
executionResponse);
+    }
+
+
     private void handleReadDirRequest(ReadDirReq readDirReq, 
StreamObserver<ServerMessage> responseObserver) {
         airavataFileService.handleReadDirRequest(readDirReq, responseObserver);
     }
@@ -224,6 +281,9 @@ public class AgentConnectionHandler extends 
AgentCommunicationServiceGrpc.AgentC
                     case JUPYTEREXECUTIONRESPONSE -> {
                         
handleJupyterExecutionResponse(request.getJupyterExecutionResponse());
                     }
+                    case PYTHONEXECUTIONRESPONSE -> {
+                        
handlePythonExecutionResponse(request.getPythonExecutionResponse());
+                    }
                     case READDIRREQ -> {
                         handleReadDirRequest(request.getReadDirReq(), 
responseObserver);
                     }
diff --git 
a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentPythonRunAck.java
 
b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentPythonRunAck.java
new file mode 100644
index 0000000000..368d2d7888
--- /dev/null
+++ 
b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentPythonRunAck.java
@@ -0,0 +1,4 @@
+package org.apache.airavata.agent.connection.service.models;
+
+public class AgentPythonRunAck extends AgentCommandAck {
+}
diff --git 
a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentPythonRunRequest.java
 
b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentPythonRunRequest.java
new file mode 100644
index 0000000000..b5673c14de
--- /dev/null
+++ 
b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentPythonRunRequest.java
@@ -0,0 +1,61 @@
+package org.apache.airavata.agent.connection.service.models;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class AgentPythonRunRequest {
+    private List<String> libraries = new ArrayList<>();
+    private String code;
+    private String pythonVersion;
+    private String parentExperimentId;
+    private boolean keepAlive;
+    private String agentId;
+
+    public List<String> getLibraries() {
+        return libraries;
+    }
+
+    public void setLibraries(List<String> libraries) {
+        this.libraries = libraries;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getPythonVersion() {
+        return pythonVersion;
+    }
+
+    public void setPythonVersion(String pythonVersion) {
+        this.pythonVersion = pythonVersion;
+    }
+
+    public String getParentExperimentId() {
+        return parentExperimentId;
+    }
+
+    public void setParentExperimentId(String parentExperimentId) {
+        this.parentExperimentId = parentExperimentId;
+    }
+
+    public boolean isKeepAlive() {
+        return keepAlive;
+    }
+
+    public void setKeepAlive(boolean keepAlive) {
+        this.keepAlive = keepAlive;
+    }
+
+    public String getAgentId() {
+        return agentId;
+    }
+
+    public void setAgentId(String agentId) {
+        this.agentId = agentId;
+    }
+}
diff --git 
a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentPythonRunResponse.java
 
b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentPythonRunResponse.java
new file mode 100644
index 0000000000..1cdeccf64a
--- /dev/null
+++ 
b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentPythonRunResponse.java
@@ -0,0 +1,41 @@
+package org.apache.airavata.agent.connection.service.models;
+
+public class AgentPythonRunResponse {
+
+    private String executionId;
+    private String sessionId;
+    private String responseString;
+    private boolean isAvailable;
+
+    public String getExecutionId() {
+        return executionId;
+    }
+
+    public void setExecutionId(String executionId) {
+        this.executionId = executionId;
+    }
+
+    public String getSessionId() {
+        return sessionId;
+    }
+
+    public void setSessionId(String sessionId) {
+        this.sessionId = sessionId;
+    }
+
+    public String getResponseString() {
+        return responseString;
+    }
+
+    public void setResponseString(String responseString) {
+        this.responseString = responseString;
+    }
+
+    public boolean isAvailable() {
+        return isAvailable;
+    }
+
+    public void setAvailable(boolean available) {
+        isAvailable = available;
+    }
+}
diff --git 
a/modules/agent-framework/agent-service/src/main/proto/agent-communication.proto
 
b/modules/agent-framework/agent-service/src/main/proto/agent-communication.proto
index 12a6326b2d..9bbc8f808b 100644
--- 
a/modules/agent-framework/agent-service/src/main/proto/agent-communication.proto
+++ 
b/modules/agent-framework/agent-service/src/main/proto/agent-communication.proto
@@ -33,6 +33,12 @@ message JupyterExecutionResponse {
   string responseString = 3;
 }
 
+message PythonExecutionResponse {
+  string executionId = 1;
+  string sessionId = 2;
+  string responseString = 3;
+}
+
 message TerminateExecutionResponse {
   string status = 1;
   string description = 2;
@@ -53,15 +59,16 @@ message AgentMessage {
     ContainerExecutionResponse containerExecutionResponse = 3;
     TerminateExecutionResponse terminateExecutionResponse = 4;
     JupyterExecutionResponse jupyterExecutionResponse = 5;
-
-    org.apache.airavata.fuse.StatFsReq statFsReq = 6;
-    org.apache.airavata.fuse.FileInfoReq fileInfoReq = 7;
-    org.apache.airavata.fuse.OpenDirReq openDirReq = 8;
-    org.apache.airavata.fuse.OpenFileReq openFileReq = 9;
-    org.apache.airavata.fuse.ReadDirReq readDirReq = 10;
-    org.apache.airavata.fuse.ReadFileReq readFileReq = 11;
-    org.apache.airavata.fuse.WriteFileReq writeFileReq = 12;
-    org.apache.airavata.fuse.SetInodeAttReq setInodeAttReq = 13;
+    PythonExecutionResponse pythonExecutionResponse = 6;
+
+    org.apache.airavata.fuse.StatFsReq statFsReq = 7;
+    org.apache.airavata.fuse.FileInfoReq fileInfoReq = 8;
+    org.apache.airavata.fuse.OpenDirReq openDirReq = 9;
+    org.apache.airavata.fuse.OpenFileReq openFileReq = 10;
+    org.apache.airavata.fuse.ReadDirReq readDirReq = 11;
+    org.apache.airavata.fuse.ReadFileReq readFileReq = 12;
+    org.apache.airavata.fuse.WriteFileReq writeFileReq = 13;
+    org.apache.airavata.fuse.SetInodeAttReq setInodeAttReq = 14;
   }
 }
 
@@ -100,6 +107,16 @@ message JupyterExecutionRequest {
   string code = 4;
 }
 
+message PythonExecutionRequest {
+  string executionId = 1;
+  string sessionId = 2;
+  bool keepAlive = 3;
+  repeated string libraries = 4;
+  string code = 5;
+  string pythonVersion = 6;
+  string workingDir = 7;
+}
+
 message TerminateExecutionRequest {
   string executionId = 1;
 }
@@ -116,14 +133,15 @@ message ServerMessage {
     KillAgentRequest killAgentRequest = 4;
     TunnelCreationRequest tunnelCreationRequest = 5;
     JupyterExecutionRequest jupyterExecutionRequest = 6;
-
-    org.apache.airavata.fuse.StatFsRes statFsRes = 7;
-    org.apache.airavata.fuse.FileInfoRes fileInfoRes = 8;
-    org.apache.airavata.fuse.OpenDirRes openDirRes = 9;
-    org.apache.airavata.fuse.OpenFileRes openFileRes = 10;
-    org.apache.airavata.fuse.ReadDirRes readDirRes = 11;
-    org.apache.airavata.fuse.ReadFileRes readFileRes = 12;
-    org.apache.airavata.fuse.WriteFileRes writeFileRes = 13;
-    org.apache.airavata.fuse.SetInodeAttRes setInodeAttRes = 14;
+    PythonExecutionRequest pythonExecutionRequest = 7;
+
+    org.apache.airavata.fuse.StatFsRes statFsRes = 8;
+    org.apache.airavata.fuse.FileInfoRes fileInfoRes = 9;
+    org.apache.airavata.fuse.OpenDirRes openDirRes = 10;
+    org.apache.airavata.fuse.OpenFileRes openFileRes = 11;
+    org.apache.airavata.fuse.ReadDirRes readDirRes = 12;
+    org.apache.airavata.fuse.ReadFileRes readFileRes = 13;
+    org.apache.airavata.fuse.WriteFileRes writeFileRes = 14;
+    org.apache.airavata.fuse.SetInodeAttRes setInodeAttRes = 15;
   }
 }
\ No newline at end of file
diff --git a/modules/agent-framework/airavata-agent/agent-communication.proto 
b/modules/agent-framework/airavata-agent/agent-communication.proto
index 762471c700..62dd4db5be 100644
--- a/modules/agent-framework/airavata-agent/agent-communication.proto
+++ b/modules/agent-framework/airavata-agent/agent-communication.proto
@@ -31,6 +31,12 @@ message JupyterExecutionResponse {
   string responseString = 3;
 }
 
+message PythonExecutionResponse {
+  string executionId = 1;
+  string sessionId = 2;
+  string responseString = 3;
+}
+
 message TerminateExecutionResponse {
   string status = 1;
   string description = 2;
@@ -51,6 +57,7 @@ message AgentMessage {
     ContainerExecutionResponse containerExecutionResponse = 3;
     TerminateExecutionResponse terminateExecutionResponse = 4;
     JupyterExecutionResponse jupyterExecutionResponse = 5;
+    PythonExecutionResponse pythonExecutionResponse = 6;
   }
 }
 
@@ -89,6 +96,16 @@ message JupyterExecutionRequest {
   string code = 4;
 }
 
+message PythonExecutionRequest {
+  string executionId = 1;
+  string sessionId = 2;
+  bool keepAlive = 3;
+  repeated string libraries = 4;
+  string code = 5;
+  string pythonVersion = 6;
+  string workingDir = 7;
+}
+
 message TerminateExecutionRequest {
   string executionId = 1;
 }
@@ -105,5 +122,6 @@ message ServerMessage {
     KillAgentRequest killAgentRequest = 4;
     TunnelCreationRequest tunnelCreationRequest = 5;
     JupyterExecutionRequest jupyterExecutionRequest = 6;
+    PythonExecutionRequest pythonExecutionRequest = 7;
   }
 }
\ No newline at end of file
diff --git a/modules/agent-framework/airavata-agent/agent.go 
b/modules/agent-framework/airavata-agent/agent.go
index 6e89469fd2..47e504de4d 100644
--- a/modules/agent-framework/airavata-agent/agent.go
+++ b/modules/agent-framework/airavata-agent/agent.go
@@ -113,6 +113,35 @@ func main() {
                        }
                        log.Printf("[agent.go] Received message %s", in.Message)
                        switch x := in.GetMessage().(type) {
+                       case *protos.ServerMessage_PythonExecutionRequest:
+                               log.Printf("[agent.go] Recived a python 
execution request")
+                               executionId := 
x.PythonExecutionRequest.ExecutionId
+                               sessionId := x.PythonExecutionRequest.SessionId
+                               code := x.PythonExecutionRequest.Code
+                               workingDir := 
x.PythonExecutionRequest.WorkingDir
+
+                               log.Printf("[agent.go] Execution id %s", 
executionId)
+                               log.Printf("[agent.go] Session id %s", 
sessionId)
+                               log.Printf("[agent.go] Code %s", code)
+                               log.Printf("[agent.go] Working Dir %s", 
workingDir)
+
+                               cmd := exec.Command("python3", "-c", code) 
//TODO: Load python runtime from a config
+
+                               output, err := cmd.Output()
+                               if err != nil {
+                                       fmt.Println("[agent.go] Failed to run 
python command:", err)
+                                       return
+                               }
+
+                               stdoutString := string(output)
+                               if err := 
stream.Send(&protos.AgentMessage{Message: 
&protos.AgentMessage_PythonExecutionResponse{
+                                       PythonExecutionResponse: 
&protos.PythonExecutionResponse{
+                                               SessionId: sessionId, 
+                                               ExecutionId: executionId, 
+                                               ResponseString: 
stdoutString}}}); err != nil {
+                                       log.Printf("[agent.go] Failed to send 
execution result to server: %v", err)
+                               }
+
                        case *protos.ServerMessage_CommandExecutionRequest:
                                log.Printf("[agent.go] Recived a command 
execution request")
                                executionId := 
x.CommandExecutionRequest.ExecutionId
diff --git 
a/modules/agent-framework/airavata-agent/protos/agent-communication.pb.go 
b/modules/agent-framework/airavata-agent/protos/agent-communication.pb.go
index 89a349cf62..ba08688ed9 100644
--- a/modules/agent-framework/airavata-agent/protos/agent-communication.pb.go
+++ b/modules/agent-framework/airavata-agent/protos/agent-communication.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-//     protoc-gen-go v1.35.1
-//     protoc        v5.28.2
+//     protoc-gen-go v1.34.2
+//     protoc        v4.24.4
 // source: agent-communication.proto
 
 package protos
@@ -30,9 +30,11 @@ type AgentPing struct {
 
 func (x *AgentPing) Reset() {
        *x = AgentPing{}
-       mi := &file_agent_communication_proto_msgTypes[0]
-       ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-       ms.StoreMessageInfo(mi)
+       if protoimpl.UnsafeEnabled {
+               mi := &file_agent_communication_proto_msgTypes[0]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
 }
 
 func (x *AgentPing) String() string {
@@ -43,7 +45,7 @@ func (*AgentPing) ProtoMessage() {}
 
 func (x *AgentPing) ProtoReflect() protoreflect.Message {
        mi := &file_agent_communication_proto_msgTypes[0]
-       if x != nil {
+       if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
                        ms.StoreMessageInfo(mi)
@@ -76,9 +78,11 @@ type CommandExecutionResponse struct {
 
 func (x *CommandExecutionResponse) Reset() {
        *x = CommandExecutionResponse{}
-       mi := &file_agent_communication_proto_msgTypes[1]
-       ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-       ms.StoreMessageInfo(mi)
+       if protoimpl.UnsafeEnabled {
+               mi := &file_agent_communication_proto_msgTypes[1]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
 }
 
 func (x *CommandExecutionResponse) String() string {
@@ -89,7 +93,7 @@ func (*CommandExecutionResponse) ProtoMessage() {}
 
 func (x *CommandExecutionResponse) ProtoReflect() protoreflect.Message {
        mi := &file_agent_communication_proto_msgTypes[1]
-       if x != nil {
+       if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
                        ms.StoreMessageInfo(mi)
@@ -129,9 +133,11 @@ type ContainerExecutionResponse struct {
 
 func (x *ContainerExecutionResponse) Reset() {
        *x = ContainerExecutionResponse{}
-       mi := &file_agent_communication_proto_msgTypes[2]
-       ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-       ms.StoreMessageInfo(mi)
+       if protoimpl.UnsafeEnabled {
+               mi := &file_agent_communication_proto_msgTypes[2]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
 }
 
 func (x *ContainerExecutionResponse) String() string {
@@ -142,7 +148,7 @@ func (*ContainerExecutionResponse) ProtoMessage() {}
 
 func (x *ContainerExecutionResponse) ProtoReflect() protoreflect.Message {
        mi := &file_agent_communication_proto_msgTypes[2]
-       if x != nil {
+       if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
                        ms.StoreMessageInfo(mi)
@@ -183,9 +189,11 @@ type JupyterExecutionResponse struct {
 
 func (x *JupyterExecutionResponse) Reset() {
        *x = JupyterExecutionResponse{}
-       mi := &file_agent_communication_proto_msgTypes[3]
-       ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-       ms.StoreMessageInfo(mi)
+       if protoimpl.UnsafeEnabled {
+               mi := &file_agent_communication_proto_msgTypes[3]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
 }
 
 func (x *JupyterExecutionResponse) String() string {
@@ -196,7 +204,7 @@ func (*JupyterExecutionResponse) ProtoMessage() {}
 
 func (x *JupyterExecutionResponse) ProtoReflect() protoreflect.Message {
        mi := &file_agent_communication_proto_msgTypes[3]
-       if x != nil {
+       if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
                        ms.StoreMessageInfo(mi)
@@ -232,6 +240,69 @@ func (x *JupyterExecutionResponse) GetResponseString() 
string {
        return ""
 }
 
+type PythonExecutionResponse struct {
+       state         protoimpl.MessageState
+       sizeCache     protoimpl.SizeCache
+       unknownFields protoimpl.UnknownFields
+
+       ExecutionId    string `protobuf:"bytes,1,opt,name=executionId,proto3" 
json:"executionId,omitempty"`
+       SessionId      string `protobuf:"bytes,2,opt,name=sessionId,proto3" 
json:"sessionId,omitempty"`
+       ResponseString string 
`protobuf:"bytes,3,opt,name=responseString,proto3" 
json:"responseString,omitempty"`
+}
+
+func (x *PythonExecutionResponse) Reset() {
+       *x = PythonExecutionResponse{}
+       if protoimpl.UnsafeEnabled {
+               mi := &file_agent_communication_proto_msgTypes[4]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
+}
+
+func (x *PythonExecutionResponse) String() string {
+       return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PythonExecutionResponse) ProtoMessage() {}
+
+func (x *PythonExecutionResponse) ProtoReflect() protoreflect.Message {
+       mi := &file_agent_communication_proto_msgTypes[4]
+       if protoimpl.UnsafeEnabled && x != nil {
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               if ms.LoadMessageInfo() == nil {
+                       ms.StoreMessageInfo(mi)
+               }
+               return ms
+       }
+       return mi.MessageOf(x)
+}
+
+// Deprecated: Use PythonExecutionResponse.ProtoReflect.Descriptor instead.
+func (*PythonExecutionResponse) Descriptor() ([]byte, []int) {
+       return file_agent_communication_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *PythonExecutionResponse) GetExecutionId() string {
+       if x != nil {
+               return x.ExecutionId
+       }
+       return ""
+}
+
+func (x *PythonExecutionResponse) GetSessionId() string {
+       if x != nil {
+               return x.SessionId
+       }
+       return ""
+}
+
+func (x *PythonExecutionResponse) GetResponseString() string {
+       if x != nil {
+               return x.ResponseString
+       }
+       return ""
+}
+
 type TerminateExecutionResponse struct {
        state         protoimpl.MessageState
        sizeCache     protoimpl.SizeCache
@@ -243,9 +314,11 @@ type TerminateExecutionResponse struct {
 
 func (x *TerminateExecutionResponse) Reset() {
        *x = TerminateExecutionResponse{}
-       mi := &file_agent_communication_proto_msgTypes[4]
-       ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-       ms.StoreMessageInfo(mi)
+       if protoimpl.UnsafeEnabled {
+               mi := &file_agent_communication_proto_msgTypes[5]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
 }
 
 func (x *TerminateExecutionResponse) String() string {
@@ -255,8 +328,8 @@ func (x *TerminateExecutionResponse) String() string {
 func (*TerminateExecutionResponse) ProtoMessage() {}
 
 func (x *TerminateExecutionResponse) ProtoReflect() protoreflect.Message {
-       mi := &file_agent_communication_proto_msgTypes[4]
-       if x != nil {
+       mi := &file_agent_communication_proto_msgTypes[5]
+       if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
                        ms.StoreMessageInfo(mi)
@@ -268,7 +341,7 @@ func (x *TerminateExecutionResponse) ProtoReflect() 
protoreflect.Message {
 
 // Deprecated: Use TerminateExecutionResponse.ProtoReflect.Descriptor instead.
 func (*TerminateExecutionResponse) Descriptor() ([]byte, []int) {
-       return file_agent_communication_proto_rawDescGZIP(), []int{4}
+       return file_agent_communication_proto_rawDescGZIP(), []int{5}
 }
 
 func (x *TerminateExecutionResponse) GetStatus() string {
@@ -295,9 +368,11 @@ type TunnelCreationResponse struct {
 
 func (x *TunnelCreationResponse) Reset() {
        *x = TunnelCreationResponse{}
-       mi := &file_agent_communication_proto_msgTypes[5]
-       ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-       ms.StoreMessageInfo(mi)
+       if protoimpl.UnsafeEnabled {
+               mi := &file_agent_communication_proto_msgTypes[6]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
 }
 
 func (x *TunnelCreationResponse) String() string {
@@ -307,8 +382,8 @@ func (x *TunnelCreationResponse) String() string {
 func (*TunnelCreationResponse) ProtoMessage() {}
 
 func (x *TunnelCreationResponse) ProtoReflect() protoreflect.Message {
-       mi := &file_agent_communication_proto_msgTypes[5]
-       if x != nil {
+       mi := &file_agent_communication_proto_msgTypes[6]
+       if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
                        ms.StoreMessageInfo(mi)
@@ -320,7 +395,7 @@ func (x *TunnelCreationResponse) ProtoReflect() 
protoreflect.Message {
 
 // Deprecated: Use TunnelCreationResponse.ProtoReflect.Descriptor instead.
 func (*TunnelCreationResponse) Descriptor() ([]byte, []int) {
-       return file_agent_communication_proto_rawDescGZIP(), []int{5}
+       return file_agent_communication_proto_rawDescGZIP(), []int{6}
 }
 
 func (x *TunnelCreationResponse) GetStatus() string {
@@ -340,9 +415,11 @@ type TunnelTerminationResponse struct {
 
 func (x *TunnelTerminationResponse) Reset() {
        *x = TunnelTerminationResponse{}
-       mi := &file_agent_communication_proto_msgTypes[6]
-       ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-       ms.StoreMessageInfo(mi)
+       if protoimpl.UnsafeEnabled {
+               mi := &file_agent_communication_proto_msgTypes[7]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
 }
 
 func (x *TunnelTerminationResponse) String() string {
@@ -352,8 +429,8 @@ func (x *TunnelTerminationResponse) String() string {
 func (*TunnelTerminationResponse) ProtoMessage() {}
 
 func (x *TunnelTerminationResponse) ProtoReflect() protoreflect.Message {
-       mi := &file_agent_communication_proto_msgTypes[6]
-       if x != nil {
+       mi := &file_agent_communication_proto_msgTypes[7]
+       if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
                        ms.StoreMessageInfo(mi)
@@ -365,7 +442,7 @@ func (x *TunnelTerminationResponse) ProtoReflect() 
protoreflect.Message {
 
 // Deprecated: Use TunnelTerminationResponse.ProtoReflect.Descriptor instead.
 func (*TunnelTerminationResponse) Descriptor() ([]byte, []int) {
-       return file_agent_communication_proto_rawDescGZIP(), []int{6}
+       return file_agent_communication_proto_rawDescGZIP(), []int{7}
 }
 
 func (x *TunnelTerminationResponse) GetStatus() string {
@@ -387,14 +464,17 @@ type AgentMessage struct {
        //      *AgentMessage_ContainerExecutionResponse
        //      *AgentMessage_TerminateExecutionResponse
        //      *AgentMessage_JupyterExecutionResponse
+       //      *AgentMessage_PythonExecutionResponse
        Message isAgentMessage_Message `protobuf_oneof:"message"`
 }
 
 func (x *AgentMessage) Reset() {
        *x = AgentMessage{}
-       mi := &file_agent_communication_proto_msgTypes[7]
-       ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-       ms.StoreMessageInfo(mi)
+       if protoimpl.UnsafeEnabled {
+               mi := &file_agent_communication_proto_msgTypes[8]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
 }
 
 func (x *AgentMessage) String() string {
@@ -404,8 +484,8 @@ func (x *AgentMessage) String() string {
 func (*AgentMessage) ProtoMessage() {}
 
 func (x *AgentMessage) ProtoReflect() protoreflect.Message {
-       mi := &file_agent_communication_proto_msgTypes[7]
-       if x != nil {
+       mi := &file_agent_communication_proto_msgTypes[8]
+       if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
                        ms.StoreMessageInfo(mi)
@@ -417,7 +497,7 @@ func (x *AgentMessage) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use AgentMessage.ProtoReflect.Descriptor instead.
 func (*AgentMessage) Descriptor() ([]byte, []int) {
-       return file_agent_communication_proto_rawDescGZIP(), []int{7}
+       return file_agent_communication_proto_rawDescGZIP(), []int{8}
 }
 
 func (m *AgentMessage) GetMessage() isAgentMessage_Message {
@@ -462,6 +542,13 @@ func (x *AgentMessage) GetJupyterExecutionResponse() 
*JupyterExecutionResponse {
        return nil
 }
 
+func (x *AgentMessage) GetPythonExecutionResponse() *PythonExecutionResponse {
+       if x, ok := x.GetMessage().(*AgentMessage_PythonExecutionResponse); ok {
+               return x.PythonExecutionResponse
+       }
+       return nil
+}
+
 type isAgentMessage_Message interface {
        isAgentMessage_Message()
 }
@@ -486,6 +573,10 @@ type AgentMessage_JupyterExecutionResponse struct {
        JupyterExecutionResponse *JupyterExecutionResponse 
`protobuf:"bytes,5,opt,name=jupyterExecutionResponse,proto3,oneof"`
 }
 
+type AgentMessage_PythonExecutionResponse struct {
+       PythonExecutionResponse *PythonExecutionResponse 
`protobuf:"bytes,6,opt,name=pythonExecutionResponse,proto3,oneof"`
+}
+
 func (*AgentMessage_AgentPing) isAgentMessage_Message() {}
 
 func (*AgentMessage_CommandExecutionResponse) isAgentMessage_Message() {}
@@ -496,6 +587,8 @@ func (*AgentMessage_TerminateExecutionResponse) 
isAgentMessage_Message() {}
 
 func (*AgentMessage_JupyterExecutionResponse) isAgentMessage_Message() {}
 
+func (*AgentMessage_PythonExecutionResponse) isAgentMessage_Message() {}
+
 type ContainerExecutionRequest struct {
        state         protoimpl.MessageState
        sizeCache     protoimpl.SizeCache
@@ -509,9 +602,11 @@ type ContainerExecutionRequest struct {
 
 func (x *ContainerExecutionRequest) Reset() {
        *x = ContainerExecutionRequest{}
-       mi := &file_agent_communication_proto_msgTypes[8]
-       ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-       ms.StoreMessageInfo(mi)
+       if protoimpl.UnsafeEnabled {
+               mi := &file_agent_communication_proto_msgTypes[9]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
 }
 
 func (x *ContainerExecutionRequest) String() string {
@@ -521,8 +616,8 @@ func (x *ContainerExecutionRequest) String() string {
 func (*ContainerExecutionRequest) ProtoMessage() {}
 
 func (x *ContainerExecutionRequest) ProtoReflect() protoreflect.Message {
-       mi := &file_agent_communication_proto_msgTypes[8]
-       if x != nil {
+       mi := &file_agent_communication_proto_msgTypes[9]
+       if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
                        ms.StoreMessageInfo(mi)
@@ -534,7 +629,7 @@ func (x *ContainerExecutionRequest) ProtoReflect() 
protoreflect.Message {
 
 // Deprecated: Use ContainerExecutionRequest.ProtoReflect.Descriptor instead.
 func (*ContainerExecutionRequest) Descriptor() ([]byte, []int) {
-       return file_agent_communication_proto_rawDescGZIP(), []int{8}
+       return file_agent_communication_proto_rawDescGZIP(), []int{9}
 }
 
 func (x *ContainerExecutionRequest) GetExecutionId() string {
@@ -580,9 +675,11 @@ type TunnelCreationRequest struct {
 
 func (x *TunnelCreationRequest) Reset() {
        *x = TunnelCreationRequest{}
-       mi := &file_agent_communication_proto_msgTypes[9]
-       ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-       ms.StoreMessageInfo(mi)
+       if protoimpl.UnsafeEnabled {
+               mi := &file_agent_communication_proto_msgTypes[10]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
 }
 
 func (x *TunnelCreationRequest) String() string {
@@ -592,8 +689,8 @@ func (x *TunnelCreationRequest) String() string {
 func (*TunnelCreationRequest) ProtoMessage() {}
 
 func (x *TunnelCreationRequest) ProtoReflect() protoreflect.Message {
-       mi := &file_agent_communication_proto_msgTypes[9]
-       if x != nil {
+       mi := &file_agent_communication_proto_msgTypes[10]
+       if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
                        ms.StoreMessageInfo(mi)
@@ -605,7 +702,7 @@ func (x *TunnelCreationRequest) ProtoReflect() 
protoreflect.Message {
 
 // Deprecated: Use TunnelCreationRequest.ProtoReflect.Descriptor instead.
 func (*TunnelCreationRequest) Descriptor() ([]byte, []int) {
-       return file_agent_communication_proto_rawDescGZIP(), []int{9}
+       return file_agent_communication_proto_rawDescGZIP(), []int{10}
 }
 
 func (x *TunnelCreationRequest) GetDestinationHost() string {
@@ -662,9 +759,11 @@ type TunnelTerminationRequest struct {
 
 func (x *TunnelTerminationRequest) Reset() {
        *x = TunnelTerminationRequest{}
-       mi := &file_agent_communication_proto_msgTypes[10]
-       ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-       ms.StoreMessageInfo(mi)
+       if protoimpl.UnsafeEnabled {
+               mi := &file_agent_communication_proto_msgTypes[11]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
 }
 
 func (x *TunnelTerminationRequest) String() string {
@@ -674,8 +773,8 @@ func (x *TunnelTerminationRequest) String() string {
 func (*TunnelTerminationRequest) ProtoMessage() {}
 
 func (x *TunnelTerminationRequest) ProtoReflect() protoreflect.Message {
-       mi := &file_agent_communication_proto_msgTypes[10]
-       if x != nil {
+       mi := &file_agent_communication_proto_msgTypes[11]
+       if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
                        ms.StoreMessageInfo(mi)
@@ -687,7 +786,7 @@ func (x *TunnelTerminationRequest) ProtoReflect() 
protoreflect.Message {
 
 // Deprecated: Use TunnelTerminationRequest.ProtoReflect.Descriptor instead.
 func (*TunnelTerminationRequest) Descriptor() ([]byte, []int) {
-       return file_agent_communication_proto_rawDescGZIP(), []int{10}
+       return file_agent_communication_proto_rawDescGZIP(), []int{11}
 }
 
 func (x *TunnelTerminationRequest) GetDestinationHost() string {
@@ -723,9 +822,11 @@ type CommandExecutionRequest struct {
 
 func (x *CommandExecutionRequest) Reset() {
        *x = CommandExecutionRequest{}
-       mi := &file_agent_communication_proto_msgTypes[11]
-       ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-       ms.StoreMessageInfo(mi)
+       if protoimpl.UnsafeEnabled {
+               mi := &file_agent_communication_proto_msgTypes[12]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
 }
 
 func (x *CommandExecutionRequest) String() string {
@@ -735,8 +836,8 @@ func (x *CommandExecutionRequest) String() string {
 func (*CommandExecutionRequest) ProtoMessage() {}
 
 func (x *CommandExecutionRequest) ProtoReflect() protoreflect.Message {
-       mi := &file_agent_communication_proto_msgTypes[11]
-       if x != nil {
+       mi := &file_agent_communication_proto_msgTypes[12]
+       if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
                        ms.StoreMessageInfo(mi)
@@ -748,7 +849,7 @@ func (x *CommandExecutionRequest) ProtoReflect() 
protoreflect.Message {
 
 // Deprecated: Use CommandExecutionRequest.ProtoReflect.Descriptor instead.
 func (*CommandExecutionRequest) Descriptor() ([]byte, []int) {
-       return file_agent_communication_proto_rawDescGZIP(), []int{11}
+       return file_agent_communication_proto_rawDescGZIP(), []int{12}
 }
 
 func (x *CommandExecutionRequest) GetExecutionId() string {
@@ -785,9 +886,11 @@ type JupyterExecutionRequest struct {
 
 func (x *JupyterExecutionRequest) Reset() {
        *x = JupyterExecutionRequest{}
-       mi := &file_agent_communication_proto_msgTypes[12]
-       ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-       ms.StoreMessageInfo(mi)
+       if protoimpl.UnsafeEnabled {
+               mi := &file_agent_communication_proto_msgTypes[13]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
 }
 
 func (x *JupyterExecutionRequest) String() string {
@@ -797,8 +900,8 @@ func (x *JupyterExecutionRequest) String() string {
 func (*JupyterExecutionRequest) ProtoMessage() {}
 
 func (x *JupyterExecutionRequest) ProtoReflect() protoreflect.Message {
-       mi := &file_agent_communication_proto_msgTypes[12]
-       if x != nil {
+       mi := &file_agent_communication_proto_msgTypes[13]
+       if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
                        ms.StoreMessageInfo(mi)
@@ -810,7 +913,7 @@ func (x *JupyterExecutionRequest) ProtoReflect() 
protoreflect.Message {
 
 // Deprecated: Use JupyterExecutionRequest.ProtoReflect.Descriptor instead.
 func (*JupyterExecutionRequest) Descriptor() ([]byte, []int) {
-       return file_agent_communication_proto_rawDescGZIP(), []int{12}
+       return file_agent_communication_proto_rawDescGZIP(), []int{13}
 }
 
 func (x *JupyterExecutionRequest) GetExecutionId() string {
@@ -841,6 +944,101 @@ func (x *JupyterExecutionRequest) GetCode() string {
        return ""
 }
 
+type PythonExecutionRequest struct {
+       state         protoimpl.MessageState
+       sizeCache     protoimpl.SizeCache
+       unknownFields protoimpl.UnknownFields
+
+       ExecutionId   string   `protobuf:"bytes,1,opt,name=executionId,proto3" 
json:"executionId,omitempty"`
+       SessionId     string   `protobuf:"bytes,2,opt,name=sessionId,proto3" 
json:"sessionId,omitempty"`
+       KeepAlive     bool     `protobuf:"varint,3,opt,name=keepAlive,proto3" 
json:"keepAlive,omitempty"`
+       Libraries     []string `protobuf:"bytes,4,rep,name=libraries,proto3" 
json:"libraries,omitempty"`
+       Code          string   `protobuf:"bytes,5,opt,name=code,proto3" 
json:"code,omitempty"`
+       PythonVersion string   
`protobuf:"bytes,6,opt,name=pythonVersion,proto3" 
json:"pythonVersion,omitempty"`
+       WorkingDir    string   `protobuf:"bytes,7,opt,name=workingDir,proto3" 
json:"workingDir,omitempty"`
+}
+
+func (x *PythonExecutionRequest) Reset() {
+       *x = PythonExecutionRequest{}
+       if protoimpl.UnsafeEnabled {
+               mi := &file_agent_communication_proto_msgTypes[14]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
+}
+
+func (x *PythonExecutionRequest) String() string {
+       return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PythonExecutionRequest) ProtoMessage() {}
+
+func (x *PythonExecutionRequest) ProtoReflect() protoreflect.Message {
+       mi := &file_agent_communication_proto_msgTypes[14]
+       if protoimpl.UnsafeEnabled && x != nil {
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               if ms.LoadMessageInfo() == nil {
+                       ms.StoreMessageInfo(mi)
+               }
+               return ms
+       }
+       return mi.MessageOf(x)
+}
+
+// Deprecated: Use PythonExecutionRequest.ProtoReflect.Descriptor instead.
+func (*PythonExecutionRequest) Descriptor() ([]byte, []int) {
+       return file_agent_communication_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *PythonExecutionRequest) GetExecutionId() string {
+       if x != nil {
+               return x.ExecutionId
+       }
+       return ""
+}
+
+func (x *PythonExecutionRequest) GetSessionId() string {
+       if x != nil {
+               return x.SessionId
+       }
+       return ""
+}
+
+func (x *PythonExecutionRequest) GetKeepAlive() bool {
+       if x != nil {
+               return x.KeepAlive
+       }
+       return false
+}
+
+func (x *PythonExecutionRequest) GetLibraries() []string {
+       if x != nil {
+               return x.Libraries
+       }
+       return nil
+}
+
+func (x *PythonExecutionRequest) GetCode() string {
+       if x != nil {
+               return x.Code
+       }
+       return ""
+}
+
+func (x *PythonExecutionRequest) GetPythonVersion() string {
+       if x != nil {
+               return x.PythonVersion
+       }
+       return ""
+}
+
+func (x *PythonExecutionRequest) GetWorkingDir() string {
+       if x != nil {
+               return x.WorkingDir
+       }
+       return ""
+}
+
 type TerminateExecutionRequest struct {
        state         protoimpl.MessageState
        sizeCache     protoimpl.SizeCache
@@ -851,9 +1049,11 @@ type TerminateExecutionRequest struct {
 
 func (x *TerminateExecutionRequest) Reset() {
        *x = TerminateExecutionRequest{}
-       mi := &file_agent_communication_proto_msgTypes[13]
-       ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-       ms.StoreMessageInfo(mi)
+       if protoimpl.UnsafeEnabled {
+               mi := &file_agent_communication_proto_msgTypes[15]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
 }
 
 func (x *TerminateExecutionRequest) String() string {
@@ -863,8 +1063,8 @@ func (x *TerminateExecutionRequest) String() string {
 func (*TerminateExecutionRequest) ProtoMessage() {}
 
 func (x *TerminateExecutionRequest) ProtoReflect() protoreflect.Message {
-       mi := &file_agent_communication_proto_msgTypes[13]
-       if x != nil {
+       mi := &file_agent_communication_proto_msgTypes[15]
+       if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
                        ms.StoreMessageInfo(mi)
@@ -876,7 +1076,7 @@ func (x *TerminateExecutionRequest) ProtoReflect() 
protoreflect.Message {
 
 // Deprecated: Use TerminateExecutionRequest.ProtoReflect.Descriptor instead.
 func (*TerminateExecutionRequest) Descriptor() ([]byte, []int) {
-       return file_agent_communication_proto_rawDescGZIP(), []int{13}
+       return file_agent_communication_proto_rawDescGZIP(), []int{15}
 }
 
 func (x *TerminateExecutionRequest) GetExecutionId() string {
@@ -896,9 +1096,11 @@ type KillAgentRequest struct {
 
 func (x *KillAgentRequest) Reset() {
        *x = KillAgentRequest{}
-       mi := &file_agent_communication_proto_msgTypes[14]
-       ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-       ms.StoreMessageInfo(mi)
+       if protoimpl.UnsafeEnabled {
+               mi := &file_agent_communication_proto_msgTypes[16]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
 }
 
 func (x *KillAgentRequest) String() string {
@@ -908,8 +1110,8 @@ func (x *KillAgentRequest) String() string {
 func (*KillAgentRequest) ProtoMessage() {}
 
 func (x *KillAgentRequest) ProtoReflect() protoreflect.Message {
-       mi := &file_agent_communication_proto_msgTypes[14]
-       if x != nil {
+       mi := &file_agent_communication_proto_msgTypes[16]
+       if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
                        ms.StoreMessageInfo(mi)
@@ -921,7 +1123,7 @@ func (x *KillAgentRequest) ProtoReflect() 
protoreflect.Message {
 
 // Deprecated: Use KillAgentRequest.ProtoReflect.Descriptor instead.
 func (*KillAgentRequest) Descriptor() ([]byte, []int) {
-       return file_agent_communication_proto_rawDescGZIP(), []int{14}
+       return file_agent_communication_proto_rawDescGZIP(), []int{16}
 }
 
 func (x *KillAgentRequest) GetReason() string {
@@ -944,14 +1146,17 @@ type ServerMessage struct {
        //      *ServerMessage_KillAgentRequest
        //      *ServerMessage_TunnelCreationRequest
        //      *ServerMessage_JupyterExecutionRequest
+       //      *ServerMessage_PythonExecutionRequest
        Message isServerMessage_Message `protobuf_oneof:"message"`
 }
 
 func (x *ServerMessage) Reset() {
        *x = ServerMessage{}
-       mi := &file_agent_communication_proto_msgTypes[15]
-       ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-       ms.StoreMessageInfo(mi)
+       if protoimpl.UnsafeEnabled {
+               mi := &file_agent_communication_proto_msgTypes[17]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
 }
 
 func (x *ServerMessage) String() string {
@@ -961,8 +1166,8 @@ func (x *ServerMessage) String() string {
 func (*ServerMessage) ProtoMessage() {}
 
 func (x *ServerMessage) ProtoReflect() protoreflect.Message {
-       mi := &file_agent_communication_proto_msgTypes[15]
-       if x != nil {
+       mi := &file_agent_communication_proto_msgTypes[17]
+       if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
                        ms.StoreMessageInfo(mi)
@@ -974,7 +1179,7 @@ func (x *ServerMessage) ProtoReflect() 
protoreflect.Message {
 
 // Deprecated: Use ServerMessage.ProtoReflect.Descriptor instead.
 func (*ServerMessage) Descriptor() ([]byte, []int) {
-       return file_agent_communication_proto_rawDescGZIP(), []int{15}
+       return file_agent_communication_proto_rawDescGZIP(), []int{17}
 }
 
 func (m *ServerMessage) GetMessage() isServerMessage_Message {
@@ -1026,6 +1231,13 @@ func (x *ServerMessage) GetJupyterExecutionRequest() 
*JupyterExecutionRequest {
        return nil
 }
 
+func (x *ServerMessage) GetPythonExecutionRequest() *PythonExecutionRequest {
+       if x, ok := x.GetMessage().(*ServerMessage_PythonExecutionRequest); ok {
+               return x.PythonExecutionRequest
+       }
+       return nil
+}
+
 type isServerMessage_Message interface {
        isServerMessage_Message()
 }
@@ -1054,6 +1266,10 @@ type ServerMessage_JupyterExecutionRequest struct {
        JupyterExecutionRequest *JupyterExecutionRequest 
`protobuf:"bytes,6,opt,name=jupyterExecutionRequest,proto3,oneof"`
 }
 
+type ServerMessage_PythonExecutionRequest struct {
+       PythonExecutionRequest *PythonExecutionRequest 
`protobuf:"bytes,7,opt,name=pythonExecutionRequest,proto3,oneof"`
+}
+
 func (*ServerMessage_ContainerExecutionRequest) isServerMessage_Message() {}
 
 func (*ServerMessage_CommandExecutionRequest) isServerMessage_Message() {}
@@ -1066,6 +1282,8 @@ func (*ServerMessage_TunnelCreationRequest) 
isServerMessage_Message() {}
 
 func (*ServerMessage_JupyterExecutionRequest) isServerMessage_Message() {}
 
+func (*ServerMessage_PythonExecutionRequest) isServerMessage_Message() {}
+
 var File_agent_communication_proto protoreflect.FileDescriptor
 
 var file_agent_communication_proto_rawDesc = []byte{
@@ -1096,167 +1314,204 @@ var file_agent_communication_proto_rawDesc = []byte{
        0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 
0x72, 0x65, 0x73, 0x70,
        0x6f, 0x6e, 0x73, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x03, 
0x20, 0x01, 0x28, 0x09,
        0x52, 0x0e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x53, 0x74, 
0x72, 0x69, 0x6e, 0x67,
-       0x22, 0x56, 0x0a, 0x1a, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 
0x65, 0x45, 0x78, 0x65,
-       0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 
0x73, 0x65, 0x12, 0x16,
-       0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 
0x28, 0x09, 0x52, 0x06,
-       0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 
0x73, 0x63, 0x72, 0x69,
-       0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 
0x0b, 0x64, 0x65, 0x73,
-       0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x30, 0x0a, 0x16, 
0x54, 0x75, 0x6e, 0x6e,
-       0x65, 0x6c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 
0x73, 0x70, 0x6f, 0x6e,
+       0x22, 0x81, 0x01, 0x0a, 0x17, 0x50, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x45, 
0x78, 0x65, 0x63, 0x75,
+       0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 
0x12, 0x20, 0x0a, 0x0b,
+       0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 
0x01, 0x20, 0x01, 0x28,
+       0x09, 0x52, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 
0x49, 0x64, 0x12, 0x1c,
+       0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 
0x02, 0x20, 0x01, 0x28,
+       0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 
0x12, 0x26, 0x0a, 0x0e,
+       0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x53, 0x74, 0x72, 0x69, 
0x6e, 0x67, 0x18, 0x03,
+       0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 
0x73, 0x65, 0x53, 0x74,
+       0x72, 0x69, 0x6e, 0x67, 0x22, 0x56, 0x0a, 0x1a, 0x54, 0x65, 0x72, 0x6d, 
0x69, 0x6e, 0x61, 0x74,
+       0x65, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 
0x73, 0x70, 0x6f, 0x6e,
        0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 
0x18, 0x01, 0x20, 0x01,
-       0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x33, 
0x0a, 0x19, 0x54, 0x75,
-       0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 
0x69, 0x6f, 0x6e, 0x52,
-       0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 
0x74, 0x61, 0x74, 0x75,
-       0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 
0x74, 0x75, 0x73, 0x22,
-       0xb7, 0x04, 0x0a, 0x0c, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x73, 
0x73, 0x61, 0x67, 0x65,
-       0x12, 0x44, 0x0a, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x69, 0x6e, 
0x67, 0x18, 0x01, 0x20,
-       0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 
0x61, 0x63, 0x68, 0x65,
-       0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, 
0x65, 0x6e, 0x74, 0x2e,
-       0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 
0x09, 0x61, 0x67, 0x65,
-       0x6e, 0x74, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x71, 0x0a, 0x18, 0x63, 0x6f, 
0x6d, 0x6d, 0x61, 0x6e,
-       0x64, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 
0x73, 0x70, 0x6f, 0x6e,
-       0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x6f, 
0x72, 0x67, 0x2e, 0x61,
-       0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 
0x74, 0x61, 0x2e, 0x61,
-       0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 
0x45, 0x78, 0x65, 0x63,
-       0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 
0x65, 0x48, 0x00, 0x52,
-       0x18, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x45, 0x78, 0x65, 0x63, 
0x75, 0x74, 0x69, 0x6f,
-       0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 
0x1a, 0x63, 0x6f, 0x6e,
-       0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 
0x69, 0x6f, 0x6e, 0x52,
-       0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 
0x0b, 0x32, 0x35, 0x2e,
-       0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 
0x69, 0x72, 0x61, 0x76,
-       0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 
0x6e, 0x74, 0x61, 0x69,
-       0x6e, 0x65, 0x72, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 
0x52, 0x65, 0x73, 0x70,
-       0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x1a, 0x63, 0x6f, 0x6e, 0x74, 
0x61, 0x69, 0x6e, 0x65,
-       0x72, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 
0x73, 0x70, 0x6f, 0x6e,
-       0x73, 0x65, 0x12, 0x77, 0x0a, 0x1a, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 
0x61, 0x74, 0x65, 0x45,
-       0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 
0x6f, 0x6e, 0x73, 0x65,
-       0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x6f, 0x72, 0x67, 
0x2e, 0x61, 0x70, 0x61,
-       0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 
0x2e, 0x61, 0x67, 0x65,
-       0x6e, 0x74, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 
0x45, 0x78, 0x65, 0x63,
-       0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 
0x65, 0x48, 0x00, 0x52,
-       0x1a, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x45, 0x78, 
0x65, 0x63, 0x75, 0x74,
-       0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 
0x71, 0x0a, 0x18, 0x6a,
-       0x75, 0x70, 0x79, 0x74, 0x65, 0x72, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 
0x69, 0x6f, 0x6e, 0x52,
-       0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 
0x0b, 0x32, 0x33, 0x2e,
-       0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 
0x69, 0x72, 0x61, 0x76,
-       0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x75, 
0x70, 0x79, 0x74, 0x65,
-       0x72, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 
0x73, 0x70, 0x6f, 0x6e,
-       0x73, 0x65, 0x48, 0x00, 0x52, 0x18, 0x6a, 0x75, 0x70, 0x79, 0x74, 0x65, 
0x72, 0x45, 0x78, 0x65,
-       0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 
0x73, 0x65, 0x42, 0x09,
-       0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x9f, 0x01, 
0x0a, 0x19, 0x43, 0x6f,
+       0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 
0x0a, 0x0b, 0x64, 0x65,
+       0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 
0x01, 0x28, 0x09, 0x52,
+       0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 
0x22, 0x30, 0x0a, 0x16,
+       0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 
0x6f, 0x6e, 0x52, 0x65,
+       0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 
0x61, 0x74, 0x75, 0x73,
+       0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 
0x75, 0x73, 0x22, 0x33,
+       0x0a, 0x19, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 
0x69, 0x6e, 0x61, 0x74,
+       0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 
0x16, 0x0a, 0x06, 0x73,
+       0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 
0x06, 0x73, 0x74, 0x61,
+       0x74, 0x75, 0x73, 0x22, 0xa7, 0x05, 0x0a, 0x0c, 0x41, 0x67, 0x65, 0x6e, 
0x74, 0x4d, 0x65, 0x73,
+       0x73, 0x61, 0x67, 0x65, 0x12, 0x44, 0x0a, 0x09, 0x61, 0x67, 0x65, 0x6e, 
0x74, 0x50, 0x69, 0x6e,
+       0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x72, 
0x67, 0x2e, 0x61, 0x70,
+       0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 
0x61, 0x2e, 0x61, 0x67,
+       0x65, 0x6e, 0x74, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x69, 0x6e, 
0x67, 0x48, 0x00, 0x52,
+       0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x71, 
0x0a, 0x18, 0x63, 0x6f,
+       0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 
0x6f, 0x6e, 0x52, 0x65,
+       0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 
0x32, 0x33, 0x2e, 0x6f,
+       0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 
0x72, 0x61, 0x76, 0x61,
+       0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 
0x6d, 0x61, 0x6e, 0x64,
+       0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 
0x70, 0x6f, 0x6e, 0x73,
+       0x65, 0x48, 0x00, 0x52, 0x18, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 
0x45, 0x78, 0x65, 0x63,
+       0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 
0x65, 0x12, 0x77, 0x0a,
+       0x1a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 0x78, 
0x65, 0x63, 0x75, 0x74,
+       0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 
0x03, 0x20, 0x01, 0x28,
+       0x0b, 0x32, 0x35, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 
0x68, 0x65, 0x2e, 0x61,
+       0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, 
0x74, 0x2e, 0x43, 0x6f,
        0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 0x78, 0x65, 0x63, 0x75, 
0x74, 0x69, 0x6f, 0x6e,
+       0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x1a, 
0x63, 0x6f, 0x6e, 0x74,
+       0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 
0x6f, 0x6e, 0x52, 0x65,
+       0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 0x1a, 0x74, 0x65, 
0x72, 0x6d, 0x69, 0x6e,
+       0x61, 0x74, 0x65, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 
0x52, 0x65, 0x73, 0x70,
+       0x6f, 0x6e, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 
0x2e, 0x6f, 0x72, 0x67,
+       0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 
0x76, 0x61, 0x74, 0x61,
+       0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 
0x6e, 0x61, 0x74, 0x65,
+       0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 
0x70, 0x6f, 0x6e, 0x73,
+       0x65, 0x48, 0x00, 0x52, 0x1a, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 
0x74, 0x65, 0x45, 0x78,
+       0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 
0x6e, 0x73, 0x65, 0x12,
+       0x71, 0x0a, 0x18, 0x6a, 0x75, 0x70, 0x79, 0x74, 0x65, 0x72, 0x45, 0x78, 
0x65, 0x63, 0x75, 0x74,
+       0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 
0x05, 0x20, 0x01, 0x28,
+       0x0b, 0x32, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 
0x68, 0x65, 0x2e, 0x61,
+       0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, 
0x74, 0x2e, 0x4a, 0x75,
+       0x70, 0x79, 0x74, 0x65, 0x72, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 
0x6f, 0x6e, 0x52, 0x65,
+       0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x18, 0x6a, 0x75, 
0x70, 0x79, 0x74, 0x65,
+       0x72, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 
0x73, 0x70, 0x6f, 0x6e,
+       0x73, 0x65, 0x12, 0x6e, 0x0a, 0x17, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 
0x45, 0x78, 0x65, 0x63,
+       0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 
0x65, 0x18, 0x06, 0x20,
+       0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 
0x61, 0x63, 0x68, 0x65,
+       0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, 
0x65, 0x6e, 0x74, 0x2e,
+       0x50, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 
0x69, 0x6f, 0x6e, 0x52,
+       0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x17, 0x70, 
0x79, 0x74, 0x68, 0x6f,
+       0x6e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 
0x73, 0x70, 0x6f, 0x6e,
+       0x73, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 
0x65, 0x22, 0x9f, 0x01,
+       0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 
0x78, 0x65, 0x63, 0x75,
+       0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 
0x20, 0x0a, 0x0b, 0x65,
+       0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 
0x20, 0x01, 0x28, 0x09,
+       0x52, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 
0x64, 0x12, 0x24, 0x0a,
+       0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 
0x6d, 0x65, 0x18, 0x02,
+       0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 
0x6e, 0x65, 0x72, 0x4e,
+       0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 
0x65, 0x6e, 0x74, 0x73,
+       0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 
0x6d, 0x65, 0x6e, 0x74,
+       0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 
0x74, 0x68, 0x18, 0x04,
+       0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 
0x61, 0x74, 0x68, 0x22,
+       0xe9, 0x01, 0x0a, 0x15, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x72, 
0x65, 0x61, 0x74, 0x69,
+       0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 
0x0f, 0x64, 0x65, 0x73,
+       0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x6f, 0x73, 0x74, 
0x18, 0x01, 0x20, 0x01,
+       0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 
0x69, 0x6f, 0x6e, 0x48,
+       0x6f, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x73, 0x74, 0x69, 
0x6e, 0x61, 0x74, 0x69,
+       0x6f, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 
0x52, 0x0f, 0x64, 0x65,
+       0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x72, 
0x74, 0x12, 0x20, 0x0a,
+       0x0b, 0x73, 0x73, 0x68, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 
0x18, 0x03, 0x20, 0x01,
+       0x28, 0x09, 0x52, 0x0b, 0x73, 0x73, 0x68, 0x55, 0x73, 0x65, 0x72, 0x4e, 
0x61, 0x6d, 0x65, 0x12,
+       0x1e, 0x0a, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x72, 
0x74, 0x18, 0x04, 0x20,
+       0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 
0x6f, 0x72, 0x74, 0x12,
+       0x1e, 0x0a, 0x0a, 0x73, 0x73, 0x68, 0x4b, 0x65, 0x79, 0x50, 0x61, 0x74, 
0x68, 0x18, 0x05, 0x20,
+       0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x73, 0x68, 0x4b, 0x65, 0x79, 0x50, 
0x61, 0x74, 0x68, 0x12,
+       0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 
0x06, 0x20, 0x01, 0x28,
+       0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 
0x8e, 0x01, 0x0a, 0x18,
+       0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 
0x61, 0x74, 0x69, 0x6f,
+       0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x0f, 
0x64, 0x65, 0x73, 0x74,
+       0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x18, 
0x01, 0x20, 0x01, 0x28,
+       0x09, 0x52, 0x0f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 
0x6f, 0x6e, 0x48, 0x6f,
+       0x73, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 
0x61, 0x74, 0x69, 0x6f,
+       0x6e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 
0x0f, 0x64, 0x65, 0x73,
+       0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x72, 0x74, 
0x12, 0x1e, 0x0a, 0x0a,
+       0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 
0x20, 0x01, 0x28, 0x09,
+       0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 
0x22, 0x79, 0x0a, 0x17,
+       0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x45, 0x78, 0x65, 0x63, 0x75, 
0x74, 0x69, 0x6f, 0x6e,
        0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 
0x78, 0x65, 0x63, 0x75,
        0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 
0x52, 0x0b, 0x65, 0x78,
-       0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x24, 0x0a, 
0x0d, 0x63, 0x6f, 0x6e,
-       0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 
0x20, 0x01, 0x28, 0x09,
-       0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 
0x61, 0x6d, 0x65, 0x12,
-       0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 
0x18, 0x03, 0x20, 0x03,
-       0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 
0x73, 0x12, 0x1c, 0x0a,
-       0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 
0x20, 0x01, 0x28, 0x09,
-       0x52, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, 0x22, 
0xe9, 0x01, 0x0a, 0x15,
-       0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 
0x6f, 0x6e, 0x52, 0x65,
-       0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x73, 
0x74, 0x69, 0x6e, 0x61,
-       0x74, 0x69, 0x6f, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 
0x28, 0x09, 0x52, 0x0f,
-       0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 
0x6f, 0x73, 0x74, 0x12,
-       0x28, 0x0a, 0x0f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 
0x6f, 0x6e, 0x50, 0x6f,
-       0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 
0x73, 0x74, 0x69, 0x6e,
-       0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x20, 0x0a, 
0x0b, 0x73, 0x73, 0x68,
-       0x55, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 
0x28, 0x09, 0x52, 0x0b,
-       0x73, 0x73, 0x68, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 
0x1e, 0x0a, 0x0a, 0x73,
-       0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 
0x01, 0x28, 0x09, 0x52,
-       0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x12, 
0x1e, 0x0a, 0x0a, 0x73,
-       0x73, 0x68, 0x4b, 0x65, 0x79, 0x50, 0x61, 0x74, 0x68, 0x18, 0x05, 0x20, 
0x01, 0x28, 0x09, 0x52,
-       0x0a, 0x73, 0x73, 0x68, 0x4b, 0x65, 0x79, 0x50, 0x61, 0x74, 0x68, 0x12, 
0x1a, 0x0a, 0x08, 0x70,
-       0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 
0x09, 0x52, 0x08, 0x70,
-       0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x8e, 0x01, 0x0a, 0x18, 
0x54, 0x75, 0x6e, 0x6e,
-       0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 
0x6e, 0x52, 0x65, 0x71,
-       0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x73, 0x74, 
0x69, 0x6e, 0x61, 0x74,
-       0x69, 0x6f, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 
0x09, 0x52, 0x0f, 0x64,
-       0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x6f, 
0x73, 0x74, 0x12, 0x28,
-       0x0a, 0x0f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 
0x6e, 0x50, 0x6f, 0x72,
-       0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x64, 0x65, 0x73, 
0x74, 0x69, 0x6e, 0x61,
-       0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 
0x73, 0x6f, 0x75, 0x72,
-       0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 
0x52, 0x0a, 0x73, 0x6f,
-       0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x22, 0x79, 0x0a, 0x17, 
0x43, 0x6f, 0x6d, 0x6d,
-       0x61, 0x6e, 0x64, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 
0x52, 0x65, 0x71, 0x75,
+       0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1c, 0x0a, 
0x09, 0x61, 0x72, 0x67,
+       0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 
0x52, 0x09, 0x61, 0x72,
+       0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x77, 
0x6f, 0x72, 0x6b, 0x69,
+       0x6e, 0x67, 0x44, 0x69, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 
0x0a, 0x77, 0x6f, 0x72,
+       0x6b, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x72, 0x22, 0x8b, 0x01, 0x0a, 0x17, 
0x4a, 0x75, 0x70, 0x79,
+       0x74, 0x65, 0x72, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 
0x52, 0x65, 0x71, 0x75,
        0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 
0x74, 0x69, 0x6f, 0x6e,
        0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x78, 
0x65, 0x63, 0x75, 0x74,
-       0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 
0x75, 0x6d, 0x65, 0x6e,
-       0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 
0x67, 0x75, 0x6d, 0x65,
-       0x6e, 0x74, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x69, 
0x6e, 0x67, 0x44, 0x69,
-       0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 
0x6b, 0x69, 0x6e, 0x67,
-       0x44, 0x69, 0x72, 0x22, 0x8b, 0x01, 0x0a, 0x17, 0x4a, 0x75, 0x70, 0x79, 
0x74, 0x65, 0x72, 0x45,
+       0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 
0x73, 0x69, 0x6f, 0x6e,
+       0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 
0x73, 0x73, 0x69, 0x6f,
+       0x6e, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x41, 
0x6c, 0x69, 0x76, 0x65,
+       0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 
0x41, 0x6c, 0x69, 0x76,
+       0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 
0x01, 0x28, 0x09, 0x52,
+       0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0xee, 0x01, 0x0a, 0x16, 0x50, 0x79, 
0x74, 0x68, 0x6f, 0x6e,
+       0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 
0x75, 0x65, 0x73, 0x74,
+       0x12, 0x20, 0x0a, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 
0x6e, 0x49, 0x64, 0x18,
+       0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 
0x74, 0x69, 0x6f, 0x6e,
+       0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 
0x6e, 0x49, 0x64, 0x18,
+       0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 
0x6f, 0x6e, 0x49, 0x64,
+       0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 
0x65, 0x18, 0x03, 0x20,
+       0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 
0x76, 0x65, 0x12, 0x1c,
+       0x0a, 0x09, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 
0x04, 0x20, 0x03, 0x28,
+       0x09, 0x52, 0x09, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 
0x12, 0x12, 0x0a, 0x04,
+       0x63, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 
0x63, 0x6f, 0x64, 0x65,
+       0x12, 0x24, 0x0a, 0x0d, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x56, 0x65, 
0x72, 0x73, 0x69, 0x6f,
+       0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x79, 0x74, 
0x68, 0x6f, 0x6e, 0x56,
+       0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x77, 0x6f, 
0x72, 0x6b, 0x69, 0x6e,
+       0x67, 0x44, 0x69, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 
0x77, 0x6f, 0x72, 0x6b,
+       0x69, 0x6e, 0x67, 0x44, 0x69, 0x72, 0x22, 0x3d, 0x0a, 0x19, 0x54, 0x65, 
0x72, 0x6d, 0x69, 0x6e,
+       0x61, 0x74, 0x65, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 
0x52, 0x65, 0x71, 0x75,
+       0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 
0x74, 0x69, 0x6f, 0x6e,
+       0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x78, 
0x65, 0x63, 0x75, 0x74,
+       0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x2a, 0x0a, 0x10, 0x4b, 0x69, 0x6c, 
0x6c, 0x41, 0x67, 0x65,
+       0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 
0x06, 0x72, 0x65, 0x61,
+       0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 
0x65, 0x61, 0x73, 0x6f,
+       0x6e, 0x22, 0x98, 0x06, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 
0x4d, 0x65, 0x73, 0x73,
+       0x61, 0x67, 0x65, 0x12, 0x74, 0x0a, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 
0x69, 0x6e, 0x65, 0x72,
+       0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 
0x75, 0x65, 0x73, 0x74,
+       0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x72, 0x67, 
0x2e, 0x61, 0x70, 0x61,
+       0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 
0x2e, 0x61, 0x67, 0x65,
+       0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 
0x45, 0x78, 0x65, 0x63,
+       0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 
0x48, 0x00, 0x52, 0x19,
+       0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 0x78, 0x65, 
0x63, 0x75, 0x74, 0x69,
+       0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x6e, 0x0a, 
0x17, 0x63, 0x6f, 0x6d,
+       0x6d, 0x61, 0x6e, 0x64, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 
0x6e, 0x52, 0x65, 0x71,
+       0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 
0x2e, 0x6f, 0x72, 0x67,
+       0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 
0x76, 0x61, 0x74, 0x61,
+       0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 
0x6e, 0x64, 0x45, 0x78,
+       0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 
0x73, 0x74, 0x48, 0x00,
+       0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x45, 0x78, 0x65, 
0x63, 0x75, 0x74, 0x69,
+       0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x74, 0x0a, 
0x19, 0x74, 0x65, 0x72,
+       0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 
0x69, 0x6f, 0x6e, 0x52,
+       0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 
0x32, 0x34, 0x2e, 0x6f,
+       0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 
0x72, 0x61, 0x76, 0x61,
+       0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x72, 
0x6d, 0x69, 0x6e, 0x61,
+       0x74, 0x65, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 
0x65, 0x71, 0x75, 0x65,
+       0x73, 0x74, 0x48, 0x00, 0x52, 0x19, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 
0x61, 0x74, 0x65, 0x45,
        0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 
0x65, 0x73, 0x74, 0x12,
-       0x20, 0x0a, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 
0x49, 0x64, 0x18, 0x01,
-       0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 
0x69, 0x6f, 0x6e, 0x49,
-       0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 
0x49, 0x64, 0x18, 0x02,
-       0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 
0x6e, 0x49, 0x64, 0x12,
-       0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 
0x18, 0x03, 0x20, 0x01,
-       0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 
0x65, 0x12, 0x12, 0x0a,
-       0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 
0x04, 0x63, 0x6f, 0x64,
-       0x65, 0x22, 0x3d, 0x0a, 0x19, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 
0x74, 0x65, 0x45, 0x78,
-       0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 
0x73, 0x74, 0x12, 0x20,
-       0x0a, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 
0x64, 0x18, 0x01, 0x20,
-       0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 
0x6f, 0x6e, 0x49, 0x64,
-       0x22, 0x2a, 0x0a, 0x10, 0x4b, 0x69, 0x6c, 0x6c, 0x41, 0x67, 0x65, 0x6e, 
0x74, 0x52, 0x65, 0x71,
-       0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 
0x6f, 0x6e, 0x18, 0x01,
-       0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 
0x22, 0xab, 0x05, 0x0a,
-       0x0d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 
0x67, 0x65, 0x12, 0x74,
-       0x0a, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 
0x78, 0x65, 0x63, 0x75,
-       0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 
0x01, 0x20, 0x01, 0x28,
-       0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 
0x68, 0x65, 0x2e, 0x61,
-       0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, 
0x74, 0x2e, 0x43, 0x6f,
-       0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 0x78, 0x65, 0x63, 0x75, 
0x74, 0x69, 0x6f, 0x6e,
-       0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x19, 0x63, 
0x6f, 0x6e, 0x74, 0x61,
-       0x69, 0x6e, 0x65, 0x72, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 
0x6e, 0x52, 0x65, 0x71,
-       0x75, 0x65, 0x73, 0x74, 0x12, 0x6e, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 
0x61, 0x6e, 0x64, 0x45,
+       0x59, 0x0a, 0x10, 0x6b, 0x69, 0x6c, 0x6c, 0x41, 0x67, 0x65, 0x6e, 0x74, 
0x52, 0x65, 0x71, 0x75,
+       0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 
0x6f, 0x72, 0x67, 0x2e,
+       0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 
0x61, 0x74, 0x61, 0x2e,
+       0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x41, 0x67, 
0x65, 0x6e, 0x74, 0x52,
+       0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x10, 0x6b, 0x69, 
0x6c, 0x6c, 0x41, 0x67,
+       0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x68, 
0x0a, 0x15, 0x74, 0x75,
+       0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 
0x52, 0x65, 0x71, 0x75,
+       0x65, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 
0x6f, 0x72, 0x67, 0x2e,
+       0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 
0x61, 0x74, 0x61, 0x2e,
+       0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 
0x43, 0x72, 0x65, 0x61,
+       0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 
0x00, 0x52, 0x15, 0x74,
+       0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 
0x6e, 0x52, 0x65, 0x71,
+       0x75, 0x65, 0x73, 0x74, 0x12, 0x6e, 0x0a, 0x17, 0x6a, 0x75, 0x70, 0x79, 
0x74, 0x65, 0x72, 0x45,
        0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 
0x65, 0x73, 0x74, 0x18,
-       0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 
0x61, 0x70, 0x61, 0x63,
+       0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 
0x61, 0x70, 0x61, 0x63,
        0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 
0x61, 0x67, 0x65, 0x6e,
-       0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x45, 0x78, 0x65, 
0x63, 0x75, 0x74, 0x69,
-       0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 
0x17, 0x63, 0x6f, 0x6d,
-       0x6d, 0x61, 0x6e, 0x64, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 
0x6e, 0x52, 0x65, 0x71,
-       0x75, 0x65, 0x73, 0x74, 0x12, 0x74, 0x0a, 0x19, 0x74, 0x65, 0x72, 0x6d, 
0x69, 0x6e, 0x61, 0x74,
-       0x65, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 
0x71, 0x75, 0x65, 0x73,
-       0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x72, 
0x67, 0x2e, 0x61, 0x70,
-       0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 
0x61, 0x2e, 0x61, 0x67,
-       0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 
0x65, 0x45, 0x78, 0x65,
-       0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 
0x74, 0x48, 0x00, 0x52,
-       0x19, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x45, 0x78, 
0x65, 0x63, 0x75, 0x74,
-       0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x59, 
0x0a, 0x10, 0x6b, 0x69,
-       0x6c, 0x6c, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 
0x73, 0x74, 0x18, 0x04,
-       0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 
0x70, 0x61, 0x63, 0x68,
-       0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 
0x67, 0x65, 0x6e, 0x74,
-       0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 
0x71, 0x75, 0x65, 0x73,
-       0x74, 0x48, 0x00, 0x52, 0x10, 0x6b, 0x69, 0x6c, 0x6c, 0x41, 0x67, 0x65, 
0x6e, 0x74, 0x52, 0x65,
-       0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x68, 0x0a, 0x15, 0x74, 0x75, 0x6e, 
0x6e, 0x65, 0x6c, 0x43,
-       0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 
0x73, 0x74, 0x18, 0x05,
-       0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 
0x70, 0x61, 0x63, 0x68,
-       0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 
0x67, 0x65, 0x6e, 0x74,
-       0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x72, 0x65, 0x61, 0x74, 
0x69, 0x6f, 0x6e, 0x52,
-       0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x15, 0x74, 0x75, 
0x6e, 0x6e, 0x65, 0x6c,
-       0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 
0x65, 0x73, 0x74, 0x12,
-       0x6e, 0x0a, 0x17, 0x6a, 0x75, 0x70, 0x79, 0x74, 0x65, 0x72, 0x45, 0x78, 
0x65, 0x63, 0x75, 0x74,
-       0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x06, 
0x20, 0x01, 0x28, 0x0b,
-       0x32, 0x32, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 
0x65, 0x2e, 0x61, 0x69,
-       0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 
0x2e, 0x4a, 0x75, 0x70,
+       0x74, 0x2e, 0x4a, 0x75, 0x70, 0x79, 0x74, 0x65, 0x72, 0x45, 0x78, 0x65, 
0x63, 0x75, 0x74, 0x69,
+       0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 
0x17, 0x6a, 0x75, 0x70,
        0x79, 0x74, 0x65, 0x72, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 
0x6e, 0x52, 0x65, 0x71,
-       0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x17, 0x6a, 0x75, 0x70, 0x79, 
0x74, 0x65, 0x72, 0x45,
-       0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 
0x65, 0x73, 0x74, 0x42,
-       0x09, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x86, 
0x01, 0x0a, 0x19, 0x41,
-       0x67, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, 
0x61, 0x74, 0x69, 0x6f,
-       0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x69, 0x0a, 0x10, 
0x63, 0x72, 0x65, 0x61,
-       0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x75, 0x73, 
0x12, 0x27, 0x2e, 0x6f,
-       0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 
0x72, 0x61, 0x76, 0x61,
-       0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x67, 0x65, 
0x6e, 0x74, 0x4d, 0x65,
-       0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x28, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 
0x61, 0x70, 0x61, 0x63,
-       0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 
0x61, 0x67, 0x65, 0x6e,
-       0x74, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 
0x61, 0x67, 0x65, 0x28,
-       0x01, 0x30, 0x01, 0x42, 0x3f, 0x0a, 0x19, 0x6f, 0x72, 0x67, 0x2e, 0x61, 
0x70, 0x61, 0x63, 0x68,
+       0x75, 0x65, 0x73, 0x74, 0x12, 0x6b, 0x0a, 0x16, 0x70, 0x79, 0x74, 0x68, 
0x6f, 0x6e, 0x45, 0x78,
+       0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 
0x73, 0x74, 0x18, 0x07,
+       0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 
0x70, 0x61, 0x63, 0x68,
        0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 
0x67, 0x65, 0x6e, 0x74,
-       0x42, 0x17, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 
0x6e, 0x69, 0x63, 0x61,
-       0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 
0x07, 0x70, 0x72, 0x6f,
-       0x74, 0x6f, 0x73, 0x2f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+       0x2e, 0x50, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x45, 0x78, 0x65, 0x63, 0x75, 
0x74, 0x69, 0x6f, 0x6e,
+       0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x16, 0x70, 
0x79, 0x74, 0x68, 0x6f,
+       0x6e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 
0x71, 0x75, 0x65, 0x73,
+       0x74, 0x42, 0x09, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 
0x32, 0x86, 0x01, 0x0a,
+       0x19, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 
0x69, 0x63, 0x61, 0x74,
+       0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x69, 
0x0a, 0x10, 0x63, 0x72,
+       0x65, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 
0x75, 0x73, 0x12, 0x27,
+       0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 
0x61, 0x69, 0x72, 0x61,
+       0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 
0x67, 0x65, 0x6e, 0x74,
+       0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x28, 0x2e, 0x6f, 0x72, 
0x67, 0x2e, 0x61, 0x70,
+       0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 
0x61, 0x2e, 0x61, 0x67,
+       0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 
0x73, 0x73, 0x61, 0x67,
+       0x65, 0x28, 0x01, 0x30, 0x01, 0x42, 0x3f, 0x0a, 0x19, 0x6f, 0x72, 0x67, 
0x2e, 0x61, 0x70, 0x61,
+       0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 
0x2e, 0x61, 0x67, 0x65,
+       0x6e, 0x74, 0x42, 0x17, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 
0x6d, 0x75, 0x6e, 0x69,
+       0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 
0x01, 0x5a, 0x07, 0x70,
+       0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 
0x6f, 0x33,
 }
 
 var (
@@ -1271,44 +1526,48 @@ func file_agent_communication_proto_rawDescGZIP() 
[]byte {
        return file_agent_communication_proto_rawDescData
 }
 
-var file_agent_communication_proto_msgTypes = make([]protoimpl.MessageInfo, 16)
+var file_agent_communication_proto_msgTypes = make([]protoimpl.MessageInfo, 18)
 var file_agent_communication_proto_goTypes = []any{
        (*AgentPing)(nil),                  // 0: 
org.apache.airavata.agent.AgentPing
        (*CommandExecutionResponse)(nil),   // 1: 
org.apache.airavata.agent.CommandExecutionResponse
        (*ContainerExecutionResponse)(nil), // 2: 
org.apache.airavata.agent.ContainerExecutionResponse
        (*JupyterExecutionResponse)(nil),   // 3: 
org.apache.airavata.agent.JupyterExecutionResponse
-       (*TerminateExecutionResponse)(nil), // 4: 
org.apache.airavata.agent.TerminateExecutionResponse
-       (*TunnelCreationResponse)(nil),     // 5: 
org.apache.airavata.agent.TunnelCreationResponse
-       (*TunnelTerminationResponse)(nil),  // 6: 
org.apache.airavata.agent.TunnelTerminationResponse
-       (*AgentMessage)(nil),               // 7: 
org.apache.airavata.agent.AgentMessage
-       (*ContainerExecutionRequest)(nil),  // 8: 
org.apache.airavata.agent.ContainerExecutionRequest
-       (*TunnelCreationRequest)(nil),      // 9: 
org.apache.airavata.agent.TunnelCreationRequest
-       (*TunnelTerminationRequest)(nil),   // 10: 
org.apache.airavata.agent.TunnelTerminationRequest
-       (*CommandExecutionRequest)(nil),    // 11: 
org.apache.airavata.agent.CommandExecutionRequest
-       (*JupyterExecutionRequest)(nil),    // 12: 
org.apache.airavata.agent.JupyterExecutionRequest
-       (*TerminateExecutionRequest)(nil),  // 13: 
org.apache.airavata.agent.TerminateExecutionRequest
-       (*KillAgentRequest)(nil),           // 14: 
org.apache.airavata.agent.KillAgentRequest
-       (*ServerMessage)(nil),              // 15: 
org.apache.airavata.agent.ServerMessage
+       (*PythonExecutionResponse)(nil),    // 4: 
org.apache.airavata.agent.PythonExecutionResponse
+       (*TerminateExecutionResponse)(nil), // 5: 
org.apache.airavata.agent.TerminateExecutionResponse
+       (*TunnelCreationResponse)(nil),     // 6: 
org.apache.airavata.agent.TunnelCreationResponse
+       (*TunnelTerminationResponse)(nil),  // 7: 
org.apache.airavata.agent.TunnelTerminationResponse
+       (*AgentMessage)(nil),               // 8: 
org.apache.airavata.agent.AgentMessage
+       (*ContainerExecutionRequest)(nil),  // 9: 
org.apache.airavata.agent.ContainerExecutionRequest
+       (*TunnelCreationRequest)(nil),      // 10: 
org.apache.airavata.agent.TunnelCreationRequest
+       (*TunnelTerminationRequest)(nil),   // 11: 
org.apache.airavata.agent.TunnelTerminationRequest
+       (*CommandExecutionRequest)(nil),    // 12: 
org.apache.airavata.agent.CommandExecutionRequest
+       (*JupyterExecutionRequest)(nil),    // 13: 
org.apache.airavata.agent.JupyterExecutionRequest
+       (*PythonExecutionRequest)(nil),     // 14: 
org.apache.airavata.agent.PythonExecutionRequest
+       (*TerminateExecutionRequest)(nil),  // 15: 
org.apache.airavata.agent.TerminateExecutionRequest
+       (*KillAgentRequest)(nil),           // 16: 
org.apache.airavata.agent.KillAgentRequest
+       (*ServerMessage)(nil),              // 17: 
org.apache.airavata.agent.ServerMessage
 }
 var file_agent_communication_proto_depIdxs = []int32{
        0,  // 0: org.apache.airavata.agent.AgentMessage.agentPing:type_name -> 
org.apache.airavata.agent.AgentPing
        1,  // 1: 
org.apache.airavata.agent.AgentMessage.commandExecutionResponse:type_name -> 
org.apache.airavata.agent.CommandExecutionResponse
        2,  // 2: 
org.apache.airavata.agent.AgentMessage.containerExecutionResponse:type_name -> 
org.apache.airavata.agent.ContainerExecutionResponse
-       4,  // 3: 
org.apache.airavata.agent.AgentMessage.terminateExecutionResponse:type_name -> 
org.apache.airavata.agent.TerminateExecutionResponse
+       5,  // 3: 
org.apache.airavata.agent.AgentMessage.terminateExecutionResponse:type_name -> 
org.apache.airavata.agent.TerminateExecutionResponse
        3,  // 4: 
org.apache.airavata.agent.AgentMessage.jupyterExecutionResponse:type_name -> 
org.apache.airavata.agent.JupyterExecutionResponse
-       8,  // 5: 
org.apache.airavata.agent.ServerMessage.containerExecutionRequest:type_name -> 
org.apache.airavata.agent.ContainerExecutionRequest
-       11, // 6: 
org.apache.airavata.agent.ServerMessage.commandExecutionRequest:type_name -> 
org.apache.airavata.agent.CommandExecutionRequest
-       13, // 7: 
org.apache.airavata.agent.ServerMessage.terminateExecutionRequest:type_name -> 
org.apache.airavata.agent.TerminateExecutionRequest
-       14, // 8: 
org.apache.airavata.agent.ServerMessage.killAgentRequest:type_name -> 
org.apache.airavata.agent.KillAgentRequest
-       9,  // 9: 
org.apache.airavata.agent.ServerMessage.tunnelCreationRequest:type_name -> 
org.apache.airavata.agent.TunnelCreationRequest
-       12, // 10: 
org.apache.airavata.agent.ServerMessage.jupyterExecutionRequest:type_name -> 
org.apache.airavata.agent.JupyterExecutionRequest
-       7,  // 11: 
org.apache.airavata.agent.AgentCommunicationService.createMessageBus:input_type 
-> org.apache.airavata.agent.AgentMessage
-       15, // 12: 
org.apache.airavata.agent.AgentCommunicationService.createMessageBus:output_type
 -> org.apache.airavata.agent.ServerMessage
-       12, // [12:13] is the sub-list for method output_type
-       11, // [11:12] is the sub-list for method input_type
-       11, // [11:11] is the sub-list for extension type_name
-       11, // [11:11] is the sub-list for extension extendee
-       0,  // [0:11] is the sub-list for field type_name
+       4,  // 5: 
org.apache.airavata.agent.AgentMessage.pythonExecutionResponse:type_name -> 
org.apache.airavata.agent.PythonExecutionResponse
+       9,  // 6: 
org.apache.airavata.agent.ServerMessage.containerExecutionRequest:type_name -> 
org.apache.airavata.agent.ContainerExecutionRequest
+       12, // 7: 
org.apache.airavata.agent.ServerMessage.commandExecutionRequest:type_name -> 
org.apache.airavata.agent.CommandExecutionRequest
+       15, // 8: 
org.apache.airavata.agent.ServerMessage.terminateExecutionRequest:type_name -> 
org.apache.airavata.agent.TerminateExecutionRequest
+       16, // 9: 
org.apache.airavata.agent.ServerMessage.killAgentRequest:type_name -> 
org.apache.airavata.agent.KillAgentRequest
+       10, // 10: 
org.apache.airavata.agent.ServerMessage.tunnelCreationRequest:type_name -> 
org.apache.airavata.agent.TunnelCreationRequest
+       13, // 11: 
org.apache.airavata.agent.ServerMessage.jupyterExecutionRequest:type_name -> 
org.apache.airavata.agent.JupyterExecutionRequest
+       14, // 12: 
org.apache.airavata.agent.ServerMessage.pythonExecutionRequest:type_name -> 
org.apache.airavata.agent.PythonExecutionRequest
+       8,  // 13: 
org.apache.airavata.agent.AgentCommunicationService.createMessageBus:input_type 
-> org.apache.airavata.agent.AgentMessage
+       17, // 14: 
org.apache.airavata.agent.AgentCommunicationService.createMessageBus:output_type
 -> org.apache.airavata.agent.ServerMessage
+       14, // [14:15] is the sub-list for method output_type
+       13, // [13:14] is the sub-list for method input_type
+       13, // [13:13] is the sub-list for extension type_name
+       13, // [13:13] is the sub-list for extension extendee
+       0,  // [0:13] is the sub-list for field type_name
 }
 
 func init() { file_agent_communication_proto_init() }
@@ -1316,20 +1575,240 @@ func file_agent_communication_proto_init() {
        if File_agent_communication_proto != nil {
                return
        }
-       file_agent_communication_proto_msgTypes[7].OneofWrappers = []any{
+       if !protoimpl.UnsafeEnabled {
+               file_agent_communication_proto_msgTypes[0].Exporter = func(v 
any, i int) any {
+                       switch v := v.(*AgentPing); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+               file_agent_communication_proto_msgTypes[1].Exporter = func(v 
any, i int) any {
+                       switch v := v.(*CommandExecutionResponse); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+               file_agent_communication_proto_msgTypes[2].Exporter = func(v 
any, i int) any {
+                       switch v := v.(*ContainerExecutionResponse); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+               file_agent_communication_proto_msgTypes[3].Exporter = func(v 
any, i int) any {
+                       switch v := v.(*JupyterExecutionResponse); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+               file_agent_communication_proto_msgTypes[4].Exporter = func(v 
any, i int) any {
+                       switch v := v.(*PythonExecutionResponse); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+               file_agent_communication_proto_msgTypes[5].Exporter = func(v 
any, i int) any {
+                       switch v := v.(*TerminateExecutionResponse); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+               file_agent_communication_proto_msgTypes[6].Exporter = func(v 
any, i int) any {
+                       switch v := v.(*TunnelCreationResponse); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+               file_agent_communication_proto_msgTypes[7].Exporter = func(v 
any, i int) any {
+                       switch v := v.(*TunnelTerminationResponse); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+               file_agent_communication_proto_msgTypes[8].Exporter = func(v 
any, i int) any {
+                       switch v := v.(*AgentMessage); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+               file_agent_communication_proto_msgTypes[9].Exporter = func(v 
any, i int) any {
+                       switch v := v.(*ContainerExecutionRequest); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+               file_agent_communication_proto_msgTypes[10].Exporter = func(v 
any, i int) any {
+                       switch v := v.(*TunnelCreationRequest); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+               file_agent_communication_proto_msgTypes[11].Exporter = func(v 
any, i int) any {
+                       switch v := v.(*TunnelTerminationRequest); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+               file_agent_communication_proto_msgTypes[12].Exporter = func(v 
any, i int) any {
+                       switch v := v.(*CommandExecutionRequest); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+               file_agent_communication_proto_msgTypes[13].Exporter = func(v 
any, i int) any {
+                       switch v := v.(*JupyterExecutionRequest); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+               file_agent_communication_proto_msgTypes[14].Exporter = func(v 
any, i int) any {
+                       switch v := v.(*PythonExecutionRequest); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+               file_agent_communication_proto_msgTypes[15].Exporter = func(v 
any, i int) any {
+                       switch v := v.(*TerminateExecutionRequest); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+               file_agent_communication_proto_msgTypes[16].Exporter = func(v 
any, i int) any {
+                       switch v := v.(*KillAgentRequest); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+               file_agent_communication_proto_msgTypes[17].Exporter = func(v 
any, i int) any {
+                       switch v := v.(*ServerMessage); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+       }
+       file_agent_communication_proto_msgTypes[8].OneofWrappers = []any{
                (*AgentMessage_AgentPing)(nil),
                (*AgentMessage_CommandExecutionResponse)(nil),
                (*AgentMessage_ContainerExecutionResponse)(nil),
                (*AgentMessage_TerminateExecutionResponse)(nil),
                (*AgentMessage_JupyterExecutionResponse)(nil),
+               (*AgentMessage_PythonExecutionResponse)(nil),
        }
-       file_agent_communication_proto_msgTypes[15].OneofWrappers = []any{
+       file_agent_communication_proto_msgTypes[17].OneofWrappers = []any{
                (*ServerMessage_ContainerExecutionRequest)(nil),
                (*ServerMessage_CommandExecutionRequest)(nil),
                (*ServerMessage_TerminateExecutionRequest)(nil),
                (*ServerMessage_KillAgentRequest)(nil),
                (*ServerMessage_TunnelCreationRequest)(nil),
                (*ServerMessage_JupyterExecutionRequest)(nil),
+               (*ServerMessage_PythonExecutionRequest)(nil),
        }
        type x struct{}
        out := protoimpl.TypeBuilder{
@@ -1337,7 +1816,7 @@ func file_agent_communication_proto_init() {
                        GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
                        RawDescriptor: file_agent_communication_proto_rawDesc,
                        NumEnums:      0,
-                       NumMessages:   16,
+                       NumMessages:   18,
                        NumExtensions: 0,
                        NumServices:   1,
                },
diff --git 
a/modules/agent-framework/airavata-agent/protos/agent-communication_grpc.pb.go 
b/modules/agent-framework/airavata-agent/protos/agent-communication_grpc.pb.go
index 28badf0990..d32e4d18eb 100644
--- 
a/modules/agent-framework/airavata-agent/protos/agent-communication_grpc.pb.go
+++ 
b/modules/agent-framework/airavata-agent/protos/agent-communication_grpc.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
-// - protoc-gen-go-grpc v1.5.1
-// - protoc             v5.28.2
+// - protoc-gen-go-grpc v1.4.0
+// - protoc             v4.24.4
 // source: agent-communication.proto
 
 package protos
@@ -15,8 +15,8 @@ import (
 
 // This is a compile-time assertion to ensure that this generated file
 // is compatible with the grpc package it is being compiled against.
-// Requires gRPC-Go v1.64.0 or later.
-const _ = grpc.SupportPackageIsVersion9
+// Requires gRPC-Go v1.62.0 or later.
+const _ = grpc.SupportPackageIsVersion8
 
 const (
        AgentCommunicationService_CreateMessageBus_FullMethodName = 
"/org.apache.airavata.agent.AgentCommunicationService/createMessageBus"
@@ -26,7 +26,7 @@ const (
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please 
refer to 
https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
 type AgentCommunicationServiceClient interface {
-       CreateMessageBus(ctx context.Context, opts ...grpc.CallOption) 
(grpc.BidiStreamingClient[AgentMessage, ServerMessage], error)
+       CreateMessageBus(ctx context.Context, opts ...grpc.CallOption) 
(AgentCommunicationService_CreateMessageBusClient, error)
 }
 
 type agentCommunicationServiceClient struct {
@@ -37,40 +37,55 @@ func NewAgentCommunicationServiceClient(cc 
grpc.ClientConnInterface) AgentCommun
        return &agentCommunicationServiceClient{cc}
 }
 
-func (c *agentCommunicationServiceClient) CreateMessageBus(ctx 
context.Context, opts ...grpc.CallOption) 
(grpc.BidiStreamingClient[AgentMessage, ServerMessage], error) {
+func (c *agentCommunicationServiceClient) CreateMessageBus(ctx 
context.Context, opts ...grpc.CallOption) 
(AgentCommunicationService_CreateMessageBusClient, error) {
        cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
        stream, err := c.cc.NewStream(ctx, 
&AgentCommunicationService_ServiceDesc.Streams[0], 
AgentCommunicationService_CreateMessageBus_FullMethodName, cOpts...)
        if err != nil {
                return nil, err
        }
-       x := &grpc.GenericClientStream[AgentMessage, 
ServerMessage]{ClientStream: stream}
+       x := &agentCommunicationServiceCreateMessageBusClient{ClientStream: 
stream}
        return x, nil
 }
 
-// This type alias is provided for backwards compatibility with existing code 
that references the prior non-generic stream type by name.
-type AgentCommunicationService_CreateMessageBusClient = 
grpc.BidiStreamingClient[AgentMessage, ServerMessage]
+type AgentCommunicationService_CreateMessageBusClient interface {
+       Send(*AgentMessage) error
+       Recv() (*ServerMessage, error)
+       grpc.ClientStream
+}
+
+type agentCommunicationServiceCreateMessageBusClient struct {
+       grpc.ClientStream
+}
+
+func (x *agentCommunicationServiceCreateMessageBusClient) Send(m 
*AgentMessage) error {
+       return x.ClientStream.SendMsg(m)
+}
+
+func (x *agentCommunicationServiceCreateMessageBusClient) Recv() 
(*ServerMessage, error) {
+       m := new(ServerMessage)
+       if err := x.ClientStream.RecvMsg(m); err != nil {
+               return nil, err
+       }
+       return m, nil
+}
 
 // AgentCommunicationServiceServer is the server API for 
AgentCommunicationService service.
 // All implementations must embed UnimplementedAgentCommunicationServiceServer
-// for forward compatibility.
+// for forward compatibility
 type AgentCommunicationServiceServer interface {
-       CreateMessageBus(grpc.BidiStreamingServer[AgentMessage, ServerMessage]) 
error
+       CreateMessageBus(AgentCommunicationService_CreateMessageBusServer) error
        mustEmbedUnimplementedAgentCommunicationServiceServer()
 }
 
-// UnimplementedAgentCommunicationServiceServer must be embedded to have
-// forward compatible implementations.
-//
-// NOTE: this should be embedded by value instead of pointer to avoid a nil
-// pointer dereference when methods are called.
-type UnimplementedAgentCommunicationServiceServer struct{}
+// UnimplementedAgentCommunicationServiceServer must be embedded to have 
forward compatible implementations.
+type UnimplementedAgentCommunicationServiceServer struct {
+}
 
-func (UnimplementedAgentCommunicationServiceServer) 
CreateMessageBus(grpc.BidiStreamingServer[AgentMessage, ServerMessage]) error {
+func (UnimplementedAgentCommunicationServiceServer) 
CreateMessageBus(AgentCommunicationService_CreateMessageBusServer) error {
        return status.Errorf(codes.Unimplemented, "method CreateMessageBus not 
implemented")
 }
 func (UnimplementedAgentCommunicationServiceServer) 
mustEmbedUnimplementedAgentCommunicationServiceServer() {
 }
-func (UnimplementedAgentCommunicationServiceServer) testEmbeddedByValue() {}
 
 // UnsafeAgentCommunicationServiceServer may be embedded to opt out of forward 
compatibility for this service.
 // Use of this interface is not recommended, as added methods to 
AgentCommunicationServiceServer will
@@ -80,22 +95,34 @@ type UnsafeAgentCommunicationServiceServer interface {
 }
 
 func RegisterAgentCommunicationServiceServer(s grpc.ServiceRegistrar, srv 
AgentCommunicationServiceServer) {
-       // If the following call pancis, it indicates 
UnimplementedAgentCommunicationServiceServer was
-       // embedded by pointer and is nil.  This will cause panics if an
-       // unimplemented method is ever invoked, so we test this at 
initialization
-       // time to prevent it from happening at runtime later due to I/O.
-       if t, ok := srv.(interface{ testEmbeddedByValue() }); ok {
-               t.testEmbeddedByValue()
-       }
        s.RegisterService(&AgentCommunicationService_ServiceDesc, srv)
 }
 
 func _AgentCommunicationService_CreateMessageBus_Handler(srv interface{}, 
stream grpc.ServerStream) error {
-       return 
srv.(AgentCommunicationServiceServer).CreateMessageBus(&grpc.GenericServerStream[AgentMessage,
 ServerMessage]{ServerStream: stream})
+       return 
srv.(AgentCommunicationServiceServer).CreateMessageBus(&agentCommunicationServiceCreateMessageBusServer{ServerStream:
 stream})
+}
+
+type AgentCommunicationService_CreateMessageBusServer interface {
+       Send(*ServerMessage) error
+       Recv() (*AgentMessage, error)
+       grpc.ServerStream
+}
+
+type agentCommunicationServiceCreateMessageBusServer struct {
+       grpc.ServerStream
 }
 
-// This type alias is provided for backwards compatibility with existing code 
that references the prior non-generic stream type by name.
-type AgentCommunicationService_CreateMessageBusServer = 
grpc.BidiStreamingServer[AgentMessage, ServerMessage]
+func (x *agentCommunicationServiceCreateMessageBusServer) Send(m 
*ServerMessage) error {
+       return x.ServerStream.SendMsg(m)
+}
+
+func (x *agentCommunicationServiceCreateMessageBusServer) Recv() 
(*AgentMessage, error) {
+       m := new(AgentMessage)
+       if err := x.ServerStream.RecvMsg(m); err != nil {
+               return nil, err
+       }
+       return m, nil
+}
 
 // AgentCommunicationService_ServiceDesc is the grpc.ServiceDesc for 
AgentCommunicationService service.
 // It's only intended for direct use with grpc.RegisterService,

Reply via email to