/** * canonical_json.v1 — Feature 62-1 跨语言规范 JSON 序列化(SPEC §1.2)。 * * TypeScript 对照实现,必须与 cutie-server/utils/canonical_json.py 对同一 input * 产出逐字节相同的输出与 sha256(golden fixtures: * cutie-server/tests/fixtures/canonical_json/golden.json,见 canonical-json.test.ts)。 * 规则(RFC 8785/JCS 子集,本项目 payload 值域收紧后的形态): * * - 对象成员递归按 UTF-16 code-unit 顺序排列(JS 字符串默认 `<` 比较即是 * UTF-16 code unit 顺序,`Array.prototype.sort()` 不带 comparator 时按此 * 排序,无需自定义 comparator); * - 数组保持原始顺序; * - 输出 UTF-8,无任何多余空白; * - 金额/价格/比例必须在 payload 构造时就是无指数的规范 Decimal 字符串 * (见 canonicalDecimalStr),整数时间戳/计数保持 JSON integer; * - 非整数 number / NaN / Infinity 直接拒绝(fail-closed,与 Python 拒 * float/Decimal 类型值对齐):出现即说明 payload 构造违约,宁可在源头炸掉; * - 整数超出 JS 安全整数范围(|v| > 2^53-1)同样拒绝——必须先经 * normalizeNumbersForHash / canonicalDecimalStr 转成十进制字符串(这类值一旦 * 以裸 number 形式落地就已经不精确,canonicalJson 本身不做"尽力恢复")。 */ export declare const CANONICAL_JSON_SCHEMA_VERSION = "canonical_json.v1"; export declare class CanonicalJsonError extends Error { constructor(message: string); } /** 把 payload 序列化为 canonical_json.v1 字符串。 */ export declare function canonicalJson(value: unknown): string; /** sha256(canonicalJson(value)) 的 hex digest——本功能所有权威 hash 的唯一算法。 */ export declare function canonicalJsonSha256(value: unknown): string; /** * 把数值转成 SPEC §1.2 规范 Decimal 字符串:无指数、无多余尾零、无负零。 * * number 输入走 `String(value)`(JS `Number#toString()` 的最短往返表示,与 * Python `str(float)` 同一保证——两者都是"给出能精确还原该浮点值的最短十进制 * 串")取得精确数字序列,再手动移位小数点转定点表示——不直接把 * `toString()` 的输出(可能是指数形态,如 "1e-7")当最终结果。SPEC §0 Step 6 * 追加冻结(K-H1/C-M2)明确禁止把"最短往返 repr/toString"直接作为跨语言输出: * Python `repr(1e-07)` 与 JS `(1e-7).toString()` 何时切换到指数记法的阈值不同, * 会分叉;这里始终重新格式化为定点,两侧输出必然一致。 */ export declare function canonicalDecimalStr(value: number | string): string; /** * execution_params.v1 数值归一(跨语言,与 server * `utils/canonical_json.py::normalize_numbers_for_hash` 同规则,SPEC §0 Step 6 * 追加冻结): * * - 数值为整数值(JS 只有单一 number 类型,不像 Python 区分 int/float,这里 * 统一按"是否整数值"判断)且 |值| ≤ 2^53-1 → JSON integer;超出 JS 安全整数 * 范围 → 十进制字符串(canonicalDecimalStr)——JS 侧 JSON.parse 会丢精度, * 整数值也必须走字符串; * - 非整数值 → 无指数定点十进制字符串(canonicalDecimalStr); * - NaN/Infinity 拒绝;容器(对象/数组)递归;null/undefined/boolean/string * 原样透传;其余类型原样透传(留给 canonicalJson 在序列化阶段 fail-closed)。 * * 归一后的对象才允许进 canonicalJson(未归一的非整数 number 会被 * canonicalJson fail-closed 拒绝)。 */ export declare function normalizeNumbersForHash(value: unknown): unknown;