Files
List entries under the requested directory. Omitting path uses the daemon work directory. depth defaults to 1 and recursive listings are capped at 10,000 entries.
path?stringTarget path. Omitted on GET /files to use the daemon work directory.
depth?stringRecursive listing depth for GET /files; omitted for the flat default (1).
application/json- response
[index: integer]?One filesystem entry as /files and /files/info serialize it.
curl -X GET 'http://sandbox:2280/files'[ { "group": "string", "isDir": true, "modTime": "string", "mode": "string", "modifiedAt": "string", "name": "string", "owner": "string", "path": "string", "permissions": "string", "size": 0 }]Delete one file. Directories require recursive=true or recursive=1.
path?stringPath to remove.
recursive?stringRecursive delete flag as the historical string query value.
The path was deleted.
curl -X DELETE 'http://sandbox:2280/files'Stream a multipart response with file parts for successful paths and error parts carrying error envelopes for per-path failures. The outer response stays 200 on partial success.
application/json- body
JSON body for POST /files/bulk-download.
paths?array<string>Paths to stream back as multipart file or error parts.
Multipart file and error parts with the fixed boundary DAYTONA-FILE-BOUNDARY.
multipart/form-datacurl -X POST 'http://sandbox:2280/files/bulk-download' \ -H 'Content-Type: application/json' \ -d '{}'Stream multipart uploads correlated by files[i].path and files[i].file. Partial success is reported in the JSON body: each destination is created and opened under the same rules as /files/upload (paths normalized lexically, created files and directories handed to the sandbox default OS user, and — when one is configured — every write and every directory creation opened as that user could have; a per-entry refusal appears in errors and creates nothing). When atomic=true, each successful file is written through a temporary file + rename with no non-atomic fallback, and an unsupported atomic rename is reported in that entry's errors slot while the rest of the batch continues.
atomic?booleanWrite each uploaded file via a temporary file + rename in its destination directory.
Multipart form using files[i].path metadata parts and files[i].file content parts.
multipart/form-data- body
files[0].path*stringDestination path for the file in the matching files[0].file part. Repeat with files[1].path, files[2].path, and so on for additional files.
files[0].file*fileFile content for the path in files[0].path.
binaryapplication/json- response
Partial-success response from POST /files/bulk-upload.
errors*array<string>Human-readable per-part failures.
files*array<>Successfully written files.
curl -X POST 'http://sandbox:2280/files/bulk-upload' \ -F 'files[0].path=string' \ -F 'files[0].file=string'{ "errors": [ "string" ], "files": [ { "bytes": 0, "path": "string" } ]}Stream one file as application/octet-stream. Directories are rejected.
path?stringTarget path. Omitted on GET /files to use the daemon work directory.
depth?stringRecursive listing depth for GET /files; omitted for the flat default (1).
Raw file bytes.
application/octet-streamcurl -X GET 'http://sandbox:2280/files/download'Walk the tree rooted at path and return literal substring matches with one-based line numbers.
path?stringRoot path to walk recursively.
pattern?stringFilename glob (search) or literal substring (find) pattern.
application/json- response
[index: integer]?One literal line match from GET /files/find.
curl -X GET 'http://sandbox:2280/files/find'[ { "content": "string", "file": "string", "line": 0 }]Create the requested directory tree. Omitting mode uses the route default.
path?stringDirectory path to create.
mode?stringOptional octal mode string; omitted or empty uses the route default.
The directory exists.
curl -X POST 'http://sandbox:2280/files/folder'Return one FileInfo record for the requested path.
path?stringTarget path. Omitted on GET /files to use the daemon work directory.
depth?stringRecursive listing depth for GET /files; omitted for the flat default (1).
application/json- response
One filesystem entry as /files and /files/info serialize it.
group*stringNumeric group id rendered as a string.
isDir*booleanWhether the entry is a directory.
modTime*stringDeprecated but load-bearing: Go time.String() layout for the last modification time.
mode*stringGo os.FileMode.String() layout (-rw-r--r--, drwxr-xr-x, …).
modifiedAt*stringRFC 3339 UTC timestamp for the last modification time.
name*stringBase name of the entry.
owner*stringNumeric owner id rendered as a string.
path*stringAbsolute path to the entry, rendered in the guest's path syntax.
permissions*stringFour-digit octal permissions (0644, 0755, …).
size*integerEntry size in bytes.
int640 <= valuecurl -X GET 'http://sandbox:2280/files/info'{ "group": "string", "isDir": true, "modTime": "string", "mode": "string", "modifiedAt": "string", "name": "string", "owner": "string", "path": "string", "permissions": "string", "size": 0}Rename the path when possible, or copy-then-remove across filesystems.
source?stringSource path to move.
destination?stringDestination path.
The path was moved.
curl -X POST 'http://sandbox:2280/files/move'Change mode and, on platforms that support it, owner and group.
path?stringPath whose permissions should change. On Linux, when this names a symlink, owner/group and mode follow it together so one request lands on the target inode.
mode?stringOptional octal mode string.
owner?stringOptional owner id or name, when the platform supports chown.
group?stringOptional group id or name, when the platform supports chgrp.
Permissions were updated.
curl -X POST 'http://sandbox:2280/files/permissions'Replace a literal substring across the requested files. File-specific failures stay inside the 200 response body.
application/json- body
JSON body for POST /files/replace.
files?array<string>Files to rewrite.
newValue?|Replacement text. Omitted only when the caller wants the route to reject the request.
pattern?stringLiteral substring to replace.
application/json- response
[index: integer]?One file's outcome from POST /files/replace.
curl -X POST 'http://sandbox:2280/files/replace' \ -H 'Content-Type: application/json' \ -d '{}'[ { "error": "string", "file": "string", "success": true }]Walk the tree rooted at path and return absolute file paths whose base name matches the glob pattern.
path?stringRoot path to walk recursively.
pattern?stringFilename glob (search) or literal substring (find) pattern.
application/json- response
Recursive filename-glob search results from GET /files/search.
files*array<string>Absolute matching file paths.
curl -X GET 'http://sandbox:2280/files/search'{ "files": [ "string" ]}Stream the multipart part named file to the destination path from the query string. The path is normalized lexically (.. collapsed) before use. A newly created file — and every parent directory this call created — is owned by the sandbox default OS user when one is configured; a pre-existing file is rewritten in place and never re-owned. A symlink at the path is followed one hop, opened without following further links, and never re-owned. When atomic=true, the daemon writes a temporary file in the destination directory, fsyncs it, applies the destination mode, and renames it over the target with no non-atomic fallback. When a default OS user is configured every write — and every directory this call would create — is opened as that user could have: search permission on every directory, write permission on the destination (or on the deepest existing directory when parents are missing), symlinks anywhere on the path followed under the same rules; otherwise 403 FILE_ACCESS_DENIED and nothing is created.
path?stringDestination path for the uploaded file.
atomic?booleanWrite via a temporary file + rename in the destination directory.
Multipart form with one file part named file.
multipart/form-data- body
file*fileFile content.
binaryThe file was uploaded.
curl -X POST 'http://sandbox:2280/files/upload' \ -F 'file=string'Server-sent events for one directory. The stream emits start with {}, fs with WatchFsEvent, and overflow with WatchOverflowEvent. follow=true is accepted and ignored for compatibility.
path?stringAbsolute directory path to watch.
recursive?booleanWhether nested subdirectories should be watched too.
follow?booleanProxy streaming hint preserved for compatibility; the daemon accepts and ignores it.
SSE stream of start, fs, and overflow events.
text/event-streamcurl -X GET 'http://sandbox:2280/files/watch'