ruvnet/ruflo · error · ProxyAlreadyRunningError
meta-proxy is already running (pid ${pid}). Stop it first wi
Error message
meta-proxy is already running (pid ${pid}). Stop it first with: ruflo proxy stop What it means
Error "meta-proxy is already running (pid ${pid}). Stop it first with: ruflo proxy stop" thrown in ruvnet/ruflo.
Source
Thrown at v3/@claude-flow/cli/src/proxy/lifecycle.ts:177
fs.unlinkSync(proxyLockFilePath());
} catch {
/* ignore */
}
}
/**
* Foreground start (ADR-307 default) — blocks the caller until the process
* exits or is interrupted. `stdio: 'inherit'` passes the proxy's own output
* straight through to the terminal; signals (Ctrl+C) propagate naturally to
* the child, no manual forwarding needed.
*/
export async function startForeground(supervised = false): Promise<never> {
const bin = requireBinary();
const status = getProxyStatus();
// In service mode startBackground has already written this supervisor's
// PID. Treating it as a competing proxy makes the supervisor immediately
// exit before it can spawn meta-proxy.
if (!supervised && status.running && status.pid) throw new ProxyAlreadyRunningError(status.pid);
if (status.stalePidFile) clearStalePidFile();
const child = spawn(bin, [], { stdio: 'inherit', windowsHide: false });
if (!supervised && child.pid) writePidFile(child.pid);
const cleanup = () => clearStalePidFile();
process.on('exit', cleanup);
if (supervised) {
const forwardSignal = (signal: NodeJS.Signals) => {
if (!child.killed) child.kill(signal);
};
process.once('SIGTERM', () => forwardSignal('SIGTERM'));
process.once('SIGINT', () => forwardSignal('SIGINT'));
}
await new Promise<void>((resolve) => {
child.on('exit', () => {
cleanup();View on GitHub (pinned to 6b01dc5a68)
When it happens
Trigger: Thrown at v3/@claude-flow/cli/src/proxy/lifecycle.ts:177 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of ruvnet/ruflo@6b01dc5a68 (2026-08-12).
Data as JSON: /api/errors/83c86b64092be16e.
Report an issue: GitHub.