paperclipai/paperclip · error · ToolGatewayHttpError
run_inactive
run_inactive
Error message
Run is not active
What it means
Lifecycle guard after the ownership checks: the run's status is not active, so tool calls against it are refused (only in-flight runs may use the tool gateway). The finished/cancelled run is at fault.
Solutions
- The run has ended. Start a new run/heartbeat before invoking tools; check run status first.
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at server/src/services/tool-gateway.ts:1069 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of paperclipai/paperclip@3f1d897a7c (2026-09-18).
Data as JSON: /api/errors/e34a8296cfd529d2.
Report an issue: GitHub.
Appendix: source
Thrown at server/src/services/tool-gateway.ts:1499
.where(eq(heartbeatRuns.id, input.runId))
.limit(1);
if (!run || run.companyId !== input.companyId) {
throw new ToolGatewayHttpError(
403,
"Run does not belong to company",
"run_company_mismatch",
);
}
if (run.agentId !== input.agentId) {
throw new ToolGatewayHttpError(
403,
"Run does not belong to agent",
"run_agent_mismatch",
);
}
if (!ACTIVE_GATEWAY_RUN_STATUSES.has(run.status)) {
throw new ToolGatewayHttpError(403, "Run is not active", "run_inactive");
}
const snapshot = asRecord(run.contextSnapshot);
const snapshotIssueId = stringValue(snapshot?.issueId);
const snapshotProjectId = stringValue(snapshot?.projectId);
if (
(input.issueId && snapshotIssueId && input.issueId !== snapshotIssueId) ||
(input.projectId &&
snapshotProjectId &&
input.projectId !== snapshotProjectId)
) {
throw new ToolGatewayHttpError(
403,
"Supplied run context does not match stored heartbeat context",
"run_context_mismatch",
);
}
const issueId = snapshotIssueId ?? input.issueId ?? null;View on GitHub (pinned to 3f1d897a7c)