Files
Priya RamanandPaperclip 32358465ce perf(adapter-utils): send each ACP stdin file in one native upload plus one finalize rename
The sandbox ACP stdin bridge base64-encoded each stdin file and appended it to
a remote temp file in 32-KiB chunks over exec, then decoded and renamed. A large
prompt cost many exec round trips.

Route each stdin file through the managed-runtime native sync seam instead. Stage
the body to a host temp file, send one syncIn operation to a temp name that the
.json poller never lists, then run one post-upload rename onto the final
sequence-named path. A provider with native transfer (e.g. Daytona) uploads raw
bytes with zero base64-over-exec round trips; a provider without native transfer
falls through the generic sync fallback, which streams the body in large decoded
chunks and still costs fewer execs than the prior append loop.

Keep the earlier stdin-ordering guarantees: the host per-session write chain
still serializes stdin writes, the final .json path only appears through one
atomic same-directory rename, and the wrapper poller keeps its sequence-gap hold
and loud error event.

Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-08-15 05:37:29 +00:00
..
2026-03-12 13:09:22 -05:00

@paperclipai/adapter-utils

Shared utilities for Paperclip adapters: process spawning, environment injection, sandbox/SSH transport, workspace sync, and the round-trip helpers that move code between the local execution-workspace cwd and wherever the agent actually runs.

For the adapter-author guide see docs/adapters/creating-an-adapter.md and the in-repo notes at packages/adapters/AUTHORING.md.

No-remote-git contract

The local execution-workspace cwd is the only persistence boundary across runs. No adapter may depend on a git remote for cross-run state.

Adapters that run the agent on a different host should use the SSH round-trip helpers in src/ssh.ts:

  • prepareWorkspaceForSshExecution({ spec, localDir, remoteDir }) — bundles the local cwd (tracked files, dirty edits, untracked additions, and the git history needed to reconstruct it) to remoteDir before the run starts. Runs with no git remote configured.
  • restoreWorkspaceFromSshExecution({ spec, localDir, remoteDir, ... }) — syncs the remote cwd back into localDir after the run, including any new commits the agent created. Also runs with no git remote configured.

prepareRemoteManagedRuntime in src/remote-managed-runtime.ts wraps both calls for adapters that want a per-run remote workspace and an automatic restoreWorkspace() finally hook.

The invariant is pinned by the no-remote-git contract case in src/ssh-fixture.test.ts, which asserts that a remote-only commit propagates to the local worktree through the prepare → restore round-trip with no git remote configured at any point. Do not regress that test.