Move files to and from your remote machines
Commands return text. Real work also produces checkpoints, rendered images, reports, log bundles,
configs, and release artifacts. AI Commander Pro gives your AI a temporary file courier alongside the
remote shell: remote_pull brings one file back, and remote_push sends a stored blob to a machine.
Pull a file from a machine
remote_pull(code, path) reads one regular file at an absolute path on the connected machine,
puts its bytes in a temporary relay blob, and returns a blobId plus a download URL.
The account must have Pro and the machine must not be restricted by the account's device limit.
# MCP
remote_pull(
code="gpu-box",
path="/home/u/aic-jobs/train/metrics.json"
)
# REST
curl -s -X POST https://aicommander.dev/api/v1/pull \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"code":"gpu-box","path":"/home/u/aic-jobs/train/metrics.json"}'
Push a file to a machine
A push has two steps: upload bytes with POST /api/v1/files, then call
remote_push(code, blob_id, dest_path) or POST /api/v1/push.
Uploading and pushing both require a signed-in Pro account. The agent writes beside the destination and
atomically renames the completed file, so an interrupted transfer does not leave a partial replacement.
dest_path already names a file, a successful
remote_push replaces it atomically. Confirm the destination before pushing; the old contents are not recoverable through AI Commander.
# curl supplies Content-Length when uploading from a file
BLOB_ID=$(curl -s -X POST https://aicommander.dev/api/v1/files \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/octet-stream' \
--data-binary @release.tar.gz | jq -r .blobId)
curl -s -X POST https://aicommander.dev/api/v1/push \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d "{\"code\":\"api-prod\",\"blob_id\":\"$BLOB_ID\",\"dest_path\":\"/tmp/release.tar.gz\"}"
Limits to design around
| Rule | File transfer | What to do |
|---|---|---|
| File size | 100 MiB maximum | Use your own object storage or artifact registry for larger files. |
| Source type | One regular file | Archive a directory into one file before pulling it. |
| Blob access | Expires at 24 hours | Download promptly; an hourly, retrying sweep removes inaccessible expired bytes. |
| Download link | 1 hour | Open or share it while it is fresh. |
| Plan access | Pro | Free and anonymous callers cannot upload, pull, or push. |
| Request deadline | About 55 seconds | Move slow or large artifacts directly through storage you control. |
tar -czf /tmp/report.tgz ./report, then pull /tmp/report.tgz.
Do not split a large artifact merely to route it through the relay; let the producing job upload to your own storage.
Fair-use quotas
Quotas protect the shared temporary courier after the Pro entitlement check. Going over one returns
429 with reason: "rate_limited"; wait for capacity or move the artifact through storage you control.
| Budget | Limit | How it is charged |
|---|---|---|
| Machine transfers | 60/hour/account | remote_pull and remote_push share this count. |
| Caller uploads | 60/hour/account | POST /api/v1/files; also capped at 5,000 uploads/hour across the relay. |
| Stored bytes | 5 GiB/subject/rolling day | Charged by caller uploads and pulls, which put bytes into the relay; pushes do not charge it again. |
Where it helps
Give your AI more than a text result
Install the agent, connect your AI client, and move the first artifact with the built-in courier.