Files
PaperClipAI/packages/adapter-utils
Priya RamanandPaperclip 12f97efa9b feat(adapter-utils): hold one HTTP/2 bridge admission slot for the whole host hold time
Wire the admission gate from the prior phase into the bridge server. Every
admitted stream now takes one gate slot after the route check, and holds
it until the response stream closes or a drain bound frees it, so the
gate's process-wide caps carry real weight against host memory instead of
sitting unused.

The body read now starts capturing data in the same synchronous turn as
the stream event, ahead of the admission wait, and arms its idle and
lifetime timers only after admission grants a slot. Node does not replay
a request body the read was not yet listening for, so a body read that
began only after an async admission wait could stall a request that had
already fully arrived.

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.