{"version":3,"file":"canonical-json.d.ts","sourceRoot":"","sources":["../../../src/core/long-horizon/canonical-json.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEtD","sourcesContent":["/**\n * Deterministic canonical JSON serialization.\n *\n * Produces stable, reproducible JSON output suitable for\n * cryptographic digest computation.\n *\n * Rules:\n *   - Object keys sorted lexicographically by UTF-16 code unit\n *   - Arrays preserved in their semantic order (not sorted)\n *   - No trailing whitespace\n *   - No platform-dependent formatting\n *   - UTF-8 encoding\n */\n\n/**\n * Serialize a value to deterministic canonical JSON.\n */\nexport function toCanonicalJson(value: unknown): string {\n\treturn serializeValue(value);\n}\n\nfunction serializeValue(value: unknown): string {\n\tif (value === null) return \"null\";\n\tif (typeof value === \"boolean\") return value ? \"true\" : \"false\";\n\tif (typeof value === \"number\") return serializeNumber(value);\n\tif (typeof value === \"string\") return serializeString(value);\n\tif (Array.isArray(value)) return serializeArray(value);\n\tif (typeof value === \"object\") return serializeObject(value as Record<string, unknown>);\n\n\tthrow new Error(`Cannot serialize value of type ${typeof value}`);\n}\n\nfunction serializeNumber(value: number): string {\n\tif (!Number.isFinite(value)) {\n\t\tthrow new Error(`Cannot serialize non-finite number: ${value}`);\n\t}\n\t// Use JSON-compatible number serialization\n\t// This ensures NaN/Infinity are rejected\n\treturn JSON.stringify(value);\n}\n\nfunction serializeString(value: string): string {\n\treturn JSON.stringify(value);\n}\n\nfunction serializeArray(value: unknown[]): string {\n\tconst items = value.map((item) => serializeValue(item)).join(\",\");\n\treturn `[${items}]`;\n}\n\nfunction serializeObject(value: Record<string, unknown>): string {\n\tconst keys = Object.keys(value).sort();\n\tconst pairs = keys.map((key) => `${serializeString(key)}:${serializeValue(value[key])}`);\n\treturn `{${pairs.join(\",\")}}`;\n}\n"]}