agentscope-ai / agentscope-ai/agentscope-java

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

Aperta
#2,397 1 commento 0 reazioni 0 assegnatari Vedi su GitHub
area/build area/core/tool area/extensions bug
Lingua principale
Java
Stelle
5.6k
Fork
1.3k
Merge medio
4g 12h
PR unite (30g)
77

Descrizione

## 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

Guida per i contributori

Apri la guida per i contributori

Valutazione

Questa issue non è ancora stata valutata.

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.