@hlos-ai/schemas 0.6.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1219,9 +1219,57 @@ var SignedRejectionReceiptV0Schema = z13.object({
1219
1219
  signature: Base64urlEd25519SigSchema
1220
1220
  }).strict();
1221
1221
 
1222
- // src/srr-signing.ts
1223
- var textEncoder = new TextEncoder();
1224
- var DOMAIN_BYTES = textEncoder.encode(SRR_REJECTION_DOMAIN);
1222
+ // src/liability-waiver-terms-v0.ts
1223
+ import { z as z14 } from "zod";
1224
+ var LIABILITY_WAIVER_TERMS_TYPE_URI = "https://hlos.ai/schema/LiabilityWaiverTermsV0";
1225
+ var LIABILITY_WAIVER_TERMS_VERSION = 0;
1226
+ var LiabilityDispositionSchema = z14.enum([
1227
+ "ABSORB",
1228
+ "RELEASE",
1229
+ "TRANSFER",
1230
+ "DISPUTE"
1231
+ ]);
1232
+ var LiabilityWaiverTermsPartiesSchema = z14.object({
1233
+ offered_by: z14.string().min(1).optional(),
1234
+ offered_to: z14.string().min(1).optional(),
1235
+ beneficiary: z14.string().min(1).optional(),
1236
+ burdened_party: z14.string().min(1).optional()
1237
+ }).strict();
1238
+ var LiabilityWaiverTermsScopeSchema = z14.object({
1239
+ crossing_id: z14.string().min(1).optional(),
1240
+ commitment_hash: Base64urlSha256Schema.optional(),
1241
+ claim_scope: z14.string().min(1).optional()
1242
+ }).strict();
1243
+ var LiabilityWaiverTermsConditionsSchema = z14.object({
1244
+ effective_if: z14.record(z14.unknown()).optional(),
1245
+ expires_at: z14.string().datetime().optional(),
1246
+ jurisdiction: z14.string().min(1).optional()
1247
+ }).strict();
1248
+ var LiabilityWaiverTermsHashInputSchema = z14.object({
1249
+ parties: LiabilityWaiverTermsPartiesSchema,
1250
+ liability_effect: LiabilityDispositionSchema,
1251
+ scope: LiabilityWaiverTermsScopeSchema,
1252
+ conditions: LiabilityWaiverTermsConditionsSchema.optional(),
1253
+ canonical_terms: z14.record(z14.unknown()).optional()
1254
+ }).strict();
1255
+ var LiabilityWaiverTermsRefV0Schema = z14.object({
1256
+ waiver_id: z14.string().min(1).optional(),
1257
+ terms_hash: Base64urlSha256Schema,
1258
+ type: z14.literal(LIABILITY_WAIVER_TERMS_TYPE_URI),
1259
+ version: z14.literal(LIABILITY_WAIVER_TERMS_VERSION)
1260
+ }).strict();
1261
+ var LiabilityWaiverTermsV0Schema = z14.object({
1262
+ "@type": z14.literal(LIABILITY_WAIVER_TERMS_TYPE_URI),
1263
+ version: z14.literal(LIABILITY_WAIVER_TERMS_VERSION),
1264
+ waiver_id: z14.string().min(1),
1265
+ terms_hash: Base64urlSha256Schema,
1266
+ parties: LiabilityWaiverTermsPartiesSchema,
1267
+ liability_effect: LiabilityDispositionSchema,
1268
+ scope: LiabilityWaiverTermsScopeSchema,
1269
+ conditions: LiabilityWaiverTermsConditionsSchema.optional(),
1270
+ human_readable_summary: z14.string().min(1).optional(),
1271
+ canonical_terms: z14.record(z14.unknown()).optional()
1272
+ }).strict();
1225
1273
  var cachedSha256 = null;
1226
1274
  function loadSha256() {
1227
1275
  if (cachedSha256) return cachedSha256;
@@ -1237,24 +1285,104 @@ function loadSha256() {
1237
1285
  sha256 = _require("@noble/hashes/sha2").sha256;
1238
1286
  } catch {
1239
1287
  throw new Error(
1240
- "SRR signing requires @noble/hashes as a peer dependency. Install it: npm install @noble/hashes"
1288
+ "Liability waiver hashing requires @noble/hashes as a peer dependency. Install it: npm install @noble/hashes"
1241
1289
  );
1242
1290
  }
1243
1291
  }
1244
1292
  cachedSha256 = sha256;
1245
1293
  return sha256;
1246
1294
  }
1247
- function computeSrrSigningPayload(unsignedSrr) {
1295
+ function toLiabilityWaiverTermsHashInput(terms) {
1296
+ return {
1297
+ parties: terms.parties,
1298
+ liability_effect: terms.liability_effect,
1299
+ scope: terms.scope,
1300
+ ...terms.conditions !== void 0 ? { conditions: terms.conditions } : {},
1301
+ ...terms.canonical_terms !== void 0 ? { canonical_terms: terms.canonical_terms } : {}
1302
+ };
1303
+ }
1304
+ function computeLiabilityWaiverTermsHash(input) {
1248
1305
  const sha256 = loadSha256();
1306
+ const canonical = jcsCanonicalize(input);
1307
+ const digest = sha256(new TextEncoder().encode(canonical));
1308
+ return bytesToBase64url(digest);
1309
+ }
1310
+
1311
+ // src/srr-v1.ts
1312
+ import { z as z15 } from "zod";
1313
+ var SRR_V1_TYPE_URI = "https://hlos.ai/schema/SignedRejectionReceiptV1";
1314
+ var SRR_V1_VERSION = 1;
1315
+ var SRR_V1_REJECTION_DOMAIN = "kernel:u:rejection:v1";
1316
+ var SRR_V1_SIGNATURE_ALGORITHM = SRR_SIGNATURE_ALGORITHM;
1317
+ var SignedRejectionReceiptV1Schema = z15.object({
1318
+ "@type": z15.literal(SRR_V1_TYPE_URI),
1319
+ version: z15.literal(SRR_V1_VERSION),
1320
+ receipt_id: z15.string().regex(
1321
+ /^srr_[0-9A-HJKMNP-TV-Z]{26}$/i,
1322
+ "receipt_id must be srr_ + 26-char ULID"
1323
+ ),
1324
+ crossing_id: z15.string().min(1),
1325
+ reason_code: z15.string().regex(REASON_CODE_PATTERN, "reason_code must be UPPER_SNAKE_CASE, 3-64 chars"),
1326
+ reason_message: z15.string().min(1),
1327
+ details: z15.record(z15.unknown()).optional(),
1328
+ commitment_hash: Base64urlSha256Schema.optional(),
1329
+ issuer_id: z15.string().min(1),
1330
+ rejected_at: z15.string().datetime(),
1331
+ issuer_public_key_ref: z15.string().min(1),
1332
+ signature_algorithm: z15.literal(SRR_V1_SIGNATURE_ALGORITHM),
1333
+ liability_disposition: LiabilityDispositionSchema,
1334
+ waiver_terms_ref: LiabilityWaiverTermsRefV0Schema.optional(),
1335
+ signature: Base64urlEd25519SigSchema
1336
+ }).strict().superRefine((value, ctx) => {
1337
+ if ((value.liability_disposition === "RELEASE" || value.liability_disposition === "TRANSFER") && value.waiver_terms_ref === void 0) {
1338
+ ctx.addIssue({
1339
+ code: z15.ZodIssueCode.custom,
1340
+ path: ["waiver_terms_ref"],
1341
+ message: "waiver_terms_ref is required for RELEASE and TRANSFER"
1342
+ });
1343
+ }
1344
+ });
1345
+
1346
+ // src/srr-signing.ts
1347
+ var textEncoder = new TextEncoder();
1348
+ var DOMAIN_BYTES_V0 = textEncoder.encode(SRR_REJECTION_DOMAIN);
1349
+ var DOMAIN_BYTES_V1 = textEncoder.encode(SRR_V1_REJECTION_DOMAIN);
1350
+ var cachedSha2562 = null;
1351
+ function loadSha2562() {
1352
+ if (cachedSha2562) return cachedSha2562;
1353
+ const moduleApi = typeof process.getBuiltinModule === "function" ? process.getBuiltinModule("module") : __require("module");
1354
+ const createRequire = moduleApi.createRequire;
1355
+ const requireBase = typeof __filename === "string" ? __filename : `${process.cwd()}/package.json`;
1356
+ const _require = createRequire(requireBase);
1357
+ let sha256;
1358
+ try {
1359
+ sha256 = _require("@noble/hashes/sha2.js").sha256;
1360
+ } catch {
1361
+ try {
1362
+ sha256 = _require("@noble/hashes/sha2").sha256;
1363
+ } catch {
1364
+ throw new Error(
1365
+ "SRR signing requires @noble/hashes as a peer dependency. Install it: npm install @noble/hashes"
1366
+ );
1367
+ }
1368
+ }
1369
+ cachedSha2562 = sha256;
1370
+ return sha256;
1371
+ }
1372
+ function computeSrrSigningPayload(unsignedSrr) {
1373
+ const sha256 = loadSha2562();
1249
1374
  const canonical = jcsCanonicalize(unsignedSrr);
1250
1375
  const digest = sha256(textEncoder.encode(canonical));
1251
- const payload = new Uint8Array(DOMAIN_BYTES.length + digest.length);
1252
- payload.set(DOMAIN_BYTES, 0);
1253
- payload.set(digest, DOMAIN_BYTES.length);
1376
+ const domainBytes = unsignedSrr["@type"] === SRR_V1_TYPE_URI ? DOMAIN_BYTES_V1 : unsignedSrr["@type"] === SRR_TYPE_URI ? DOMAIN_BYTES_V0 : (() => {
1377
+ throw new Error("Unsupported SRR type for signing payload construction");
1378
+ })();
1379
+ const payload = new Uint8Array(domainBytes.length + digest.length);
1380
+ payload.set(domainBytes, 0);
1381
+ payload.set(digest, domainBytes.length);
1254
1382
  return payload;
1255
1383
  }
1256
1384
  function computeSrrDigest(signedSrr) {
1257
- const sha256 = loadSha256();
1385
+ const sha256 = loadSha2562();
1258
1386
  const canonical = jcsCanonicalize(signedSrr);
1259
1387
  return bytesToBase64url(sha256(textEncoder.encode(canonical)));
1260
1388
  }
@@ -1310,23 +1438,28 @@ async function verifySignedRejectionReceipt(params) {
1310
1438
  if (!srr || typeof srr !== "object") {
1311
1439
  return { valid: false, reason: "SCHEMA_VIOLATION" };
1312
1440
  }
1313
- if (srr.signature_algorithm !== SRR_SIGNATURE_ALGORITHM) {
1441
+ if (typeof srr.signature_algorithm === "string" && srr.signature_algorithm !== SRR_SIGNATURE_ALGORITHM) {
1314
1442
  return { valid: false, reason: "UNSUPPORTED_ALGORITHM" };
1315
1443
  }
1316
- const parseResult = SignedRejectionReceiptV0Schema.safeParse(srr);
1444
+ const wireType = srr["@type"];
1445
+ if (wireType !== SRR_V1_TYPE_URI && wireType !== SRR_TYPE_URI) {
1446
+ return { valid: false, reason: "SCHEMA_VIOLATION" };
1447
+ }
1448
+ const parseResult = wireType === SRR_V1_TYPE_URI ? SignedRejectionReceiptV1Schema.safeParse(srr) : SignedRejectionReceiptV0Schema.safeParse(srr);
1317
1449
  if (!parseResult.success) {
1318
1450
  return { valid: false, reason: "SCHEMA_VIOLATION" };
1319
1451
  }
1452
+ const parsedSrr = parseResult.data;
1320
1453
  let signingPayload;
1321
1454
  try {
1322
- const { signature, ...unsignedFields } = srr;
1455
+ const { signature, ...unsignedFields } = parsedSrr;
1323
1456
  signingPayload = computeSrrSigningPayload(unsignedFields);
1324
1457
  } catch {
1325
1458
  return { valid: false, reason: "PAYLOAD_CONSTRUCTION_ERROR" };
1326
1459
  }
1327
1460
  let signatureBytes;
1328
1461
  try {
1329
- signatureBytes = base64urlToBytes(srr.signature);
1462
+ signatureBytes = base64urlToBytes(parsedSrr.signature);
1330
1463
  } catch {
1331
1464
  return { valid: false, reason: "INVALID_SIGNATURE" };
1332
1465
  }
@@ -1382,7 +1515,16 @@ export {
1382
1515
  KernelErrorCodeSchema2 as KernelErrorCodeSchema,
1383
1516
  KernelErrorSchema,
1384
1517
  KernelOkSchema,
1518
+ LIABILITY_WAIVER_TERMS_TYPE_URI,
1519
+ LIABILITY_WAIVER_TERMS_VERSION,
1385
1520
  LiabilityAttestationContentSchema,
1521
+ LiabilityDispositionSchema,
1522
+ LiabilityWaiverTermsConditionsSchema,
1523
+ LiabilityWaiverTermsHashInputSchema,
1524
+ LiabilityWaiverTermsPartiesSchema,
1525
+ LiabilityWaiverTermsRefV0Schema,
1526
+ LiabilityWaiverTermsScopeSchema,
1527
+ LiabilityWaiverTermsV0Schema,
1386
1528
  LogInclusionProofSchema,
1387
1529
  NA_ID_PREFIX,
1388
1530
  NotarizeResponseSchema,
@@ -1409,6 +1551,10 @@ export {
1409
1551
  SRR_REJECTION_DOMAIN,
1410
1552
  SRR_SIGNATURE_ALGORITHM,
1411
1553
  SRR_TYPE_URI,
1554
+ SRR_V1_REJECTION_DOMAIN,
1555
+ SRR_V1_SIGNATURE_ALGORITHM,
1556
+ SRR_V1_TYPE_URI,
1557
+ SRR_V1_VERSION,
1412
1558
  SRR_VERSION,
1413
1559
  SURFACES,
1414
1560
  SettlementAnchorContentSchema,
@@ -1419,6 +1565,7 @@ export {
1419
1565
  SignedReceiptV0LooseSchema,
1420
1566
  SignedReceiptV0Schema,
1421
1567
  SignedRejectionReceiptV0Schema,
1568
+ SignedRejectionReceiptV1Schema,
1422
1569
  StackConnectionSchema,
1423
1570
  StackProviderSchema,
1424
1571
  StackSchema,
@@ -1436,6 +1583,7 @@ export {
1436
1583
  base64urlToBytes,
1437
1584
  bytesToBase64url,
1438
1585
  computeContentHash,
1586
+ computeLiabilityWaiverTermsHash,
1439
1587
  computeReceiptHash,
1440
1588
  computeSrrDigest,
1441
1589
  computeSrrSigningPayload,
@@ -1459,6 +1607,7 @@ export {
1459
1607
  kernelError,
1460
1608
  kernelOk,
1461
1609
  success,
1610
+ toLiabilityWaiverTermsHashInput,
1462
1611
  validateTimeWindow,
1463
1612
  verifyAAR,
1464
1613
  verifyDetachedEd25519,