Bound the pre-READY readiness buffer, apply the header allowlist on the host duplex forward path, derive the nested broker budgets from the forward budget, and remove a dead cleanup branch. - The readiness gate caps the pre-READY buffer at the codec frame-size bound plus one line of margin. Past the cap with no newline, the gate finishes with protocol contamination. The gate drops later bytes after it settles, so a failed handshake never grows the buffer. - The broker forward callback applies the host header allowlist next to the route check, so a frame header outside the allowlist never reaches the authenticated fetch. The sandbox-side filter stays a convenience. - The broker budgets derive the response budget and the gateway wait budget from the forward budget, so any forward budget keeps the nested order. The host constructs the broker inside the guarded region, so a construction throw closes the channel and selects the file bridge. - The channel-open catch block drops the dead `if (channel)` branch, because the open call is the last statement of the try. Co-authored-by: Paperclip <noreply@paperclip.ing>
@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) toremoteDirbefore the run starts. Runs with nogit remoteconfigured.restoreWorkspaceFromSshExecution({ spec, localDir, remoteDir, ... })— syncs the remote cwd back intolocalDirafter the run, including any new commits the agent created. Also runs with nogit remoteconfigured.
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.