wavetermdev/waveterm · error
failed to delete file
Error message
failed to delete file: %w
What it means
After a successful backup, deleteTextFileCallback calls os.Remove(expandedPath). Any OS-level removal failure (permission denied, file busy on some systems, directory not empty if a directory was passed) is wrapped as "failed to delete file". The backup has already been created and its path recorded in toolUseData.WriteBackupFileName, so the content is recoverable.
Solutions
- Check/fix write permission on the file's parent directory
- Inspect the wrapped inner error (%w) for the exact OS reason (ENOENT, EACCES, EBUSY)
- Restore from the recorded backup (toolUseData.WriteBackupFileName) if needed and retry after fixing
- Remove immutable flags or free file locks before retrying
- For directories, remove contents first — the tool targets text files
Defensive patterns
Strategy: try-catch
Validate before calling
info, err := os.Stat(expandedPath)
if err != nil || info.IsDir() {
return fmt.Errorf("delete target must be an existing file")
}
// check parent dir writability
if unix.Access(filepath.Dir(expandedPath), unix.W_OK) != nil {
return fmt.Errorf("no write permission on parent directory")
} Try / catch
err = os.Remove(expandedPath)
if err != nil {
if os.IsPermission(err) {
// fix perms or restore from toolUseData.WriteBackupFileName
}
return nil, fmt.Errorf("failed to delete file: %w", err)
} Prevention
- Verify write permission on the parent directory before deleting
- Avoid deleting files on read-only or immutable filesystems
- Recover using the recorded WriteBackupFileName when deletion partially fails
- Handle locked/open files (close handles) before retrying
When it happens
Trigger: os.Remove fails: no write permission on the parent directory, read-only filesystem, file locked/immutable, or expandedPath is a non-empty directory.
Common situations: Deleting files in root-owned directories without elevation; read-only mounts (container layers, network shares); immutable flags (chattr +i); passing a directory that validateTextFile did not reject.
Related errors
AI-assisted analysis of wavetermdev/waveterm@a4447c1563 (2026-09-01).
Data as JSON: /api/errors/cb18d1ff09fc8f01.
Report an issue: GitHub.
Appendix: source
Thrown at pkg/aiusechat/tools_writefile.go:486
if !filepath.IsAbs(expandedPath) {
return nil, fmt.Errorf("path must be absolute, got relative path: %s", params.Filename)
}
_, err = validateTextFile(expandedPath, "delete", true)
if err != nil {
return nil, err
}
backupPath, err := filebackup.MakeFileBackup(expandedPath)
if err != nil {
return nil, fmt.Errorf("failed to create backup: %w", err)
}
toolUseData.WriteBackupFileName = backupPath
err = os.Remove(expandedPath)
if err != nil {
return nil, fmt.Errorf("failed to delete file: %w", err)
}
return map[string]any{
"success": true,
"message": fmt.Sprintf("Successfully deleted %s", params.Filename),
}, nil
}
func GetDeleteTextFileToolDefinition() uctypes.ToolDefinition {
return uctypes.ToolDefinition{
Name: "delete_text_file",
DisplayName: "Delete Text File",
Description: "Delete a text file from the filesystem. A backup is created before deletion. Maximum file size: 100KB.",
ToolLogName: "gen:deletefile",
Strict: true,
InputSchema: map[string]any{
"type": "object",
"properties": map[string]any{View on GitHub (pinned to a4447c1563)