Tencent/WeKnora · error
sandbox: workspace write path %q must be an absolute file pa
Error message
sandbox: workspace write path %q must be an absolute file path
What it means
Validation guard in cleanSessionWorkspaceWritePath: the model-authored write path is not absolute (or reduces to '.'), so it cannot be confined to the session workspace. Lexical check with path.Clean; the input at fault is a relative path supplied for a workspace file write.
Source
Thrown at internal/sandbox/session_manager.go:1022
func cleanSessionInputPath(filePath string) (string, error) {
clean := path.Clean(strings.TrimSpace(filePath))
if clean == SessionInputRoot || strings.HasPrefix(clean, SessionInputRoot+"/") {
return clean, nil
}
return "", fmt.Errorf(
"sandbox: session input path %q is outside %s",
filePath, SessionInputRoot,
)
}
// cleanSessionWorkspaceWritePath keeps model-authored writes inside the
// session workspace and out of the attachment tree. Validation is lexical
// (path.Clean plus prefix checks), matching cleanSessionWorkDir.
func cleanSessionWorkspaceWritePath(filePath string) (string, error) {
clean := path.Clean(strings.TrimSpace(filePath))
if !path.IsAbs(clean) || clean == "." || clean == "/" {
return "", fmt.Errorf("sandbox: workspace write path %q must be an absolute file path", filePath)
}
if clean == SessionWorkspaceRoot || clean == SessionOutputRoot || clean == SessionInputRoot {
return "", fmt.Errorf("sandbox: workspace write path %q is a directory, not a file", filePath)
}
if !strings.HasPrefix(clean, SessionWorkspaceRoot+"/") {
return "", fmt.Errorf("sandbox: workspace write path %q is outside %s", filePath, SessionWorkspaceRoot)
}
if strings.HasPrefix(clean, SessionInputRoot+"/") {
return "", fmt.Errorf("sandbox: session input %s is read-only", SessionInputRoot)
}
return clean, nil
}
// cleanSessionWorkDir keeps shell_exec inside directories we are willing to let
// an agent work in. Ordinary sessions get /workspace only.
//
// Validation is lexical (path.Clean plus prefix checks): a symlink under an
// allowed root that resolves elsewhere at execution time is not detected andView on GitHub (pinned to 988cbb0330)
Solutions
- Supply an absolute path rooted at the session workspace
- Join the relative path onto the workspace root before validation
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at internal/sandbox/session_manager.go:1022 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of Tencent/WeKnora@988cbb0330 (2026-09-02).
Data as JSON: /api/errors/0f9dd228400bca89.
Report an issue: GitHub.