agentscope-ai / agentscope-ai/agentscope-java
BaseSandboxFilesystem.edit() inline Python script has multiple bugs, should use download-edit-upload
- Langage dominant
- Java
- Étoiles
- 5.6k
- Forks
- 1.3k
- Merge moyen
- 4 j 12 h
- PR mergées (30 j)
- 77
Description
## 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
Guide de contribution
Ouvrir le guide de contribution
Évaluation
Cette issue n'a pas encore été évaluée.