paperclipai/paperclip · error · Error

Another managed install is already running

Error message

Another managed install is already running${ownerLabel}. If no install process is active, remove the stale lock at ${paths.lockPath} and retry.

What it means

The install-store lockfile is held by another process (with a live owner pid, shown in the label). Dead-owner locks are reclaimed automatically, so this means a real concurrent install/update is running.

Solutions

  1. Wait for the running install to finish, then retry.
  2. If no install is active, remove the stale lock at ${paths.lockPath} and retry.
Defensive patterns

Strategy: retry

When it happens

Trigger: Thrown at cli/src/install-store.ts:181 when the library encounters an invalid state.

Common situations: See trigger scenarios.


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

Appendix: source

Thrown at cli/src/install-store.ts:181

    const temporaryPath = `${paths.lockPath}.${token}.tmp`;
    try {
      fs.writeFileSync(temporaryPath, `${token}\n`, { mode: 0o600, flag: "wx" });
      try {
        fs.linkSync(temporaryPath, paths.lockPath);
        return;
      } catch (error) {
        if ((error as NodeJS.ErrnoException).code !== "EEXIST") throw error;
      }
      const owner = fs.readFileSync(paths.lockPath, "utf8").trim();
      const ownerPid = Number.parseInt(owner.split(":", 1)[0] ?? "", 10);
      if (Number.isInteger(ownerPid) && ownerPid > 0 && !processIsAlive(ownerPid)) {
        fs.rmSync(paths.lockPath);
        fs.rmSync(temporaryPath, { force: true });
        acquire();
        return;
      }
      const ownerLabel = Number.isInteger(ownerPid) && ownerPid > 0 ? ` (pid ${ownerPid})` : "";
      throw new Error(
        `Another managed install is already running${ownerLabel}. ` +
        `If no install process is active, remove the stale lock at ${paths.lockPath} and retry.`,
      );
    } finally {
      fs.rmSync(temporaryPath, { force: true });
    }
  };

  acquire();
  try {
    return await callback();
  } finally {
    try {
      if (fs.readFileSync(paths.lockPath, "utf8").trim() === token) {
        fs.rmSync(paths.lockPath, { force: true });
      }
    } catch (error) {
      if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error;

View on GitHub (pinned to 01ad858492)