JuliusBrussee/caveman · error · Error

value is not JSON-serializable

Error message

value is not JSON-serializable

What it means

Error "value is not JSON-serializable" thrown in JuliusBrussee/caveman.

Source

Thrown at packages/sdk/typescript/src/index.ts:1940

  const prefixHash = sha256Hex(prefixBytes);
  const assemblyHeader = `v1;slots=${ordered.length};prefix=${prefixHash.slice(0, 12)};vbb=1`;
  assemblyRequestHeaders.set(request, assemblyHeader);
  return {
    request,
    headers: { "x-cave-assembly": assemblyHeader },
    prefixHash,
    breakpoints,
    stableTokens: Math.ceil(new TextEncoder().encode(prefixBytes).length / 4),
    tokenBasis: "estimated_bytes_div_4",
    basis: "inferred",
    volatileBelowBreakpoint: true
  };
}

function canonicalJSON(value: unknown): string {
  const raw = JSON.stringify(value);
  if (raw === undefined) throw new Error("value is not JSON-serializable");
  return stableStringify(JSON.parse(raw));
}

function cloneCanonical(value: unknown): unknown {
  return JSON.parse(canonicalJSON(value)) as unknown;
}

function assemblyText(value: unknown): string {
  return typeof value === "string" ? value : canonicalJSON(value);
}

async function cavePlan(cave: Cave): Promise<CavePlan> {
  // `/sdk/v1/cave-plan` is a gateway-owned project-key route. `controlURL` is
  // reserved for control-api `/api/v1/*` surfaces and must never redirect this
  // call to a route that service does not expose.
  const response = await caveFetch(cave, `${cave.options.baseURL}/sdk/v1/cave-plan`, {
    method: "GET",
    headers: otlpHeaders(cave)

View on GitHub (pinned to 27d5a3981a)

Solutions

  1. Pass a JSON-serializable value (no functions, symbols, or cyclic structures).

When it happens

Trigger: Thrown at packages/sdk/typescript/src/index.ts:1940 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of JuliusBrussee/caveman@27d5a3981a (2026-08-15). Data as JSON: /api/errors/59d5bd171cc58c6e. Report an issue: GitHub.