Create a directory
Creates a directory inside a root, including any missing parents.
Features
A job is an ordered list of operations against folders the agent has been told it may touch. Everything below is enforced on the machine itself, not only at the API.
Creates a directory inside a root, including any missing parents.
Downloads a URL to a path inside a root. Supply an expected SHA-256 and the file is discarded rather than published if the bytes do not match.
Copies between two paths. Both sides are resolved independently, so a copy cannot read from outside a root any more than it can write outside one.
Moves between two paths. The source is removed only after the destination has been published.
Extracts a .zip into a directory. Every entry path is validated against the destination before it is written, and entry count, uncompressed size and compression ratio are all capped.
Compresses a directory inside a root into a .zip at another path inside a root.
Writes a base64 body to a path — for the small generated files, manifests and configs that are not worth hosting somewhere just to download again.
Deletes a path. Directories require an explicit recursive flag, and deletion has to be enabled per root, separately from writing.
Delivering a file is easy until the network drops, the machine reboots, or the same request arrives twice.
Submit a job with an idempotency key and a retry after a timeout returns the original job instead of running the work twice. Reusing a key with a different body is rejected rather than silently accepted.
A claimed job is held under a lease that the agent renews while it works. If the machine dies, the lease expires and the job returns to the queue — bounded by an attempt cap so nothing retries forever.
Writes are staged inside the destination root and moved into place only when the whole job succeeds. Same-volume renames mean a reader never sees a partly written file.
Every attempt is recorded with its outcome, and job history is retained for the window your plan includes, after the job row itself ages out.
Keys carry explicit scopes such as jobs:write and jobs:read. Read-only integrations never get the ability to submit work.
The dashboard follows jobs on a connected machine as their state changes, rather than making you poll for an outcome.