paperclipai/paperclip · error
Remote file read was truncated for
Error message
Remote file read was truncated for ${remotePath}: ${out.byteLength}/${totalBytes} bytes What it means
Read-integrity check in the command-managed client: a chunked remote file read (dd+base64 per chunk) decoded fewer bytes than the file's reported total, meaning the transfer was cut short mid-stream; retrying the read is the correct response.
Solutions
- Retry the operation; the remote read was cut short.
- Check for truncated writes on the remote target (disk full, connection drops).
Defensive patterns
Strategy: retry
When it happens
Trigger: Thrown at packages/adapter-utils/src/command-managed-runtime.ts:315 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of paperclipai/paperclip@3f1d897a7c (2026-08-18).
Data as JSON: /api/errors/881d00ee4bba2b58.
Report an issue: GitHub.
Appendix: source
Thrown at packages/adapter-utils/src/command-managed-runtime.ts:385
// single base64 stdout string for the whole archive. The client API still
// returns the decoded file as a Buffer, but every command result stays
// small enough for provider-backed sandbox RPCs.
const decodedChunks: Buffer[] = [];
let decodedSoFar = 0;
if (totalBytes === 0) {
await options?.onProgress?.(0, 0);
return Buffer.alloc(0);
}
for (let chunkIndex = 0; decodedSoFar < totalBytes; chunkIndex++) {
const result = await runShell(
`dd if=${shellQuote(remotePath)} bs=${REMOTE_READ_CHUNK_BYTES} skip=${chunkIndex} count=1 2>/dev/null | base64`,
);
const chunk = Buffer.from(result.stdout.replace(/\s+/g, ""), "base64");
if (chunk.byteLength === 0) break;
decodedChunks.push(chunk);
decodedSoFar += chunk.byteLength;
await options?.onProgress?.(Math.min(decodedSoFar, totalBytes), totalBytes);
}
const out = Buffer.concat(decodedChunks);
if (out.byteLength !== totalBytes) {
throw new Error(`Remote file read was truncated for ${remotePath}: ${out.byteLength}/${totalBytes} bytes`);
}
await options?.onProgress?.(out.byteLength, totalBytes);
return out;
},
listFiles: async (remotePath) => {
const result = await runShell(
`if [ -d ${shellQuote(remotePath)} ]; then ` +
`for entry in ${shellQuote(remotePath)}/*; do ` +
`[ -f "$entry" ] || continue; ` +
`basename "$entry"; ` +
`done; ` +
`fi`,
);
return result.stdout
.split(/\r?\n/)View on GitHub (pinned to 3f1d897a7c)