From 0cab093c9867f8cdfddce0ec93442421b8c5833c Mon Sep 17 00:00:00 2001 From: mikemikimike <13286568797@163.com> Date: Sun, 23 Aug 2026 00:10:10 +0800 Subject: [PATCH 1/6] fix(sandbox-e2b): preserve zero exit codes --- .../extensions/sandbox/e2b/E2bEnvdProcessClient.java | 11 +++++------ .../sandbox/e2b/E2bEnvdProcessClientTest.java | 12 ++++++++++++ 2 files changed, 17 insertions(+), 6 deletions(-) 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 af8f8d0391..53306e87a8 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 @@ -204,10 +204,8 @@ private int drainStartStream( DynamicMessage end = (DynamicMessage) pe.getField(peEndF); Descriptors.FieldDescriptor ec = end.getDescriptorForType().findFieldByName("exit_code"); - if (end.hasField(ec)) { - Object v = end.getField(ec); - exit = v instanceof Integer ? (Integer) v : ((Long) v).intValue(); - } + Object v = end.getField(ec); + exit = v instanceof Integer ? (Integer) v : ((Long) v).intValue(); } } catch (IOException e) { continue; @@ -342,10 +340,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()); } - if (!endBuilder.getAllFields().isEmpty()) { + if (hasExitCode || !endBuilder.getAllFields().isEmpty()) { event.setField(processEventDesc.findFieldByName("end"), endBuilder.build()); } } 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 902c790bf8..d56cad3ac6 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 @@ -147,6 +147,18 @@ void jsonCodecReturnsEmptyOutputsWhenOnlyEndPresent() throws Exception { assertEquals("", stderr.toString(StandardCharsets.UTF_8)); } + @Test + void jsonCodecPreservesSuccessfulExitCode() throws Exception { + E2bEnvdProcessClient client = new E2bEnvdProcessClient(options(E2bCodec.JSON)); + ByteArrayOutputStream stdout = new ByteArrayOutputStream(); + ByteArrayOutputStream stderr = new ByteArrayOutputStream(); + + int exit = + drainStartStream(client, connectFrame(responseJson(null, null, 0)), stdout, stderr); + + assertEquals(0, exit); + } + private static DynamicMessage dataResponse( E2bEnvdProcessClient client, String stdout, String stderr) { Descriptors.FileDescriptor fd = client.fileDescriptor(); From 21e2eca31c10db730507ebf522dd30e68e89fe8d Mon Sep 17 00:00:00 2001 From: mikemikimike <13286568797@163.com> Date: Sun, 23 Aug 2026 13:45:27 +0800 Subject: [PATCH 2/6] Fix duplicate test declarations --- .../extensions/sandbox/e2b/E2bEnvdProcessClientTest.java | 3 --- 1 file changed, 3 deletions(-) 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 8de0b31e9d..e384b40aaa 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 @@ -97,9 +97,6 @@ void jsonCodecReturnsEmptyMessageForNullOrMissingEvent() throws Exception { @Test void jsonCodecSkipsMalformedBase64AndKeepsStreaming() throws Exception { - E2bEnvdProcessClient client = new E2bEnvdProcessClient(options(E2bCodec.JSON)); - ByteArrayOutputStream stdout = new ByteArrayOutputStream(); - ByteArrayOutputStream stderr = new ByteArrayOutputStream(); int exit = drainStartStream( client, From 39e3f7e77e01a8c598f6ee3298ebd45fa2e4512e Mon Sep 17 00:00:00 2001 From: mikemikimike <13286568797@163.com> Date: Sun, 23 Aug 2026 13:51:06 +0800 Subject: [PATCH 3/6] Repair merged E2B test setup --- .../extensions/sandbox/e2b/E2bEnvdProcessClientTest.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) 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 e384b40aaa..117521f6b4 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 @@ -97,6 +97,9 @@ void jsonCodecReturnsEmptyMessageForNullOrMissingEvent() throws Exception { @Test void jsonCodecSkipsMalformedBase64AndKeepsStreaming() throws Exception { + E2bEnvdProcessClient client = new E2bEnvdProcessClient(options(E2bCodec.JSON)); + ByteArrayOutputStream stdout = new ByteArrayOutputStream(); + ByteArrayOutputStream stderr = new ByteArrayOutputStream(); int exit = drainStartStream( client, @@ -146,10 +149,6 @@ void jsonCodecReturnsEmptyOutputsWhenOnlyEndPresent() throws Exception { @Test void jsonCodecPreservesSuccessfulExitCode() throws Exception { - E2bEnvdProcessClient client = new E2bEnvdProcessClient(options(E2bCodec.JSON)); - ByteArrayOutputStream stdout = new ByteArrayOutputStream(); - ByteArrayOutputStream stderr = new ByteArrayOutputStream(); - E2bEnvdProcessClient client = new E2bEnvdProcessClient(options(E2bCodec.JSON)); ByteArrayOutputStream stdout = new ByteArrayOutputStream(); ByteArrayOutputStream stderr = new ByteArrayOutputStream(); From 21ed63495e250327bbfbe5b86bef72c7e4fecc7d Mon Sep 17 00:00:00 2001 From: mikemikimike <13286568797@163.com> Date: Tue, 25 Aug 2026 01:24:49 +0800 Subject: [PATCH 4/6] test(sandbox-e2b): cover empty end events --- .../sandbox/e2b/E2bEnvdProcessClientTest.java | 11 +++++++++++ 1 file changed, 11 insertions(+) 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 117521f6b4..f578332292 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 @@ -158,6 +158,17 @@ void jsonCodecPreservesSuccessfulExitCode() throws Exception { assertEquals(0, exit); } + @Test + void jsonCodecIgnoresEndWithoutExitCode() 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(Integer.MIN_VALUE, exit); + } + private static DynamicMessage dataResponse( E2bEnvdProcessClient client, String stdout, String stderr) { Descriptors.FileDescriptor fd = client.fileDescriptor(); From 6df1778fbfec62feda61e3f0f8eff69d16018e98 Mon Sep 17 00:00:00 2001 From: mikemikimike <13286568797@163.com> Date: Tue, 25 Aug 2026 16:09:23 +0800 Subject: [PATCH 5/6] test(sandbox-e2b): remove ambiguous empty end assertion --- .../sandbox/e2b/E2bEnvdProcessClientTest.java | 11 ----------- 1 file changed, 11 deletions(-) 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 f578332292..117521f6b4 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 @@ -158,17 +158,6 @@ void jsonCodecPreservesSuccessfulExitCode() throws Exception { assertEquals(0, exit); } - @Test - void jsonCodecIgnoresEndWithoutExitCode() 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(Integer.MIN_VALUE, exit); - } - private static DynamicMessage dataResponse( E2bEnvdProcessClient client, String stdout, String stderr) { Descriptors.FileDescriptor fd = client.fileDescriptor(); From 0e91f16075e19625acc063e927007f505d6f4bf1 Mon Sep 17 00:00:00 2001 From: mikemikimike <13286568797@163.com> Date: Tue, 25 Aug 2026 17:42:07 +0800 Subject: [PATCH 6/6] fix(sandbox-e2b): treat empty end events as success --- .../extensions/sandbox/e2b/E2bEnvdProcessClient.java | 4 +--- .../sandbox/e2b/E2bEnvdProcessClientTest.java | 11 +++++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) 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 7ab2585065..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 @@ -345,9 +345,7 @@ private DynamicMessage parseJsonStartResponse(byte[] data) throws IOException { if (hasExitCode) { endBuilder.setField(exitCodeField, exitCodeNode.intValue()); } - if (hasExitCode || !endBuilder.getAllFields().isEmpty()) { - 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 117521f6b4..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 @@ -158,6 +158,17 @@ void jsonCodecPreservesSuccessfulExitCode() 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();