paperclipai/paperclip · error
Revision not found
Error message
Revision not found
What it means
Lookup guard on the config-revision detail route: the requested revisionId does not match any stored configuration revision for this agent, so the route returns 404 after the agent itself was found and access checked.
Solutions
- Verify the revision id exists for this agent; list revisions and use a valid one.
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at server/src/routes/agents.ts:3024 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of paperclipai/paperclip@3f1d897a7c (2026-08-18).
Data as JSON: /api/errors/a6160cfadd08eca0.
Report an issue: GitHub.
Appendix: source
Thrown at server/src/routes/agents.ts:3800
const owner = await readOwnerLoginSession(companyId, type, sessionId, ownerUserId);
if (!owner) {
res.status(404).json({ error: "Adapter login session not found" });
return;
}
res.json(owner);
},
);
// Cancel a login session. The owner aborts the in-flight run. A non-owner or a
// cross-company caller receives a 404.
router.post(
"/companies/:companyId/adapters/:type/login-sessions/:sessionId/cancel",
async (req, res) => {
const companyId = req.params.companyId as string;
const type = req.params.type as string;
const sessionId = req.params.sessionId as string;
const ownerUserId = await assertCanManageAdapterLogin(req, companyId);
assertDeviceLoginAdapter(type);
// Scope the cancel to this company, adapter, and owner. A non-owner and a
// cross-company caller both receive a 404 and cannot cancel a session.
const owner = await readOwnerLoginSession(companyId, type, sessionId, ownerUserId);
if (!owner) {
res.status(404).json({ error: "Adapter login session not found" });
return;
}
// Durably release the company slot. The durable write terminates the row
// even when this process does not own the in-flight run, so a cross-process
// cancel or a cancel after a restart does not leave the slot held until the
// expiry. The reaper deletes the sandbox and finalizes the terminal.
const cancelled = await adapterLoginService.cancelOwnerSession(sessionId, companyId, ownerUserId);
// Abort the in-flight run this process owns, so the local login stops at
// once instead of waiting for the reaper. A run in another process, or an
// already-terminal run, has no controller here.
adapterLoginAbortControllers.get(sessionId)?.abort();View on GitHub (pinned to 3f1d897a7c)