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

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

commit 38b64e7c38802c5b1ca9f99cdff6e27a4473e471
Author: yasith <[email protected]>
AuthorDate: Thu Apr 3 08:14:55 2025 -0400

    add kernel restart functionality to agent service and agent
---
 .../service/controllers/AgentController.java       |  21 +
 .../service/handlers/AgentConnectionHandler.java   |  53 ++
 .../service/models/AgentKernelRestartAck.java      |   4 +
 .../service/models/AgentKernelRestartRequest.java  |  23 +
 .../service/models/AgentKernelRestartResponse.java |  32 ++
 modules/agent-framework/airavata-agent/agent.go    | 127 +++--
 .../protos/agent-communication.pb.go               | 626 ++++++++++++++-------
 .../proto/agent-communication.proto                |  20 +-
 8 files changed, 646 insertions(+), 260 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 8cdc790b48..f223264c92 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
@@ -13,6 +13,9 @@ import 
org.apache.airavata.agent.connection.service.models.AgentInfoResponse;
 import 
org.apache.airavata.agent.connection.service.models.AgentJupyterExecutionAck;
 import 
org.apache.airavata.agent.connection.service.models.AgentJupyterExecutionRequest;
 import 
org.apache.airavata.agent.connection.service.models.AgentJupyterExecutionResponse;
+import 
org.apache.airavata.agent.connection.service.models.AgentKernelRestartAck;
+import 
org.apache.airavata.agent.connection.service.models.AgentKernelRestartRequest;
+import 
org.apache.airavata.agent.connection.service.models.AgentKernelRestartResponse;
 import 
org.apache.airavata.agent.connection.service.models.AgentPythonExecutionAck;
 import 
org.apache.airavata.agent.connection.service.models.AgentPythonExecutionRequest;
 import 
org.apache.airavata.agent.connection.service.models.AgentPythonExecutionResponse;
@@ -67,6 +70,24 @@ public class AgentController {
         return 
ResponseEntity.accepted().body(agentConnectionHandler.getEnvSetupResponse(executionId));
     }
 
+    @PostMapping("/setup/restart")
+    public ResponseEntity<AgentKernelRestartAck> 
runKernelRestartOnAgent(@Valid @RequestBody AgentKernelRestartRequest 
kernelRestartRequest) {
+        logger.info("Received kernel restart request to run on agent {}", 
kernelRestartRequest.getAgentId());
+        if 
(agentConnectionHandler.isAgentUp(kernelRestartRequest.getAgentId()).isAgentUp())
 {
+            return 
ResponseEntity.accepted().body(agentConnectionHandler.runKernelRestartOnAgent(kernelRestartRequest));
+        } else {
+            logger.warn("No agent is available to run on agent {}", 
kernelRestartRequest.getAgentId());
+            AgentKernelRestartAck ack = new AgentKernelRestartAck();
+            ack.setError("Agent not found");
+            return ResponseEntity.accepted().body(ack);
+        }
+    }
+
+    @GetMapping("/setup/restart/{executionId}")
+    public ResponseEntity<AgentKernelRestartResponse> 
getKernelRestartResponse(@PathVariable("executionId") String executionId) {
+        return 
ResponseEntity.accepted().body(agentConnectionHandler.getKernelRestartResponse(executionId));
+    }
+
     @PostMapping("/execute/shell")
     public ResponseEntity<AgentCommandExecutionAck> runCommandOnAgent(@Valid 
@RequestBody AgentCommandExecutionRequest commandRequest) {
         logger.info("Received command request to run on agent {}", 
commandRequest.getAgentId());
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 9ce52d4fe7..b809cf4db4 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
@@ -1,5 +1,6 @@
 package org.apache.airavata.agent.connection.service.handlers;
 
+import java.awt.image.Kernel;
 import java.util.Map;
 import java.util.Optional;
 import java.util.UUID;
@@ -12,6 +13,8 @@ import org.apache.airavata.agent.CommandExecutionRequest;
 import org.apache.airavata.agent.CommandExecutionResponse;
 import org.apache.airavata.agent.EnvSetupResponse;
 import org.apache.airavata.agent.JupyterExecutionResponse;
+import org.apache.airavata.agent.KernelRestartRequest;
+import org.apache.airavata.agent.KernelRestartResponse;
 import org.apache.airavata.agent.PythonExecutionRequest;
 import org.apache.airavata.agent.PythonExecutionResponse;
 import org.apache.airavata.agent.ServerMessage;
@@ -26,6 +29,9 @@ import 
org.apache.airavata.agent.connection.service.models.AgentInfoResponse;
 import 
org.apache.airavata.agent.connection.service.models.AgentJupyterExecutionAck;
 import 
org.apache.airavata.agent.connection.service.models.AgentJupyterExecutionRequest;
 import 
org.apache.airavata.agent.connection.service.models.AgentJupyterExecutionResponse;
+import 
org.apache.airavata.agent.connection.service.models.AgentKernelRestartAck;
+import 
org.apache.airavata.agent.connection.service.models.AgentKernelRestartRequest;
+import 
org.apache.airavata.agent.connection.service.models.AgentKernelRestartResponse;
 import 
org.apache.airavata.agent.connection.service.models.AgentPythonExecutionAck;
 import 
org.apache.airavata.agent.connection.service.models.AgentPythonExecutionRequest;
 import 
org.apache.airavata.agent.connection.service.models.AgentPythonExecutionResponse;
@@ -52,6 +58,7 @@ public class AgentConnectionHandler extends 
AgentCommunicationServiceGrpc.AgentC
     private final Map<String, EnvSetupResponse> ENV_SETUP_RESPONSE_CACHE = new 
ConcurrentHashMap<>();
     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, KernelRestartResponse> 
KERNEL_RESTART_RESPONSE_CACHE = new ConcurrentHashMap<>();
     private final Map<String, PythonExecutionResponse> 
PYTHON_EXECUTION_RESPONSE_CACHE = new ConcurrentHashMap<>();
 
     // response handling
@@ -103,6 +110,19 @@ public class AgentConnectionHandler extends 
AgentCommunicationServiceGrpc.AgentC
         return executionResponse;
     }
 
+    public AgentKernelRestartResponse getKernelRestartResponse(String 
executionId) {
+        AgentKernelRestartResponse kernelRestartResponse = new 
AgentKernelRestartResponse();
+        if (KERNEL_RESTART_RESPONSE_CACHE.containsKey(executionId)) {
+            
kernelRestartResponse.setStatus(KERNEL_RESTART_RESPONSE_CACHE.get(executionId).getStatus());
+            kernelRestartResponse.setExecutionId(executionId);
+            kernelRestartResponse.setRestarted(true);
+            KERNEL_RESTART_RESPONSE_CACHE.remove(executionId);
+        } else {
+            kernelRestartResponse.setRestarted(false);
+        }
+        return kernelRestartResponse;
+    }
+
     public AgentPythonExecutionResponse getPythonExecutionResponse(String 
executionId) {
         AgentPythonExecutionResponse runResponse = new 
AgentPythonExecutionResponse();
         if (PYTHON_EXECUTION_RESPONSE_CACHE.containsKey(executionId)) {
@@ -269,6 +289,31 @@ public class AgentConnectionHandler extends 
AgentCommunicationServiceGrpc.AgentC
         return ack;
     }
 
+    public AgentKernelRestartAck 
runKernelRestartOnAgent(AgentKernelRestartRequest kernelRestartRequest) {
+        String executionId = UUID.randomUUID().toString();
+        AgentKernelRestartAck ack = new AgentKernelRestartAck();
+        ack.setExecutionId(executionId);
+        Optional<StreamObserver<ServerMessage>> agentStreamObserver = 
getAgentStreamObserver(kernelRestartRequest.getAgentId());
+        if (agentStreamObserver.isPresent()) {
+            try {
+                logger.info("restarting kernel on env {}...", 
kernelRestartRequest.getEnvName());
+                
agentStreamObserver.get().onNext(ServerMessage.newBuilder().setKernelRestartRequest(
+                        KernelRestartRequest.newBuilder()
+                                .setExecutionId(executionId)
+                                .setEnvName(kernelRestartRequest.getEnvName())
+                                .build()
+                ).build());
+            } catch (Exception e) {
+                logger.error("{} Failed to restart kernel on env {}!", 
executionId, kernelRestartRequest.getEnvName(), e);
+                ack.setError(e.getMessage());
+            }
+        } else {
+            logger.warn("No agent found to run the kernel restart on agent 
{}", kernelRestartRequest.getAgentId());
+            ack.setError("No agent found to run the kernel restart on agent " 
+ kernelRestartRequest.getAgentId());
+        }
+        return ack;
+    }
+
     // internal handlers
     private void handleAgentPing(AgentPing agentPing, String streamId) {
         logger.info("Received agent ping for agent id {}", 
agentPing.getAgentId());
@@ -290,6 +335,11 @@ public class AgentConnectionHandler extends 
AgentCommunicationServiceGrpc.AgentC
         
JUPYTER_EXECUTION_RESPONSE_CACHE.put(executionResponse.getExecutionId(), 
executionResponse);
     }
 
+    private void handleKernelRestartResponse(KernelRestartResponse 
kernelRestartResponse) {
+        logger.info("Received kernel restart response for execution id {}", 
kernelRestartResponse.getExecutionId());
+        
KERNEL_RESTART_RESPONSE_CACHE.put(kernelRestartResponse.getExecutionId(), 
kernelRestartResponse);
+    }
+
     private void handlePythonExecutionResponse(PythonExecutionResponse 
executionResponse) {
         logger.info("Received python execution response for execution id {}", 
executionResponse.getExecutionId());
         
PYTHON_EXECUTION_RESPONSE_CACHE.put(executionResponse.getExecutionId(), 
executionResponse);
@@ -327,6 +377,9 @@ public class AgentConnectionHandler extends 
AgentCommunicationServiceGrpc.AgentC
                     case JUPYTEREXECUTIONRESPONSE -> {
                         
handleJupyterExecutionResponse(request.getJupyterExecutionResponse());
                     }
+                    case KERNELRESTARTRESPONSE -> {
+                        
handleKernelRestartResponse(request.getKernelRestartResponse());
+                    }
                     case PYTHONEXECUTIONRESPONSE -> {
                         
handlePythonExecutionResponse(request.getPythonExecutionResponse());
                     }
diff --git 
a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentKernelRestartAck.java
 
b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentKernelRestartAck.java
new file mode 100644
index 0000000000..0854e068b7
--- /dev/null
+++ 
b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentKernelRestartAck.java
@@ -0,0 +1,4 @@
+package org.apache.airavata.agent.connection.service.models;
+
+public class AgentKernelRestartAck extends AgentCommandExecutionAck {
+}
diff --git 
a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentKernelRestartRequest.java
 
b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentKernelRestartRequest.java
new file mode 100644
index 0000000000..aff821df7e
--- /dev/null
+++ 
b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentKernelRestartRequest.java
@@ -0,0 +1,23 @@
+package org.apache.airavata.agent.connection.service.models;
+
+public class AgentKernelRestartRequest {
+
+    private String agentId;
+    private String envName;
+
+    public String getAgentId() {
+        return agentId;
+    }
+
+    public void setAgentId(String agentId) {
+        this.agentId = agentId;
+    }
+
+    public String getEnvName() {
+        return envName;
+    }
+
+    public void setEnvName(String envName) {
+        this.envName = envName;
+    }
+}
diff --git 
a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentKernelRestartResponse.java
 
b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentKernelRestartResponse.java
new file mode 100644
index 0000000000..4a2e632076
--- /dev/null
+++ 
b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentKernelRestartResponse.java
@@ -0,0 +1,32 @@
+package org.apache.airavata.agent.connection.service.models;
+
+public class AgentKernelRestartResponse {
+
+    private String executionId;
+    private String status;
+    private boolean restarted;
+
+    public String getExecutionId() {
+        return executionId;
+    }
+
+    public void setExecutionId(String executionId) {
+        this.executionId = executionId;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public boolean getRestarted() {
+        return restarted;
+    }
+
+    public void setRestarted(boolean restarted) {
+        this.restarted = restarted;
+    }
+}
diff --git a/modules/agent-framework/airavata-agent/agent.go 
b/modules/agent-framework/airavata-agent/agent.go
index 3b8000aea9..1519d92454 100644
--- a/modules/agent-framework/airavata-agent/agent.go
+++ b/modules/agent-framework/airavata-agent/agent.go
@@ -15,6 +15,7 @@ import (
        "os"
        "os/exec"
        "strings"
+       "time"
 
        "golang.org/x/crypto/ssh"
        "google.golang.org/grpc"
@@ -23,11 +24,13 @@ import (
 
 type Stream = grpc.BidiStreamingClient[protos.AgentMessage, 
protos.ServerMessage]
 
+var pidMap = make(map[string]int)
+
 func main() {
 
        // get CLI args
-       serverUrl := os.Args[0]
-       agentId := os.Args[1]
+       serverUrl := os.Args[1]
+       agentId := os.Args[2]
 
        conn, err := grpc.NewClient(serverUrl, 
grpc.WithTransportCredentials(insecure.NewCredentials()))
        if err != nil {
@@ -115,6 +118,12 @@ func startInterceptor(stream Stream, grpcStreamChannel 
chan struct{}) {
                        code := x.JupyterExecutionRequest.Code
                        go executeJupyter(stream, executionId, envName, code)
 
+               case *protos.ServerMessage_KernelRestartRequest:
+                       log.Printf("[agent.go] Recived a kernel restart 
request\n")
+                       executionId := x.KernelRestartRequest.ExecutionId
+                       envName = x.KernelRestartRequest.EnvName
+                       go restartKernel(stream, executionId, envName)
+
                case *protos.ServerMessage_TunnelCreationRequest:
                        log.Printf("[agent.go] Received a tunnel creation 
request\n")
                        executionId := x.TunnelCreationRequest.ExecutionId
@@ -133,32 +142,42 @@ func createEnv(stream Stream, executionId string, envName 
string, envLibs []stri
        log.Printf("[agent.go] createEnv() Env name %s\n", envName)
        log.Printf("[agent.go] createEnv() Env libs %s\n", envLibs)
        log.Printf("[agent.go] createEnv() Env pip %s\n", envPip)
+       // cleanup previous kernel if exists
+       if pid, exists := pidMap[envName]; exists {
+               cmd := exec.Command("kill", fmt.Sprintf("%d", pid))
+               if err := cmd.Run(); err != nil {
+                       log.Printf("[agent.go] createEnv() Failed to kill 
existing process with PID %d: %v\n", pid, err)
+               } else {
+                       log.Printf("[agent.go] createEnv() Successfully killed 
existing process with PID %d\n", pid)
+               }
+               delete(pidMap, envName)
+       }
        // create environment
        if envName != "base" {
                createEnvCmd := exec.Command("micromamba", "create", "-n", 
envName, "--yes", "--quiet")
-               if err := createEnvCmd.Wait(); err != nil {
+               if err := createEnvCmd.Run(); err != nil {
                        log.Printf("[agent.go] createEnv() Error creating 
environment: %v\n", err)
                        return
                }
                log.Printf("[agent.go] createEnv() Environment created: %s\n", 
envName)
        }
-
-       if len(envLibs) > 0 {
-               installDepsCmd := exec.Command("micromamba", "install", "-n", 
envName, "--yes", "--quiet", strings.Join(envLibs, " "))
-               if err := installDepsCmd.Wait(); err != nil {
-                       log.Printf("[agent.go] createEnv() Error waiting for 
command: %v\n", err)
-                       return
-               }
+       envLibs = append(envLibs, "python<3.12", "pip", "ipykernel", "git", 
"flask", "jupyter_client")
+       installDepsCmd := exec.Command("micromamba", "install", "-n", envName, 
"--yes")
+       installDepsCmd.Args = append(installDepsCmd.Args, envLibs...)
+       if err := installDepsCmd.Run(); err != nil {
+               log.Printf("[agent.go] createEnv() Error waiting for command: 
%v\n", err)
+               return
        }
        if len(envPip) > 0 {
-               installPipCmd := exec.Command("micromamba", "run", "-n", 
envName, "pip", "install", strings.Join(envLibs, " "))
-               if err := installPipCmd.Wait(); err != nil {
+               installPipCmd := exec.Command("micromamba", "run", "-n", 
envName, "pip", "install")
+               installPipCmd.Args = append(installPipCmd.Args, envPip...)
+               if err := installPipCmd.Run(); err != nil {
                        log.Printf("[agent.go] createEnv() Error waiting for 
command: %v\n", err)
                        return
                }
        }
-       // start python server
-       go startPythonServer(envName)
+       // start kernel in new environment
+       pidMap[envName] = startJupyterKernel(envName)
        msg := &protos.AgentMessage{
                Message: &protos.AgentMessage_EnvSetupResponse{
                        EnvSetupResponse: &protos.EnvSetupResponse{
@@ -174,42 +193,44 @@ func createEnv(stream Stream, executionId string, envName 
string, envLibs []stri
        }
 }
 
-func startPythonServer(envName string) {
-       log.Printf("[agent.go] startPythonServer() Starting python server in 
env: %s...\n", envName)
+func startJupyterKernel(envName string) int {
+       log.Printf("[agent.go] startJupyterKernel() Starting python server in 
env: %s...\n", envName)
        // Run command
        cmd := exec.Command("micromamba", "run", "-n", envName, "python", 
"/opt/jupyter/kernel.py")
        stdout, err := cmd.StdoutPipe()
        if err != nil {
-               log.Printf("[agent.go] startPythonServer() Error creating 
StdoutPipe for cmd: %v\n", err)
-               return
+               log.Printf("[agent.go] startJupyterKernel() Error creating 
StdoutPipe for cmd: %v\n", err)
+               return 0
        }
        stderr, err := cmd.StderrPipe()
        if err != nil {
-               log.Printf("[agent.go] startPythonServer() Error creating 
StderrPipe for cmd: %v\n", err)
-               return
+               log.Printf("[agent.go] startJupyterKernel() Error creating 
StderrPipe for cmd: %v\n", err)
+               return 0
        }
        if err := cmd.Start(); err != nil {
-               log.Printf("[agent.go] startPythonServer() Error during start: 
%v\n", err)
-               return
+               log.Printf("[agent.go] startJupyterKernel() Error during start: 
%v\n", err)
+               return 0
        }
-       log.Printf("[agent.go] startPythonServer() Started python server.\n")
+       log.Printf("[agent.go] startJupyterKernel() Started python server.\n")
        go func() {
                stdoutScanner := bufio.NewScanner(stdout)
                for stdoutScanner.Scan() {
-                       log.Printf("[agent.go] startPythonServer() stdout: 
%s\n", stdoutScanner.Text())
+                       log.Printf("[agent.go] startJupyterKernel() stdout: 
%s\n", stdoutScanner.Text())
                }
        }()
        go func() {
                stderrScanner := bufio.NewScanner(stderr)
                for stderrScanner.Scan() {
-                       log.Printf("[agent.go] startPythonServer() stderr: 
%s\n", stderrScanner.Text())
+                       log.Printf("[agent.go] startJupyterKernel() stderr: 
%s\n", stderrScanner.Text())
                }
        }()
-       if err := cmd.Wait(); err != nil {
-               log.Printf("[agent.go] startPythonServer() Error waiting for 
command: %v\n", err)
-               return
-       }
-       log.Printf("[agent.go] startPythonServer() Command finished.\n")
+       go func() {
+               if err := cmd.Wait(); err != nil {
+                       log.Printf("[agent.go] startJupyterKernel() Error 
waiting for command: %v\n", err)
+               }
+       }()
+       log.Printf("[agent.go] startJupyterKernel() Command finished.\n")
+       return cmd.Process.Pid
 }
 
 func executePython(stream Stream, executionId string, envName string, 
workingDir string, code string) {
@@ -218,16 +239,13 @@ func executePython(stream Stream, executionId string, 
envName string, workingDir
        log.Printf("[agent.go] executePython() Working Dir %s\n", workingDir)
        log.Printf("[agent.go] executePython() Code %s\n", code)
        // Run command
-       cmd := exec.Command("micromamba", "run", "-n", envName, "python", "-c")
+       cmd := exec.Command("micromamba", "run", "-n", envName, "python", "-c", 
code)
        cmd.Dir = workingDir
-       cmd.Stdin = strings.NewReader(code)
        output, err := cmd.CombinedOutput()
-       var responseString string
+       responseString := string(output)
        if err != nil {
-               responseString = fmt.Sprintf("Error: %v", err)
                log.Printf("[agent.go] executePython() error: %v\n", err)
        } else {
-               responseString = string(output)
                log.Printf("[agent.go] executePython() completed: %s\n", 
responseString)
        }
        msg := &protos.AgentMessage{
@@ -250,15 +268,13 @@ func executeShell(stream Stream, executionId string, 
envName string, workingDir
        log.Printf("[agent.go] executeShell() Env name %s\n", envName)
        log.Printf("[agent.go] executeShell() Exec args %s\n", execArgs)
        // Run command
-       cmd := exec.Command("micromamba", "run", "-n", envName, 
strings.Join(execArgs, " "))
+       cmd := exec.Command("micromamba", "run", "-n", envName, "bash", "-c", 
strings.Join(execArgs, " "))
        cmd.Dir = workingDir
        output, err := cmd.CombinedOutput()
-       var responseString string
+       responseString := string(output)
        if err != nil {
-               responseString = fmt.Sprintf("Error: %v", err)
                log.Printf("[agent.go] executeShell() %s failed: %v\n", 
executionId, err)
        } else {
-               responseString = string(output)
                log.Printf("[agent.go] executeShell() %s done: %s\n", 
executionId, responseString)
        }
        msg := &protos.AgentMessage{
@@ -277,6 +293,11 @@ func executeShell(stream Stream, executionId string, 
envName string, workingDir
 }
 
 func executeJupyter(stream Stream, executionId string, envName string, code 
string) {
+       if _, exists := pidMap[envName]; !exists {
+               log.Printf("[agent.go] executeJupyter() Starting python server 
in env: %s...\n", envName)
+               pidMap[envName] = startJupyterKernel(envName)
+               time.Sleep(5 * time.Second)
+       }
        log.Printf("[agent.go] executeJupyter() Execution ID: %s, Env: %s, 
Code: %s\n", executionId, envName, code)
        unixSock := os.Getenv("KERNEL_SOCK")
        client := &http.Client{
@@ -351,6 +372,34 @@ func executeJupyter(stream Stream, executionId string, 
envName string, code stri
        sendResponse(jupyterResponse, nil)
 }
 
+func restartKernel(stream Stream, executionId string, envName string) {
+       log.Printf("[agent.go] restartKernel() Execution id %s\n", executionId)
+       log.Printf("[agent.go] restartKernel() Env name %s\n", envName)
+       if pid, exists := pidMap[envName]; exists {
+               cmd := exec.Command("kill", fmt.Sprintf("%d", pid))
+               if err := cmd.Run(); err != nil {
+                       log.Printf("[agent.go] restartKernel() Failed to kill 
existing process with PID %d: %v\n", pid, err)
+               } else {
+                       log.Printf("[agent.go] restartKernel() Successfully 
killed existing process with PID %d\n", pid)
+               }
+               delete(pidMap, envName)
+       }
+       pidMap[envName] = startJupyterKernel(envName)
+       msg := &protos.AgentMessage{
+               Message: &protos.AgentMessage_KernelRestartResponse{
+                       KernelRestartResponse: &protos.KernelRestartResponse{
+                               ExecutionId: executionId,
+                               Status:      "OK",
+                       },
+               },
+       }
+       if err := stream.Send(msg); err != nil {
+               log.Printf("[agent.go] restartKernel() failed to send result to 
server: %v\n", err)
+       } else {
+               log.Printf("[agent.go] restartKernel() sent result to server\n")
+       }
+}
+
 func openRemoteTunnel(stream Stream, executionId string, destHost string, 
destPort string, localPort string, sshUser string, sshKeyFile string) {
        log.Printf("[agent.go] openRemoteTunnel() rhost: %s, rport: %s, lport: 
%s, user: %s, keyfile: %s\n", destHost, destPort, localPort, sshUser, 
sshKeyFile)
        key, err := os.ReadFile(sshKeyFile)
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 f602f05030..0e3aa9f7cc 100644
--- a/modules/agent-framework/airavata-agent/protos/agent-communication.pb.go
+++ b/modules/agent-framework/airavata-agent/protos/agent-communication.pb.go
@@ -878,6 +878,117 @@ func (x *JupyterExecutionResponse) GetResponseString() 
string {
        return ""
 }
 
+// server requesting the agent to restart a jupyter kernel
+type KernelRestartRequest struct {
+       state         protoimpl.MessageState
+       sizeCache     protoimpl.SizeCache
+       unknownFields protoimpl.UnknownFields
+
+       ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" 
json:"executionId,omitempty"`
+       EnvName     string `protobuf:"bytes,2,opt,name=envName,proto3" 
json:"envName,omitempty"`
+}
+
+func (x *KernelRestartRequest) Reset() {
+       *x = KernelRestartRequest{}
+       if protoimpl.UnsafeEnabled {
+               mi := &file_agent_communication_proto_msgTypes[14]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
+}
+
+func (x *KernelRestartRequest) String() string {
+       return protoimpl.X.MessageStringOf(x)
+}
+
+func (*KernelRestartRequest) ProtoMessage() {}
+
+func (x *KernelRestartRequest) 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 KernelRestartRequest.ProtoReflect.Descriptor instead.
+func (*KernelRestartRequest) Descriptor() ([]byte, []int) {
+       return file_agent_communication_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *KernelRestartRequest) GetExecutionId() string {
+       if x != nil {
+               return x.ExecutionId
+       }
+       return ""
+}
+
+func (x *KernelRestartRequest) GetEnvName() string {
+       if x != nil {
+               return x.EnvName
+       }
+       return ""
+}
+
+type KernelRestartResponse struct {
+       state         protoimpl.MessageState
+       sizeCache     protoimpl.SizeCache
+       unknownFields protoimpl.UnknownFields
+
+       ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" 
json:"executionId,omitempty"`
+       Status      string `protobuf:"bytes,2,opt,name=status,proto3" 
json:"status,omitempty"`
+}
+
+func (x *KernelRestartResponse) Reset() {
+       *x = KernelRestartResponse{}
+       if protoimpl.UnsafeEnabled {
+               mi := &file_agent_communication_proto_msgTypes[15]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
+}
+
+func (x *KernelRestartResponse) String() string {
+       return protoimpl.X.MessageStringOf(x)
+}
+
+func (*KernelRestartResponse) ProtoMessage() {}
+
+func (x *KernelRestartResponse) ProtoReflect() protoreflect.Message {
+       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)
+               }
+               return ms
+       }
+       return mi.MessageOf(x)
+}
+
+// Deprecated: Use KernelRestartResponse.ProtoReflect.Descriptor instead.
+func (*KernelRestartResponse) Descriptor() ([]byte, []int) {
+       return file_agent_communication_proto_rawDescGZIP(), []int{15}
+}
+
+func (x *KernelRestartResponse) GetExecutionId() string {
+       if x != nil {
+               return x.ExecutionId
+       }
+       return ""
+}
+
+func (x *KernelRestartResponse) GetStatus() string {
+       if x != nil {
+               return x.Status
+       }
+       return ""
+}
+
 // server requesting the agent to create a ssh tunnel
 type TunnelCreationRequest struct {
        state         protoimpl.MessageState
@@ -896,7 +1007,7 @@ type TunnelCreationRequest struct {
 func (x *TunnelCreationRequest) Reset() {
        *x = TunnelCreationRequest{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_agent_communication_proto_msgTypes[14]
+               mi := &file_agent_communication_proto_msgTypes[16]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -909,7 +1020,7 @@ func (x *TunnelCreationRequest) String() string {
 func (*TunnelCreationRequest) ProtoMessage() {}
 
 func (x *TunnelCreationRequest) ProtoReflect() protoreflect.Message {
-       mi := &file_agent_communication_proto_msgTypes[14]
+       mi := &file_agent_communication_proto_msgTypes[16]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -922,7 +1033,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{14}
+       return file_agent_communication_proto_rawDescGZIP(), []int{16}
 }
 
 func (x *TunnelCreationRequest) GetExecutionId() string {
@@ -986,7 +1097,7 @@ type TunnelCreationResponse struct {
 func (x *TunnelCreationResponse) Reset() {
        *x = TunnelCreationResponse{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_agent_communication_proto_msgTypes[15]
+               mi := &file_agent_communication_proto_msgTypes[17]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -999,7 +1110,7 @@ func (x *TunnelCreationResponse) String() string {
 func (*TunnelCreationResponse) ProtoMessage() {}
 
 func (x *TunnelCreationResponse) ProtoReflect() protoreflect.Message {
-       mi := &file_agent_communication_proto_msgTypes[15]
+       mi := &file_agent_communication_proto_msgTypes[17]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -1012,7 +1123,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{15}
+       return file_agent_communication_proto_rawDescGZIP(), []int{17}
 }
 
 func (x *TunnelCreationResponse) GetExecutionId() string {
@@ -1043,7 +1154,7 @@ type TunnelTerminationRequest struct {
 func (x *TunnelTerminationRequest) Reset() {
        *x = TunnelTerminationRequest{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_agent_communication_proto_msgTypes[16]
+               mi := &file_agent_communication_proto_msgTypes[18]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -1056,7 +1167,7 @@ func (x *TunnelTerminationRequest) String() string {
 func (*TunnelTerminationRequest) ProtoMessage() {}
 
 func (x *TunnelTerminationRequest) ProtoReflect() protoreflect.Message {
-       mi := &file_agent_communication_proto_msgTypes[16]
+       mi := &file_agent_communication_proto_msgTypes[18]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -1069,7 +1180,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{16}
+       return file_agent_communication_proto_rawDescGZIP(), []int{18}
 }
 
 func (x *TunnelTerminationRequest) GetDestinationHost() string {
@@ -1105,7 +1216,7 @@ type TunnelTerminationResponse struct {
 func (x *TunnelTerminationResponse) Reset() {
        *x = TunnelTerminationResponse{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_agent_communication_proto_msgTypes[17]
+               mi := &file_agent_communication_proto_msgTypes[19]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -1118,7 +1229,7 @@ func (x *TunnelTerminationResponse) String() string {
 func (*TunnelTerminationResponse) ProtoMessage() {}
 
 func (x *TunnelTerminationResponse) ProtoReflect() protoreflect.Message {
-       mi := &file_agent_communication_proto_msgTypes[17]
+       mi := &file_agent_communication_proto_msgTypes[19]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -1131,7 +1242,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{17}
+       return file_agent_communication_proto_rawDescGZIP(), []int{19}
 }
 
 func (x *TunnelTerminationResponse) GetExecutionId() string {
@@ -1162,6 +1273,7 @@ type AgentMessage struct {
        //      *AgentMessage_CommandExecutionResponse
        //      *AgentMessage_PythonExecutionResponse
        //      *AgentMessage_JupyterExecutionResponse
+       //      *AgentMessage_KernelRestartResponse
        //      *AgentMessage_TunnelCreationResponse
        //      *AgentMessage_TunnelTerminationResponse
        Message isAgentMessage_Message `protobuf_oneof:"message"`
@@ -1170,7 +1282,7 @@ type AgentMessage struct {
 func (x *AgentMessage) Reset() {
        *x = AgentMessage{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_agent_communication_proto_msgTypes[18]
+               mi := &file_agent_communication_proto_msgTypes[20]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -1183,7 +1295,7 @@ func (x *AgentMessage) String() string {
 func (*AgentMessage) ProtoMessage() {}
 
 func (x *AgentMessage) ProtoReflect() protoreflect.Message {
-       mi := &file_agent_communication_proto_msgTypes[18]
+       mi := &file_agent_communication_proto_msgTypes[20]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -1196,7 +1308,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{18}
+       return file_agent_communication_proto_rawDescGZIP(), []int{20}
 }
 
 func (m *AgentMessage) GetMessage() isAgentMessage_Message {
@@ -1255,6 +1367,13 @@ func (x *AgentMessage) GetJupyterExecutionResponse() 
*JupyterExecutionResponse {
        return nil
 }
 
+func (x *AgentMessage) GetKernelRestartResponse() *KernelRestartResponse {
+       if x, ok := x.GetMessage().(*AgentMessage_KernelRestartResponse); ok {
+               return x.KernelRestartResponse
+       }
+       return nil
+}
+
 func (x *AgentMessage) GetTunnelCreationResponse() *TunnelCreationResponse {
        if x, ok := x.GetMessage().(*AgentMessage_TunnelCreationResponse); ok {
                return x.TunnelCreationResponse
@@ -1301,12 +1420,16 @@ type AgentMessage_JupyterExecutionResponse struct {
        JupyterExecutionResponse *JupyterExecutionResponse 
`protobuf:"bytes,7,opt,name=jupyterExecutionResponse,proto3,oneof"`
 }
 
+type AgentMessage_KernelRestartResponse struct {
+       KernelRestartResponse *KernelRestartResponse 
`protobuf:"bytes,8,opt,name=kernelRestartResponse,proto3,oneof"`
+}
+
 type AgentMessage_TunnelCreationResponse struct {
-       TunnelCreationResponse *TunnelCreationResponse 
`protobuf:"bytes,8,opt,name=tunnelCreationResponse,proto3,oneof"`
+       TunnelCreationResponse *TunnelCreationResponse 
`protobuf:"bytes,9,opt,name=tunnelCreationResponse,proto3,oneof"`
 }
 
 type AgentMessage_TunnelTerminationResponse struct {
-       TunnelTerminationResponse *TunnelTerminationResponse 
`protobuf:"bytes,9,opt,name=tunnelTerminationResponse,proto3,oneof"`
+       TunnelTerminationResponse *TunnelTerminationResponse 
`protobuf:"bytes,10,opt,name=tunnelTerminationResponse,proto3,oneof"`
 }
 
 func (*AgentMessage_AgentPing) isAgentMessage_Message() {}
@@ -1323,6 +1446,8 @@ func (*AgentMessage_PythonExecutionResponse) 
isAgentMessage_Message() {}
 
 func (*AgentMessage_JupyterExecutionResponse) isAgentMessage_Message() {}
 
+func (*AgentMessage_KernelRestartResponse) isAgentMessage_Message() {}
+
 func (*AgentMessage_TunnelCreationResponse) isAgentMessage_Message() {}
 
 func (*AgentMessage_TunnelTerminationResponse) isAgentMessage_Message() {}
@@ -1341,6 +1466,7 @@ type ServerMessage struct {
        //      *ServerMessage_CommandExecutionRequest
        //      *ServerMessage_PythonExecutionRequest
        //      *ServerMessage_JupyterExecutionRequest
+       //      *ServerMessage_KernelRestartRequest
        //      *ServerMessage_TunnelCreationRequest
        //      *ServerMessage_TunnelTerminationRequest
        Message isServerMessage_Message `protobuf_oneof:"message"`
@@ -1349,7 +1475,7 @@ type ServerMessage struct {
 func (x *ServerMessage) Reset() {
        *x = ServerMessage{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_agent_communication_proto_msgTypes[19]
+               mi := &file_agent_communication_proto_msgTypes[21]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -1362,7 +1488,7 @@ func (x *ServerMessage) String() string {
 func (*ServerMessage) ProtoMessage() {}
 
 func (x *ServerMessage) ProtoReflect() protoreflect.Message {
-       mi := &file_agent_communication_proto_msgTypes[19]
+       mi := &file_agent_communication_proto_msgTypes[21]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -1375,7 +1501,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{19}
+       return file_agent_communication_proto_rawDescGZIP(), []int{21}
 }
 
 func (m *ServerMessage) GetMessage() isServerMessage_Message {
@@ -1434,6 +1560,13 @@ func (x *ServerMessage) GetJupyterExecutionRequest() 
*JupyterExecutionRequest {
        return nil
 }
 
+func (x *ServerMessage) GetKernelRestartRequest() *KernelRestartRequest {
+       if x, ok := x.GetMessage().(*ServerMessage_KernelRestartRequest); ok {
+               return x.KernelRestartRequest
+       }
+       return nil
+}
+
 func (x *ServerMessage) GetTunnelCreationRequest() *TunnelCreationRequest {
        if x, ok := x.GetMessage().(*ServerMessage_TunnelCreationRequest); ok {
                return x.TunnelCreationRequest
@@ -1480,12 +1613,16 @@ type ServerMessage_JupyterExecutionRequest struct {
        JupyterExecutionRequest *JupyterExecutionRequest 
`protobuf:"bytes,7,opt,name=jupyterExecutionRequest,proto3,oneof"`
 }
 
+type ServerMessage_KernelRestartRequest struct {
+       KernelRestartRequest *KernelRestartRequest 
`protobuf:"bytes,8,opt,name=kernelRestartRequest,proto3,oneof"`
+}
+
 type ServerMessage_TunnelCreationRequest struct {
-       TunnelCreationRequest *TunnelCreationRequest 
`protobuf:"bytes,8,opt,name=tunnelCreationRequest,proto3,oneof"`
+       TunnelCreationRequest *TunnelCreationRequest 
`protobuf:"bytes,9,opt,name=tunnelCreationRequest,proto3,oneof"`
 }
 
 type ServerMessage_TunnelTerminationRequest struct {
-       TunnelTerminationRequest *TunnelTerminationRequest 
`protobuf:"bytes,9,opt,name=tunnelTerminationRequest,proto3,oneof"`
+       TunnelTerminationRequest *TunnelTerminationRequest 
`protobuf:"bytes,10,opt,name=tunnelTerminationRequest,proto3,oneof"`
 }
 
 func (*ServerMessage_ShutdownRequest) isServerMessage_Message() {}
@@ -1502,6 +1639,8 @@ func (*ServerMessage_PythonExecutionRequest) 
isServerMessage_Message() {}
 
 func (*ServerMessage_JupyterExecutionRequest) isServerMessage_Message() {}
 
+func (*ServerMessage_KernelRestartRequest) isServerMessage_Message() {}
+
 func (*ServerMessage_TunnelCreationRequest) isServerMessage_Message() {}
 
 func (*ServerMessage_TunnelTerminationRequest) isServerMessage_Message() {}
@@ -1604,177 +1743,200 @@ var file_agent_communication_proto_rawDesc = []byte{
        0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x72, 
0x65, 0x73, 0x70, 0x6f,
        0x6e, 0x73, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 
0x01, 0x28, 0x09, 0x52,
        0x0e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x53, 0x74, 0x72, 
0x69, 0x6e, 0x67, 0x22,
-       0x8b, 0x02, 0x0a, 0x15, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x72, 
0x65, 0x61, 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, 
0x28, 0x0a, 0x0f, 0x64,
-       0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x6f, 
0x73, 0x74, 0x18, 0x02,
-       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, 0x03, 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, 0x04,
-       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,
-       0x05, 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,
-       0x06, 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, 0x07, 0x20,
-       0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 
0x64, 0x22, 0x52, 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, 0x20, 0x0a, 0x0b, 0x65, 
0x78, 0x65, 0x63, 0x75,
+       0x52, 0x0a, 0x14, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x73, 
0x74, 0x61, 0x72, 0x74,
+       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, 0x16, 0x0a, 
0x06, 0x73, 0x74, 0x61,
-       0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 
0x74, 0x61, 0x74, 0x75,
-       0x73, 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, 0x55, 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,
-       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, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 
0x02, 0x20, 0x01, 0x28,
-       0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xc4, 0x07, 
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, 0x62, 0x0a, 0x13, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x67, 
0x65, 0x6e, 0x74, 0x52,
-       0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 
0x0b, 0x32, 0x2e, 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, 0x72, 
0x65, 0x61, 0x74, 0x65,
-       0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 
0x65, 0x48, 0x00, 0x52,
-       0x13, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 
0x52, 0x65, 0x73, 0x70,
-       0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6b, 0x0a, 0x16, 0x74, 0x65, 0x72, 0x6d, 
0x69, 0x6e, 0x61, 0x74,
-       0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 
0x73, 0x65, 0x18, 0x03,
-       0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 
0x70, 0x61, 0x63, 0x68,
+       0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x18, 0x0a, 
0x07, 0x65, 0x6e, 0x76,
+       0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 
0x65, 0x6e, 0x76, 0x4e,
+       0x61, 0x6d, 0x65, 0x22, 0x51, 0x0a, 0x15, 0x4b, 0x65, 0x72, 0x6e, 0x65, 
0x6c, 0x52, 0x65, 0x73,
+       0x74, 0x61, 0x72, 0x74, 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, 0x16,
+       0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 
0x28, 0x09, 0x52, 0x06,
+       0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x8b, 0x02, 0x0a, 0x15, 0x54, 
0x75, 0x6e, 0x6e, 0x65,
+       0x6c, 0x43, 0x72, 0x65, 0x61, 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, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 
0x61, 0x74, 0x69, 0x6f,
+       0x6e, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 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,
+       0x03, 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, 0x04, 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, 0x05, 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, 0x06, 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, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 
0x70, 0x61, 0x73, 0x73,
+       0x77, 0x6f, 0x72, 0x64, 0x22, 0x52, 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, 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, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 
0x20, 0x01, 0x28, 0x09,
+       0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 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, 0x55, 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, 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, 0x16, 0x0a, 0x06, 
0x73, 0x74, 0x61, 0x74,
+       0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 
0x61, 0x74, 0x75, 0x73,
+       0x22, 0xae, 0x08, 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, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x41, 0x67, 
0x65, 0x6e, 0x74, 0x52,
-       0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x16, 0x74, 
0x65, 0x72, 0x6d, 0x69,
-       0x6e, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 
0x70, 0x6f, 0x6e, 0x73,
-       0x65, 0x12, 0x59, 0x0a, 0x10, 0x65, 0x6e, 0x76, 0x53, 0x65, 0x74, 0x75, 
0x70, 0x52, 0x65, 0x73,
-       0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 
0x2b, 0x2e, 0x6f, 0x72,
+       0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x69, 0x6e, 0x67, 0x48, 0x00, 
0x52, 0x09, 0x61, 0x67,
+       0x65, 0x6e, 0x74, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x62, 0x0a, 0x13, 0x63, 
0x72, 0x65, 0x61, 0x74,
+       0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 
0x73, 0x65, 0x18, 0x02,
+       0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 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, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 
0x52, 0x65, 0x73, 0x70,
+       0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x13, 0x63, 0x72, 0x65, 0x61, 
0x74, 0x65, 0x41, 0x67,
+       0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 
0x6b, 0x0a, 0x16, 0x74,
+       0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 
0x74, 0x52, 0x65, 0x73,
+       0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x03, 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, 0x2e, 0x45, 0x6e, 0x76, 0x53, 
0x65, 0x74, 0x75, 0x70,
-       0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x10, 
0x65, 0x6e, 0x76, 0x53,
-       0x65, 0x74, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 
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, 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, 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,
-       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, 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, 
0x07, 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,
+       0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x72, 0x6d, 
0x69, 0x6e, 0x61, 0x74,
+       0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 
0x73, 0x65, 0x48, 0x00,
+       0x52, 0x16, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x41, 
0x67, 0x65, 0x6e, 0x74,
+       0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x59, 0x0a, 0x10, 
0x65, 0x6e, 0x76, 0x53,
+       0x65, 0x74, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 
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, 0x45,
+       0x6e, 0x76, 0x53, 0x65, 0x74, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 
0x6e, 0x73, 0x65, 0x48,
+       0x00, 0x52, 0x10, 0x65, 0x6e, 0x76, 0x53, 0x65, 0x74, 0x75, 0x70, 0x52, 
0x65, 0x73, 0x70, 0x6f,
+       0x6e, 0x73, 0x65, 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,
+       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, 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, 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, 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, 0x12, 0x6b, 0x0a, 0x16, 0x74, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 
0x43, 0x72, 0x65, 0x61,
-       0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 
0x18, 0x08, 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, 0x2e, 0x54,
-       0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 
0x6e, 0x52, 0x65, 0x73,
-       0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x16, 0x74, 0x75, 0x6e, 
0x6e, 0x65, 0x6c, 0x43,
-       0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 
0x6e, 0x73, 0x65, 0x12,
-       0x74, 0x0a, 0x19, 0x74, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 
0x6d, 0x69, 0x6e, 0x61,
-       0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 
0x18, 0x09, 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,
-       0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 
0x74, 0x69, 0x6f, 0x6e,
-       0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x19, 
0x74, 0x75, 0x6e, 0x6e,
-       0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 
0x6e, 0x52, 0x65, 0x73,
-       0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x6d, 0x65, 0x73, 
0x73, 0x61, 0x67, 0x65,
-       0x22, 0xbf, 0x07, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 
0x65, 0x73, 0x73, 0x61,
-       0x67, 0x65, 0x12, 0x56, 0x0a, 0x0f, 0x73, 0x68, 0x75, 0x74, 0x64, 0x6f, 
0x77, 0x6e, 0x52, 0x65,
-       0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 
0x2a, 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, 0x68, 0x75, 0x74, 
0x64, 0x6f, 0x77, 0x6e,
-       0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0f, 0x73, 
0x68, 0x75, 0x74, 0x64,
-       0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5f, 
0x0a, 0x12, 0x63, 0x72,
-       0x65, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 
0x75, 0x65, 0x73, 0x74,
-       0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 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, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 
0x6e, 0x74, 0x52, 0x65,
-       0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x12, 0x63, 0x72, 0x65, 
0x61, 0x74, 0x65, 0x41,
-       0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 
0x68, 0x0a, 0x15, 0x74,
-       0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 
0x74, 0x52, 0x65, 0x71,
-       0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 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, 0x65, 0x72, 0x6d, 0x69, 
0x6e, 0x61, 0x74, 0x65,
-       0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 
0x48, 0x00, 0x52, 0x15,
+       0x73, 0x65, 0x18, 0x07, 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, 0x68, 0x0a, 
0x15, 0x6b, 0x65, 0x72,
+       0x6e, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 
0x73, 0x70, 0x6f, 0x6e,
+       0x73, 0x65, 0x18, 0x08, 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, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x52, 
0x65, 0x73, 0x74, 0x61,
+       0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 
0x52, 0x15, 0x6b, 0x65,
+       0x72, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x52, 
0x65, 0x73, 0x70, 0x6f,
+       0x6e, 0x73, 0x65, 0x12, 0x6b, 0x0a, 0x16, 0x74, 0x75, 0x6e, 0x6e, 0x65, 
0x6c, 0x43, 0x72, 0x65,
+       0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 
0x65, 0x18, 0x09, 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, 0x2e,
+       0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 
0x6f, 0x6e, 0x52, 0x65,
+       0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x16, 0x74, 0x75, 
0x6e, 0x6e, 0x65, 0x6c,
+       0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 
0x6f, 0x6e, 0x73, 0x65,
+       0x12, 0x74, 0x0a, 0x19, 0x74, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 
0x72, 0x6d, 0x69, 0x6e,
+       0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 
0x65, 0x18, 0x0a, 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, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 
0x61, 0x74, 0x69, 0x6f,
+       0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 
0x19, 0x74, 0x75, 0x6e,
+       0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 
0x6f, 0x6e, 0x52, 0x65,
+       0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x6d, 0x65, 
0x73, 0x73, 0x61, 0x67,
+       0x65, 0x22, 0xa6, 0x08, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 
0x4d, 0x65, 0x73, 0x73,
+       0x61, 0x67, 0x65, 0x12, 0x56, 0x0a, 0x0f, 0x73, 0x68, 0x75, 0x74, 0x64, 
0x6f, 0x77, 0x6e, 0x52,
+       0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 
0x32, 0x2a, 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, 0x68, 0x75, 
0x74, 0x64, 0x6f, 0x77,
+       0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0f, 
0x73, 0x68, 0x75, 0x74,
+       0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 
0x5f, 0x0a, 0x12, 0x63,
+       0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 
0x71, 0x75, 0x65, 0x73,
+       0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 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, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x67, 
0x65, 0x6e, 0x74, 0x52,
+       0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x12, 0x63, 0x72, 
0x65, 0x61, 0x74, 0x65,
+       0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 
0x12, 0x68, 0x0a, 0x15,
        0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 
0x6e, 0x74, 0x52, 0x65,
-       0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x56, 0x0a, 0x0f, 0x65, 0x6e, 0x76, 
0x53, 0x65, 0x74, 0x75,
-       0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 
0x28, 0x0b, 0x32, 0x2a,
-       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, 0x45, 
0x6e, 0x76, 0x53, 0x65,
-       0x74, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 
0x52, 0x0f, 0x65, 0x6e,
-       0x76, 0x53, 0x65, 0x74, 0x75, 0x70, 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, 0x05, 0x20, 0x01, 
0x28, 0x0b, 0x32, 0x32,
+       0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 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, 0x65, 0x72, 0x6d, 
0x69, 0x6e, 0x61, 0x74,
+       0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 
0x74, 0x48, 0x00, 0x52,
+       0x15, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x41, 0x67, 
0x65, 0x6e, 0x74, 0x52,
+       0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x56, 0x0a, 0x0f, 0x65, 0x6e, 
0x76, 0x53, 0x65, 0x74,
+       0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 
0x01, 0x28, 0x0b, 0x32,
+       0x2a, 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, 
0x45, 0x6e, 0x76, 0x53,
+       0x65, 0x74, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 
0x00, 0x52, 0x0f, 0x65,
+       0x6e, 0x76, 0x53, 0x65, 0x74, 0x75, 0x70, 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, 0x05, 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, 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, 0x06, 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, 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, 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, 0x06, 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, 0x2e, 0x50, 0x79, 
0x74, 0x68, 0x6f, 0x6e,
+       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, 
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, 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, 0x07, 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, 
0x79, 0x74, 0x65, 0x72,
        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, 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, 0x07, 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, 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, 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, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 
0x6f, 0x72, 0x67, 0x2e,
+       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, 0x12, 
0x65, 0x0a, 0x14, 0x6b,
+       0x65, 0x72, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 
0x52, 0x65, 0x71, 0x75,
+       0x65, 0x73, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 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, 0x71, 0x0a, 0x18, 0x74, 0x75, 0x6e, 0x6e, 
0x65, 0x6c, 0x54, 0x65,
-       0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 
0x75, 0x65, 0x73, 0x74,
-       0x18, 0x09, 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, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 
0x6d, 0x69, 0x6e, 0x61,
-       0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 
0x00, 0x52, 0x18, 0x74,
-       0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 
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,
+       0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 
0x52, 0x65, 0x73, 0x74,
+       0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 
0x52, 0x14, 0x6b, 0x65,
+       0x72, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 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, 
0x09, 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, 0x71, 0x0a, 0x18,
+       0x74, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 
0x61, 0x74, 0x69, 0x6f,
+       0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0a, 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, 0x54, 
0x75, 0x6e, 0x6e, 0x65,
+       0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 
0x52, 0x65, 0x71, 0x75,
+       0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x18, 0x74, 0x75, 0x6e, 0x6e, 0x65, 
0x6c, 0x54, 0x65, 0x72,
+       0x6d, 0x69, 0x6e, 0x61, 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, 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,
+       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 (
@@ -1789,7 +1951,7 @@ func file_agent_communication_proto_rawDescGZIP() []byte {
        return file_agent_communication_proto_rawDescData
 }
 
-var file_agent_communication_proto_msgTypes = make([]protoimpl.MessageInfo, 20)
+var file_agent_communication_proto_msgTypes = make([]protoimpl.MessageInfo, 22)
 var file_agent_communication_proto_goTypes = []any{
        (*AgentPing)(nil),                 // 0: 
org.apache.airavata.agent.AgentPing
        (*ShutdownRequest)(nil),           // 1: 
org.apache.airavata.agent.ShutdownRequest
@@ -1805,12 +1967,14 @@ var file_agent_communication_proto_goTypes = []any{
        (*PythonExecutionResponse)(nil),   // 11: 
org.apache.airavata.agent.PythonExecutionResponse
        (*JupyterExecutionRequest)(nil),   // 12: 
org.apache.airavata.agent.JupyterExecutionRequest
        (*JupyterExecutionResponse)(nil),  // 13: 
org.apache.airavata.agent.JupyterExecutionResponse
-       (*TunnelCreationRequest)(nil),     // 14: 
org.apache.airavata.agent.TunnelCreationRequest
-       (*TunnelCreationResponse)(nil),    // 15: 
org.apache.airavata.agent.TunnelCreationResponse
-       (*TunnelTerminationRequest)(nil),  // 16: 
org.apache.airavata.agent.TunnelTerminationRequest
-       (*TunnelTerminationResponse)(nil), // 17: 
org.apache.airavata.agent.TunnelTerminationResponse
-       (*AgentMessage)(nil),              // 18: 
org.apache.airavata.agent.AgentMessage
-       (*ServerMessage)(nil),             // 19: 
org.apache.airavata.agent.ServerMessage
+       (*KernelRestartRequest)(nil),      // 14: 
org.apache.airavata.agent.KernelRestartRequest
+       (*KernelRestartResponse)(nil),     // 15: 
org.apache.airavata.agent.KernelRestartResponse
+       (*TunnelCreationRequest)(nil),     // 16: 
org.apache.airavata.agent.TunnelCreationRequest
+       (*TunnelCreationResponse)(nil),    // 17: 
org.apache.airavata.agent.TunnelCreationResponse
+       (*TunnelTerminationRequest)(nil),  // 18: 
org.apache.airavata.agent.TunnelTerminationRequest
+       (*TunnelTerminationResponse)(nil), // 19: 
org.apache.airavata.agent.TunnelTerminationResponse
+       (*AgentMessage)(nil),              // 20: 
org.apache.airavata.agent.AgentMessage
+       (*ServerMessage)(nil),             // 21: 
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
@@ -1820,24 +1984,26 @@ var file_agent_communication_proto_depIdxs = []int32{
        9,  // 4: 
org.apache.airavata.agent.AgentMessage.commandExecutionResponse:type_name -> 
org.apache.airavata.agent.CommandExecutionResponse
        11, // 5: 
org.apache.airavata.agent.AgentMessage.pythonExecutionResponse:type_name -> 
org.apache.airavata.agent.PythonExecutionResponse
        13, // 6: 
org.apache.airavata.agent.AgentMessage.jupyterExecutionResponse:type_name -> 
org.apache.airavata.agent.JupyterExecutionResponse
-       15, // 7: 
org.apache.airavata.agent.AgentMessage.tunnelCreationResponse:type_name -> 
org.apache.airavata.agent.TunnelCreationResponse
-       17, // 8: 
org.apache.airavata.agent.AgentMessage.tunnelTerminationResponse:type_name -> 
org.apache.airavata.agent.TunnelTerminationResponse
-       1,  // 9: 
org.apache.airavata.agent.ServerMessage.shutdownRequest:type_name -> 
org.apache.airavata.agent.ShutdownRequest
-       2,  // 10: 
org.apache.airavata.agent.ServerMessage.createAgentRequest:type_name -> 
org.apache.airavata.agent.CreateAgentRequest
-       4,  // 11: 
org.apache.airavata.agent.ServerMessage.terminateAgentRequest:type_name -> 
org.apache.airavata.agent.TerminateAgentRequest
-       6,  // 12: 
org.apache.airavata.agent.ServerMessage.envSetupRequest:type_name -> 
org.apache.airavata.agent.EnvSetupRequest
-       8,  // 13: 
org.apache.airavata.agent.ServerMessage.commandExecutionRequest:type_name -> 
org.apache.airavata.agent.CommandExecutionRequest
-       10, // 14: 
org.apache.airavata.agent.ServerMessage.pythonExecutionRequest:type_name -> 
org.apache.airavata.agent.PythonExecutionRequest
-       12, // 15: 
org.apache.airavata.agent.ServerMessage.jupyterExecutionRequest:type_name -> 
org.apache.airavata.agent.JupyterExecutionRequest
-       14, // 16: 
org.apache.airavata.agent.ServerMessage.tunnelCreationRequest:type_name -> 
org.apache.airavata.agent.TunnelCreationRequest
-       16, // 17: 
org.apache.airavata.agent.ServerMessage.tunnelTerminationRequest:type_name -> 
org.apache.airavata.agent.TunnelTerminationRequest
-       18, // 18: 
org.apache.airavata.agent.AgentCommunicationService.createMessageBus:input_type 
-> org.apache.airavata.agent.AgentMessage
-       19, // 19: 
org.apache.airavata.agent.AgentCommunicationService.createMessageBus:output_type
 -> org.apache.airavata.agent.ServerMessage
-       19, // [19:20] is the sub-list for method output_type
-       18, // [18:19] is the sub-list for method input_type
-       18, // [18:18] is the sub-list for extension type_name
-       18, // [18:18] is the sub-list for extension extendee
-       0,  // [0:18] is the sub-list for field type_name
+       15, // 7: 
org.apache.airavata.agent.AgentMessage.kernelRestartResponse:type_name -> 
org.apache.airavata.agent.KernelRestartResponse
+       17, // 8: 
org.apache.airavata.agent.AgentMessage.tunnelCreationResponse:type_name -> 
org.apache.airavata.agent.TunnelCreationResponse
+       19, // 9: 
org.apache.airavata.agent.AgentMessage.tunnelTerminationResponse:type_name -> 
org.apache.airavata.agent.TunnelTerminationResponse
+       1,  // 10: 
org.apache.airavata.agent.ServerMessage.shutdownRequest:type_name -> 
org.apache.airavata.agent.ShutdownRequest
+       2,  // 11: 
org.apache.airavata.agent.ServerMessage.createAgentRequest:type_name -> 
org.apache.airavata.agent.CreateAgentRequest
+       4,  // 12: 
org.apache.airavata.agent.ServerMessage.terminateAgentRequest:type_name -> 
org.apache.airavata.agent.TerminateAgentRequest
+       6,  // 13: 
org.apache.airavata.agent.ServerMessage.envSetupRequest:type_name -> 
org.apache.airavata.agent.EnvSetupRequest
+       8,  // 14: 
org.apache.airavata.agent.ServerMessage.commandExecutionRequest:type_name -> 
org.apache.airavata.agent.CommandExecutionRequest
+       10, // 15: 
org.apache.airavata.agent.ServerMessage.pythonExecutionRequest:type_name -> 
org.apache.airavata.agent.PythonExecutionRequest
+       12, // 16: 
org.apache.airavata.agent.ServerMessage.jupyterExecutionRequest:type_name -> 
org.apache.airavata.agent.JupyterExecutionRequest
+       14, // 17: 
org.apache.airavata.agent.ServerMessage.kernelRestartRequest:type_name -> 
org.apache.airavata.agent.KernelRestartRequest
+       16, // 18: 
org.apache.airavata.agent.ServerMessage.tunnelCreationRequest:type_name -> 
org.apache.airavata.agent.TunnelCreationRequest
+       18, // 19: 
org.apache.airavata.agent.ServerMessage.tunnelTerminationRequest:type_name -> 
org.apache.airavata.agent.TunnelTerminationRequest
+       20, // 20: 
org.apache.airavata.agent.AgentCommunicationService.createMessageBus:input_type 
-> org.apache.airavata.agent.AgentMessage
+       21, // 21: 
org.apache.airavata.agent.AgentCommunicationService.createMessageBus:output_type
 -> org.apache.airavata.agent.ServerMessage
+       21, // [21:22] is the sub-list for method output_type
+       20, // [20:21] is the sub-list for method input_type
+       20, // [20:20] is the sub-list for extension type_name
+       20, // [20:20] is the sub-list for extension extendee
+       0,  // [0:20] is the sub-list for field type_name
 }
 
 func init() { file_agent_communication_proto_init() }
@@ -2015,7 +2181,7 @@ func file_agent_communication_proto_init() {
                        }
                }
                file_agent_communication_proto_msgTypes[14].Exporter = func(v 
any, i int) any {
-                       switch v := v.(*TunnelCreationRequest); i {
+                       switch v := v.(*KernelRestartRequest); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -2027,7 +2193,7 @@ func file_agent_communication_proto_init() {
                        }
                }
                file_agent_communication_proto_msgTypes[15].Exporter = func(v 
any, i int) any {
-                       switch v := v.(*TunnelCreationResponse); i {
+                       switch v := v.(*KernelRestartResponse); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -2039,7 +2205,7 @@ func file_agent_communication_proto_init() {
                        }
                }
                file_agent_communication_proto_msgTypes[16].Exporter = func(v 
any, i int) any {
-                       switch v := v.(*TunnelTerminationRequest); i {
+                       switch v := v.(*TunnelCreationRequest); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -2051,7 +2217,7 @@ func file_agent_communication_proto_init() {
                        }
                }
                file_agent_communication_proto_msgTypes[17].Exporter = func(v 
any, i int) any {
-                       switch v := v.(*TunnelTerminationResponse); i {
+                       switch v := v.(*TunnelCreationResponse); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -2063,7 +2229,7 @@ func file_agent_communication_proto_init() {
                        }
                }
                file_agent_communication_proto_msgTypes[18].Exporter = func(v 
any, i int) any {
-                       switch v := v.(*AgentMessage); i {
+                       switch v := v.(*TunnelTerminationRequest); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -2075,6 +2241,30 @@ func file_agent_communication_proto_init() {
                        }
                }
                file_agent_communication_proto_msgTypes[19].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[20].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[21].Exporter = func(v 
any, i int) any {
                        switch v := v.(*ServerMessage); i {
                        case 0:
                                return &v.state
@@ -2087,7 +2277,7 @@ func file_agent_communication_proto_init() {
                        }
                }
        }
-       file_agent_communication_proto_msgTypes[18].OneofWrappers = []any{
+       file_agent_communication_proto_msgTypes[20].OneofWrappers = []any{
                (*AgentMessage_AgentPing)(nil),
                (*AgentMessage_CreateAgentResponse)(nil),
                (*AgentMessage_TerminateAgentResponse)(nil),
@@ -2095,10 +2285,11 @@ func file_agent_communication_proto_init() {
                (*AgentMessage_CommandExecutionResponse)(nil),
                (*AgentMessage_PythonExecutionResponse)(nil),
                (*AgentMessage_JupyterExecutionResponse)(nil),
+               (*AgentMessage_KernelRestartResponse)(nil),
                (*AgentMessage_TunnelCreationResponse)(nil),
                (*AgentMessage_TunnelTerminationResponse)(nil),
        }
-       file_agent_communication_proto_msgTypes[19].OneofWrappers = []any{
+       file_agent_communication_proto_msgTypes[21].OneofWrappers = []any{
                (*ServerMessage_ShutdownRequest)(nil),
                (*ServerMessage_CreateAgentRequest)(nil),
                (*ServerMessage_TerminateAgentRequest)(nil),
@@ -2106,6 +2297,7 @@ func file_agent_communication_proto_init() {
                (*ServerMessage_CommandExecutionRequest)(nil),
                (*ServerMessage_PythonExecutionRequest)(nil),
                (*ServerMessage_JupyterExecutionRequest)(nil),
+               (*ServerMessage_KernelRestartRequest)(nil),
                (*ServerMessage_TunnelCreationRequest)(nil),
                (*ServerMessage_TunnelTerminationRequest)(nil),
        }
@@ -2115,7 +2307,7 @@ func file_agent_communication_proto_init() {
                        GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
                        RawDescriptor: file_agent_communication_proto_rawDesc,
                        NumEnums:      0,
-                       NumMessages:   20,
+                       NumMessages:   22,
                        NumExtensions: 0,
                        NumServices:   1,
                },
diff --git a/modules/agent-framework/proto/agent-communication.proto 
b/modules/agent-framework/proto/agent-communication.proto
index 9bf6d3d7f3..a1f2e46f5b 100644
--- a/modules/agent-framework/proto/agent-communication.proto
+++ b/modules/agent-framework/proto/agent-communication.proto
@@ -93,6 +93,16 @@ message JupyterExecutionResponse {
   string responseString = 2;
 }
 
+// server requesting the agent to restart a jupyter kernel
+message KernelRestartRequest {
+  string executionId = 1;
+  string envName = 2;
+}
+message KernelRestartResponse {
+  string executionId = 1;
+  string status = 2;
+}
+
 // server requesting the agent to create a ssh tunnel
 message TunnelCreationRequest {
   string executionId = 1;
@@ -128,8 +138,9 @@ message AgentMessage {
     CommandExecutionResponse commandExecutionResponse = 5;
     PythonExecutionResponse pythonExecutionResponse = 6;
     JupyterExecutionResponse jupyterExecutionResponse = 7;
-    TunnelCreationResponse tunnelCreationResponse = 8;
-    TunnelTerminationResponse tunnelTerminationResponse = 9;
+    KernelRestartResponse kernelRestartResponse = 8;
+    TunnelCreationResponse tunnelCreationResponse = 9;
+    TunnelTerminationResponse tunnelTerminationResponse = 10;
   }
 }
 
@@ -142,7 +153,8 @@ message ServerMessage {
     CommandExecutionRequest commandExecutionRequest = 5;
     PythonExecutionRequest pythonExecutionRequest = 6;
     JupyterExecutionRequest jupyterExecutionRequest = 7;
-    TunnelCreationRequest tunnelCreationRequest = 8;
-    TunnelTerminationRequest tunnelTerminationRequest = 9;
+    KernelRestartRequest kernelRestartRequest = 8;
+    TunnelCreationRequest tunnelCreationRequest = 9;
+    TunnelTerminationRequest tunnelTerminationRequest = 10;
   }
 }
\ No newline at end of file

Reply via email to