diff --git a/agentscope-extensions/agentscope-extensions-sandbox/agentscope-extensions-sandbox-e2b/src/main/java/io/agentscope/extensions/sandbox/e2b/E2bEnvdProcessClient.java b/agentscope-extensions/agentscope-extensions-sandbox/agentscope-extensions-sandbox-e2b/src/main/java/io/agentscope/extensions/sandbox/e2b/E2bEnvdProcessClient.java index d8fb0b9dc0..7a43e3bcab 100644 --- a/agentscope-extensions/agentscope-extensions-sandbox/agentscope-extensions-sandbox-e2b/src/main/java/io/agentscope/extensions/sandbox/e2b/E2bEnvdProcessClient.java +++ b/agentscope-extensions/agentscope-extensions-sandbox/agentscope-extensions-sandbox-e2b/src/main/java/io/agentscope/extensions/sandbox/e2b/E2bEnvdProcessClient.java @@ -341,10 +341,11 @@ private DynamicMessage parseJsonStartResponse(byte[] data) throws IOException { DynamicMessage.Builder endBuilder = DynamicMessage.newBuilder(endDesc); Descriptors.FieldDescriptor exitCodeField = endDesc.findFieldByName("exit_code"); JsonNode exitCodeNode = endNode.path("exitCode"); - if (exitCodeNode.canConvertToInt()) { + boolean hasExitCode = exitCodeNode.canConvertToInt(); + if (hasExitCode) { endBuilder.setField(exitCodeField, exitCodeNode.intValue()); - event.setField(processEventDesc.findFieldByName("end"), endBuilder.build()); } + event.setField(processEventDesc.findFieldByName("end"), endBuilder.build()); } if (!event.getAllFields().isEmpty()) { diff --git a/agentscope-extensions/agentscope-extensions-sandbox/agentscope-extensions-sandbox-e2b/src/test/java/io/agentscope/extensions/sandbox/e2b/E2bEnvdProcessClientTest.java b/agentscope-extensions/agentscope-extensions-sandbox/agentscope-extensions-sandbox-e2b/src/test/java/io/agentscope/extensions/sandbox/e2b/E2bEnvdProcessClientTest.java index 95d37d8dd5..4589877f01 100644 --- a/agentscope-extensions/agentscope-extensions-sandbox/agentscope-extensions-sandbox-e2b/src/test/java/io/agentscope/extensions/sandbox/e2b/E2bEnvdProcessClientTest.java +++ b/agentscope-extensions/agentscope-extensions-sandbox/agentscope-extensions-sandbox-e2b/src/test/java/io/agentscope/extensions/sandbox/e2b/E2bEnvdProcessClientTest.java @@ -148,7 +148,7 @@ void jsonCodecReturnsEmptyOutputsWhenOnlyEndPresent() throws Exception { } @Test - void jsonCodecPreservesZeroExitCode() throws Exception { + void jsonCodecPreservesSuccessfulExitCode() throws Exception { E2bEnvdProcessClient client = new E2bEnvdProcessClient(options(E2bCodec.JSON)); ByteArrayOutputStream stdout = new ByteArrayOutputStream(); ByteArrayOutputStream stderr = new ByteArrayOutputStream(); @@ -158,6 +158,17 @@ void jsonCodecPreservesZeroExitCode() throws Exception { assertEquals(0, exit); } + @Test + void jsonCodecTreatsEmptyEndEventAsSuccessfulExit() throws Exception { + E2bEnvdProcessClient client = new E2bEnvdProcessClient(options(E2bCodec.JSON)); + ByteArrayOutputStream stdout = new ByteArrayOutputStream(); + ByteArrayOutputStream stderr = new ByteArrayOutputStream(); + int exit = + drainStartStream(client, connectFrame("{\"event\":{\"end\":{}}}"), stdout, stderr); + + assertEquals(0, exit); + } + private static DynamicMessage dataResponse( E2bEnvdProcessClient client, String stdout, String stderr) { Descriptors.FileDescriptor fd = client.fileDescriptor();