paperclipai/paperclip · error · Error

Timed out acquiring sandbox callback bridge response lock.

Error message

Timed out acquiring sandbox callback bridge response lock.

What it means

Liveness failure in the filesystem-based sandbox callback bridge queue: the response lock (mkdir lock dir) has been held by a live process through hundreds of polling attempts (~30s), so the bridge cannot take its turn writing responses; stale locks from dead holders are cleaned automatically, so this indicates a genuinely stuck or long-blocked holder.

Solutions

  1. Retry; the response lock timed out under contention.
  2. Reduce concurrent bridge requests or increase the lock timeout.
Defensive patterns

Strategy: retry

When it happens

Trigger: Thrown at packages/adapter-utils/src/sandbox-callback-bridge.ts:526 when the library encounters an invalid state.

Common situations: See trigger scenarios.

Understand the failure class


AI-assisted analysis of paperclipai/paperclip@3f1d897a7c (2026-08-18). Data as JSON: /api/errors/d29cf094e0b81519. Report an issue: GitHub.

Appendix: source

Thrown at packages/adapter-utils/src/sandbox-callback-bridge.ts:606

          }
          let holderAlive = false;
          if (holderPid !== null) {
            try {
              process.kill(holderPid, 0);
              holderAlive = true;
            } catch {
              holderAlive = false;
            }
          }
          if (!holderAlive) {
            await fs.rm(lockDir, { recursive: true, force: true }).catch(() => undefined);
            continue;
          }
          attempts += 1;
          if (attempts >= 600) {
            throw new Error("Timed out acquiring sandbox callback bridge response lock.");
          }
          await new Promise((resolve) => setTimeout(resolve, 50));
        }
      }

      try {
        if (options.requestPath) {
          const requestExists = await pathExists(options.requestPath);
          if (!requestExists) {
            return { wrote: false };
          }
        }
        const responseExists = await pathExists(responsePath);
        if (responseExists) {
          return { wrote: false };
        }
        await fs.writeFile(tempPath, body, "utf8");
        await fs.rename(tempPath, responsePath);
        return { wrote: true };
      } finally {

View on GitHub (pinned to 3f1d897a7c)