Files
PaperClipAI/packages/adapter-utils
Priya RamanandPaperclip 59b064bc3f fix(adapter-utils): stop the http2 bridge denial path from buffering a body
A denied stream (a bad token, a bad path, a denied route) answered at
once, then read its body through a helper that kept every chunk in an
array and built one Buffer at the end. No denial ever used that body,
and the read ran outside the admission gate, so a sandbox could open
many denied streams and hold up to maxBodyBytes per stream in host
memory with no bound from the gate.

Rename the helper to discardHttp2StreamBody and drop the chunk array:
it now counts bytes to enforce the same size and time bounds, then
drops each chunk at once and resolves with no value. The one caller,
denyRequest, is unchanged apart from the new name, so every denial
branch still discards through the same central, non-retaining path
and still takes no admission-gate slot.

Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-08-26 18:01:32 -07: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.