earendil-works/pi · error · TypeError
Protocol JSON values must not contain circular references
Error message
Protocol JSON values must not contain circular references
What it means
Error "Protocol JSON values must not contain circular references" thrown in earendil-works/pi.
Source
Thrown at packages/server/src/protocol.ts:149
if (typeof value !== "string" || value.length === 0) throw new TypeError(`${label} must be a non-empty string`);
return value;
}
function timestamp(value: number): number {
if (!Number.isSafeInteger(value) || value < 0)
throw new TypeError("Protocol timestamps must be non-negative integers");
return value;
}
/** Validate and copy a value from an execution boundary into the protocol's JSON-compatible subset. */
export function toProtocolJsonValue(value: unknown, seen = new Set<object>()): JsonValue {
if (value === null || typeof value === "string" || typeof value === "boolean") return value;
if (typeof value === "number") {
if (!Number.isFinite(value)) throw new TypeError("Protocol JSON numbers must be finite");
return value;
}
if (typeof value !== "object") throw new TypeError(`Unsupported protocol JSON value: ${typeof value}`);
if (seen.has(value)) throw new TypeError("Protocol JSON values must not contain circular references");
const prototype = Object.getPrototypeOf(value);
if (!Array.isArray(value) && prototype !== Object.prototype && prototype !== null) {
throw new TypeError("Protocol JSON objects must be plain objects");
}
seen.add(value);
try {
if (Array.isArray(value)) return Array.from(value, (entry) => toProtocolJsonValue(entry, seen));
const result: Record<string, JsonValue> = {};
for (const [key, entry] of Object.entries(value)) result[key] = toProtocolJsonValue(entry, seen);
return result;
} finally {
seen.delete(value);
}
}
/** Lossily sanitize diagnostic tool details that must not affect execution semantics. */
export function sanitizeProtocolDetails(value: unknown, seen = new Set<object>()): JsonValue | undefined {
if (value === null || typeof value === "string" || typeof value === "boolean") return value;View on GitHub (pinned to 4af9d21d3b)
Solutions
- Remove circular references before serializing the value.
When it happens
Trigger: Thrown at packages/server/src/protocol.ts:149 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of earendil-works/pi@4af9d21d3b (2026-08-24).
Data as JSON: /api/errors/f6beabb6de9a98b2.
Report an issue: GitHub.