agentscope-ai / agentscope-ai/agentscope-java

BaseSandboxFilesystem.edit() inline Python script has multiple bugs, should use download-edit-upload

Abierto
#2,397 1 comentario 0 reacciones 0 asignados Ver en GitHub
area/build area/core/tool area/extensions bug
Lenguaje dominante
Java
Estrellas
5.6k
Forks
1.3k
Merge medio
4 d 12 h
PR fusionados (30 d)
77

Descripción

## Problem

`BaseSandboxFilesystem.edit()` executes an inline Python script via `python3 -c` with heredoc to perform string replacement inside the sandbox. This approach has three bugs:

### Bug 1: `\n` is not recognized as newline by `python3 -c`

The Java code uses `\\n` (literal backslash+n) to represent line breaks in the Python code. However, `python3 -c` does not interpret `\n` as a newline separator — it is parsed as a line continuation character, causing `SyntaxError`.

**Actual error:**
```
Error editing file '/tmp/file.txt': unexpected server response:
File "", line 1
import sys, os, base64, json
SyntaxError: unexpected character after line continuation character
```

### Bug 2: Manual JSON concatenation is fragile

`edit()` builds the JSON payload by hand with `jsonEscape()`, which only escapes `\`, `"`, `\n`, `\r`, `\t`. It misses other JSON control characters (U+0000-U+0008, U+000B, U+000C, U+000E-U+001F). When `oldString`/`newString` contain these characters, the generated JSON is invalid and `json.loads()` fails.

### Bug 3: Hard dependency on `python3`

`edit()` is the only method in `BaseSandboxFilesystem` that requires `python3` in the sandbox image. All other methods (`ls`/`grep`/`glob`/`write`/`read`) use pure shell commands or the `uploadFiles` API. Many sandbox images do not have `python3` pre-installed.

## Fix (PR #)

Restructure `edit()` to download → Java replacement → upload:

1. `downloadFiles()` downloads the file content to the Java side
2. `FilesystemUtils.performStringReplacement()` performs the replacement (shared with `LocalFilesystem` and `RemoteFilesystem`)
3. `uploadFiles()` writes the modified content back to the sandbox

Additional improvements:
- Add `FilesystemUtils.ReplacementResult` record to replace the type-unsafe `Object[]` return
- Fix empty-file guard semantics: `contentBytes == null || contentBytes.length == 0`
- Remove `jsonEscape()` method and unused `import java.util.Base64`
- Use `import java.nio.charset.StandardCharsets` instead of fully qualified name

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.