earendil-works/pi · error · TypeError
Unsupported protocol JSON value: ${typeof value}
Error message
Unsupported protocol JSON value: ${typeof value} What it means
Error "Unsupported protocol JSON value: ${typeof value}" thrown in earendil-works/pi.
Source
Thrown at packages/server/src/protocol.ts:148
function identifier(value: string, label: string): string {
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 {View on GitHub (pinned to 4af9d21d3b)
Solutions
- Only send JSON-serializable values: string, number, boolean, null, arrays, and plain objects.
When it happens
Trigger: Thrown at packages/server/src/protocol.ts:148 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/fa4b3470bc35886f.
Report an issue: GitHub.