@tinycloud/sdk-core 2.7.0-beta.3 → 2.7.0

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.cjs CHANGED
@@ -5,15 +5,19 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __getProtoOf = Object.getPrototypeOf;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __typeError = (msg) => {
9
+ throw TypeError(msg);
10
+ };
11
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
12
  var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
13
+ for (var name2 in all)
14
+ __defProp(target, name2, { get: all[name2], enumerable: true });
11
15
  };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
16
+ var __copyProps = (to, from3, except, desc) => {
17
+ if (from3 && typeof from3 === "object" || typeof from3 === "function") {
18
+ for (let key of __getOwnPropNames(from3))
15
19
  if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
20
+ __defProp(to, key, { get: () => from3[key], enumerable: !(desc = __getOwnPropDesc(from3, key)) || desc.enumerable });
17
21
  }
18
22
  return to;
19
23
  };
@@ -26,6 +30,11 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
30
  mod
27
31
  ));
28
32
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
33
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
34
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
35
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
36
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
37
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
29
38
 
30
39
  // src/index.ts
31
40
  var index_exports = {};
@@ -49,6 +58,7 @@ __export(index_exports, {
49
58
  CAPABILITY_REGISTRY: () => import_bootstrap3.CAPABILITY_REGISTRY,
50
59
  CapabilityKeyRegistry: () => CapabilityKeyRegistry,
51
60
  CapabilityKeyRegistryErrorCodes: () => CapabilityKeyRegistryErrorCodes,
61
+ CaveatedDelegationUnsupportedError: () => CaveatedDelegationUnsupportedError,
52
62
  ClientSessionSchema: () => ClientSessionSchema,
53
63
  CloudLocationResolutionError: () => CloudLocationResolutionError,
54
64
  DECRYPT_ACTION: () => import_sdk_services7.DECRYPT_ACTION,
@@ -67,6 +77,7 @@ __export(index_exports, {
67
77
  DUCKDB: () => import_bootstrap3.DUCKDB,
68
78
  DataVaultService: () => import_sdk_services7.DataVaultService,
69
79
  DatabaseHandle: () => import_sdk_services7.DatabaseHandle,
80
+ DecryptTransportResponseError: () => import_sdk_services7.DecryptTransportResponseError,
70
81
  DelegationErrorCodes: () => DelegationErrorCodes,
71
82
  DelegationManager: () => DelegationManager,
72
83
  DuckDbAction: () => import_sdk_services7.DuckDbAction,
@@ -174,6 +185,7 @@ __export(index_exports, {
174
185
  canonicalizeDidUrl: () => canonicalizeDidUrl,
175
186
  canonicalizeEncryptionJson: () => import_sdk_services7.canonicalizeEncryptionJson,
176
187
  canonicalizeNetworkId: () => canonicalizeNetworkId,
188
+ canonicalizeRecapCaveats: () => canonicalizeRecapCaveats,
177
189
  canonicalizeSecretScope: () => import_sdk_services7.canonicalizeSecretScope,
178
190
  canonicalizeSignedObjectUnsigned: () => canonicalizeSignedObjectUnsigned,
179
191
  checkDecryptInvocationInput: () => import_sdk_services7.checkDecryptInvocationInput,
@@ -247,6 +259,7 @@ __export(index_exports, {
247
259
  pkhDid: () => pkhDid,
248
260
  principalDid: () => principalDid,
249
261
  principalDidEquals: () => principalDidEquals,
262
+ recapCaveatsEqual: () => recapCaveatsEqual,
250
263
  resolveCloudLocation: () => resolveCloudLocation,
251
264
  resolveManifest: () => resolveManifest,
252
265
  resolveManifestKnowledgeRoot: () => resolveManifestKnowledgeRoot,
@@ -399,40 +412,945 @@ function canonicalizeDidUrl(didUrl) {
399
412
  function principalDid(didUrl) {
400
413
  return canonicalizeDid(splitDidUrl(didUrl).did);
401
414
  }
402
- function didEquals(a, b, options = {}) {
403
- const canonicalize = options.ignoreFragment ? principalDid : canonicalizeDidUrl;
415
+ function didEquals(a, b, options2 = {}) {
416
+ const canonicalize = options2.ignoreFragment ? principalDid : canonicalizeDidUrl;
404
417
  return canonicalize(a) === canonicalize(b);
405
418
  }
406
419
  function principalDidEquals(a, b) {
407
420
  return didEquals(a, b, { ignoreFragment: true });
408
421
  }
409
- function didCacheKey(input, options = {}) {
422
+ function didCacheKey(input, options2 = {}) {
410
423
  const { did, fragment } = splitDidUrl(input);
411
424
  const pkh = parsePkhDid(did);
412
- const base = pkh ? `did:pkh:eip155:${pkh.chainId}:${addressStorageKey(pkh.address)}` : canonicalizeDid(did);
413
- return options.preserveFragment ? `${base}${fragment}` : base;
425
+ const base3 = pkh ? `did:pkh:eip155:${pkh.chainId}:${addressStorageKey(pkh.address)}` : canonicalizeDid(did);
426
+ return options2.preserveFragment ? `${base3}${fragment}` : base3;
414
427
  }
415
- function makePkhSpaceId(address, chainId, name) {
428
+ function makePkhSpaceId(address, chainId, name2) {
416
429
  assertValidChainId(chainId);
417
- if (!name) {
430
+ if (!name2) {
418
431
  throw new IdentityParseError("Space name cannot be empty");
419
432
  }
420
- return `tinycloud:pkh:eip155:${chainId}:${canonicalizeAddress(address)}:${name}`;
433
+ return `tinycloud:pkh:eip155:${chainId}:${canonicalizeAddress(address)}:${name2}`;
421
434
  }
422
435
 
423
436
  // src/requester/index.ts
424
437
  var import_viem4 = require("viem");
425
438
  var import_blake3 = require("@noble/hashes/blake3");
426
- var import_cid = require("multiformats/cid");
427
- var import_digest = require("multiformats/hashes/digest");
439
+
440
+ // ../../node_modules/multiformats/dist/src/bases/base32.js
441
+ var base32_exports = {};
442
+ __export(base32_exports, {
443
+ base32: () => base32,
444
+ base32hex: () => base32hex,
445
+ base32hexpad: () => base32hexpad,
446
+ base32hexpadupper: () => base32hexpadupper,
447
+ base32hexupper: () => base32hexupper,
448
+ base32pad: () => base32pad,
449
+ base32padupper: () => base32padupper,
450
+ base32upper: () => base32upper,
451
+ base32z: () => base32z
452
+ });
453
+
454
+ // ../../node_modules/multiformats/dist/src/bytes.js
455
+ var empty = new Uint8Array(0);
456
+ function equals(aa, bb) {
457
+ if (aa === bb) {
458
+ return true;
459
+ }
460
+ if (aa.byteLength !== bb.byteLength) {
461
+ return false;
462
+ }
463
+ for (let ii = 0; ii < aa.byteLength; ii++) {
464
+ if (aa[ii] !== bb[ii]) {
465
+ return false;
466
+ }
467
+ }
468
+ return true;
469
+ }
470
+ function coerce(o) {
471
+ if (o instanceof Uint8Array && o.constructor.name === "Uint8Array") {
472
+ return o;
473
+ }
474
+ if (o instanceof ArrayBuffer) {
475
+ return new Uint8Array(o);
476
+ }
477
+ if (ArrayBuffer.isView(o)) {
478
+ return new Uint8Array(o.buffer, o.byteOffset, o.byteLength);
479
+ }
480
+ throw new Error("Unknown type, must be binary type");
481
+ }
482
+ function fromString(str) {
483
+ return new TextEncoder().encode(str);
484
+ }
485
+ function toString(b) {
486
+ return new TextDecoder().decode(b);
487
+ }
488
+
489
+ // ../../node_modules/multiformats/dist/src/vendor/base-x.js
490
+ function base(ALPHABET, name2) {
491
+ if (ALPHABET.length >= 255) {
492
+ throw new TypeError("Alphabet too long");
493
+ }
494
+ var BASE_MAP = new Uint8Array(256);
495
+ for (var j = 0; j < BASE_MAP.length; j++) {
496
+ BASE_MAP[j] = 255;
497
+ }
498
+ for (var i = 0; i < ALPHABET.length; i++) {
499
+ var x = ALPHABET.charAt(i);
500
+ var xc = x.charCodeAt(0);
501
+ if (BASE_MAP[xc] !== 255) {
502
+ throw new TypeError(x + " is ambiguous");
503
+ }
504
+ BASE_MAP[xc] = i;
505
+ }
506
+ var BASE = ALPHABET.length;
507
+ var LEADER = ALPHABET.charAt(0);
508
+ var FACTOR = Math.log(BASE) / Math.log(256);
509
+ var iFACTOR = Math.log(256) / Math.log(BASE);
510
+ function encode5(source) {
511
+ if (source instanceof Uint8Array)
512
+ ;
513
+ else if (ArrayBuffer.isView(source)) {
514
+ source = new Uint8Array(source.buffer, source.byteOffset, source.byteLength);
515
+ } else if (Array.isArray(source)) {
516
+ source = Uint8Array.from(source);
517
+ }
518
+ if (!(source instanceof Uint8Array)) {
519
+ throw new TypeError("Expected Uint8Array");
520
+ }
521
+ if (source.length === 0) {
522
+ return "";
523
+ }
524
+ var zeroes = 0;
525
+ var length2 = 0;
526
+ var pbegin = 0;
527
+ var pend = source.length;
528
+ while (pbegin !== pend && source[pbegin] === 0) {
529
+ pbegin++;
530
+ zeroes++;
531
+ }
532
+ var size = (pend - pbegin) * iFACTOR + 1 >>> 0;
533
+ var b58 = new Uint8Array(size);
534
+ while (pbegin !== pend) {
535
+ var carry = source[pbegin];
536
+ var i2 = 0;
537
+ for (var it1 = size - 1; (carry !== 0 || i2 < length2) && it1 !== -1; it1--, i2++) {
538
+ carry += 256 * b58[it1] >>> 0;
539
+ b58[it1] = carry % BASE >>> 0;
540
+ carry = carry / BASE >>> 0;
541
+ }
542
+ if (carry !== 0) {
543
+ throw new Error("Non-zero carry");
544
+ }
545
+ length2 = i2;
546
+ pbegin++;
547
+ }
548
+ var it2 = size - length2;
549
+ while (it2 !== size && b58[it2] === 0) {
550
+ it2++;
551
+ }
552
+ var str = LEADER.repeat(zeroes);
553
+ for (; it2 < size; ++it2) {
554
+ str += ALPHABET.charAt(b58[it2]);
555
+ }
556
+ return str;
557
+ }
558
+ function decodeUnsafe(source) {
559
+ if (typeof source !== "string") {
560
+ throw new TypeError("Expected String");
561
+ }
562
+ if (source.length === 0) {
563
+ return new Uint8Array();
564
+ }
565
+ var psz = 0;
566
+ if (source[psz] === " ") {
567
+ return;
568
+ }
569
+ var zeroes = 0;
570
+ var length2 = 0;
571
+ while (source[psz] === LEADER) {
572
+ zeroes++;
573
+ psz++;
574
+ }
575
+ var size = (source.length - psz) * FACTOR + 1 >>> 0;
576
+ var b256 = new Uint8Array(size);
577
+ while (source[psz]) {
578
+ var carry = BASE_MAP[source.charCodeAt(psz)];
579
+ if (carry === 255) {
580
+ return;
581
+ }
582
+ var i2 = 0;
583
+ for (var it3 = size - 1; (carry !== 0 || i2 < length2) && it3 !== -1; it3--, i2++) {
584
+ carry += BASE * b256[it3] >>> 0;
585
+ b256[it3] = carry % 256 >>> 0;
586
+ carry = carry / 256 >>> 0;
587
+ }
588
+ if (carry !== 0) {
589
+ throw new Error("Non-zero carry");
590
+ }
591
+ length2 = i2;
592
+ psz++;
593
+ }
594
+ if (source[psz] === " ") {
595
+ return;
596
+ }
597
+ var it4 = size - length2;
598
+ while (it4 !== size && b256[it4] === 0) {
599
+ it4++;
600
+ }
601
+ var vch = new Uint8Array(zeroes + (size - it4));
602
+ var j2 = zeroes;
603
+ while (it4 !== size) {
604
+ vch[j2++] = b256[it4++];
605
+ }
606
+ return vch;
607
+ }
608
+ function decode7(string2) {
609
+ var buffer = decodeUnsafe(string2);
610
+ if (buffer) {
611
+ return buffer;
612
+ }
613
+ throw new Error(`Non-${name2} character`);
614
+ }
615
+ return {
616
+ encode: encode5,
617
+ decodeUnsafe,
618
+ decode: decode7
619
+ };
620
+ }
621
+ var src = base;
622
+ var _brrp__multiformats_scope_baseX = src;
623
+ var base_x_default = _brrp__multiformats_scope_baseX;
624
+
625
+ // ../../node_modules/multiformats/dist/src/bases/base.js
626
+ var Encoder = class {
627
+ constructor(name2, prefix, baseEncode) {
628
+ __publicField(this, "name");
629
+ __publicField(this, "prefix");
630
+ __publicField(this, "baseEncode");
631
+ this.name = name2;
632
+ this.prefix = prefix;
633
+ this.baseEncode = baseEncode;
634
+ }
635
+ encode(bytes) {
636
+ if (bytes instanceof Uint8Array) {
637
+ return `${this.prefix}${this.baseEncode(bytes)}`;
638
+ } else {
639
+ throw Error("Unknown type, must be binary type");
640
+ }
641
+ }
642
+ };
643
+ var Decoder = class {
644
+ constructor(name2, prefix, baseDecode) {
645
+ __publicField(this, "name");
646
+ __publicField(this, "prefix");
647
+ __publicField(this, "baseDecode");
648
+ __publicField(this, "prefixCodePoint");
649
+ this.name = name2;
650
+ this.prefix = prefix;
651
+ const prefixCodePoint = prefix.codePointAt(0);
652
+ if (prefixCodePoint === void 0) {
653
+ throw new Error("Invalid prefix character");
654
+ }
655
+ this.prefixCodePoint = prefixCodePoint;
656
+ this.baseDecode = baseDecode;
657
+ }
658
+ decode(text) {
659
+ if (typeof text === "string") {
660
+ if (text.codePointAt(0) !== this.prefixCodePoint) {
661
+ throw Error(`Unable to decode multibase string ${JSON.stringify(text)}, ${this.name} decoder only supports inputs prefixed with ${this.prefix}`);
662
+ }
663
+ return this.baseDecode(text.slice(this.prefix.length));
664
+ } else {
665
+ throw Error("Can only multibase decode strings");
666
+ }
667
+ }
668
+ or(decoder) {
669
+ return or(this, decoder);
670
+ }
671
+ };
672
+ var ComposedDecoder = class {
673
+ constructor(decoders2) {
674
+ __publicField(this, "decoders");
675
+ this.decoders = decoders2;
676
+ }
677
+ or(decoder) {
678
+ return or(this, decoder);
679
+ }
680
+ decode(input) {
681
+ const prefix = input[0];
682
+ const decoder = this.decoders[prefix];
683
+ if (decoder != null) {
684
+ return decoder.decode(input);
685
+ } else {
686
+ throw RangeError(`Unable to decode multibase string ${JSON.stringify(input)}, only inputs prefixed with ${Object.keys(this.decoders)} are supported`);
687
+ }
688
+ }
689
+ };
690
+ function or(left, right) {
691
+ return new ComposedDecoder({
692
+ ...left.decoders ?? { [left.prefix]: left },
693
+ ...right.decoders ?? { [right.prefix]: right }
694
+ });
695
+ }
696
+ var Codec = class {
697
+ constructor(name2, prefix, baseEncode, baseDecode) {
698
+ __publicField(this, "name");
699
+ __publicField(this, "prefix");
700
+ __publicField(this, "baseEncode");
701
+ __publicField(this, "baseDecode");
702
+ __publicField(this, "encoder");
703
+ __publicField(this, "decoder");
704
+ this.name = name2;
705
+ this.prefix = prefix;
706
+ this.baseEncode = baseEncode;
707
+ this.baseDecode = baseDecode;
708
+ this.encoder = new Encoder(name2, prefix, baseEncode);
709
+ this.decoder = new Decoder(name2, prefix, baseDecode);
710
+ }
711
+ encode(input) {
712
+ return this.encoder.encode(input);
713
+ }
714
+ decode(input) {
715
+ return this.decoder.decode(input);
716
+ }
717
+ };
718
+ function from({ name: name2, prefix, encode: encode5, decode: decode7 }) {
719
+ return new Codec(name2, prefix, encode5, decode7);
720
+ }
721
+ function baseX({ name: name2, prefix, alphabet: alphabet2 }) {
722
+ const { encode: encode5, decode: decode7 } = base_x_default(alphabet2, name2);
723
+ return from({
724
+ prefix,
725
+ name: name2,
726
+ encode: encode5,
727
+ decode: (text) => coerce(decode7(text))
728
+ });
729
+ }
730
+ function decode(string2, alphabetIdx, bitsPerChar, name2) {
731
+ let end = string2.length;
732
+ while (string2[end - 1] === "=") {
733
+ --end;
734
+ }
735
+ const out = new Uint8Array(end * bitsPerChar / 8 | 0);
736
+ let bits = 0;
737
+ let buffer = 0;
738
+ let written = 0;
739
+ for (let i = 0; i < end; ++i) {
740
+ const value = alphabetIdx[string2[i]];
741
+ if (value === void 0) {
742
+ throw new SyntaxError(`Non-${name2} character`);
743
+ }
744
+ buffer = buffer << bitsPerChar | value;
745
+ bits += bitsPerChar;
746
+ if (bits >= 8) {
747
+ bits -= 8;
748
+ out[written++] = 255 & buffer >> bits;
749
+ }
750
+ }
751
+ if (bits >= bitsPerChar || (255 & buffer << 8 - bits) !== 0) {
752
+ throw new SyntaxError("Unexpected end of data");
753
+ }
754
+ return out;
755
+ }
756
+ function encode(data, alphabet2, bitsPerChar) {
757
+ const pad = alphabet2[alphabet2.length - 1] === "=";
758
+ const mask = (1 << bitsPerChar) - 1;
759
+ let out = "";
760
+ let bits = 0;
761
+ let buffer = 0;
762
+ for (let i = 0; i < data.length; ++i) {
763
+ buffer = buffer << 8 | data[i];
764
+ bits += 8;
765
+ while (bits > bitsPerChar) {
766
+ bits -= bitsPerChar;
767
+ out += alphabet2[mask & buffer >> bits];
768
+ }
769
+ }
770
+ if (bits !== 0) {
771
+ out += alphabet2[mask & buffer << bitsPerChar - bits];
772
+ }
773
+ if (pad) {
774
+ while ((out.length * bitsPerChar & 7) !== 0) {
775
+ out += "=";
776
+ }
777
+ }
778
+ return out;
779
+ }
780
+ function createAlphabetIdx(alphabet2) {
781
+ const alphabetIdx = {};
782
+ for (let i = 0; i < alphabet2.length; ++i) {
783
+ alphabetIdx[alphabet2[i]] = i;
784
+ }
785
+ return alphabetIdx;
786
+ }
787
+ function rfc4648({ name: name2, prefix, bitsPerChar, alphabet: alphabet2 }) {
788
+ const alphabetIdx = createAlphabetIdx(alphabet2);
789
+ return from({
790
+ prefix,
791
+ name: name2,
792
+ encode(input) {
793
+ return encode(input, alphabet2, bitsPerChar);
794
+ },
795
+ decode(input) {
796
+ return decode(input, alphabetIdx, bitsPerChar, name2);
797
+ }
798
+ });
799
+ }
800
+
801
+ // ../../node_modules/multiformats/dist/src/bases/base32.js
802
+ var base32 = rfc4648({
803
+ prefix: "b",
804
+ name: "base32",
805
+ alphabet: "abcdefghijklmnopqrstuvwxyz234567",
806
+ bitsPerChar: 5
807
+ });
808
+ var base32upper = rfc4648({
809
+ prefix: "B",
810
+ name: "base32upper",
811
+ alphabet: "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",
812
+ bitsPerChar: 5
813
+ });
814
+ var base32pad = rfc4648({
815
+ prefix: "c",
816
+ name: "base32pad",
817
+ alphabet: "abcdefghijklmnopqrstuvwxyz234567=",
818
+ bitsPerChar: 5
819
+ });
820
+ var base32padupper = rfc4648({
821
+ prefix: "C",
822
+ name: "base32padupper",
823
+ alphabet: "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=",
824
+ bitsPerChar: 5
825
+ });
826
+ var base32hex = rfc4648({
827
+ prefix: "v",
828
+ name: "base32hex",
829
+ alphabet: "0123456789abcdefghijklmnopqrstuv",
830
+ bitsPerChar: 5
831
+ });
832
+ var base32hexupper = rfc4648({
833
+ prefix: "V",
834
+ name: "base32hexupper",
835
+ alphabet: "0123456789ABCDEFGHIJKLMNOPQRSTUV",
836
+ bitsPerChar: 5
837
+ });
838
+ var base32hexpad = rfc4648({
839
+ prefix: "t",
840
+ name: "base32hexpad",
841
+ alphabet: "0123456789abcdefghijklmnopqrstuv=",
842
+ bitsPerChar: 5
843
+ });
844
+ var base32hexpadupper = rfc4648({
845
+ prefix: "T",
846
+ name: "base32hexpadupper",
847
+ alphabet: "0123456789ABCDEFGHIJKLMNOPQRSTUV=",
848
+ bitsPerChar: 5
849
+ });
850
+ var base32z = rfc4648({
851
+ prefix: "h",
852
+ name: "base32z",
853
+ alphabet: "ybndrfg8ejkmcpqxot1uwisza345h769",
854
+ bitsPerChar: 5
855
+ });
856
+
857
+ // ../../node_modules/multiformats/dist/src/bases/base36.js
858
+ var base36_exports = {};
859
+ __export(base36_exports, {
860
+ base36: () => base36,
861
+ base36upper: () => base36upper
862
+ });
863
+ var base36 = baseX({
864
+ prefix: "k",
865
+ name: "base36",
866
+ alphabet: "0123456789abcdefghijklmnopqrstuvwxyz"
867
+ });
868
+ var base36upper = baseX({
869
+ prefix: "K",
870
+ name: "base36upper",
871
+ alphabet: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
872
+ });
873
+
874
+ // ../../node_modules/multiformats/dist/src/bases/base58.js
875
+ var base58_exports = {};
876
+ __export(base58_exports, {
877
+ base58btc: () => base58btc,
878
+ base58flickr: () => base58flickr
879
+ });
880
+ var base58btc = baseX({
881
+ name: "base58btc",
882
+ prefix: "z",
883
+ alphabet: "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
884
+ });
885
+ var base58flickr = baseX({
886
+ name: "base58flickr",
887
+ prefix: "Z",
888
+ alphabet: "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"
889
+ });
890
+
891
+ // ../../node_modules/multiformats/dist/src/vendor/varint.js
892
+ var encode_1 = encode2;
893
+ var MSB = 128;
894
+ var REST = 127;
895
+ var MSBALL = ~REST;
896
+ var INT = Math.pow(2, 31);
897
+ function encode2(num, out, offset) {
898
+ out = out || [];
899
+ offset = offset || 0;
900
+ var oldOffset = offset;
901
+ while (num >= INT) {
902
+ out[offset++] = num & 255 | MSB;
903
+ num /= 128;
904
+ }
905
+ while (num & MSBALL) {
906
+ out[offset++] = num & 255 | MSB;
907
+ num >>>= 7;
908
+ }
909
+ out[offset] = num | 0;
910
+ encode2.bytes = offset - oldOffset + 1;
911
+ return out;
912
+ }
913
+ var decode2 = read;
914
+ var MSB$1 = 128;
915
+ var REST$1 = 127;
916
+ function read(buf, offset) {
917
+ var res = 0, offset = offset || 0, shift = 0, counter = offset, b, l = buf.length;
918
+ do {
919
+ if (counter >= l) {
920
+ read.bytes = 0;
921
+ throw new RangeError("Could not decode varint");
922
+ }
923
+ b = buf[counter++];
924
+ res += shift < 28 ? (b & REST$1) << shift : (b & REST$1) * Math.pow(2, shift);
925
+ shift += 7;
926
+ } while (b >= MSB$1);
927
+ read.bytes = counter - offset;
928
+ return res;
929
+ }
930
+ var N1 = Math.pow(2, 7);
931
+ var N2 = Math.pow(2, 14);
932
+ var N3 = Math.pow(2, 21);
933
+ var N4 = Math.pow(2, 28);
934
+ var N5 = Math.pow(2, 35);
935
+ var N6 = Math.pow(2, 42);
936
+ var N7 = Math.pow(2, 49);
937
+ var N8 = Math.pow(2, 56);
938
+ var N9 = Math.pow(2, 63);
939
+ var length = function(value) {
940
+ return value < N1 ? 1 : value < N2 ? 2 : value < N3 ? 3 : value < N4 ? 4 : value < N5 ? 5 : value < N6 ? 6 : value < N7 ? 7 : value < N8 ? 8 : value < N9 ? 9 : 10;
941
+ };
942
+ var varint = {
943
+ encode: encode_1,
944
+ decode: decode2,
945
+ encodingLength: length
946
+ };
947
+ var _brrp_varint = varint;
948
+ var varint_default = _brrp_varint;
949
+
950
+ // ../../node_modules/multiformats/dist/src/varint.js
951
+ function decode3(data, offset = 0) {
952
+ const code2 = varint_default.decode(data, offset);
953
+ return [code2, varint_default.decode.bytes];
954
+ }
955
+ function encodeTo(int, target, offset = 0) {
956
+ varint_default.encode(int, target, offset);
957
+ return target;
958
+ }
959
+ function encodingLength(int) {
960
+ return varint_default.encodingLength(int);
961
+ }
962
+
963
+ // ../../node_modules/multiformats/dist/src/hashes/digest.js
964
+ function create(code2, digest2) {
965
+ const size = digest2.byteLength;
966
+ const sizeOffset = encodingLength(code2);
967
+ const digestOffset = sizeOffset + encodingLength(size);
968
+ const bytes = new Uint8Array(digestOffset + size);
969
+ encodeTo(code2, bytes, 0);
970
+ encodeTo(size, bytes, sizeOffset);
971
+ bytes.set(digest2, digestOffset);
972
+ return new Digest(code2, size, digest2, bytes);
973
+ }
974
+ function decode4(multihash) {
975
+ const bytes = coerce(multihash);
976
+ const [code2, sizeOffset] = decode3(bytes);
977
+ const [size, digestOffset] = decode3(bytes.subarray(sizeOffset));
978
+ const digest2 = bytes.subarray(sizeOffset + digestOffset);
979
+ if (digest2.byteLength !== size) {
980
+ throw new Error("Incorrect length");
981
+ }
982
+ return new Digest(code2, size, digest2, bytes);
983
+ }
984
+ function equals2(a, b) {
985
+ if (a === b) {
986
+ return true;
987
+ } else {
988
+ const data = b;
989
+ return a.code === data.code && a.size === data.size && data.bytes instanceof Uint8Array && equals(a.bytes, data.bytes);
990
+ }
991
+ }
992
+ var Digest = class {
993
+ /**
994
+ * Creates a multihash digest.
995
+ */
996
+ constructor(code2, size, digest2, bytes) {
997
+ __publicField(this, "code");
998
+ __publicField(this, "size");
999
+ __publicField(this, "digest");
1000
+ __publicField(this, "bytes");
1001
+ this.code = code2;
1002
+ this.size = size;
1003
+ this.digest = digest2;
1004
+ this.bytes = bytes;
1005
+ }
1006
+ };
1007
+
1008
+ // ../../node_modules/multiformats/dist/src/cid.js
1009
+ function format(link, base3) {
1010
+ const { bytes, version } = link;
1011
+ switch (version) {
1012
+ case 0:
1013
+ return toStringV0(bytes, baseCache(link), base3 ?? base58btc.encoder);
1014
+ default:
1015
+ return toStringV1(bytes, baseCache(link), base3 ?? base32.encoder);
1016
+ }
1017
+ }
1018
+ var cache = /* @__PURE__ */ new WeakMap();
1019
+ function baseCache(cid) {
1020
+ const baseCache2 = cache.get(cid);
1021
+ if (baseCache2 == null) {
1022
+ const baseCache3 = /* @__PURE__ */ new Map();
1023
+ cache.set(cid, baseCache3);
1024
+ return baseCache3;
1025
+ }
1026
+ return baseCache2;
1027
+ }
1028
+ var _a;
1029
+ var CID = class _CID {
1030
+ /**
1031
+ * @param version - Version of the CID
1032
+ * @param code - Code of the codec content is encoded in, see https://github.com/multiformats/multicodec/blob/master/table.csv
1033
+ * @param multihash - (Multi)hash of the of the content.
1034
+ */
1035
+ constructor(version, code2, multihash, bytes) {
1036
+ __publicField(this, "code");
1037
+ __publicField(this, "version");
1038
+ __publicField(this, "multihash");
1039
+ __publicField(this, "bytes");
1040
+ __publicField(this, "/");
1041
+ __publicField(this, _a, "CID");
1042
+ this.code = code2;
1043
+ this.version = version;
1044
+ this.multihash = multihash;
1045
+ this.bytes = bytes;
1046
+ this["/"] = bytes;
1047
+ }
1048
+ /**
1049
+ * Signalling `cid.asCID === cid` has been replaced with `cid['/'] === cid.bytes`
1050
+ * please either use `CID.asCID(cid)` or switch to new signalling mechanism
1051
+ *
1052
+ * @deprecated
1053
+ */
1054
+ get asCID() {
1055
+ return this;
1056
+ }
1057
+ // ArrayBufferView
1058
+ get byteOffset() {
1059
+ return this.bytes.byteOffset;
1060
+ }
1061
+ // ArrayBufferView
1062
+ get byteLength() {
1063
+ return this.bytes.byteLength;
1064
+ }
1065
+ toV0() {
1066
+ switch (this.version) {
1067
+ case 0: {
1068
+ return this;
1069
+ }
1070
+ case 1: {
1071
+ const { code: code2, multihash } = this;
1072
+ if (code2 !== DAG_PB_CODE) {
1073
+ throw new Error("Cannot convert a non dag-pb CID to CIDv0");
1074
+ }
1075
+ if (multihash.code !== SHA_256_CODE) {
1076
+ throw new Error("Cannot convert non sha2-256 multihash CID to CIDv0");
1077
+ }
1078
+ return _CID.createV0(multihash);
1079
+ }
1080
+ default: {
1081
+ throw Error(`Can not convert CID version ${this.version} to version 0. This is a bug please report`);
1082
+ }
1083
+ }
1084
+ }
1085
+ toV1() {
1086
+ switch (this.version) {
1087
+ case 0: {
1088
+ const { code: code2, digest: digest2 } = this.multihash;
1089
+ const multihash = create(code2, digest2);
1090
+ return _CID.createV1(this.code, multihash);
1091
+ }
1092
+ case 1: {
1093
+ return this;
1094
+ }
1095
+ default: {
1096
+ throw Error(`Can not convert CID version ${this.version} to version 1. This is a bug please report`);
1097
+ }
1098
+ }
1099
+ }
1100
+ equals(other) {
1101
+ return _CID.equals(this, other);
1102
+ }
1103
+ static equals(self, other) {
1104
+ const unknown = other;
1105
+ return unknown != null && self.code === unknown.code && self.version === unknown.version && equals2(self.multihash, unknown.multihash);
1106
+ }
1107
+ toString(base3) {
1108
+ return format(this, base3);
1109
+ }
1110
+ toJSON() {
1111
+ return { "/": format(this) };
1112
+ }
1113
+ link() {
1114
+ return this;
1115
+ }
1116
+ // Legacy
1117
+ [(_a = Symbol.toStringTag, /* @__PURE__ */ Symbol.for("nodejs.util.inspect.custom"))]() {
1118
+ return `CID(${this.toString()})`;
1119
+ }
1120
+ /**
1121
+ * Takes any input `value` and returns a `CID` instance if it was
1122
+ * a `CID` otherwise returns `null`. If `value` is instanceof `CID`
1123
+ * it will return value back. If `value` is not instance of this CID
1124
+ * class, but is compatible CID it will return new instance of this
1125
+ * `CID` class. Otherwise returns null.
1126
+ *
1127
+ * This allows two different incompatible versions of CID library to
1128
+ * co-exist and interop as long as binary interface is compatible.
1129
+ */
1130
+ static asCID(input) {
1131
+ if (input == null) {
1132
+ return null;
1133
+ }
1134
+ const value = input;
1135
+ if (value instanceof _CID) {
1136
+ return value;
1137
+ } else if (value["/"] != null && value["/"] === value.bytes || value.asCID === value) {
1138
+ const { version, code: code2, multihash, bytes } = value;
1139
+ return new _CID(version, code2, multihash, bytes ?? encodeCID(version, code2, multihash.bytes));
1140
+ } else if (value[cidSymbol] === true) {
1141
+ const { version, multihash, code: code2 } = value;
1142
+ const digest2 = decode4(multihash);
1143
+ return _CID.create(version, code2, digest2);
1144
+ } else {
1145
+ return null;
1146
+ }
1147
+ }
1148
+ /**
1149
+ * @param version - Version of the CID
1150
+ * @param code - Code of the codec content is encoded in, see https://github.com/multiformats/multicodec/blob/master/table.csv
1151
+ * @param digest - (Multi)hash of the of the content.
1152
+ */
1153
+ static create(version, code2, digest2) {
1154
+ if (typeof code2 !== "number") {
1155
+ throw new Error("String codecs are no longer supported");
1156
+ }
1157
+ if (!(digest2.bytes instanceof Uint8Array)) {
1158
+ throw new Error("Invalid digest");
1159
+ }
1160
+ switch (version) {
1161
+ case 0: {
1162
+ if (code2 !== DAG_PB_CODE) {
1163
+ throw new Error(`Version 0 CID must use dag-pb (code: ${DAG_PB_CODE}) block encoding`);
1164
+ } else {
1165
+ return new _CID(version, code2, digest2, digest2.bytes);
1166
+ }
1167
+ }
1168
+ case 1: {
1169
+ const bytes = encodeCID(version, code2, digest2.bytes);
1170
+ return new _CID(version, code2, digest2, bytes);
1171
+ }
1172
+ default: {
1173
+ throw new Error("Invalid version");
1174
+ }
1175
+ }
1176
+ }
1177
+ /**
1178
+ * Simplified version of `create` for CIDv0.
1179
+ */
1180
+ static createV0(digest2) {
1181
+ return _CID.create(0, DAG_PB_CODE, digest2);
1182
+ }
1183
+ /**
1184
+ * Simplified version of `create` for CIDv1.
1185
+ *
1186
+ * @param code - Content encoding format code.
1187
+ * @param digest - Multihash of the content.
1188
+ */
1189
+ static createV1(code2, digest2) {
1190
+ return _CID.create(1, code2, digest2);
1191
+ }
1192
+ /**
1193
+ * Decoded a CID from its binary representation. The byte array must contain
1194
+ * only the CID with no additional bytes.
1195
+ *
1196
+ * An error will be thrown if the bytes provided do not contain a valid
1197
+ * binary representation of a CID.
1198
+ */
1199
+ static decode(bytes) {
1200
+ const [cid, remainder] = _CID.decodeFirst(bytes);
1201
+ if (remainder.length !== 0) {
1202
+ throw new Error("Incorrect length");
1203
+ }
1204
+ return cid;
1205
+ }
1206
+ /**
1207
+ * Decoded a CID from its binary representation at the beginning of a byte
1208
+ * array.
1209
+ *
1210
+ * Returns an array with the first element containing the CID and the second
1211
+ * element containing the remainder of the original byte array. The remainder
1212
+ * will be a zero-length byte array if the provided bytes only contained a
1213
+ * binary CID representation.
1214
+ */
1215
+ static decodeFirst(bytes) {
1216
+ const specs = _CID.inspectBytes(bytes);
1217
+ const prefixSize = specs.size - specs.multihashSize;
1218
+ const multihashBytes = coerce(bytes.subarray(prefixSize, prefixSize + specs.multihashSize));
1219
+ if (multihashBytes.byteLength !== specs.multihashSize) {
1220
+ throw new Error("Incorrect length");
1221
+ }
1222
+ const digestBytes = multihashBytes.subarray(specs.multihashSize - specs.digestSize);
1223
+ const digest2 = new Digest(specs.multihashCode, specs.digestSize, digestBytes, multihashBytes);
1224
+ const cid = specs.version === 0 ? _CID.createV0(digest2) : _CID.createV1(specs.codec, digest2);
1225
+ return [cid, bytes.subarray(specs.size)];
1226
+ }
1227
+ /**
1228
+ * Inspect the initial bytes of a CID to determine its properties.
1229
+ *
1230
+ * Involves decoding up to 4 varints. Typically this will require only 4 to 6
1231
+ * bytes but for larger multicodec code values and larger multihash digest
1232
+ * lengths these varints can be quite large. It is recommended that at least
1233
+ * 10 bytes be made available in the `initialBytes` argument for a complete
1234
+ * inspection.
1235
+ */
1236
+ static inspectBytes(initialBytes) {
1237
+ let offset = 0;
1238
+ const next = () => {
1239
+ const [i, length2] = decode3(initialBytes.subarray(offset));
1240
+ offset += length2;
1241
+ return i;
1242
+ };
1243
+ let version = next();
1244
+ let codec = DAG_PB_CODE;
1245
+ if (version === 18) {
1246
+ version = 0;
1247
+ offset = 0;
1248
+ } else {
1249
+ codec = next();
1250
+ }
1251
+ if (version !== 0 && version !== 1) {
1252
+ throw new RangeError(`Invalid CID version ${version}`);
1253
+ }
1254
+ const prefixSize = offset;
1255
+ const multihashCode = next();
1256
+ const digestSize = next();
1257
+ const size = offset + digestSize;
1258
+ const multihashSize = size - prefixSize;
1259
+ return { version, codec, multihashCode, digestSize, multihashSize, size };
1260
+ }
1261
+ /**
1262
+ * Takes cid in a string representation and creates an instance. If `base`
1263
+ * decoder is not provided will use a default from the configuration. It will
1264
+ * throw an error if encoding of the CID is not compatible with supplied (or
1265
+ * a default decoder).
1266
+ */
1267
+ static parse(source, base3) {
1268
+ const [prefix, bytes] = parseCIDtoBytes(source, base3);
1269
+ const cid = _CID.decode(bytes);
1270
+ if (cid.version === 0 && source[0] !== "Q") {
1271
+ throw Error("Version 0 CID string must not include multibase prefix");
1272
+ }
1273
+ baseCache(cid).set(prefix, source);
1274
+ return cid;
1275
+ }
1276
+ };
1277
+ function parseCIDtoBytes(source, base3) {
1278
+ switch (source[0]) {
1279
+ // CIDv0 is parsed differently
1280
+ case "Q": {
1281
+ const decoder = base3 ?? base58btc;
1282
+ return [
1283
+ base58btc.prefix,
1284
+ decoder.decode(`${base58btc.prefix}${source}`)
1285
+ ];
1286
+ }
1287
+ case base58btc.prefix: {
1288
+ const decoder = base3 ?? base58btc;
1289
+ return [base58btc.prefix, decoder.decode(source)];
1290
+ }
1291
+ case base32.prefix: {
1292
+ const decoder = base3 ?? base32;
1293
+ return [base32.prefix, decoder.decode(source)];
1294
+ }
1295
+ case base36.prefix: {
1296
+ const decoder = base3 ?? base36;
1297
+ return [base36.prefix, decoder.decode(source)];
1298
+ }
1299
+ default: {
1300
+ if (base3 == null) {
1301
+ throw Error("To parse non base32, base36 or base58btc encoded CID multibase decoder must be provided");
1302
+ }
1303
+ return [source[0], base3.decode(source)];
1304
+ }
1305
+ }
1306
+ }
1307
+ function toStringV0(bytes, cache2, base3) {
1308
+ const { prefix } = base3;
1309
+ if (prefix !== base58btc.prefix) {
1310
+ throw Error(`Cannot string encode V0 in ${base3.name} encoding`);
1311
+ }
1312
+ const cid = cache2.get(prefix);
1313
+ if (cid == null) {
1314
+ const cid2 = base3.encode(bytes).slice(1);
1315
+ cache2.set(prefix, cid2);
1316
+ return cid2;
1317
+ } else {
1318
+ return cid;
1319
+ }
1320
+ }
1321
+ function toStringV1(bytes, cache2, base3) {
1322
+ const { prefix } = base3;
1323
+ const cid = cache2.get(prefix);
1324
+ if (cid == null) {
1325
+ const cid2 = base3.encode(bytes);
1326
+ cache2.set(prefix, cid2);
1327
+ return cid2;
1328
+ } else {
1329
+ return cid;
1330
+ }
1331
+ }
1332
+ var DAG_PB_CODE = 112;
1333
+ var SHA_256_CODE = 18;
1334
+ function encodeCID(version, code2, multihash) {
1335
+ const codeOffset = encodingLength(version);
1336
+ const hashOffset = codeOffset + encodingLength(code2);
1337
+ const bytes = new Uint8Array(hashOffset + multihash.byteLength);
1338
+ encodeTo(version, bytes, 0);
1339
+ encodeTo(code2, bytes, codeOffset);
1340
+ bytes.set(multihash, hashOffset);
1341
+ return bytes;
1342
+ }
1343
+ var cidSymbol = /* @__PURE__ */ Symbol.for("@ipld/js-cid/CID");
1344
+
1345
+ // src/requester/index.ts
428
1346
  var import_zod2 = require("zod");
429
1347
 
430
1348
  // src/policy/errors.ts
431
1349
  var SignedObjectProfileError = class extends Error {
432
- constructor(code, message) {
1350
+ constructor(code2, message) {
433
1351
  super(message);
434
1352
  this.name = "SignedObjectProfileError";
435
- this.code = code;
1353
+ this.code = code2;
436
1354
  }
437
1355
  };
438
1356
  var SignedObjectSchemaError = class extends SignedObjectProfileError {
@@ -630,35 +1548,33 @@ function assertNoSymbolKeys(input, path) {
630
1548
  );
631
1549
  }
632
1550
  }
633
- function isArrayIndexKey(key, length) {
1551
+ function isArrayIndexKey(key, length2) {
634
1552
  if (!/^(0|[1-9]\d*)$/.test(key)) {
635
1553
  return false;
636
1554
  }
637
1555
  const index = Number(key);
638
- return Number.isSafeInteger(index) && index >= 0 && index < length;
1556
+ return Number.isSafeInteger(index) && index >= 0 && index < length2;
639
1557
  }
640
1558
  function serializeObject(value) {
641
- const keys = Object.keys(value).sort(compareCodePoints);
1559
+ const keys = Object.keys(value).sort(compareUtf16CodeUnits);
642
1560
  const parts = keys.map((key) => `${JSON.stringify(key)}:${serialize(value[key])}`);
643
1561
  return `{${parts.join(",")}}`;
644
1562
  }
645
- function compareCodePoints(a, b) {
646
- const left = Array.from(a);
647
- const right = Array.from(b);
648
- const max = Math.min(left.length, right.length);
1563
+ function compareUtf16CodeUnits(a, b) {
1564
+ const max = Math.min(a.length, b.length);
649
1565
  for (let index = 0; index < max; index++) {
650
- const leftPoint = left[index].codePointAt(0) ?? 0;
651
- const rightPoint = right[index].codePointAt(0) ?? 0;
652
- if (leftPoint !== rightPoint) {
653
- return leftPoint - rightPoint;
1566
+ const leftCodeUnit = a.charCodeAt(index);
1567
+ const rightCodeUnit = b.charCodeAt(index);
1568
+ if (leftCodeUnit !== rightCodeUnit) {
1569
+ return leftCodeUnit - rightCodeUnit;
654
1570
  }
655
1571
  }
656
- return left.length - right.length;
1572
+ return a.length - b.length;
657
1573
  }
658
1574
  function assertUnicodeScalarString(value, path) {
659
1575
  for (let index = 0; index < value.length; index++) {
660
- const code = value.charCodeAt(index);
661
- if (code >= 55296 && code <= 56319) {
1576
+ const code2 = value.charCodeAt(index);
1577
+ if (code2 >= 55296 && code2 <= 56319) {
662
1578
  const next = value.charCodeAt(index + 1);
663
1579
  if (Number.isNaN(next) || next < 56320 || next > 57343) {
664
1580
  throw new SignedObjectCanonicalizationError(
@@ -668,7 +1584,7 @@ function assertUnicodeScalarString(value, path) {
668
1584
  index++;
669
1585
  continue;
670
1586
  }
671
- if (code >= 56320 && code <= 57343) {
1587
+ if (code2 >= 56320 && code2 <= 57343) {
672
1588
  throw new SignedObjectCanonicalizationError(
673
1589
  `${path} contains a lone low surrogate`
674
1590
  );
@@ -681,10 +1597,10 @@ var import_bootstrap = require("@tinycloud/bootstrap");
681
1597
  var import_viem2 = require("viem");
682
1598
  var textEncoder = new TextEncoder();
683
1599
  var PolicyCapabilityError = class extends Error {
684
- constructor(code, message) {
1600
+ constructor(code2, message) {
685
1601
  super(message);
686
1602
  this.name = "PolicyCapabilityError";
687
- this.code = code;
1603
+ this.code = code2;
688
1604
  }
689
1605
  };
690
1606
  var objectHasOwn2 = Object.hasOwn ?? Object.prototype.hasOwnProperty.call.bind(
@@ -735,7 +1651,7 @@ function policyCapabilityContains(authority, request) {
735
1651
  }
736
1652
  return caveatsContain(auth.caveats, req.caveats);
737
1653
  }
738
- function normalizePolicyCapabilityWithOptions(input, options) {
1654
+ function normalizePolicyCapabilityWithOptions(input, options2) {
739
1655
  const object = expectObject(input, "$");
740
1656
  assertExactKeys(object, ["service", "space", "path", "actions", "caveats"], "$");
741
1657
  const service = requiredString(object, "service", "$", "policy-capability-malformed-service");
@@ -748,26 +1664,26 @@ function normalizePolicyCapabilityWithOptions(input, options) {
748
1664
  const space = requiredString(object, "space", "$", "policy-capability-malformed-space");
749
1665
  validateConcreteSpace(space);
750
1666
  const canonicalSpace = space.normalize("NFC");
751
- if (options.requireCanonical && canonicalSpace !== space) {
1667
+ if (options2.requireCanonical && canonicalSpace !== space) {
752
1668
  throw new PolicyCapabilityError(
753
1669
  "policy-capability-malformed-space",
754
1670
  "$.space must already be canonical NFC"
755
1671
  );
756
1672
  }
757
1673
  const rawPath = requiredString(object, "path", "$", "policy-capability-malformed-path");
758
- validateRawPath(rawPath, options);
1674
+ validateRawPath(rawPath, options2);
759
1675
  const path = normalizePath(rawPath);
760
- if (options.requireCanonical && path !== rawPath) {
1676
+ if (options2.requireCanonical && path !== rawPath) {
761
1677
  throw new PolicyCapabilityError(
762
1678
  "policy-capability-malformed-path",
763
1679
  "$.path must already be canonical"
764
1680
  );
765
1681
  }
766
- validateRawPath(path, options);
1682
+ validateRawPath(path, options2);
767
1683
  const actions = normalizeActions(
768
1684
  requiredArray(object, "actions", "$", "policy-capability-malformed-action"),
769
1685
  service,
770
- options
1686
+ options2
771
1687
  );
772
1688
  const output = /* @__PURE__ */ Object.create(null);
773
1689
  output.service = service;
@@ -810,23 +1726,23 @@ function assertExactKeys(object, allowed, path) {
810
1726
  }
811
1727
  }
812
1728
  }
813
- function requiredValue(object, key, path, code) {
1729
+ function requiredValue(object, key, path, code2) {
814
1730
  if (!hasOwn(object, key)) {
815
- throw new PolicyCapabilityError(code, `${path}.${key} is required`);
1731
+ throw new PolicyCapabilityError(code2, `${path}.${key} is required`);
816
1732
  }
817
1733
  return object[key];
818
1734
  }
819
- function requiredString(object, key, path, code) {
820
- const value = requiredValue(object, key, path, code);
1735
+ function requiredString(object, key, path, code2) {
1736
+ const value = requiredValue(object, key, path, code2);
821
1737
  if (typeof value !== "string" || value.length === 0) {
822
- throw new PolicyCapabilityError(code, `${path}.${key} must be a non-empty string`);
1738
+ throw new PolicyCapabilityError(code2, `${path}.${key} must be a non-empty string`);
823
1739
  }
824
1740
  return value;
825
1741
  }
826
- function requiredArray(object, key, path, code) {
827
- const value = requiredValue(object, key, path, code);
1742
+ function requiredArray(object, key, path, code2) {
1743
+ const value = requiredValue(object, key, path, code2);
828
1744
  if (!Array.isArray(value)) {
829
- throw new PolicyCapabilityError(code, `${path}.${key} must be an array`);
1745
+ throw new PolicyCapabilityError(code2, `${path}.${key} must be an array`);
830
1746
  }
831
1747
  return value;
832
1748
  }
@@ -838,11 +1754,11 @@ function validateConcreteSpace(space) {
838
1754
  );
839
1755
  }
840
1756
  }
841
- function validateRawPath(path, options) {
1757
+ function validateRawPath(path, options2) {
842
1758
  if (path.length === 0) {
843
1759
  throw new PolicyCapabilityError("policy-capability-malformed-path", "$.path is empty");
844
1760
  }
845
- if (!options.allowPrefixPaths && path.endsWith("/")) {
1761
+ if (!options2.allowPrefixPaths && path.endsWith("/")) {
846
1762
  throw new PolicyCapabilityError(
847
1763
  "policy-capability-malformed-path",
848
1764
  "$.path must be an exact concrete path, not a prefix"
@@ -854,7 +1770,7 @@ function validateRawPath(path, options) {
854
1770
  const segments = path.split("/");
855
1771
  for (let index = 0; index < segments.length; index++) {
856
1772
  const segment = segments[index];
857
- const isTrailingPrefixSegment = options.allowPrefixPaths && index === segments.length - 1 && segment.length === 0;
1773
+ const isTrailingPrefixSegment = options2.allowPrefixPaths && index === segments.length - 1 && segment.length === 0;
858
1774
  if (segment.length === 0 && !isTrailingPrefixSegment) {
859
1775
  throw new PolicyCapabilityError("policy-capability-malformed-path", "$.path has an empty segment");
860
1776
  }
@@ -881,7 +1797,7 @@ function decodeUnreserved(path) {
881
1797
  return /^[A-Za-z0-9._~-]$/.test(char) ? char : encoded.toUpperCase();
882
1798
  });
883
1799
  }
884
- function normalizeActions(actions, service, options) {
1800
+ function normalizeActions(actions, service, options2) {
885
1801
  const accepted = GRANTABLE_ACTIONS.get(service);
886
1802
  if (accepted === void 0) {
887
1803
  throw new PolicyCapabilityError(
@@ -915,7 +1831,7 @@ function normalizeActions(actions, service, options) {
915
1831
  );
916
1832
  }
917
1833
  const normalizedActions = [...unique].sort();
918
- if (options.requireCanonical && (rawActions.length !== normalizedActions.length || rawActions.some((action, index) => action !== normalizedActions[index]))) {
1834
+ if (options2.requireCanonical && (rawActions.length !== normalizedActions.length || rawActions.some((action, index) => action !== normalizedActions[index]))) {
919
1835
  throw new PolicyCapabilityError(
920
1836
  "policy-capability-malformed-action",
921
1837
  "$.actions must already be sorted, deduplicated canonical action URNs"
@@ -1057,50 +1973,291 @@ function hasOwn(object, key) {
1057
1973
 
1058
1974
  // src/policy/signed-object.ts
1059
1975
  var import_ed25519 = require("@noble/curves/ed25519");
1060
- var import_basics = require("multiformats/basics");
1061
- var import_viem3 = require("viem");
1062
- var POLICY_SCHEMA = "xyz.tinycloud.policy/policy/v0";
1063
- var POLICY_STATUS_SCHEMA = "xyz.tinycloud.policy/status/v0";
1064
- var POLICY_ENGINE_RECORD_SCHEMA = "xyz.tinycloud.policy/engine-record/v0";
1065
- var ED25519_JCS_SIGNATURE_SUITE = "eddsa-ed25519-sha256-jcs-v1";
1066
- var EIP191_JCS_SIGNATURE_SUITE = "eip191-secp256k1-sha256-jcs-v1";
1067
- var DESCRIPTORS = {
1068
- Policy: {
1069
- kind: "Policy",
1070
- schema: POLICY_SCHEMA,
1071
- idField: "policyId",
1072
- idPrefix: "pol_",
1073
- domain: POLICY_SCHEMA
1074
- },
1075
- PolicyStatus: {
1076
- kind: "PolicyStatus",
1077
- schema: POLICY_STATUS_SCHEMA,
1078
- idField: "statusId",
1079
- idPrefix: "polst_",
1080
- domain: POLICY_STATUS_SCHEMA
1081
- },
1082
- PolicyEngineRecord: {
1083
- kind: "PolicyEngineRecord",
1084
- schema: POLICY_ENGINE_RECORD_SCHEMA,
1085
- idField: "engineRecordId",
1086
- idPrefix: "peng_",
1087
- domain: POLICY_ENGINE_RECORD_SCHEMA
1088
- }
1089
- };
1090
- var textEncoder2 = new TextEncoder();
1091
- var BASE32_ALPHABET = "abcdefghijklmnopqrstuvwxyz234567";
1092
- var BASE64URL_RE = /^[A-Za-z0-9_-]+$/;
1093
- var objectHasOwn3 = Object.hasOwn ?? Object.prototype.hasOwnProperty.call.bind(
1094
- Object.prototype.hasOwnProperty
1095
- );
1096
- function canonicalizeSignedObjectUnsigned(input) {
1097
- return jcsCanonicalize(input);
1098
- }
1099
- function deriveSignedObjectMaterial(input) {
1100
- const descriptor = descriptorForUnsigned(input);
1101
- const unsigned = validateUnsignedForDescriptor(input, descriptor);
1102
- return materialForUnsigned(unsigned, descriptor);
1103
- }
1976
+
1977
+ // ../../node_modules/multiformats/dist/src/bases/base10.js
1978
+ var base10_exports = {};
1979
+ __export(base10_exports, {
1980
+ base10: () => base10
1981
+ });
1982
+ var base10 = baseX({
1983
+ prefix: "9",
1984
+ name: "base10",
1985
+ alphabet: "0123456789"
1986
+ });
1987
+
1988
+ // ../../node_modules/multiformats/dist/src/bases/base16.js
1989
+ var base16_exports = {};
1990
+ __export(base16_exports, {
1991
+ base16: () => base16,
1992
+ base16upper: () => base16upper
1993
+ });
1994
+ var base16 = rfc4648({
1995
+ prefix: "f",
1996
+ name: "base16",
1997
+ alphabet: "0123456789abcdef",
1998
+ bitsPerChar: 4
1999
+ });
2000
+ var base16upper = rfc4648({
2001
+ prefix: "F",
2002
+ name: "base16upper",
2003
+ alphabet: "0123456789ABCDEF",
2004
+ bitsPerChar: 4
2005
+ });
2006
+
2007
+ // ../../node_modules/multiformats/dist/src/bases/base2.js
2008
+ var base2_exports = {};
2009
+ __export(base2_exports, {
2010
+ base2: () => base2
2011
+ });
2012
+ var base2 = rfc4648({
2013
+ prefix: "0",
2014
+ name: "base2",
2015
+ alphabet: "01",
2016
+ bitsPerChar: 1
2017
+ });
2018
+
2019
+ // ../../node_modules/multiformats/dist/src/bases/base256emoji.js
2020
+ var base256emoji_exports = {};
2021
+ __export(base256emoji_exports, {
2022
+ base256emoji: () => base256emoji
2023
+ });
2024
+ var alphabet = Array.from("\u{1F680}\u{1FA90}\u2604\u{1F6F0}\u{1F30C}\u{1F311}\u{1F312}\u{1F313}\u{1F314}\u{1F315}\u{1F316}\u{1F317}\u{1F318}\u{1F30D}\u{1F30F}\u{1F30E}\u{1F409}\u2600\u{1F4BB}\u{1F5A5}\u{1F4BE}\u{1F4BF}\u{1F602}\u2764\u{1F60D}\u{1F923}\u{1F60A}\u{1F64F}\u{1F495}\u{1F62D}\u{1F618}\u{1F44D}\u{1F605}\u{1F44F}\u{1F601}\u{1F525}\u{1F970}\u{1F494}\u{1F496}\u{1F499}\u{1F622}\u{1F914}\u{1F606}\u{1F644}\u{1F4AA}\u{1F609}\u263A\u{1F44C}\u{1F917}\u{1F49C}\u{1F614}\u{1F60E}\u{1F607}\u{1F339}\u{1F926}\u{1F389}\u{1F49E}\u270C\u2728\u{1F937}\u{1F631}\u{1F60C}\u{1F338}\u{1F64C}\u{1F60B}\u{1F497}\u{1F49A}\u{1F60F}\u{1F49B}\u{1F642}\u{1F493}\u{1F929}\u{1F604}\u{1F600}\u{1F5A4}\u{1F603}\u{1F4AF}\u{1F648}\u{1F447}\u{1F3B6}\u{1F612}\u{1F92D}\u2763\u{1F61C}\u{1F48B}\u{1F440}\u{1F62A}\u{1F611}\u{1F4A5}\u{1F64B}\u{1F61E}\u{1F629}\u{1F621}\u{1F92A}\u{1F44A}\u{1F973}\u{1F625}\u{1F924}\u{1F449}\u{1F483}\u{1F633}\u270B\u{1F61A}\u{1F61D}\u{1F634}\u{1F31F}\u{1F62C}\u{1F643}\u{1F340}\u{1F337}\u{1F63B}\u{1F613}\u2B50\u2705\u{1F97A}\u{1F308}\u{1F608}\u{1F918}\u{1F4A6}\u2714\u{1F623}\u{1F3C3}\u{1F490}\u2639\u{1F38A}\u{1F498}\u{1F620}\u261D\u{1F615}\u{1F33A}\u{1F382}\u{1F33B}\u{1F610}\u{1F595}\u{1F49D}\u{1F64A}\u{1F639}\u{1F5E3}\u{1F4AB}\u{1F480}\u{1F451}\u{1F3B5}\u{1F91E}\u{1F61B}\u{1F534}\u{1F624}\u{1F33C}\u{1F62B}\u26BD\u{1F919}\u2615\u{1F3C6}\u{1F92B}\u{1F448}\u{1F62E}\u{1F646}\u{1F37B}\u{1F343}\u{1F436}\u{1F481}\u{1F632}\u{1F33F}\u{1F9E1}\u{1F381}\u26A1\u{1F31E}\u{1F388}\u274C\u270A\u{1F44B}\u{1F630}\u{1F928}\u{1F636}\u{1F91D}\u{1F6B6}\u{1F4B0}\u{1F353}\u{1F4A2}\u{1F91F}\u{1F641}\u{1F6A8}\u{1F4A8}\u{1F92C}\u2708\u{1F380}\u{1F37A}\u{1F913}\u{1F619}\u{1F49F}\u{1F331}\u{1F616}\u{1F476}\u{1F974}\u25B6\u27A1\u2753\u{1F48E}\u{1F4B8}\u2B07\u{1F628}\u{1F31A}\u{1F98B}\u{1F637}\u{1F57A}\u26A0\u{1F645}\u{1F61F}\u{1F635}\u{1F44E}\u{1F932}\u{1F920}\u{1F927}\u{1F4CC}\u{1F535}\u{1F485}\u{1F9D0}\u{1F43E}\u{1F352}\u{1F617}\u{1F911}\u{1F30A}\u{1F92F}\u{1F437}\u260E\u{1F4A7}\u{1F62F}\u{1F486}\u{1F446}\u{1F3A4}\u{1F647}\u{1F351}\u2744\u{1F334}\u{1F4A3}\u{1F438}\u{1F48C}\u{1F4CD}\u{1F940}\u{1F922}\u{1F445}\u{1F4A1}\u{1F4A9}\u{1F450}\u{1F4F8}\u{1F47B}\u{1F910}\u{1F92E}\u{1F3BC}\u{1F975}\u{1F6A9}\u{1F34E}\u{1F34A}\u{1F47C}\u{1F48D}\u{1F4E3}\u{1F942}");
2025
+ var alphabetBytesToChars = alphabet.reduce((p, c, i) => {
2026
+ p[i] = c;
2027
+ return p;
2028
+ }, []);
2029
+ var alphabetCharsToBytes = alphabet.reduce((p, c, i) => {
2030
+ const codePoint = c.codePointAt(0);
2031
+ if (codePoint == null) {
2032
+ throw new Error(`Invalid character: ${c}`);
2033
+ }
2034
+ p[codePoint] = i;
2035
+ return p;
2036
+ }, []);
2037
+ function encode3(data) {
2038
+ return data.reduce((p, c) => {
2039
+ p += alphabetBytesToChars[c];
2040
+ return p;
2041
+ }, "");
2042
+ }
2043
+ function decode5(str) {
2044
+ const byts = [];
2045
+ for (const char of str) {
2046
+ const codePoint = char.codePointAt(0);
2047
+ if (codePoint == null) {
2048
+ throw new Error(`Invalid character: ${char}`);
2049
+ }
2050
+ const byt = alphabetCharsToBytes[codePoint];
2051
+ if (byt == null) {
2052
+ throw new Error(`Non-base256emoji character: ${char}`);
2053
+ }
2054
+ byts.push(byt);
2055
+ }
2056
+ return new Uint8Array(byts);
2057
+ }
2058
+ var base256emoji = from({
2059
+ prefix: "\u{1F680}",
2060
+ name: "base256emoji",
2061
+ encode: encode3,
2062
+ decode: decode5
2063
+ });
2064
+
2065
+ // ../../node_modules/multiformats/dist/src/bases/base64.js
2066
+ var base64_exports = {};
2067
+ __export(base64_exports, {
2068
+ base64: () => base64,
2069
+ base64pad: () => base64pad,
2070
+ base64url: () => base64url,
2071
+ base64urlpad: () => base64urlpad
2072
+ });
2073
+ var base64 = rfc4648({
2074
+ prefix: "m",
2075
+ name: "base64",
2076
+ alphabet: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
2077
+ bitsPerChar: 6
2078
+ });
2079
+ var base64pad = rfc4648({
2080
+ prefix: "M",
2081
+ name: "base64pad",
2082
+ alphabet: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
2083
+ bitsPerChar: 6
2084
+ });
2085
+ var base64url = rfc4648({
2086
+ prefix: "u",
2087
+ name: "base64url",
2088
+ alphabet: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",
2089
+ bitsPerChar: 6
2090
+ });
2091
+ var base64urlpad = rfc4648({
2092
+ prefix: "U",
2093
+ name: "base64urlpad",
2094
+ alphabet: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=",
2095
+ bitsPerChar: 6
2096
+ });
2097
+
2098
+ // ../../node_modules/multiformats/dist/src/bases/base8.js
2099
+ var base8_exports = {};
2100
+ __export(base8_exports, {
2101
+ base8: () => base8
2102
+ });
2103
+ var base8 = rfc4648({
2104
+ prefix: "7",
2105
+ name: "base8",
2106
+ alphabet: "01234567",
2107
+ bitsPerChar: 3
2108
+ });
2109
+
2110
+ // ../../node_modules/multiformats/dist/src/bases/identity.js
2111
+ var identity_exports = {};
2112
+ __export(identity_exports, {
2113
+ identity: () => identity
2114
+ });
2115
+ var identity = from({
2116
+ prefix: "\0",
2117
+ name: "identity",
2118
+ encode: (buf) => toString(buf),
2119
+ decode: (str) => fromString(str)
2120
+ });
2121
+
2122
+ // ../../node_modules/multiformats/dist/src/codecs/json.js
2123
+ var textEncoder2 = new TextEncoder();
2124
+ var textDecoder = new TextDecoder();
2125
+
2126
+ // ../../node_modules/multiformats/dist/src/hashes/identity.js
2127
+ var identity_exports2 = {};
2128
+ __export(identity_exports2, {
2129
+ identity: () => identity2
2130
+ });
2131
+ var code = 0;
2132
+ var name = "identity";
2133
+ var encode4 = coerce;
2134
+ function digest(input, options2) {
2135
+ if (options2?.truncate != null && options2.truncate !== input.byteLength) {
2136
+ if (options2.truncate < 0 || options2.truncate > input.byteLength) {
2137
+ throw new Error(`Invalid truncate option, must be less than or equal to ${input.byteLength}`);
2138
+ }
2139
+ input = input.subarray(0, options2.truncate);
2140
+ }
2141
+ return create(code, encode4(input));
2142
+ }
2143
+ var identity2 = { code, name, encode: encode4, digest };
2144
+
2145
+ // ../../node_modules/multiformats/dist/src/hashes/sha2.js
2146
+ var sha2_exports = {};
2147
+ __export(sha2_exports, {
2148
+ sha256: () => sha2562,
2149
+ sha512: () => sha512
2150
+ });
2151
+ var import_crypto = __toESM(require("crypto"), 1);
2152
+
2153
+ // ../../node_modules/multiformats/dist/src/hashes/hasher.js
2154
+ var DEFAULT_MIN_DIGEST_LENGTH = 20;
2155
+ function from2({ name: name2, code: code2, encode: encode5, minDigestLength, maxDigestLength }) {
2156
+ return new Hasher(name2, code2, encode5, minDigestLength, maxDigestLength);
2157
+ }
2158
+ var Hasher = class {
2159
+ constructor(name2, code2, encode5, minDigestLength, maxDigestLength) {
2160
+ __publicField(this, "name");
2161
+ __publicField(this, "code");
2162
+ __publicField(this, "encode");
2163
+ __publicField(this, "minDigestLength");
2164
+ __publicField(this, "maxDigestLength");
2165
+ this.name = name2;
2166
+ this.code = code2;
2167
+ this.encode = encode5;
2168
+ this.minDigestLength = minDigestLength ?? DEFAULT_MIN_DIGEST_LENGTH;
2169
+ this.maxDigestLength = maxDigestLength;
2170
+ }
2171
+ digest(input, options2) {
2172
+ if (options2?.truncate != null) {
2173
+ if (options2.truncate < this.minDigestLength) {
2174
+ throw new Error(`Invalid truncate option, must be greater than or equal to ${this.minDigestLength}`);
2175
+ }
2176
+ if (this.maxDigestLength != null && options2.truncate > this.maxDigestLength) {
2177
+ throw new Error(`Invalid truncate option, must be less than or equal to ${this.maxDigestLength}`);
2178
+ }
2179
+ }
2180
+ if (input instanceof Uint8Array) {
2181
+ const result = this.encode(input);
2182
+ if (result instanceof Uint8Array) {
2183
+ return createDigest(result, this.code, options2?.truncate);
2184
+ }
2185
+ return result.then((digest2) => createDigest(digest2, this.code, options2?.truncate));
2186
+ } else {
2187
+ throw Error("Unknown type, must be binary type");
2188
+ }
2189
+ }
2190
+ };
2191
+ function createDigest(digest2, code2, truncate) {
2192
+ if (truncate != null && truncate !== digest2.byteLength) {
2193
+ if (truncate > digest2.byteLength) {
2194
+ throw new Error(`Invalid truncate option, must be less than or equal to ${digest2.byteLength}`);
2195
+ }
2196
+ digest2 = digest2.subarray(0, truncate);
2197
+ }
2198
+ return create(code2, digest2);
2199
+ }
2200
+
2201
+ // ../../node_modules/multiformats/dist/src/hashes/sha2.js
2202
+ var sha2562 = from2({
2203
+ name: "sha2-256",
2204
+ code: 18,
2205
+ encode: (input) => coerce(import_crypto.default.createHash("sha256").update(input).digest())
2206
+ });
2207
+ var sha512 = from2({
2208
+ name: "sha2-512",
2209
+ code: 19,
2210
+ encode: (input) => coerce(import_crypto.default.createHash("sha512").update(input).digest())
2211
+ });
2212
+
2213
+ // ../../node_modules/multiformats/dist/src/basics.js
2214
+ var bases = { ...identity_exports, ...base2_exports, ...base8_exports, ...base10_exports, ...base16_exports, ...base32_exports, ...base36_exports, ...base58_exports, ...base64_exports, ...base256emoji_exports };
2215
+ var hashes = { ...sha2_exports, ...identity_exports2 };
2216
+
2217
+ // src/policy/signed-object.ts
2218
+ var import_viem3 = require("viem");
2219
+ var POLICY_SCHEMA = "xyz.tinycloud.policy/policy/v0";
2220
+ var POLICY_STATUS_SCHEMA = "xyz.tinycloud.policy/status/v0";
2221
+ var POLICY_ENGINE_RECORD_SCHEMA = "xyz.tinycloud.policy/engine-record/v0";
2222
+ var ED25519_JCS_SIGNATURE_SUITE = "eddsa-ed25519-sha256-jcs-v1";
2223
+ var EIP191_JCS_SIGNATURE_SUITE = "eip191-secp256k1-sha256-jcs-v1";
2224
+ var DESCRIPTORS = {
2225
+ Policy: {
2226
+ kind: "Policy",
2227
+ schema: POLICY_SCHEMA,
2228
+ idField: "policyId",
2229
+ idPrefix: "pol_",
2230
+ domain: POLICY_SCHEMA
2231
+ },
2232
+ PolicyStatus: {
2233
+ kind: "PolicyStatus",
2234
+ schema: POLICY_STATUS_SCHEMA,
2235
+ idField: "statusId",
2236
+ idPrefix: "polst_",
2237
+ domain: POLICY_STATUS_SCHEMA
2238
+ },
2239
+ PolicyEngineRecord: {
2240
+ kind: "PolicyEngineRecord",
2241
+ schema: POLICY_ENGINE_RECORD_SCHEMA,
2242
+ idField: "engineRecordId",
2243
+ idPrefix: "peng_",
2244
+ domain: POLICY_ENGINE_RECORD_SCHEMA
2245
+ }
2246
+ };
2247
+ var textEncoder3 = new TextEncoder();
2248
+ var BASE32_ALPHABET = "abcdefghijklmnopqrstuvwxyz234567";
2249
+ var BASE64URL_RE = /^[A-Za-z0-9_-]+$/;
2250
+ var objectHasOwn3 = Object.hasOwn ?? Object.prototype.hasOwnProperty.call.bind(
2251
+ Object.prototype.hasOwnProperty
2252
+ );
2253
+ function canonicalizeSignedObjectUnsigned(input) {
2254
+ return jcsCanonicalize(input);
2255
+ }
2256
+ function deriveSignedObjectMaterial(input) {
2257
+ const descriptor = descriptorForUnsigned(input);
2258
+ const unsigned = validateUnsignedForDescriptor(input, descriptor);
2259
+ return materialForUnsigned(unsigned, descriptor);
2260
+ }
1104
2261
  function signedObjectIdFor(input) {
1105
2262
  return deriveSignedObjectMaterial(input).id;
1106
2263
  }
@@ -1536,9 +2693,9 @@ function validateAudit(input, path) {
1536
2693
  }
1537
2694
  function materialForUnsigned(unsigned, descriptor) {
1538
2695
  const jcs = jcsCanonicalize(unsigned);
1539
- const jcsBytes = textEncoder2.encode(jcs);
1540
- const digest = sha256Bytes(concatBytes(textEncoder2.encode(`${descriptor.domain}\0`), jcsBytes));
1541
- const id = `${descriptor.idPrefix}${base32LowerNoPad(digest)}`;
2696
+ const jcsBytes = textEncoder3.encode(jcs);
2697
+ const digest2 = sha256Bytes(concatBytes(textEncoder3.encode(`${descriptor.domain}\0`), jcsBytes));
2698
+ const id = `${descriptor.idPrefix}${base32LowerNoPad(digest2)}`;
1542
2699
  return {
1543
2700
  kind: descriptor.kind,
1544
2701
  idField: descriptor.idField,
@@ -1547,8 +2704,8 @@ function materialForUnsigned(unsigned, descriptor) {
1547
2704
  unsigned,
1548
2705
  jcs,
1549
2706
  jcsBytes,
1550
- digest,
1551
- digestHex: (0, import_viem3.bytesToHex)(digest).slice(2)
2707
+ digest: digest2,
2708
+ digestHex: (0, import_viem3.bytesToHex)(digest2).slice(2)
1552
2709
  };
1553
2710
  }
1554
2711
  function assertIdMatches(signed, material, descriptor) {
@@ -1596,12 +2753,12 @@ function assertSignerDidMatchesSuite(signerDid, suite) {
1596
2753
  }
1597
2754
  throw new UnsupportedSignatureSuiteError(`unsupported signature suite: ${suite}`);
1598
2755
  }
1599
- async function verifySignature(signature, digest) {
2756
+ async function verifySignature(signature, digest2) {
1600
2757
  if (signature.suite === ED25519_JCS_SIGNATURE_SUITE) {
1601
2758
  const publicKey = ed25519PublicKeyFromDidKey(signature.signerDid);
1602
2759
  const signatureBytes = decodeSignatureValue(signature.value, signature.suite);
1603
2760
  try {
1604
- return import_ed25519.ed25519.verify(signatureBytes, digest, publicKey);
2761
+ return import_ed25519.ed25519.verify(signatureBytes, digest2, publicKey);
1605
2762
  } catch {
1606
2763
  throw new SignatureVerificationError("Ed25519 signature verification failed");
1607
2764
  }
@@ -1612,7 +2769,7 @@ async function verifySignature(signature, digest) {
1612
2769
  try {
1613
2770
  return (0, import_viem3.verifyMessage)({
1614
2771
  address: pkh.address,
1615
- message: { raw: digest },
2772
+ message: { raw: digest2 },
1616
2773
  signature: (0, import_viem3.bytesToHex)(signatureBytes)
1617
2774
  });
1618
2775
  } catch {
@@ -1631,7 +2788,7 @@ function ed25519PublicKeyFromDidKey(did) {
1631
2788
  }
1632
2789
  let bytes;
1633
2790
  try {
1634
- bytes = import_basics.bases.base58btc.decode(identifier);
2791
+ bytes = bases.base58btc.decode(identifier);
1635
2792
  } catch {
1636
2793
  throw new SignatureMaterialError("did:key signerDid is undecodable");
1637
2794
  }
@@ -1844,20 +3001,20 @@ function base32LowerNoPad(bytes) {
1844
3001
  return output;
1845
3002
  }
1846
3003
  function base64UrlEncode(bytes) {
1847
- const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
3004
+ const alphabet2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
1848
3005
  let output = "";
1849
3006
  for (let index = 0; index < bytes.length; index += 3) {
1850
3007
  const a = bytes[index];
1851
3008
  const b = bytes[index + 1];
1852
3009
  const c = bytes[index + 2];
1853
3010
  const triplet = a << 16 | (b ?? 0) << 8 | (c ?? 0);
1854
- output += alphabet[triplet >> 18 & 63];
1855
- output += alphabet[triplet >> 12 & 63];
3011
+ output += alphabet2[triplet >> 18 & 63];
3012
+ output += alphabet2[triplet >> 12 & 63];
1856
3013
  if (index + 1 < bytes.length) {
1857
- output += alphabet[triplet >> 6 & 63];
3014
+ output += alphabet2[triplet >> 6 & 63];
1858
3015
  }
1859
3016
  if (index + 2 < bytes.length) {
1860
- output += alphabet[triplet & 63];
3017
+ output += alphabet2[triplet & 63];
1861
3018
  }
1862
3019
  }
1863
3020
  return output;
@@ -1866,12 +3023,12 @@ function base64UrlDecode(value) {
1866
3023
  if (value.length % 4 === 1) {
1867
3024
  throw new SignatureMaterialError("signature value is not canonical base64url");
1868
3025
  }
1869
- const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
3026
+ const alphabet2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
1870
3027
  const bytes = [];
1871
3028
  let buffer = 0;
1872
3029
  let bits = 0;
1873
3030
  for (const char of value) {
1874
- const index = alphabet.indexOf(char);
3031
+ const index = alphabet2.indexOf(char);
1875
3032
  if (index < 0) {
1876
3033
  throw new SignatureMaterialError("signature value is not base64url");
1877
3034
  }
@@ -1906,14 +3063,14 @@ var OWNER_NODE_ENDPOINT_SCHEMA = "xyz.tinycloud.exchange/owner-node-endpoint/v1"
1906
3063
  var POLICY_VERSION_V0 = "v0";
1907
3064
  var W3C_VC_CREDENTIAL_VERIFIER = "w3c.vc/credential/v1";
1908
3065
  var PolicyAuthoringError = class extends Error {
1909
- constructor(code, message) {
3066
+ constructor(code2, message) {
1910
3067
  super(message);
1911
3068
  this.name = "PolicyAuthoringError";
1912
- this.code = code;
3069
+ this.code = code2;
1913
3070
  }
1914
3071
  };
1915
- async function verifyPolicyEngineRecordForRequester(options) {
1916
- const normalized = expectObject2(options, "$", "policy-authoring-malformed");
3072
+ async function verifyPolicyEngineRecordForRequester(options2) {
3073
+ const normalized = expectObject2(options2, "$", "policy-authoring-malformed");
1917
3074
  assertExactKeys3(
1918
3075
  normalized,
1919
3076
  [
@@ -2020,11 +3177,11 @@ async function verifyPolicyEngineRecordForRequester(options) {
2020
3177
  }
2021
3178
  return verified;
2022
3179
  }
2023
- function expectObject2(input, path, code) {
3180
+ function expectObject2(input, path, code2) {
2024
3181
  try {
2025
3182
  const normalized = normalizeJson(input);
2026
3183
  if (normalized === null || typeof normalized !== "object" || Array.isArray(normalized)) {
2027
- throw new PolicyAuthoringError(code, `${path} must be an object`);
3184
+ throw new PolicyAuthoringError(code2, `${path} must be an object`);
2028
3185
  }
2029
3186
  return normalized;
2030
3187
  } catch (error) {
@@ -2032,7 +3189,7 @@ function expectObject2(input, path, code) {
2032
3189
  throw error;
2033
3190
  }
2034
3191
  throw new PolicyAuthoringError(
2035
- code,
3192
+ code2,
2036
3193
  error instanceof Error ? error.message : String(error)
2037
3194
  );
2038
3195
  }
@@ -2067,14 +3224,14 @@ function requiredString3(object, key, path) {
2067
3224
  }
2068
3225
  return value;
2069
3226
  }
2070
- function fieldString(object, key, path, code) {
3227
+ function fieldString(object, key, path, code2) {
2071
3228
  if (!hasOwn3(object, key)) {
2072
- throw new PolicyAuthoringError(code, `${path}.${key} is required`);
3229
+ throw new PolicyAuthoringError(code2, `${path}.${key} is required`);
2073
3230
  }
2074
3231
  const value = object[key];
2075
3232
  if (typeof value !== "string" || value.length === 0) {
2076
3233
  throw new PolicyAuthoringError(
2077
- code,
3234
+ code2,
2078
3235
  `${path}.${key} must be a non-empty string`
2079
3236
  );
2080
3237
  }
@@ -2180,10 +3337,10 @@ var POLICY_ENGINE_GRANT_PRESENTATION_DENIAL_CODES = [
2180
3337
  "rate-limited"
2181
3338
  ];
2182
3339
  var TranscriptRequesterError = class extends Error {
2183
- constructor(code, message, state = "invalid", denialCode, status) {
3340
+ constructor(code2, message, state = "invalid", denialCode, status) {
2184
3341
  super(message);
2185
3342
  this.name = "TranscriptRequesterError";
2186
- this.code = code;
3343
+ this.code = code2;
2187
3344
  this.state = state;
2188
3345
  this.denialCode = denialCode;
2189
3346
  this.status = status;
@@ -2321,50 +3478,50 @@ var LISTEN_SQL_STATEMENT_BY_NAME = new Map(
2321
3478
  ])
2322
3479
  );
2323
3480
  var TranscriptRequester = class _TranscriptRequester {
2324
- constructor(bootstrap, requestedCapabilities, nativeAuthorityCeiling, requestedCapabilitiesHash2, policyEngineRecordExpiresAtMs, policyEngineAddresses, ownerNodeAddresses, options) {
3481
+ constructor(bootstrap, requestedCapabilities, nativeAuthorityCeiling, requestedCapabilitiesHash2, policyEngineRecordExpiresAtMs, policyEngineAddresses, ownerNodeAddresses, options2) {
2325
3482
  this.usedChallengeNonces = /* @__PURE__ */ new Set();
2326
3483
  this.accessEnded = false;
2327
3484
  this.bootstrap = bootstrap;
2328
3485
  this.requestedCapabilities = requestedCapabilities;
2329
3486
  this.nativeAuthorityCeiling = nativeAuthorityCeiling;
2330
3487
  this.requestedCapabilitiesHash = requestedCapabilitiesHash2;
2331
- this.requesterDid = options.requesterDid;
2332
- this.ownerDid = options.ownerDid;
2333
- this.audience = options.audience;
2334
- this.grantIssuerDid = options.grantIssuerDid;
2335
- this.transport = options.transport;
2336
- this.signingCapability = options.signingCapability;
2337
- this.invocationCapability = options.invocationCapability;
3488
+ this.requesterDid = options2.requesterDid;
3489
+ this.ownerDid = options2.ownerDid;
3490
+ this.audience = options2.audience;
3491
+ this.grantIssuerDid = options2.grantIssuerDid;
3492
+ this.transport = options2.transport;
3493
+ this.signingCapability = options2.signingCapability;
3494
+ this.invocationCapability = options2.invocationCapability;
2338
3495
  this.policyEngineRecordExpiresAtMs = policyEngineRecordExpiresAtMs;
2339
3496
  this.policyEngineAddresses = policyEngineAddresses;
2340
3497
  this.ownerNodeAddresses = ownerNodeAddresses;
2341
- this.eligibleSubjectDid = options.eligibleSubjectDid ?? options.signingCapability?.eligibleSubjectDid ?? options.requesterDid;
2342
- this.holderBinding = options.holderBinding ?? options.signingCapability?.holderBinding ?? {
3498
+ this.eligibleSubjectDid = options2.eligibleSubjectDid ?? options2.signingCapability?.eligibleSubjectDid ?? options2.requesterDid;
3499
+ this.holderBinding = options2.holderBinding ?? options2.signingCapability?.holderBinding ?? {
2343
3500
  type: "enrolled-agent",
2344
3501
  enrollment: {
2345
3502
  schema: "xyz.tinycloud.policy/holder-enrollment/v0",
2346
- holderDid: options.requesterDid
3503
+ holderDid: options2.requesterDid
2347
3504
  }
2348
3505
  };
2349
- this.evidence = options.evidence ?? options.signingCapability?.evidence;
3506
+ this.evidence = options2.evidence ?? options2.signingCapability?.evidence;
2350
3507
  this.presentationTtlSeconds = Math.min(
2351
- Math.max(options.presentationTtlSeconds ?? 60, 1),
3508
+ Math.max(options2.presentationTtlSeconds ?? 60, 1),
2352
3509
  300
2353
3510
  );
2354
- this.now = options.now ?? (() => /* @__PURE__ */ new Date());
2355
- this.sleep = options.sleep ?? ((milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds)));
2356
- this.random = options.random ?? Math.random;
2357
- this.engineRetryAttempts = options.engineRetryAttempts ?? REQUESTER_ENGINE_RETRY_ATTEMPTS;
2358
- }
2359
- static async create(options) {
2360
- const bootstrap = parseBootstrap(options.bootstrap);
2361
- if (bootstrap.ownerNode.endpoint !== options.trustedOwnerNode.endpoint || bootstrap.ownerNode.spaceId !== options.trustedOwnerNode.spaceId) {
3511
+ this.now = options2.now ?? (() => /* @__PURE__ */ new Date());
3512
+ this.sleep = options2.sleep ?? ((milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds)));
3513
+ this.random = options2.random ?? Math.random;
3514
+ this.engineRetryAttempts = options2.engineRetryAttempts ?? REQUESTER_ENGINE_RETRY_ATTEMPTS;
3515
+ }
3516
+ static async create(options2) {
3517
+ const bootstrap = parseBootstrap(options2.bootstrap);
3518
+ if (bootstrap.ownerNode.endpoint !== options2.trustedOwnerNode.endpoint || bootstrap.ownerNode.spaceId !== options2.trustedOwnerNode.spaceId) {
2362
3519
  throw endpointError(
2363
3520
  "owner-node",
2364
3521
  "bootstrap owner-node binding does not match trusted discovery/config"
2365
3522
  );
2366
3523
  }
2367
- const record = await verifyRecordBeforeEgress(bootstrap, options);
3524
+ const record = await verifyRecordBeforeEgress(bootstrap, options2);
2368
3525
  if (record.endpoint !== bootstrap.policyEngine.endpoint) {
2369
3526
  throw new TranscriptRequesterError(
2370
3527
  "requester-engine-record-endpoint-mismatch",
@@ -2381,12 +3538,12 @@ var TranscriptRequester = class _TranscriptRequester {
2381
3538
  }
2382
3539
  const policyEngineAddresses = await validateAndResolvePublicEndpoint(
2383
3540
  bootstrap.policyEngine.endpoint,
2384
- options.transport,
3541
+ options2.transport,
2385
3542
  "policy-engine"
2386
3543
  );
2387
3544
  const ownerNodeAddresses = await validateAndResolveOwnerNode(
2388
3545
  bootstrap.ownerNode.endpoint,
2389
- options.transport
3546
+ options2.transport
2390
3547
  );
2391
3548
  const requestedCapabilities = bootstrap.resourceHint.requestedCapabilities.map(
2392
3549
  (capability, index) => parsePolicyCapability(
@@ -2406,7 +3563,7 @@ var TranscriptRequester = class _TranscriptRequester {
2406
3563
  parseStrictRfc33392(record.expiresAt),
2407
3564
  policyEngineAddresses,
2408
3565
  ownerNodeAddresses,
2409
- options
3566
+ options2
2410
3567
  );
2411
3568
  }
2412
3569
  get accessState() {
@@ -2930,8 +4087,8 @@ var TranscriptRequester = class _TranscriptRequester {
2930
4087
  }
2931
4088
  }
2932
4089
  };
2933
- async function createTranscriptRequester(options) {
2934
- return TranscriptRequester.create(options);
4090
+ async function createTranscriptRequester(options2) {
4091
+ return TranscriptRequester.create(options2);
2935
4092
  }
2936
4093
  function parseBootstrap(input) {
2937
4094
  const normalized = normalizeExternal(input, "requester-bootstrap-malformed");
@@ -2945,35 +4102,35 @@ function parseBootstrap(input) {
2945
4102
  }
2946
4103
  return parsed.data;
2947
4104
  }
2948
- async function verifyRecordBeforeEgress(bootstrap, options) {
4105
+ async function verifyRecordBeforeEgress(bootstrap, options2) {
2949
4106
  try {
2950
4107
  return await verifyPolicyEngineRecordForRequester({
2951
4108
  signedRecord: bootstrap.policyEngine.signedRecord,
2952
- ownerDid: options.ownerDid,
2953
- audience: options.audience,
2954
- grantIssuerDid: options.grantIssuerDid,
2955
- now: (options.now ?? (() => /* @__PURE__ */ new Date()))().toISOString().replace(".000Z", "Z"),
4109
+ ownerDid: options2.ownerDid,
4110
+ audience: options2.audience,
4111
+ grantIssuerDid: options2.grantIssuerDid,
4112
+ now: (options2.now ?? (() => /* @__PURE__ */ new Date()))().toISOString().replace(".000Z", "Z"),
2956
4113
  requiredPolicyVersion: POLICY_VERSION_V0,
2957
4114
  requiredEvidenceVerifier: W3C_VC_CREDENTIAL_VERIFIER
2958
4115
  });
2959
4116
  } catch (error) {
2960
- const code = errorCodeForRecordFailure(error);
4117
+ const code2 = errorCodeForRecordFailure(error);
2961
4118
  throw new TranscriptRequesterError(
2962
- code,
4119
+ code2,
2963
4120
  error instanceof Error ? error.message : String(error),
2964
4121
  "bootstrap-invalid"
2965
4122
  );
2966
4123
  }
2967
4124
  }
2968
4125
  function errorCodeForRecordFailure(error) {
2969
- const code = typeof error === "object" && error !== null && "code" in error ? error.code : void 0;
2970
- if (code === "policy-engine-record-signature-invalid") {
4126
+ const code2 = typeof error === "object" && error !== null && "code" in error ? error.code : void 0;
4127
+ if (code2 === "policy-engine-record-signature-invalid") {
2971
4128
  return "requester-engine-record-signature-invalid";
2972
4129
  }
2973
- if (code === "policy-engine-record-owner-mismatch") {
4130
+ if (code2 === "policy-engine-record-owner-mismatch") {
2974
4131
  return "requester-engine-record-owner-mismatch";
2975
4132
  }
2976
- if (code === "policy-engine-record-audience-mismatch") {
4133
+ if (code2 === "policy-engine-record-audience-mismatch") {
2977
4134
  return "requester-engine-record-audience-mismatch";
2978
4135
  }
2979
4136
  return "requester-engine-record-invalid";
@@ -3273,16 +4430,16 @@ function nodeErrorMessage(body) {
3273
4430
  if (typeof body === "string") return body;
3274
4431
  if (body !== null && typeof body === "object") {
3275
4432
  const record = body;
3276
- const code = typeof record.code === "string" ? record.code : void 0;
4433
+ const code2 = typeof record.code === "string" ? record.code : void 0;
3277
4434
  const message = typeof record.message === "string" ? record.message : void 0;
3278
- if (code !== void 0)
3279
- return message === void 0 ? code : `${code}: ${message}`;
4435
+ if (code2 !== void 0)
4436
+ return message === void 0 ? code2 : `${code2}: ${message}`;
3280
4437
  }
3281
4438
  return "native node refusal";
3282
4439
  }
3283
4440
  function deriveDelegationCid(encoded) {
3284
- const digest = (0, import_digest.create)(30, (0, import_blake3.blake3)(new TextEncoder().encode(encoded)));
3285
- return import_cid.CID.createV1(85, digest).toString();
4441
+ const digest2 = create(30, (0, import_blake3.blake3)(new TextEncoder().encode(encoded)));
4442
+ return CID.createV1(85, digest2).toString();
3286
4443
  }
3287
4444
  function headersRecord(headers) {
3288
4445
  return Array.isArray(headers) ? Object.fromEntries(headers) : headers;
@@ -3393,21 +4550,21 @@ function errorForDenial(denial, status) {
3393
4550
  );
3394
4551
  }
3395
4552
  function retryDelay(attempt, random) {
3396
- const base = Math.min(REQUESTER_ENGINE_RETRY_MAX_DELAY_MS, 50 * 2 ** attempt);
4553
+ const base3 = Math.min(REQUESTER_ENGINE_RETRY_MAX_DELAY_MS, 50 * 2 ** attempt);
3397
4554
  return Math.min(
3398
4555
  REQUESTER_ENGINE_RETRY_MAX_DELAY_MS,
3399
- Math.floor(base * (0.5 + random))
4556
+ Math.floor(base3 * (0.5 + random))
3400
4557
  );
3401
4558
  }
3402
4559
  function trimTrailingSlash(value) {
3403
4560
  return value.endsWith("/") ? value.slice(0, -1) : value;
3404
4561
  }
3405
- function normalizeExternal(input, code) {
4562
+ function normalizeExternal(input, code2) {
3406
4563
  try {
3407
4564
  return normalizeJson(input);
3408
4565
  } catch (error) {
3409
4566
  throw new TranscriptRequesterError(
3410
- code,
4567
+ code2,
3411
4568
  error instanceof Error ? error.message : String(error)
3412
4569
  );
3413
4570
  }
@@ -3700,6 +4857,8 @@ var DelegationSchema = import_zod4.z.object({
3700
4857
  path: import_zod4.z.string(),
3701
4858
  /** Actions this delegation authorizes */
3702
4859
  actions: import_zod4.z.array(import_zod4.z.string()),
4860
+ /** Exact ReCap caveats that constrain every action in this scope. */
4861
+ caveats: import_zod4.z.array(import_zod4.z.record(import_zod4.z.string(), import_zod4.z.unknown())).optional(),
3703
4862
  /** When this delegation expires (accepts Date or ISO string from JSON) */
3704
4863
  expiry: import_zod4.z.coerce.date(),
3705
4864
  /** Whether this delegation has been revoked */
@@ -3980,7 +5139,9 @@ var DelegatedResourceSchema = import_zod4.z.object({
3980
5139
  /** Resource path; empty string when the resource URI had no path segment. */
3981
5140
  path: import_zod4.z.string(),
3982
5141
  /** Full-URN ability strings, e.g. ["tinycloud.kv/get", "tinycloud.kv/put"]. */
3983
- actions: import_zod4.z.array(import_zod4.z.string())
5142
+ actions: import_zod4.z.array(import_zod4.z.string()),
5143
+ /** Exact ReCap caveats that constrain every action in this scope. */
5144
+ caveats: import_zod4.z.array(import_zod4.z.record(import_zod4.z.string(), import_zod4.z.unknown())).optional()
3984
5145
  });
3985
5146
  var CreateDelegationWasmParamsSchema = import_zod4.z.object({
3986
5147
  /** The session containing delegation credentials */
@@ -4255,13 +5416,13 @@ function parseSpaceUri(uri) {
4255
5416
  /^tinycloud:pkh:eip155:(\d+):(0x[a-fA-F0-9]{40}):(.+)$/
4256
5417
  );
4257
5418
  if (fullUriMatch) {
4258
- const [, chainId, address, name] = fullUriMatch;
5419
+ const [, chainId, address, name2] = fullUriMatch;
4259
5420
  try {
4260
5421
  const chainIdNumber = Number(chainId);
4261
5422
  const canonicalAddress = canonicalizeAddress(address);
4262
5423
  return {
4263
5424
  owner: pkhDid(canonicalAddress, chainIdNumber),
4264
- name,
5425
+ name: name2,
4265
5426
  chainId: String(chainIdNumber),
4266
5427
  address: canonicalAddress
4267
5428
  };
@@ -4278,12 +5439,12 @@ function parseSpaceUri(uri) {
4278
5439
  }
4279
5440
  return null;
4280
5441
  }
4281
- function buildSpaceUri(owner, name) {
5442
+ function buildSpaceUri(owner, name2) {
4282
5443
  const pkh = parsePkhDid(owner);
4283
5444
  if (pkh) {
4284
- return makePkhSpaceId(pkh.address, pkh.chainId, name);
5445
+ return makePkhSpaceId(pkh.address, pkh.chainId, name2);
4285
5446
  }
4286
- return `tinycloud:${owner}:${name}`;
5447
+ return `tinycloud:${owner}:${name2}`;
4287
5448
  }
4288
5449
  function transformServerDelegations(validatedData, defaultSpaceId) {
4289
5450
  const result = [];
@@ -4548,13 +5709,13 @@ var SpaceService = class {
4548
5709
  *
4549
5710
  * @param name - The name for the new space
4550
5711
  */
4551
- async create(name) {
5712
+ async create(name2) {
4552
5713
  if (!this.session) {
4553
5714
  return (0, import_sdk_services2.err)(
4554
5715
  (0, import_sdk_services2.serviceError)(SpaceErrorCodes.AUTH_REQUIRED, "Authentication required", SERVICE_NAME)
4555
5716
  );
4556
5717
  }
4557
- if (!name || !/^[a-zA-Z0-9_-]+$/.test(name)) {
5718
+ if (!name2 || !/^[a-zA-Z0-9_-]+$/.test(name2)) {
4558
5719
  return (0, import_sdk_services2.err)(
4559
5720
  (0, import_sdk_services2.serviceError)(
4560
5721
  SpaceErrorCodes.INVALID_NAME,
@@ -4564,11 +5725,11 @@ var SpaceService = class {
4564
5725
  );
4565
5726
  }
4566
5727
  try {
4567
- const headers = this.invoke(this.session, "space", name, "tinycloud.space/create");
5728
+ const headers = this.invoke(this.session, "space", name2, "tinycloud.space/create");
4568
5729
  const response = await this.fetchFn(`${this.host}/invoke`, {
4569
5730
  method: "POST",
4570
5731
  headers,
4571
- body: JSON.stringify({ name })
5732
+ body: JSON.stringify({ name: name2 })
4572
5733
  });
4573
5734
  if (!response.ok) {
4574
5735
  const errorText = await response.text();
@@ -4576,7 +5737,7 @@ var SpaceService = class {
4576
5737
  return (0, import_sdk_services2.err)(
4577
5738
  (0, import_sdk_services2.serviceError)(
4578
5739
  SpaceErrorCodes.ALREADY_EXISTS,
4579
- `Space "${name}" already exists`,
5740
+ `Space "${name2}" already exists`,
4580
5741
  SERVICE_NAME
4581
5742
  )
4582
5743
  );
@@ -4604,7 +5765,7 @@ var SpaceService = class {
4604
5765
  }
4605
5766
  const spaceInfo = {
4606
5767
  id: validationResult.data.id,
4607
- name: validationResult.data.name || name,
5768
+ name: validationResult.data.name || name2,
4608
5769
  owner: validationResult.data.owner || this.userDid || "",
4609
5770
  type: "owned",
4610
5771
  permissions: ["*"]
@@ -4643,10 +5804,10 @@ var SpaceService = class {
4643
5804
  return cached;
4644
5805
  }
4645
5806
  const parsed = parseSpaceUri(spaceId);
4646
- const name = parsed?.name ?? this.extractNameFromId(spaceId);
5807
+ const name2 = parsed?.name ?? this.extractNameFromId(spaceId);
4647
5808
  const config = {
4648
5809
  id: spaceId,
4649
- name,
5810
+ name: name2,
4650
5811
  createKV: this.createSpaceScopedKV.bind(this),
4651
5812
  createVault: this.createSpaceScopedVault.bind(this),
4652
5813
  createSecrets: this.createSpaceScopedSecrets.bind(this),
@@ -5090,12 +6251,12 @@ var TinyCloud = class _TinyCloud {
5090
6251
  hooks: import_sdk_services3.HooksService,
5091
6252
  ...this.config.services
5092
6253
  };
5093
- for (const [name, ServiceClass] of Object.entries(serviceConstructors)) {
5094
- const serviceConfig = this.config.serviceConfigs?.[name] ?? {};
6254
+ for (const [name2, ServiceClass] of Object.entries(serviceConstructors)) {
6255
+ const serviceConfig = this.config.serviceConfigs?.[name2] ?? {};
5095
6256
  const service = new ServiceClass(serviceConfig);
5096
6257
  service.initialize(this._serviceContext);
5097
- this._serviceContext.registerService(name, service);
5098
- this._services.set(name, service);
6258
+ this._serviceContext.registerService(name2, service);
6259
+ this._services.set(name2, service);
5099
6260
  }
5100
6261
  this._servicesInitialized = true;
5101
6262
  }
@@ -5111,14 +6272,23 @@ var TinyCloud = class _TinyCloud {
5111
6272
  }
5112
6273
  return this._serviceContext;
5113
6274
  }
6275
+ /** @internal Retire this service graph after its owner replaces a session. */
6276
+ retireServices() {
6277
+ try {
6278
+ this._serviceContext?.retire();
6279
+ } finally {
6280
+ this._services.clear();
6281
+ this._servicesInitialized = false;
6282
+ }
6283
+ }
5114
6284
  /**
5115
6285
  * Get a registered service by name.
5116
6286
  *
5117
6287
  * @param name - Service name (e.g., 'kv')
5118
6288
  * @returns The service instance or undefined
5119
6289
  */
5120
- getService(name) {
5121
- return this._services.get(name);
6290
+ getService(name2) {
6291
+ return this._services.get(name2);
5122
6292
  }
5123
6293
  /**
5124
6294
  * Get the KV service.
@@ -5286,8 +6456,8 @@ var TinyCloud = class _TinyCloud {
5286
6456
  * @param options - Optional per-call SIWE overrides for this sign-in only
5287
6457
  * @returns The new session
5288
6458
  */
5289
- async signIn(options) {
5290
- const session = await this.userAuthorization.signIn(options);
6459
+ async signIn(options2) {
6460
+ const session = await this.userAuthorization.signIn(options2);
5291
6461
  const serviceSession = this.toServiceSession(session);
5292
6462
  this.notifyServicesOfSessionChange(serviceSession);
5293
6463
  return session;
@@ -5826,32 +6996,32 @@ function validateManifestSecrets(secrets) {
5826
6996
  if (secrets === null || typeof secrets !== "object" || Array.isArray(secrets)) {
5827
6997
  throw new ManifestValidationError("manifest.secrets must be an object");
5828
6998
  }
5829
- for (const [name, spec] of Object.entries(secrets)) {
5830
- if (!import_sdk_services4.SECRET_NAME_RE.test(name)) {
6999
+ for (const [name2, spec] of Object.entries(secrets)) {
7000
+ if (!import_sdk_services4.SECRET_NAME_RE.test(name2)) {
5831
7001
  throw new ManifestValidationError(
5832
- `manifest.secrets.${name} must match ${import_sdk_services4.SECRET_NAME_RE.source}`
7002
+ `manifest.secrets.${name2} must match ${import_sdk_services4.SECRET_NAME_RE.source}`
5833
7003
  );
5834
7004
  }
5835
7005
  try {
5836
7006
  (0, import_sdk_services4.resolveSecretPath)(
5837
- secretNameFromSpec(name, spec),
7007
+ secretNameFromSpec(name2, spec),
5838
7008
  { scope: secretScopeFromSpec(spec) }
5839
7009
  );
5840
7010
  } catch (error) {
5841
7011
  throw new ManifestValidationError(
5842
- `manifest.secrets.${name}: ${error instanceof Error ? error.message : String(error)}`
7012
+ `manifest.secrets.${name2}: ${error instanceof Error ? error.message : String(error)}`
5843
7013
  );
5844
7014
  }
5845
- const actions = secretActionsFromSpec(name, spec);
7015
+ const actions = secretActionsFromSpec(name2, spec);
5846
7016
  if (actions.length === 0) {
5847
7017
  throw new ManifestValidationError(
5848
- `manifest.secrets.${name} actions must be non-empty`
7018
+ `manifest.secrets.${name2} actions must be non-empty`
5849
7019
  );
5850
7020
  }
5851
7021
  for (const action of actions) {
5852
7022
  if (typeof action !== "string" || action.length === 0) {
5853
7023
  throw new ManifestValidationError(
5854
- `manifest.secrets.${name} actions must be non-empty strings`
7024
+ `manifest.secrets.${name2} actions must be non-empty strings`
5855
7025
  );
5856
7026
  }
5857
7027
  }
@@ -5893,6 +7063,11 @@ function validatePermissionEntry(p, path) {
5893
7063
  vaultActionExpansion(action);
5894
7064
  }
5895
7065
  }
7066
+ if (entry.caveats !== void 0 && (!Array.isArray(entry.caveats) || entry.caveats.some(
7067
+ (caveat) => caveat === null || typeof caveat !== "object" || Array.isArray(caveat)
7068
+ ))) {
7069
+ throw new ManifestValidationError(`${path}.caveats must be an array of objects`);
7070
+ }
5896
7071
  if (entry.expiry !== void 0) {
5897
7072
  parseExpiry(entry.expiry);
5898
7073
  }
@@ -6010,7 +7185,7 @@ function secretScopeFromSpec(spec) {
6010
7185
  }
6011
7186
  return void 0;
6012
7187
  }
6013
- function secretActionsFromSpec(name, spec) {
7188
+ function secretActionsFromSpec(name2, spec) {
6014
7189
  if (spec === true) {
6015
7190
  return ["read"];
6016
7191
  }
@@ -6022,7 +7197,7 @@ function secretActionsFromSpec(name, spec) {
6022
7197
  }
6023
7198
  if (spec === null || typeof spec !== "object") {
6024
7199
  throw new ManifestValidationError(
6025
- `manifest.secrets.${name} must be true, a string action, an actions array, or an object`
7200
+ `manifest.secrets.${name2} must be true, a string action, an actions array, or an object`
6026
7201
  );
6027
7202
  }
6028
7203
  if (spec.actions === void 0) {
@@ -6035,7 +7210,7 @@ function secretActionsFromSpec(name, spec) {
6035
7210
  return spec.actions;
6036
7211
  }
6037
7212
  throw new ManifestValidationError(
6038
- `manifest.secrets.${name}.actions must be a string or array`
7213
+ `manifest.secrets.${name2}.actions must be a string or array`
6039
7214
  );
6040
7215
  }
6041
7216
  function secretEntriesForManifest(secrets) {
@@ -6043,10 +7218,10 @@ function secretEntriesForManifest(secrets) {
6043
7218
  return [];
6044
7219
  }
6045
7220
  const entries = [];
6046
- for (const [name, spec] of Object.entries(secrets)) {
6047
- const actions = secretActionsFromSpec(name, spec);
7221
+ for (const [name2, spec] of Object.entries(secrets)) {
7222
+ const actions = secretActionsFromSpec(name2, spec);
6048
7223
  const secretPath = (0, import_sdk_services4.resolveSecretPath)(
6049
- secretNameFromSpec(name, spec),
7224
+ secretNameFromSpec(name2, spec),
6050
7225
  { scope: secretScopeFromSpec(spec) }
6051
7226
  );
6052
7227
  const extra = spec !== true && typeof spec === "object" && !Array.isArray(spec) ? spec : {};
@@ -6087,18 +7262,18 @@ function expandVaultPermissionEntry(entry) {
6087
7262
  const byBase = /* @__PURE__ */ new Map();
6088
7263
  for (const action of entry.actions) {
6089
7264
  const expansion = vaultActionExpansion(action);
6090
- for (const base of expansion.bases) {
6091
- const actions = byBase.get(base) ?? [];
7265
+ for (const base3 of expansion.bases) {
7266
+ const actions = byBase.get(base3) ?? [];
6092
7267
  if (!actions.includes(expansion.action)) {
6093
7268
  actions.push(expansion.action);
6094
7269
  }
6095
- byBase.set(base, actions);
7270
+ byBase.set(base3, actions);
6096
7271
  }
6097
7272
  }
6098
- return [...byBase.entries()].map(([base, actions]) => ({
7273
+ return [...byBase.entries()].map(([base3, actions]) => ({
6099
7274
  ...entry,
6100
7275
  service: "tinycloud.kv",
6101
- path: vaultKVPath(base, entry.path),
7276
+ path: vaultKVPath(base3, entry.path),
6102
7277
  actions,
6103
7278
  skipPrefix: true
6104
7279
  }));
@@ -6141,9 +7316,9 @@ function normalizeVaultAction(action) {
6141
7316
  }
6142
7317
  return action;
6143
7318
  }
6144
- function vaultKVPath(base, path) {
7319
+ function vaultKVPath(base3, path) {
6145
7320
  const normalized = path.startsWith("/") ? path.slice(1) : path;
6146
- return `${base}/${normalized}`;
7321
+ return `${base3}/${normalized}`;
6147
7322
  }
6148
7323
  function cloneResourceCapability(entry) {
6149
7324
  return {
@@ -6161,6 +7336,7 @@ function clonePermissionEntry(entry) {
6161
7336
  ...entry.space !== void 0 ? { space: entry.space } : {},
6162
7337
  path: entry.path,
6163
7338
  actions: [...entry.actions],
7339
+ ...entry.caveats !== void 0 ? { caveats: JSON.parse(JSON.stringify(entry.caveats)) } : {},
6164
7340
  ...entry.skipPrefix !== void 0 ? { skipPrefix: entry.skipPrefix } : {},
6165
7341
  ...entry.expiry !== void 0 ? { expiry: entry.expiry } : {},
6166
7342
  ...entry.description !== void 0 ? { description: entry.description } : {}
@@ -6232,13 +7408,13 @@ function accountRegistryIndexPermission() {
6232
7408
  actions: ["tinycloud.sql/read", "tinycloud.sql/write", "tinycloud.sql/schema"]
6233
7409
  };
6234
7410
  }
6235
- function composeManifestRequest(inputs, options = {}) {
7411
+ function composeManifestRequest(inputs, options2 = {}) {
6236
7412
  if (!Array.isArray(inputs) || inputs.length === 0) {
6237
7413
  throw new ManifestValidationError(
6238
7414
  "composeManifestRequest requires at least one manifest"
6239
7415
  );
6240
7416
  }
6241
- const includeAccountRegistryPermissions = options.includeAccountRegistryPermissions ?? true;
7417
+ const includeAccountRegistryPermissions = options2.includeAccountRegistryPermissions ?? true;
6242
7418
  const manifests = inputs.map(validateManifest);
6243
7419
  const resolved = manifests.map(resolveManifest);
6244
7420
  const resources = resolved.flatMap((entry) => entry.resources);
@@ -6343,13 +7519,13 @@ var AccountService = class {
6343
7519
  constructor(config) {
6344
7520
  this.config = config;
6345
7521
  this.applications = {
6346
- list: async (options = {}) => {
6347
- if (options.preferIndex) {
7522
+ list: async (options2 = {}) => {
7523
+ if (options2.preferIndex) {
6348
7524
  const indexed = await this.index.applications.list();
6349
7525
  if (indexed.ok && indexed.data.length > 0) return indexed;
6350
7526
  if (!indexed.ok && !isMissingIndexError(indexed.error)) return indexed;
6351
7527
  const canonical = await this.applications.list();
6352
- if (canonical.ok && options.refreshIndex !== false) {
7528
+ if (canonical.ok && options2.refreshIndex !== false) {
6353
7529
  await this.replaceApplicationsIndexQuietly(canonical.data);
6354
7530
  }
6355
7531
  return canonical;
@@ -6426,13 +7602,13 @@ var AccountService = class {
6426
7602
  }
6427
7603
  };
6428
7604
  this.spaces = {
6429
- list: async (options = {}) => {
6430
- if (options.preferIndex) {
7605
+ list: async (options2 = {}) => {
7606
+ if (options2.preferIndex) {
6431
7607
  const indexed = await this.index.spaces.list();
6432
7608
  if (indexed.ok && indexed.data.length > 0) return indexed;
6433
7609
  if (!indexed.ok && !isMissingIndexError(indexed.error)) return indexed;
6434
7610
  const canonical = await this.spaces.syncAccessible();
6435
- if (canonical.ok && options.refreshIndex !== false) {
7611
+ if (canonical.ok && options2.refreshIndex !== false) {
6436
7612
  await this.replaceSpacesIndexQuietly(canonical.data);
6437
7613
  }
6438
7614
  return canonical;
@@ -6489,7 +7665,7 @@ var AccountService = class {
6489
7665
  }
6490
7666
  };
6491
7667
  this.delegations = {
6492
- query: async (options = {}) => {
7668
+ query: async (options2 = {}) => {
6493
7669
  const manager = this.config.getDelegationManager?.();
6494
7670
  if (!manager) {
6495
7671
  return (0, import_sdk_services5.err)((0, import_sdk_services5.serviceError)(
@@ -6498,35 +7674,35 @@ var AccountService = class {
6498
7674
  SERVICE_NAME2
6499
7675
  ));
6500
7676
  }
6501
- const queried = await manager.query(options);
7677
+ const queried = await manager.query(options2);
6502
7678
  return queried.ok ? (0, import_sdk_services5.ok)(queried.data) : accountErr(queried.error);
6503
7679
  },
6504
- list: async (options = {}) => {
6505
- if (options.preferIndex) {
6506
- const indexed = await this.index.delegations.list(options);
7680
+ list: async (options2 = {}) => {
7681
+ if (options2.preferIndex) {
7682
+ const indexed = await this.index.delegations.list(options2);
6507
7683
  if (indexed.ok && indexed.data.length > 0) return indexed;
6508
7684
  if (!indexed.ok && !isMissingIndexError(indexed.error)) return indexed;
6509
7685
  const live = await this.delegations.list({
6510
- direction: options.direction,
6511
- space: options.space
7686
+ direction: options2.direction,
7687
+ space: options2.space
6512
7688
  });
6513
- if (live.ok && options.refreshIndex !== false) {
7689
+ if (live.ok && options2.refreshIndex !== false) {
6514
7690
  await this.replaceDelegationsIndexQuietly(live.data);
6515
7691
  }
6516
7692
  return live;
6517
7693
  }
6518
7694
  const spaces = await this.config.getSpaces().list();
6519
7695
  if (!spaces.ok) return accountErr(spaces.error);
6520
- const targetSpaces = options.space ? spaces.data.filter((space) => space.id === options.space || space.name === options.space) : spaces.data;
7696
+ const targetSpaces = options2.space ? spaces.data.filter((space) => space.id === options2.space || space.name === options2.space) : spaces.data;
6521
7697
  const delegations = [];
6522
7698
  for (const space of targetSpaces) {
6523
7699
  const scoped = this.config.getSpaces().get(space.id).delegations;
6524
- if (options.direction !== "received") {
7700
+ if (options2.direction !== "received") {
6525
7701
  const granted = await scoped.list();
6526
7702
  if (!granted.ok) return accountErr(granted.error);
6527
7703
  delegations.push(...granted.data.map((d) => mapDelegation(d, space, "granted")));
6528
7704
  }
6529
- if (options.direction !== "granted") {
7705
+ if (options2.direction !== "granted") {
6530
7706
  const received = await scoped.listReceived();
6531
7707
  if (!received.ok) return accountErr(received.error);
6532
7708
  delegations.push(...received.data.map((d) => mapDelegation(d, space, "received")));
@@ -6674,18 +7850,18 @@ var AccountService = class {
6674
7850
  }
6675
7851
  },
6676
7852
  delegations: {
6677
- list: async (options = {}) => {
7853
+ list: async (options2 = {}) => {
6678
7854
  const dbResult = this.accountDb();
6679
7855
  if (!dbResult.ok) return dbResult;
6680
7856
  const where = [];
6681
7857
  const params = [];
6682
- if (options.direction && options.direction !== "all") {
7858
+ if (options2.direction && options2.direction !== "all") {
6683
7859
  where.push("direction = ?");
6684
- params.push(options.direction);
7860
+ params.push(options2.direction);
6685
7861
  }
6686
- if (options.space) {
7862
+ if (options2.space) {
6687
7863
  where.push("(space_id = ? OR space_name = ?)");
6688
- params.push(options.space, options.space);
7864
+ params.push(options2.space, options2.space);
6689
7865
  }
6690
7866
  const queried = await dbResult.data.query(
6691
7867
  `SELECT cid, direction, space_id, space_name, counterparty_did, delegate_did, delegator_did, path, actions_json, expiry, status, created_at FROM delegations${where.length > 0 ? ` WHERE ${where.join(" AND ")}` : ""} ORDER BY space_id, cid`,
@@ -7006,10 +8182,10 @@ function applicationFromRecord(key, record) {
7006
8182
  };
7007
8183
  }
7008
8184
  function indexedApplicationFromRow(row) {
7009
- const [appId, name, description, updatedAt, manifestJson, manifestHash] = row;
8185
+ const [appId, name2, description, updatedAt, manifestJson, manifestHash] = row;
7010
8186
  return {
7011
8187
  appId,
7012
- name: name ?? void 0,
8188
+ name: name2 ?? void 0,
7013
8189
  description: description ?? void 0,
7014
8190
  updatedAt: updatedAt ?? void 0,
7015
8191
  manifests: JSON.parse(manifestJson),
@@ -7060,10 +8236,10 @@ function spaceFromRecord(key, record) {
7060
8236
  };
7061
8237
  }
7062
8238
  function indexedSpaceFromRow(row) {
7063
- const [spaceId, name, ownerDid, type, permissionsJson, status, registeredAt, updatedAt, expiresAt] = row;
8239
+ const [spaceId, name2, ownerDid, type, permissionsJson, status, registeredAt, updatedAt, expiresAt] = row;
7064
8240
  return {
7065
8241
  spaceId,
7066
- name,
8242
+ name: name2,
7067
8243
  ownerDid,
7068
8244
  type,
7069
8245
  permissions: JSON.parse(permissionsJson),
@@ -7231,9 +8407,9 @@ var DelegationAction = {
7231
8407
  GET: "tinycloud.delegation/get",
7232
8408
  CHECK: "tinycloud.delegation/check"
7233
8409
  };
7234
- function createError(code, message, cause, meta) {
8410
+ function createError(code2, message, cause, meta) {
7235
8411
  return {
7236
- code,
8412
+ code: code2,
7237
8413
  message,
7238
8414
  service: "delegation",
7239
8415
  cause,
@@ -7568,8 +8744,8 @@ var DelegationManager = class {
7568
8744
  }
7569
8745
  }
7570
8746
  /** Query lifecycle-complete delegation history for the authenticated account. */
7571
- async query(options = {}) {
7572
- const validated = AccountDelegationQueryOptionsSchema.safeParse(options);
8747
+ async query(options2 = {}) {
8748
+ const validated = AccountDelegationQueryOptionsSchema.safeParse(options2);
7573
8749
  if (!validated.success) {
7574
8750
  return {
7575
8751
  ok: false,
@@ -8042,6 +9218,17 @@ var SessionExpiredError = class extends Error {
8042
9218
  this.expiredAt = expiredAt;
8043
9219
  }
8044
9220
  };
9221
+ var CaveatedDelegationUnsupportedError = class extends Error {
9222
+ constructor(entries) {
9223
+ super(
9224
+ "Cannot create a caveated delegation because this WASM delegation boundary cannot preserve every ReCap caveat branch exactly."
9225
+ );
9226
+ /** Stable machine-readable error code for fail-closed caveated delegation. */
9227
+ this.code = "CAVEATED_DELEGATION_UNSUPPORTED";
9228
+ this.name = "CaveatedDelegationUnsupportedError";
9229
+ this.entries = entries.map(cloneEntry);
9230
+ }
9231
+ };
8045
9232
  function normalizeSpace(space) {
8046
9233
  if (!space.startsWith("tinycloud:")) {
8047
9234
  return space;
@@ -8082,8 +9269,42 @@ function canonicalizeEntryMatches(requested, granted) {
8082
9269
  return false;
8083
9270
  }
8084
9271
  }
9272
+ if (!recapCaveatsEqual(requested.caveats, granted.caveats)) {
9273
+ return false;
9274
+ }
8085
9275
  return true;
8086
9276
  }
9277
+ function recapCaveatsEqual(left, right) {
9278
+ return canonicalizeRecapCaveats(left) === canonicalizeRecapCaveats(right);
9279
+ }
9280
+ function canonicalizeRecapCaveats(caveats) {
9281
+ const canonicalize = (value) => {
9282
+ if (value === null || typeof value === "boolean" || typeof value === "string") {
9283
+ return JSON.stringify(value);
9284
+ }
9285
+ if (typeof value === "number") {
9286
+ if (Number.isFinite(value)) return JSON.stringify(value);
9287
+ throw new Error("ReCap caveats must contain only JSON values.");
9288
+ }
9289
+ if (Array.isArray(value)) return `[${value.map(canonicalize).join(",")}]`;
9290
+ if (typeof value === "object") {
9291
+ const object = value;
9292
+ const prototype = Object.getPrototypeOf(object);
9293
+ if (prototype !== Object.prototype && prototype !== null) {
9294
+ throw new Error("ReCap caveats must contain only JSON values.");
9295
+ }
9296
+ return `{${Object.keys(object).sort().map(
9297
+ (key) => `${JSON.stringify(key)}:${canonicalize(object[key])}`
9298
+ ).join(",")}}`;
9299
+ }
9300
+ throw new Error("ReCap caveats must contain only JSON values.");
9301
+ };
9302
+ const branches = (caveats ?? []).map(canonicalize).sort();
9303
+ if (branches.length === 0 || branches.length === 1 && branches[0] === "{}") {
9304
+ return "[]";
9305
+ }
9306
+ return `[${branches.join(",")}]`;
9307
+ }
8087
9308
  function actionContains(grantedAction, requestedAction) {
8088
9309
  if (grantedAction === "*" || grantedAction === requestedAction) return true;
8089
9310
  if (!grantedAction.endsWith("/*")) return false;
@@ -8105,6 +9326,7 @@ function cloneEntry(entry) {
8105
9326
  ...entry.space !== void 0 ? { space: entry.space } : {},
8106
9327
  path: entry.path,
8107
9328
  actions: [...entry.actions],
9329
+ ...entry.caveats !== void 0 ? { caveats: JSON.parse(JSON.stringify(entry.caveats)) } : {},
8108
9330
  ...entry.skipPrefix !== void 0 ? { skipPrefix: entry.skipPrefix } : {},
8109
9331
  ...entry.expiry !== void 0 ? { expiry: entry.expiry } : {}
8110
9332
  };
@@ -8128,7 +9350,8 @@ function parseRecapCapabilities(parseWasm, siwe) {
8128
9350
  // returned entries match the shape manifests use.
8129
9351
  space: normalizeSpace(entry.space),
8130
9352
  path: entry.path,
8131
- actions: [...entry.actions]
9353
+ actions: [...entry.actions],
9354
+ ...entry.caveats === void 0 ? {} : { caveats: JSON.parse(JSON.stringify(entry.caveats)) }
8132
9355
  };
8133
9356
  });
8134
9357
  normalized.sort((a, b) => {
@@ -8143,7 +9366,6 @@ function parseRecapCapabilities(parseWasm, siwe) {
8143
9366
  }
8144
9367
 
8145
9368
  // src/delegations/SharingService.ts
8146
- var import_basics2 = require("multiformats/basics");
8147
9369
  var import_ed255192 = require("@noble/curves/ed25519");
8148
9370
  function inferShortServiceFromActionUrns(actions) {
8149
9371
  let short;
@@ -8164,9 +9386,9 @@ function inferShortServiceFromActionUrns(actions) {
8164
9386
  var DEFAULT_READ_ACTIONS = ["tinycloud.kv/get", "tinycloud.kv/metadata"];
8165
9387
  var DEFAULT_EXPIRY_MS = EXPIRY.SHARE_MS;
8166
9388
  var BASE64_PREFIX = "tc1:";
8167
- function createError2(code, message, cause, meta) {
9389
+ function createError2(code2, message, cause, meta) {
8168
9390
  return {
8169
- code,
9391
+ code: code2,
8170
9392
  message,
8171
9393
  service: "delegation",
8172
9394
  cause,
@@ -8174,25 +9396,25 @@ function createError2(code, message, cause, meta) {
8174
9396
  };
8175
9397
  }
8176
9398
  function base64UrlEncode2(data) {
8177
- let base64;
9399
+ let base642;
8178
9400
  if (typeof btoa !== "undefined") {
8179
- base64 = btoa(unescape(encodeURIComponent(data)));
9401
+ base642 = btoa(unescape(encodeURIComponent(data)));
8180
9402
  } else if (typeof Buffer !== "undefined") {
8181
- base64 = Buffer.from(data, "utf-8").toString("base64");
9403
+ base642 = Buffer.from(data, "utf-8").toString("base64");
8182
9404
  } else {
8183
9405
  throw new Error("No base64 encoding available");
8184
9406
  }
8185
- return base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
9407
+ return base642.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
8186
9408
  }
8187
9409
  function base64UrlDecode2(encoded) {
8188
- let base64 = encoded.replace(/-/g, "+").replace(/_/g, "/");
8189
- while (base64.length % 4) {
8190
- base64 += "=";
9410
+ let base642 = encoded.replace(/-/g, "+").replace(/_/g, "/");
9411
+ while (base642.length % 4) {
9412
+ base642 += "=";
8191
9413
  }
8192
9414
  if (typeof atob !== "undefined") {
8193
- return decodeURIComponent(escape(atob(base64)));
9415
+ return decodeURIComponent(escape(atob(base642)));
8194
9416
  } else if (typeof Buffer !== "undefined") {
8195
- return Buffer.from(base64, "base64").toString("utf-8");
9417
+ return Buffer.from(base642, "base64").toString("utf-8");
8196
9418
  } else {
8197
9419
  throw new Error("No base64 decoding available");
8198
9420
  }
@@ -8217,6 +9439,7 @@ var SharingService = class {
8217
9439
  this.pathPrefix = config.pathPrefix ?? "";
8218
9440
  this.sessionExpiry = config.sessionExpiry;
8219
9441
  this.onRootDelegationNeeded = config.onRootDelegationNeeded;
9442
+ this.assertActiveFn = config.assertActive;
8220
9443
  }
8221
9444
  /**
8222
9445
  * Gets the primary host URL.
@@ -8228,6 +9451,7 @@ var SharingService = class {
8228
9451
  * Updates the session (e.g., after re-authentication).
8229
9452
  */
8230
9453
  updateSession(session) {
9454
+ this.assertActiveFn?.();
8231
9455
  this.session = session;
8232
9456
  }
8233
9457
  /**
@@ -8235,6 +9459,7 @@ var SharingService = class {
8235
9459
  * Used to add full capabilities (session, delegationManager, createDelegation, createDelegationWasm) after signIn.
8236
9460
  */
8237
9461
  updateConfig(config) {
9462
+ this.assertActiveFn?.();
8238
9463
  if (config.session !== void 0) {
8239
9464
  this.session = config.session;
8240
9465
  }
@@ -8253,6 +9478,9 @@ var SharingService = class {
8253
9478
  if (config.onRootDelegationNeeded !== void 0) {
8254
9479
  this.onRootDelegationNeeded = config.onRootDelegationNeeded;
8255
9480
  }
9481
+ if (config.assertActive !== void 0) {
9482
+ this.assertActiveFn = config.assertActive;
9483
+ }
8256
9484
  }
8257
9485
  /**
8258
9486
  * Generate a sharing link with an embedded private key.
@@ -8265,6 +9493,8 @@ var SharingService = class {
8265
9493
  * 5. Return link string
8266
9494
  */
8267
9495
  async generate(params) {
9496
+ const activeError = this.retiredGraphError();
9497
+ if (activeError) return { ok: false, error: activeError };
8268
9498
  if (!this.session) {
8269
9499
  return {
8270
9500
  ok: false,
@@ -8312,7 +9542,11 @@ var SharingService = class {
8312
9542
  try {
8313
9543
  const shareKeyName = `share:${Date.now()}:${Math.random().toString(36).substring(2, 10)}`;
8314
9544
  keyId = await this.keyProvider.createSessionKey(shareKeyName);
9545
+ const keyCreationActiveError = this.retiredGraphError();
9546
+ if (keyCreationActiveError) return { ok: false, error: keyCreationActiveError };
8315
9547
  keyDid = await this.keyProvider.getDID(keyId);
9548
+ const keyDidActiveError = this.retiredGraphError();
9549
+ if (keyDidActiveError) return { ok: false, error: keyDidActiveError };
8316
9550
  keyJwk = this.keyProvider.getJWK(keyId);
8317
9551
  if (!keyJwk.d) {
8318
9552
  return {
@@ -8348,6 +9582,8 @@ var SharingService = class {
8348
9582
  );
8349
9583
  if (canSatisfyFromRegistry) {
8350
9584
  const delegationResult = await this.createSessionDelegation(plainDID, fullPath, actions, expiry);
9585
+ const childDelegationActiveError = this.retiredGraphError();
9586
+ if (childDelegationActiveError) return { ok: false, error: childDelegationActiveError };
8351
9587
  const parsed = handleDelegationResult(delegationResult);
8352
9588
  if ("ok" in parsed && parsed.ok === false) {
8353
9589
  return parsed;
@@ -8362,39 +9598,41 @@ var SharingService = class {
8362
9598
  actions,
8363
9599
  requestedExpiry
8364
9600
  });
9601
+ const rootDelegationActiveError = this.retiredGraphError();
9602
+ if (rootDelegationActiveError) return { ok: false, error: rootDelegationActiveError };
8365
9603
  if (rootDelegation) {
8366
9604
  delegation = rootDelegation;
8367
9605
  expiry = requestedExpiry;
8368
9606
  } else {
8369
- const fallbackResult = await this.handleSessionExtensionFallback(requestedExpiry);
8370
- expiry = fallbackResult.expiry;
8371
- const delegationResult = await this.createSessionDelegation(plainDID, fullPath, actions, expiry);
8372
- const parsed = handleDelegationResult(delegationResult);
8373
- if ("ok" in parsed && parsed.ok === false) {
8374
- return parsed;
8375
- }
8376
- delegation = parsed;
9607
+ return {
9608
+ ok: false,
9609
+ error: createError2(
9610
+ DelegationErrorCodes.PERMISSION_DENIED,
9611
+ "The active session ReCap does not authorize this sharing delegation."
9612
+ )
9613
+ };
8377
9614
  }
8378
9615
  } catch (err6) {
8379
- const fallbackResult = await this.handleSessionExtensionFallback(requestedExpiry);
8380
- expiry = fallbackResult.expiry;
8381
- const delegationResult = await this.createSessionDelegation(plainDID, fullPath, actions, expiry);
8382
- const parsed = handleDelegationResult(delegationResult);
8383
- if ("ok" in parsed && parsed.ok === false) {
8384
- return parsed;
8385
- }
8386
- delegation = parsed;
9616
+ return {
9617
+ ok: false,
9618
+ error: createError2(
9619
+ DelegationErrorCodes.PERMISSION_DENIED,
9620
+ "The active session ReCap does not authorize this sharing delegation.",
9621
+ err6 instanceof Error ? err6 : void 0
9622
+ )
9623
+ };
8387
9624
  }
8388
9625
  } else {
8389
- const fallbackResult = await this.handleSessionExtensionFallback(requestedExpiry);
8390
- expiry = fallbackResult.expiry;
8391
- const delegationResult = await this.createSessionDelegation(plainDID, fullPath, actions, expiry);
8392
- const parsed = handleDelegationResult(delegationResult);
8393
- if ("ok" in parsed && parsed.ok === false) {
8394
- return parsed;
8395
- }
8396
- delegation = parsed;
9626
+ return {
9627
+ ok: false,
9628
+ error: createError2(
9629
+ DelegationErrorCodes.PERMISSION_DENIED,
9630
+ "The active session ReCap does not authorize this sharing delegation."
9631
+ )
9632
+ };
8397
9633
  }
9634
+ const finalActiveError = this.retiredGraphError();
9635
+ if (finalActiveError) return { ok: false, error: finalActiveError };
8398
9636
  const shareData = {
8399
9637
  key: keyJwk,
8400
9638
  keyDid,
@@ -8427,13 +9665,16 @@ var SharingService = class {
8427
9665
  * @internal
8428
9666
  */
8429
9667
  findSuitableKeyForDelegation(path, actions, requestedExpiry) {
8430
- if (this.sessionExpiry && requestedExpiry <= this.sessionExpiry) {
8431
- return true;
8432
- }
8433
9668
  const allKeys = this.registry.getAllKeys();
8434
9669
  for (const key of allKeys) {
8435
9670
  const delegations = this.registry.getDelegationsForKey(key.id);
8436
9671
  for (const delegation of delegations) {
9672
+ if (delegation.spaceId !== this.session?.spaceId) {
9673
+ continue;
9674
+ }
9675
+ if ((delegation.caveats?.length ?? 0) > 0) {
9676
+ continue;
9677
+ }
8437
9678
  if (!this.registry.isDelegationValid(delegation)) {
8438
9679
  continue;
8439
9680
  }
@@ -8459,6 +9700,18 @@ var SharingService = class {
8459
9700
  }
8460
9701
  return false;
8461
9702
  }
9703
+ retiredGraphError() {
9704
+ try {
9705
+ this.assertActiveFn?.();
9706
+ return void 0;
9707
+ } catch (err6) {
9708
+ return createError2(
9709
+ DelegationErrorCodes.NOT_INITIALIZED,
9710
+ "The session service graph has been retired.",
9711
+ err6 instanceof Error ? err6 : void 0
9712
+ );
9713
+ }
9714
+ }
8462
9715
  /**
8463
9716
  * Check if a delegation path matches/covers the requested path.
8464
9717
  * A delegation path covers the request if:
@@ -8481,19 +9734,14 @@ var SharingService = class {
8481
9734
  }
8482
9735
  return false;
8483
9736
  }
8484
- /**
8485
- * Handle fallback to session extension when root delegation is not available.
8486
- * @internal
8487
- */
8488
- async handleSessionExtensionFallback(requestedExpiry) {
8489
- return { expiry: this.sessionExpiry ?? requestedExpiry };
8490
- }
8491
9737
  /**
8492
9738
  * Create a delegation from the current session to a share key.
8493
9739
  * This is the fallback path when root delegation is not available.
8494
9740
  * @internal
8495
9741
  */
8496
9742
  async createSessionDelegation(delegateDID, path, actions, expiry) {
9743
+ const activeError = this.retiredGraphError();
9744
+ if (activeError) return { ok: false, error: activeError };
8497
9745
  if (!this.session) {
8498
9746
  return {
8499
9747
  ok: false,
@@ -8535,14 +9783,20 @@ var SharingService = class {
8535
9783
  },
8536
9784
  expirationSecs: Math.floor(expiry.getTime() / 1e3)
8537
9785
  });
9786
+ const childSigningActiveError = this.retiredGraphError();
9787
+ if (childSigningActiveError) return { ok: false, error: childSigningActiveError };
8538
9788
  const registerRes = await this.fetchFn(`${this.host}/delegate`, {
8539
9789
  method: "POST",
8540
9790
  headers: {
8541
9791
  Authorization: wasmResult.delegation
8542
9792
  }
8543
9793
  });
9794
+ const registrationActiveError = this.retiredGraphError();
9795
+ if (registrationActiveError) return { ok: false, error: registrationActiveError };
8544
9796
  if (!registerRes.ok) {
8545
9797
  const errorText = await registerRes.text();
9798
+ const registrationTextActiveError = this.retiredGraphError();
9799
+ if (registrationTextActiveError) return { ok: false, error: registrationTextActiveError };
8546
9800
  return {
8547
9801
  ok: false,
8548
9802
  error: createError2(
@@ -8592,6 +9846,8 @@ var SharingService = class {
8592
9846
  disableSubDelegation: false
8593
9847
  };
8594
9848
  const delegationResult = this.createDelegationFn ? await this.createDelegationFn(delegationParams) : await this.delegationManager.create(delegationParams);
9849
+ const delegationCreationActiveError = this.retiredGraphError();
9850
+ if (delegationCreationActiveError) return { ok: false, error: delegationCreationActiveError };
8595
9851
  if (!delegationResult.ok) {
8596
9852
  return {
8597
9853
  ok: false,
@@ -8617,12 +9873,14 @@ var SharingService = class {
8617
9873
  * - Register sub-delegation capabilities
8618
9874
  * 4. Return ShareAccess with pre-configured KV service
8619
9875
  */
8620
- async receive(link, options = {}) {
9876
+ async receive(link, options2 = {}) {
9877
+ const activeError = this.retiredGraphError();
9878
+ if (activeError) return { ok: false, error: activeError };
8621
9879
  const {
8622
9880
  autoSubdelegate = true,
8623
9881
  useSessionKey = true,
8624
9882
  ingestOptions
8625
- } = options;
9883
+ } = options2;
8626
9884
  const decodeResult = this.decodeLinkWithValidation(link);
8627
9885
  if (!decodeResult.ok) {
8628
9886
  return decodeResult;
@@ -8708,9 +9966,12 @@ var SharingService = class {
8708
9966
  * be logged or stored insecurely.
8709
9967
  */
8710
9968
  async delegateReceivedShare(link, params) {
9969
+ const activeError = this.retiredGraphError();
9970
+ if (activeError) return { ok: false, error: activeError };
8711
9971
  const decoded = this.decodeLinkWithValidation(link);
8712
9972
  if (!decoded.ok) return decoded;
8713
9973
  const shareData = decoded.data;
9974
+ this.assertDelegationCaveatsPreservable(shareData.delegation);
8714
9975
  const parentExpiry = new Date(shareData.delegation.expiry);
8715
9976
  const now = /* @__PURE__ */ new Date();
8716
9977
  if (parentExpiry <= now) {
@@ -8844,6 +10105,8 @@ var SharingService = class {
8844
10105
  abilities: { [service]: { [path]: actions } },
8845
10106
  expirationSecs: Math.floor(expiry.getTime() / 1e3)
8846
10107
  });
10108
+ const childSigningActiveError = this.retiredGraphError();
10109
+ if (childSigningActiveError) return { ok: false, error: childSigningActiveError };
8847
10110
  const verifiedChild = verifySignedChild(result, {
8848
10111
  delegateDID,
8849
10112
  issuerDID: principalDid(shareData.keyDid),
@@ -8870,6 +10133,8 @@ var SharingService = class {
8870
10133
  redirect: "error"
8871
10134
  };
8872
10135
  const registration = await this.fetchFn(new URL("/delegate", trustedHost).toString(), registrationInit);
10136
+ const registrationActiveError = this.retiredGraphError();
10137
+ if (registrationActiveError) return { ok: false, error: registrationActiveError };
8873
10138
  if (!registration.ok) {
8874
10139
  throw new Error(`node rejected child delegation (${registration.status})`);
8875
10140
  }
@@ -8915,6 +10180,22 @@ var SharingService = class {
8915
10180
  };
8916
10181
  }
8917
10182
  }
10183
+ /**
10184
+ * The child-delegation WASM boundary accepts action-only abilities. Reject
10185
+ * every constrained parent branch before that boundary can broaden it.
10186
+ */
10187
+ assertDelegationCaveatsPreservable(delegation) {
10188
+ if (recapCaveatsEqual(delegation.caveats, void 0)) return;
10189
+ const service = delegation.actions[0]?.split("/", 1)[0] ?? "tinycloud.unknown";
10190
+ const entry = {
10191
+ service,
10192
+ space: delegation.spaceId,
10193
+ path: delegation.path,
10194
+ actions: [...delegation.actions],
10195
+ caveats: delegation.caveats ?? []
10196
+ };
10197
+ throw new CaveatedDelegationUnsupportedError([entry]);
10198
+ }
8918
10199
  /**
8919
10200
  * Encode sharing data into a link string.
8920
10201
  *
@@ -9083,7 +10364,7 @@ function capabilityPathContains(parent, child) {
9083
10364
  function shareKeyMatchesDid(key, didUrl) {
9084
10365
  if (key.kty !== "OKP" || key.crv !== "Ed25519" || typeof key.x !== "string" || typeof key.d !== "string") return false;
9085
10366
  try {
9086
- const didBytes = import_basics2.bases.base58btc.decode(principalDid(didUrl).slice("did:key:".length));
10367
+ const didBytes = bases.base58btc.decode(principalDid(didUrl).slice("did:key:".length));
9087
10368
  const publicKey = didBytes.length === 34 && didBytes[0] === 237 && didBytes[1] === 1 ? didBytes.slice(2) : null;
9088
10369
  if (!publicKey) return false;
9089
10370
  const jwkBytes = decodeBase64UrlBytes(key.x);
@@ -9195,7 +10476,14 @@ var CapabilityKeyRegistry = class {
9195
10476
  removeKey(keyId) {
9196
10477
  const delegations = this.store.byKey.get(keyId) || [];
9197
10478
  for (const delegation of delegations) {
9198
- this.store.byCid.delete(delegation.cid);
10479
+ const chains = this.store.byCid.get(delegation.cid);
10480
+ if (!chains) continue;
10481
+ const remaining = chains.filter((chain) => chain.keyId !== keyId);
10482
+ if (remaining.length === 0) {
10483
+ this.store.byCid.delete(delegation.cid);
10484
+ } else {
10485
+ this.store.byCid.set(delegation.cid, remaining);
10486
+ }
9199
10487
  }
9200
10488
  for (const [capKey, entries] of this.store.byCapability) {
9201
10489
  const filtered = entries.filter(
@@ -9285,8 +10573,8 @@ var CapabilityKeyRegistry = class {
9285
10573
  * @param delegation - Delegation to associate with the key
9286
10574
  * @param options - Ingestion options
9287
10575
  */
9288
- ingestKey(key, delegation, options) {
9289
- const keyToStore = options?.priority !== void 0 ? { ...key, priority: options.priority } : key;
10576
+ ingestKey(key, delegation, options2) {
10577
+ const keyToStore = options2?.priority !== void 0 ? { ...key, priority: options2.priority } : key;
9290
10578
  this.keys.set(keyToStore.id, keyToStore);
9291
10579
  if (!this.store.byKey.has(keyToStore.id)) {
9292
10580
  this.store.byKey.set(keyToStore.id, []);
@@ -9355,7 +10643,7 @@ var CapabilityKeyRegistry = class {
9355
10643
  */
9356
10644
  revokeDelegation(cid) {
9357
10645
  const stored = this.store.byCid.get(cid);
9358
- if (!stored) {
10646
+ if (!stored || stored.length === 0) {
9359
10647
  return (0, import_sdk_services6.err)(
9360
10648
  (0, import_sdk_services6.serviceError)(
9361
10649
  CapabilityKeyRegistryErrorCodes.KEY_NOT_FOUND,
@@ -9364,12 +10652,10 @@ var CapabilityKeyRegistry = class {
9364
10652
  )
9365
10653
  );
9366
10654
  }
9367
- stored.delegation.isRevoked = true;
9368
- const keyDelegations = this.store.byKey.get(stored.keyId);
9369
- if (keyDelegations) {
9370
- const delegation = keyDelegations.find((d) => d.cid === cid);
9371
- if (delegation) {
9372
- delegation.isRevoked = true;
10655
+ for (const chain of stored) chain.delegation.isRevoked = true;
10656
+ for (const keyDelegations of this.store.byKey.values()) {
10657
+ for (const delegation of keyDelegations) {
10658
+ if (delegation.cid === cid) delegation.isRevoked = true;
9373
10659
  }
9374
10660
  }
9375
10661
  for (const entries of this.store.byCapability.values()) {
@@ -9416,22 +10702,28 @@ var CapabilityKeyRegistry = class {
9416
10702
  */
9417
10703
  addDelegation(key, delegation) {
9418
10704
  const keyDelegations = this.store.byKey.get(key.id) || [];
9419
- if (!keyDelegations.some((d) => d.cid === delegation.cid)) {
10705
+ if (!keyDelegations.some((d) => this.sameDelegationScope(d, delegation))) {
9420
10706
  keyDelegations.push(delegation);
9421
10707
  this.store.byKey.set(key.id, keyDelegations);
9422
10708
  }
9423
- if (!this.store.byCid.has(delegation.cid)) {
9424
- this.store.byCid.set(delegation.cid, {
10709
+ const chains = this.store.byCid.get(delegation.cid) ?? [];
10710
+ if (!chains.some(
10711
+ (chain) => chain.keyId === key.id && this.sameDelegationScope(chain.delegation, delegation)
10712
+ )) {
10713
+ chains.push({
9425
10714
  delegation,
9426
10715
  parentCid: delegation.parentCid,
9427
10716
  keyId: key.id,
9428
10717
  storedAt: /* @__PURE__ */ new Date()
9429
10718
  });
10719
+ this.store.byCid.set(delegation.cid, chains);
9430
10720
  }
9431
10721
  for (const action of delegation.actions) {
9432
10722
  const capKey = this.makeCapabilityKey(delegation.path, action);
9433
10723
  const entries = this.store.byCapability.get(capKey) || [];
9434
- const existingEntry = entries.find((e) => e.delegation.cid === delegation.cid);
10724
+ const existingEntry = entries.find(
10725
+ (e) => this.sameDelegationScope(e.delegation, delegation)
10726
+ );
9435
10727
  if (existingEntry) {
9436
10728
  if (!existingEntry.keys.some((k) => k.id === key.id)) {
9437
10729
  existingEntry.keys.push(key);
@@ -9460,6 +10752,9 @@ var CapabilityKeyRegistry = class {
9460
10752
  makeCapabilityKey(resource, action) {
9461
10753
  return `${resource}|${action}`;
9462
10754
  }
10755
+ sameDelegationScope(left, right) {
10756
+ return left.cid === right.cid && left.spaceId === right.spaceId && left.path === right.path && left.actions.length === right.actions.length && left.actions.every((action) => right.actions.includes(action)) && recapCaveatsEqual(left.caveats, right.caveats);
10757
+ }
9463
10758
  /**
9464
10759
  * Find capability entries that match a resource and action.
9465
10760
  *
@@ -9481,7 +10776,9 @@ var CapabilityKeyRegistry = class {
9481
10776
  continue;
9482
10777
  }
9483
10778
  if (this.resourceMatchesPattern(resource, entry.resource)) {
9484
- if (!results.some((r) => r.delegation.cid === entry.delegation.cid)) {
10779
+ if (!results.some(
10780
+ (r) => this.sameDelegationScope(r.delegation, entry.delegation)
10781
+ )) {
9485
10782
  results.push(entry);
9486
10783
  }
9487
10784
  }
@@ -9562,24 +10859,24 @@ function openKeyApprovalReason(body) {
9562
10859
  }
9563
10860
  return "OpenKey explicit approval required";
9564
10861
  }
9565
- function createOpenKeyCallbackSigningStrategy(options) {
10862
+ function createOpenKeyCallbackSigningStrategy(options2) {
9566
10863
  return {
9567
10864
  type: "callback",
9568
10865
  openKeyAutoSign: true,
9569
10866
  handler: async (request) => {
9570
- const fetchImpl = options.fetch ?? globalThis.fetch;
10867
+ const fetchImpl = options2.fetch ?? globalThis.fetch;
9571
10868
  if (!fetchImpl) {
9572
10869
  throw new Error("OpenKey signing strategy requires a fetch implementation");
9573
10870
  }
9574
- const token = await resolveOpenKeyToken(options.token);
9575
- const extraHeaders = await resolveOpenKeyHeaders(options.headers);
10871
+ const token = await resolveOpenKeyToken(options2.token);
10872
+ const extraHeaders = await resolveOpenKeyHeaders(options2.headers);
9576
10873
  const body = {
9577
10874
  ...request,
9578
- ...options.keyId ? { keyId: options.keyId } : {}
10875
+ ...options2.keyId ? { keyId: options2.keyId } : {}
9579
10876
  };
9580
- const response = await fetchImpl(options.endpoint, {
10877
+ const response = await fetchImpl(options2.endpoint, {
9581
10878
  method: "POST",
9582
- credentials: options.credentials,
10879
+ credentials: options2.credentials,
9583
10880
  headers: {
9584
10881
  "content-type": "application/json",
9585
10882
  ...token ? { authorization: `Bearer ${token}` } : {},
@@ -9696,12 +10993,1459 @@ async function checkNodeInfo(host, sdkProtocol, fetchFn = globalThis.fetch.bind(
9696
10993
  // src/index.ts
9697
10994
  var import_bootstrap3 = require("@tinycloud/bootstrap");
9698
10995
 
10996
+ // ../../node_modules/uint8arrays/dist/src/equals.js
10997
+ function equals3(a, b) {
10998
+ if (a === b) {
10999
+ return true;
11000
+ }
11001
+ if (a.byteLength !== b.byteLength) {
11002
+ return false;
11003
+ }
11004
+ for (let i = 0; i < a.byteLength; i++) {
11005
+ if (a[i] !== b[i]) {
11006
+ return false;
11007
+ }
11008
+ }
11009
+ return true;
11010
+ }
11011
+
11012
+ // ../../node_modules/uint8arrays/dist/src/alloc.node.js
11013
+ var import_node_buffer = require("buffer");
11014
+
11015
+ // ../../node_modules/uint8arrays/dist/src/util/as-uint8array.node.js
11016
+ function asUint8Array(buf) {
11017
+ return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
11018
+ }
11019
+
11020
+ // ../../node_modules/uint8arrays/dist/src/alloc.node.js
11021
+ function allocUnsafe(size = 0) {
11022
+ return asUint8Array(import_node_buffer.Buffer.allocUnsafe(size));
11023
+ }
11024
+
11025
+ // ../../node_modules/uint8-varint/dist/src/index.js
11026
+ var N12 = Math.pow(2, 7);
11027
+ var N22 = Math.pow(2, 14);
11028
+ var N32 = Math.pow(2, 21);
11029
+ var N42 = Math.pow(2, 28);
11030
+ var N52 = Math.pow(2, 35);
11031
+ var N62 = Math.pow(2, 42);
11032
+ var N72 = Math.pow(2, 49);
11033
+ var MSB2 = 128;
11034
+ var REST2 = 127;
11035
+ function encodingLength2(value) {
11036
+ if (value < N12) {
11037
+ return 1;
11038
+ }
11039
+ if (value < N22) {
11040
+ return 2;
11041
+ }
11042
+ if (value < N32) {
11043
+ return 3;
11044
+ }
11045
+ if (value < N42) {
11046
+ return 4;
11047
+ }
11048
+ if (value < N52) {
11049
+ return 5;
11050
+ }
11051
+ if (value < N62) {
11052
+ return 6;
11053
+ }
11054
+ if (value < N72) {
11055
+ return 7;
11056
+ }
11057
+ if (Number.MAX_SAFE_INTEGER != null && value > Number.MAX_SAFE_INTEGER) {
11058
+ throw new RangeError("Could not encode varint");
11059
+ }
11060
+ return 8;
11061
+ }
11062
+ function encodeUint8Array(value, buf, offset = 0) {
11063
+ switch (encodingLength2(value)) {
11064
+ case 8: {
11065
+ buf[offset++] = value & 255 | MSB2;
11066
+ value /= 128;
11067
+ }
11068
+ case 7: {
11069
+ buf[offset++] = value & 255 | MSB2;
11070
+ value /= 128;
11071
+ }
11072
+ case 6: {
11073
+ buf[offset++] = value & 255 | MSB2;
11074
+ value /= 128;
11075
+ }
11076
+ case 5: {
11077
+ buf[offset++] = value & 255 | MSB2;
11078
+ value /= 128;
11079
+ }
11080
+ case 4: {
11081
+ buf[offset++] = value & 255 | MSB2;
11082
+ value >>>= 7;
11083
+ }
11084
+ case 3: {
11085
+ buf[offset++] = value & 255 | MSB2;
11086
+ value >>>= 7;
11087
+ }
11088
+ case 2: {
11089
+ buf[offset++] = value & 255 | MSB2;
11090
+ value >>>= 7;
11091
+ }
11092
+ case 1: {
11093
+ buf[offset++] = value & 255;
11094
+ value >>>= 7;
11095
+ break;
11096
+ }
11097
+ default:
11098
+ throw new Error("unreachable");
11099
+ }
11100
+ return buf;
11101
+ }
11102
+ function decodeUint8Array(buf, offset) {
11103
+ let b = buf[offset];
11104
+ let res = 0;
11105
+ res += b & REST2;
11106
+ if (b < MSB2) {
11107
+ return res;
11108
+ }
11109
+ b = buf[offset + 1];
11110
+ res += (b & REST2) << 7;
11111
+ if (b < MSB2) {
11112
+ return res;
11113
+ }
11114
+ b = buf[offset + 2];
11115
+ res += (b & REST2) << 14;
11116
+ if (b < MSB2) {
11117
+ return res;
11118
+ }
11119
+ b = buf[offset + 3];
11120
+ res += (b & REST2) << 21;
11121
+ if (b < MSB2) {
11122
+ return res;
11123
+ }
11124
+ b = buf[offset + 4];
11125
+ res += (b & REST2) * N42;
11126
+ if (b < MSB2) {
11127
+ return res;
11128
+ }
11129
+ b = buf[offset + 5];
11130
+ res += (b & REST2) * N52;
11131
+ if (b < MSB2) {
11132
+ return res;
11133
+ }
11134
+ b = buf[offset + 6];
11135
+ res += (b & REST2) * N62;
11136
+ if (b < MSB2) {
11137
+ return res;
11138
+ }
11139
+ b = buf[offset + 7];
11140
+ res += (b & REST2) * N72;
11141
+ if (b < MSB2) {
11142
+ return res;
11143
+ }
11144
+ throw new RangeError("Could not decode varint");
11145
+ }
11146
+ function decodeUint8ArrayList(buf, offset) {
11147
+ let b = buf.get(offset);
11148
+ let res = 0;
11149
+ res += b & REST2;
11150
+ if (b < MSB2) {
11151
+ return res;
11152
+ }
11153
+ b = buf.get(offset + 1);
11154
+ res += (b & REST2) << 7;
11155
+ if (b < MSB2) {
11156
+ return res;
11157
+ }
11158
+ b = buf.get(offset + 2);
11159
+ res += (b & REST2) << 14;
11160
+ if (b < MSB2) {
11161
+ return res;
11162
+ }
11163
+ b = buf.get(offset + 3);
11164
+ res += (b & REST2) << 21;
11165
+ if (b < MSB2) {
11166
+ return res;
11167
+ }
11168
+ b = buf.get(offset + 4);
11169
+ res += (b & REST2) * N42;
11170
+ if (b < MSB2) {
11171
+ return res;
11172
+ }
11173
+ b = buf.get(offset + 5);
11174
+ res += (b & REST2) * N52;
11175
+ if (b < MSB2) {
11176
+ return res;
11177
+ }
11178
+ b = buf.get(offset + 6);
11179
+ res += (b & REST2) * N62;
11180
+ if (b < MSB2) {
11181
+ return res;
11182
+ }
11183
+ b = buf.get(offset + 7);
11184
+ res += (b & REST2) * N72;
11185
+ if (b < MSB2) {
11186
+ return res;
11187
+ }
11188
+ throw new RangeError("Could not decode varint");
11189
+ }
11190
+ function decode6(buf, offset = 0) {
11191
+ if (buf instanceof Uint8Array) {
11192
+ return decodeUint8Array(buf, offset);
11193
+ } else {
11194
+ return decodeUint8ArrayList(buf, offset);
11195
+ }
11196
+ }
11197
+
11198
+ // ../../node_modules/uint8arrays/dist/src/concat.node.js
11199
+ var import_node_buffer2 = require("buffer");
11200
+ function concat(arrays, length2) {
11201
+ return asUint8Array(import_node_buffer2.Buffer.concat(arrays, length2));
11202
+ }
11203
+
11204
+ // ../../node_modules/uint8arrays/dist/src/from-string.node.js
11205
+ var import_node_buffer3 = require("buffer");
11206
+
11207
+ // ../../node_modules/uint8arrays/dist/src/util/bases.js
11208
+ function createCodec(name2, prefix, encode5, decode7) {
11209
+ return {
11210
+ name: name2,
11211
+ prefix,
11212
+ encoder: {
11213
+ name: name2,
11214
+ prefix,
11215
+ encode: encode5
11216
+ },
11217
+ decoder: {
11218
+ decode: decode7
11219
+ }
11220
+ };
11221
+ }
11222
+ var string = createCodec("utf8", "u", (buf) => {
11223
+ const decoder = new TextDecoder("utf8");
11224
+ return "u" + decoder.decode(buf);
11225
+ }, (str) => {
11226
+ const encoder = new TextEncoder();
11227
+ return encoder.encode(str.substring(1));
11228
+ });
11229
+ var ascii = createCodec("ascii", "a", (buf) => {
11230
+ let string2 = "a";
11231
+ for (let i = 0; i < buf.length; i++) {
11232
+ string2 += String.fromCharCode(buf[i]);
11233
+ }
11234
+ return string2;
11235
+ }, (str) => {
11236
+ str = str.substring(1);
11237
+ const buf = allocUnsafe(str.length);
11238
+ for (let i = 0; i < str.length; i++) {
11239
+ buf[i] = str.charCodeAt(i);
11240
+ }
11241
+ return buf;
11242
+ });
11243
+ var BASES = {
11244
+ utf8: string,
11245
+ "utf-8": string,
11246
+ hex: bases.base16,
11247
+ latin1: ascii,
11248
+ ascii,
11249
+ binary: ascii,
11250
+ ...bases
11251
+ };
11252
+ var bases_default = BASES;
11253
+
11254
+ // ../../node_modules/uint8arrays/dist/src/from-string.node.js
11255
+ function fromString2(string2, encoding = "utf8") {
11256
+ const base3 = bases_default[encoding];
11257
+ if (base3 == null) {
11258
+ throw new Error(`Unsupported encoding "${encoding}"`);
11259
+ }
11260
+ if (encoding === "utf8" || encoding === "utf-8") {
11261
+ return asUint8Array(import_node_buffer3.Buffer.from(string2, "utf-8"));
11262
+ }
11263
+ return base3.decoder.decode(`${base3.prefix}${string2}`);
11264
+ }
11265
+
11266
+ // ../../node_modules/uint8arrays/dist/src/to-string.node.js
11267
+ var import_node_buffer4 = require("buffer");
11268
+ function toString2(array, encoding = "utf8") {
11269
+ const base3 = bases_default[encoding];
11270
+ if (base3 == null) {
11271
+ throw new Error(`Unsupported encoding "${encoding}"`);
11272
+ }
11273
+ if (encoding === "utf8" || encoding === "utf-8") {
11274
+ return import_node_buffer4.Buffer.from(array.buffer, array.byteOffset, array.byteLength).toString("utf8");
11275
+ }
11276
+ return base3.encoder.encode(array).substring(1);
11277
+ }
11278
+
11279
+ // ../../node_modules/@multiformats/multiaddr/dist/src/errors.js
11280
+ var InvalidMultiaddrError = class extends Error {
11281
+ constructor() {
11282
+ super(...arguments);
11283
+ __publicField(this, "name", "InvalidMultiaddrError");
11284
+ }
11285
+ };
11286
+ __publicField(InvalidMultiaddrError, "name", "InvalidMultiaddrError");
11287
+ var ValidationError = class extends Error {
11288
+ constructor() {
11289
+ super(...arguments);
11290
+ __publicField(this, "name", "ValidationError");
11291
+ }
11292
+ };
11293
+ __publicField(ValidationError, "name", "ValidationError");
11294
+ var InvalidParametersError = class extends Error {
11295
+ constructor() {
11296
+ super(...arguments);
11297
+ __publicField(this, "name", "InvalidParametersError");
11298
+ }
11299
+ };
11300
+ __publicField(InvalidParametersError, "name", "InvalidParametersError");
11301
+ var UnknownProtocolError = class extends Error {
11302
+ constructor() {
11303
+ super(...arguments);
11304
+ __publicField(this, "name", "UnknownProtocolError");
11305
+ }
11306
+ };
11307
+ __publicField(UnknownProtocolError, "name", "UnknownProtocolError");
11308
+
11309
+ // ../../node_modules/@chainsafe/is-ip/lib/is-ip.node.js
11310
+ var import_node_net = require("net");
11311
+
11312
+ // ../../node_modules/@multiformats/multiaddr/dist/src/constants.js
11313
+ var CODE_IP4 = 4;
11314
+ var CODE_TCP = 6;
11315
+ var CODE_UDP = 273;
11316
+ var CODE_DCCP = 33;
11317
+ var CODE_IP6 = 41;
11318
+ var CODE_IP6ZONE = 42;
11319
+ var CODE_IPCIDR = 43;
11320
+ var CODE_DNS = 53;
11321
+ var CODE_DNS4 = 54;
11322
+ var CODE_DNS6 = 55;
11323
+ var CODE_DNSADDR = 56;
11324
+ var CODE_SCTP = 132;
11325
+ var CODE_UDT = 301;
11326
+ var CODE_UTP = 302;
11327
+ var CODE_UNIX = 400;
11328
+ var CODE_P2P = 421;
11329
+ var CODE_ONION = 444;
11330
+ var CODE_ONION3 = 445;
11331
+ var CODE_GARLIC64 = 446;
11332
+ var CODE_GARLIC32 = 447;
11333
+ var CODE_TLS = 448;
11334
+ var CODE_SNI = 449;
11335
+ var CODE_NOISE = 454;
11336
+ var CODE_QUIC = 460;
11337
+ var CODE_QUIC_V1 = 461;
11338
+ var CODE_WEBTRANSPORT = 465;
11339
+ var CODE_CERTHASH = 466;
11340
+ var CODE_HTTP = 480;
11341
+ var CODE_HTTP_PATH = 481;
11342
+ var CODE_HTTPS = 443;
11343
+ var CODE_WS = 477;
11344
+ var CODE_WSS = 478;
11345
+ var CODE_P2P_WEBSOCKET_STAR = 479;
11346
+ var CODE_P2P_STARDUST = 277;
11347
+ var CODE_P2P_WEBRTC_STAR = 275;
11348
+ var CODE_P2P_WEBRTC_DIRECT = 276;
11349
+ var CODE_WEBRTC_DIRECT = 280;
11350
+ var CODE_WEBRTC = 281;
11351
+ var CODE_P2P_CIRCUIT = 290;
11352
+ var CODE_MEMORY = 777;
11353
+
11354
+ // ../../node_modules/@multiformats/multiaddr/dist/src/utils.js
11355
+ function bytesToString(base3) {
11356
+ return (buf) => {
11357
+ return toString2(buf, base3);
11358
+ };
11359
+ }
11360
+ function stringToBytes(base3) {
11361
+ return (buf) => {
11362
+ return fromString2(buf, base3);
11363
+ };
11364
+ }
11365
+ function bytes2port(buf) {
11366
+ const view = new DataView(buf.buffer);
11367
+ return view.getUint16(buf.byteOffset).toString();
11368
+ }
11369
+ function port2bytes(port) {
11370
+ const buf = new ArrayBuffer(2);
11371
+ const view = new DataView(buf);
11372
+ view.setUint16(0, typeof port === "string" ? parseInt(port) : port);
11373
+ return new Uint8Array(buf);
11374
+ }
11375
+ function onion2bytes(str) {
11376
+ const addr = str.split(":");
11377
+ if (addr.length !== 2) {
11378
+ throw new Error(`failed to parse onion addr: ["'${addr.join('", "')}'"]' does not contain a port number`);
11379
+ }
11380
+ if (addr[0].length !== 16) {
11381
+ throw new Error(`failed to parse onion addr: ${addr[0]} not a Tor onion address.`);
11382
+ }
11383
+ const buf = fromString2(addr[0], "base32");
11384
+ const port = parseInt(addr[1], 10);
11385
+ if (port < 1 || port > 65536) {
11386
+ throw new Error("Port number is not in range(1, 65536)");
11387
+ }
11388
+ const portBuf = port2bytes(port);
11389
+ return concat([buf, portBuf], buf.length + portBuf.length);
11390
+ }
11391
+ function onion32bytes(str) {
11392
+ const addr = str.split(":");
11393
+ if (addr.length !== 2) {
11394
+ throw new Error(`failed to parse onion addr: ["'${addr.join('", "')}'"]' does not contain a port number`);
11395
+ }
11396
+ if (addr[0].length !== 56) {
11397
+ throw new Error(`failed to parse onion addr: ${addr[0]} not a Tor onion3 address.`);
11398
+ }
11399
+ const buf = base32.decode(`b${addr[0]}`);
11400
+ const port = parseInt(addr[1], 10);
11401
+ if (port < 1 || port > 65536) {
11402
+ throw new Error("Port number is not in range(1, 65536)");
11403
+ }
11404
+ const portBuf = port2bytes(port);
11405
+ return concat([buf, portBuf], buf.length + portBuf.length);
11406
+ }
11407
+ function bytes2onion(buf) {
11408
+ const addrBytes = buf.subarray(0, buf.length - 2);
11409
+ const portBytes = buf.subarray(buf.length - 2);
11410
+ const addr = toString2(addrBytes, "base32");
11411
+ const port = bytes2port(portBytes);
11412
+ return `${addr}:${port}`;
11413
+ }
11414
+ var ip4ToBytes = function(ip) {
11415
+ ip = ip.toString().trim();
11416
+ const bytes = new Uint8Array(4);
11417
+ ip.split(/\./g).forEach((byte, index) => {
11418
+ const value = parseInt(byte, 10);
11419
+ if (isNaN(value) || value < 0 || value > 255) {
11420
+ throw new InvalidMultiaddrError("Invalid byte value in IP address");
11421
+ }
11422
+ bytes[index] = value;
11423
+ });
11424
+ return bytes;
11425
+ };
11426
+ var ip6ToBytes = function(ip) {
11427
+ let offset = 0;
11428
+ ip = ip.toString().trim();
11429
+ const sections = ip.split(":", 8);
11430
+ let i;
11431
+ for (i = 0; i < sections.length; i++) {
11432
+ const isv4 = (0, import_node_net.isIPv4)(sections[i]);
11433
+ let v4Buffer;
11434
+ if (isv4) {
11435
+ v4Buffer = ip4ToBytes(sections[i]);
11436
+ sections[i] = toString2(v4Buffer.subarray(0, 2), "base16");
11437
+ }
11438
+ if (v4Buffer != null && ++i < 8) {
11439
+ sections.splice(i, 0, toString2(v4Buffer.subarray(2, 4), "base16"));
11440
+ }
11441
+ }
11442
+ if (sections[0] === "") {
11443
+ while (sections.length < 8) {
11444
+ sections.unshift("0");
11445
+ }
11446
+ } else if (sections[sections.length - 1] === "") {
11447
+ while (sections.length < 8) {
11448
+ sections.push("0");
11449
+ }
11450
+ } else if (sections.length < 8) {
11451
+ for (i = 0; i < sections.length && sections[i] !== ""; i++) {
11452
+ }
11453
+ const argv = [i, 1];
11454
+ for (i = 9 - sections.length; i > 0; i--) {
11455
+ argv.push("0");
11456
+ }
11457
+ sections.splice.apply(sections, argv);
11458
+ }
11459
+ const bytes = new Uint8Array(offset + 16);
11460
+ for (i = 0; i < sections.length; i++) {
11461
+ if (sections[i] === "") {
11462
+ sections[i] = "0";
11463
+ }
11464
+ const word2 = parseInt(sections[i], 16);
11465
+ if (isNaN(word2) || word2 < 0 || word2 > 65535) {
11466
+ throw new InvalidMultiaddrError("Invalid byte value in IP address");
11467
+ }
11468
+ bytes[offset++] = word2 >> 8 & 255;
11469
+ bytes[offset++] = word2 & 255;
11470
+ }
11471
+ return bytes;
11472
+ };
11473
+ var ip4ToString = function(buf) {
11474
+ if (buf.byteLength !== 4) {
11475
+ throw new InvalidMultiaddrError("IPv4 address was incorrect length");
11476
+ }
11477
+ const result = [];
11478
+ for (let i = 0; i < buf.byteLength; i++) {
11479
+ result.push(buf[i]);
11480
+ }
11481
+ return result.join(".");
11482
+ };
11483
+ var ip6ToString = function(buf) {
11484
+ if (buf.byteLength !== 16) {
11485
+ throw new InvalidMultiaddrError("IPv6 address was incorrect length");
11486
+ }
11487
+ const result = [];
11488
+ for (let i = 0; i < buf.byteLength; i += 2) {
11489
+ const byte1 = buf[i];
11490
+ const byte2 = buf[i + 1];
11491
+ const tuple = `${byte1.toString(16).padStart(2, "0")}${byte2.toString(16).padStart(2, "0")}`;
11492
+ result.push(tuple);
11493
+ }
11494
+ const ip = result.join(":");
11495
+ try {
11496
+ const url = new URL(`http://[${ip}]`);
11497
+ return url.hostname.substring(1, url.hostname.length - 1);
11498
+ } catch {
11499
+ throw new InvalidMultiaddrError(`Invalid IPv6 address "${ip}"`);
11500
+ }
11501
+ };
11502
+ function ip6StringToValue(str) {
11503
+ try {
11504
+ const url = new URL(`http://[${str}]`);
11505
+ return url.hostname.substring(1, url.hostname.length - 1);
11506
+ } catch {
11507
+ throw new InvalidMultiaddrError(`Invalid IPv6 address "${str}"`);
11508
+ }
11509
+ }
11510
+ var decoders = Object.values(bases).map((c) => c.decoder);
11511
+ var anybaseDecoder = (function() {
11512
+ let acc = decoders[0].or(decoders[1]);
11513
+ decoders.slice(2).forEach((d) => acc = acc.or(d));
11514
+ return acc;
11515
+ })();
11516
+ function mb2bytes(mbstr) {
11517
+ return anybaseDecoder.decode(mbstr);
11518
+ }
11519
+ function bytes2mb(base3) {
11520
+ return (buf) => {
11521
+ return base3.encoder.encode(buf);
11522
+ };
11523
+ }
11524
+
11525
+ // ../../node_modules/@multiformats/multiaddr/dist/src/validation.js
11526
+ function integer(value) {
11527
+ const int = parseInt(value);
11528
+ if (int.toString() !== value) {
11529
+ throw new ValidationError("Value must be an integer");
11530
+ }
11531
+ }
11532
+ function positive(value) {
11533
+ if (value < 0) {
11534
+ throw new ValidationError("Value must be a positive integer, or zero");
11535
+ }
11536
+ }
11537
+ function maxValue(max) {
11538
+ return (value) => {
11539
+ if (value > max) {
11540
+ throw new ValidationError(`Value must be smaller than or equal to ${max}`);
11541
+ }
11542
+ };
11543
+ }
11544
+ function validate(...funcs) {
11545
+ return (value) => {
11546
+ for (const fn of funcs) {
11547
+ fn(value);
11548
+ }
11549
+ };
11550
+ }
11551
+ var validatePort = validate(integer, positive, maxValue(65535));
11552
+
11553
+ // ../../node_modules/@multiformats/multiaddr/dist/src/registry.js
11554
+ var V = -1;
11555
+ var Registry = class {
11556
+ constructor() {
11557
+ __publicField(this, "protocolsByCode", /* @__PURE__ */ new Map());
11558
+ __publicField(this, "protocolsByName", /* @__PURE__ */ new Map());
11559
+ }
11560
+ getProtocol(key) {
11561
+ let codec;
11562
+ if (typeof key === "string") {
11563
+ codec = this.protocolsByName.get(key);
11564
+ } else {
11565
+ codec = this.protocolsByCode.get(key);
11566
+ }
11567
+ if (codec == null) {
11568
+ throw new UnknownProtocolError(`Protocol ${key} was unknown`);
11569
+ }
11570
+ return codec;
11571
+ }
11572
+ addProtocol(codec) {
11573
+ this.protocolsByCode.set(codec.code, codec);
11574
+ this.protocolsByName.set(codec.name, codec);
11575
+ codec.aliases?.forEach((alias) => {
11576
+ this.protocolsByName.set(alias, codec);
11577
+ });
11578
+ }
11579
+ removeProtocol(code2) {
11580
+ const codec = this.protocolsByCode.get(code2);
11581
+ if (codec == null) {
11582
+ return;
11583
+ }
11584
+ this.protocolsByCode.delete(codec.code);
11585
+ this.protocolsByName.delete(codec.name);
11586
+ codec.aliases?.forEach((alias) => {
11587
+ this.protocolsByName.delete(alias);
11588
+ });
11589
+ }
11590
+ };
11591
+ var registry = new Registry();
11592
+ var codecs = [{
11593
+ code: CODE_IP4,
11594
+ name: "ip4",
11595
+ size: 32,
11596
+ valueToBytes: ip4ToBytes,
11597
+ bytesToValue: ip4ToString,
11598
+ validate: (value) => {
11599
+ if (!(0, import_node_net.isIPv4)(value)) {
11600
+ throw new ValidationError(`Invalid IPv4 address "${value}"`);
11601
+ }
11602
+ }
11603
+ }, {
11604
+ code: CODE_TCP,
11605
+ name: "tcp",
11606
+ size: 16,
11607
+ valueToBytes: port2bytes,
11608
+ bytesToValue: bytes2port,
11609
+ validate: validatePort
11610
+ }, {
11611
+ code: CODE_UDP,
11612
+ name: "udp",
11613
+ size: 16,
11614
+ valueToBytes: port2bytes,
11615
+ bytesToValue: bytes2port,
11616
+ validate: validatePort
11617
+ }, {
11618
+ code: CODE_DCCP,
11619
+ name: "dccp",
11620
+ size: 16,
11621
+ valueToBytes: port2bytes,
11622
+ bytesToValue: bytes2port,
11623
+ validate: validatePort
11624
+ }, {
11625
+ code: CODE_IP6,
11626
+ name: "ip6",
11627
+ size: 128,
11628
+ valueToBytes: ip6ToBytes,
11629
+ bytesToValue: ip6ToString,
11630
+ stringToValue: ip6StringToValue,
11631
+ validate: (value) => {
11632
+ if (!(0, import_node_net.isIPv6)(value)) {
11633
+ throw new ValidationError(`Invalid IPv6 address "${value}"`);
11634
+ }
11635
+ }
11636
+ }, {
11637
+ code: CODE_IP6ZONE,
11638
+ name: "ip6zone",
11639
+ size: V
11640
+ }, {
11641
+ code: CODE_IPCIDR,
11642
+ name: "ipcidr",
11643
+ size: 8,
11644
+ bytesToValue: bytesToString("base10"),
11645
+ valueToBytes: stringToBytes("base10")
11646
+ }, {
11647
+ code: CODE_DNS,
11648
+ name: "dns",
11649
+ size: V
11650
+ }, {
11651
+ code: CODE_DNS4,
11652
+ name: "dns4",
11653
+ size: V
11654
+ }, {
11655
+ code: CODE_DNS6,
11656
+ name: "dns6",
11657
+ size: V
11658
+ }, {
11659
+ code: CODE_DNSADDR,
11660
+ name: "dnsaddr",
11661
+ size: V
11662
+ }, {
11663
+ code: CODE_SCTP,
11664
+ name: "sctp",
11665
+ size: 16,
11666
+ valueToBytes: port2bytes,
11667
+ bytesToValue: bytes2port,
11668
+ validate: validatePort
11669
+ }, {
11670
+ code: CODE_UDT,
11671
+ name: "udt"
11672
+ }, {
11673
+ code: CODE_UTP,
11674
+ name: "utp"
11675
+ }, {
11676
+ code: CODE_UNIX,
11677
+ name: "unix",
11678
+ size: V,
11679
+ stringToValue: (str) => decodeURIComponent(str),
11680
+ valueToString: (val) => encodeURIComponent(val)
11681
+ }, {
11682
+ code: CODE_P2P,
11683
+ name: "p2p",
11684
+ aliases: ["ipfs"],
11685
+ size: V,
11686
+ bytesToValue: bytesToString("base58btc"),
11687
+ valueToBytes: (val) => {
11688
+ if (val.startsWith("Q") || val.startsWith("1")) {
11689
+ return stringToBytes("base58btc")(val);
11690
+ }
11691
+ return CID.parse(val).multihash.bytes;
11692
+ }
11693
+ }, {
11694
+ code: CODE_ONION,
11695
+ name: "onion",
11696
+ size: 96,
11697
+ bytesToValue: bytes2onion,
11698
+ valueToBytes: onion2bytes
11699
+ }, {
11700
+ code: CODE_ONION3,
11701
+ name: "onion3",
11702
+ size: 296,
11703
+ bytesToValue: bytes2onion,
11704
+ valueToBytes: onion32bytes
11705
+ }, {
11706
+ code: CODE_GARLIC64,
11707
+ name: "garlic64",
11708
+ size: V
11709
+ }, {
11710
+ code: CODE_GARLIC32,
11711
+ name: "garlic32",
11712
+ size: V
11713
+ }, {
11714
+ code: CODE_TLS,
11715
+ name: "tls"
11716
+ }, {
11717
+ code: CODE_SNI,
11718
+ name: "sni",
11719
+ size: V
11720
+ }, {
11721
+ code: CODE_NOISE,
11722
+ name: "noise"
11723
+ }, {
11724
+ code: CODE_QUIC,
11725
+ name: "quic"
11726
+ }, {
11727
+ code: CODE_QUIC_V1,
11728
+ name: "quic-v1"
11729
+ }, {
11730
+ code: CODE_WEBTRANSPORT,
11731
+ name: "webtransport"
11732
+ }, {
11733
+ code: CODE_CERTHASH,
11734
+ name: "certhash",
11735
+ size: V,
11736
+ bytesToValue: bytes2mb(base64url),
11737
+ valueToBytes: mb2bytes
11738
+ }, {
11739
+ code: CODE_HTTP,
11740
+ name: "http"
11741
+ }, {
11742
+ code: CODE_HTTP_PATH,
11743
+ name: "http-path",
11744
+ size: V,
11745
+ stringToValue: (str) => `/${decodeURIComponent(str)}`,
11746
+ valueToString: (val) => encodeURIComponent(val.substring(1))
11747
+ }, {
11748
+ code: CODE_HTTPS,
11749
+ name: "https"
11750
+ }, {
11751
+ code: CODE_WS,
11752
+ name: "ws"
11753
+ }, {
11754
+ code: CODE_WSS,
11755
+ name: "wss"
11756
+ }, {
11757
+ code: CODE_P2P_WEBSOCKET_STAR,
11758
+ name: "p2p-websocket-star"
11759
+ }, {
11760
+ code: CODE_P2P_STARDUST,
11761
+ name: "p2p-stardust"
11762
+ }, {
11763
+ code: CODE_P2P_WEBRTC_STAR,
11764
+ name: "p2p-webrtc-star"
11765
+ }, {
11766
+ code: CODE_P2P_WEBRTC_DIRECT,
11767
+ name: "p2p-webrtc-direct"
11768
+ }, {
11769
+ code: CODE_WEBRTC_DIRECT,
11770
+ name: "webrtc-direct"
11771
+ }, {
11772
+ code: CODE_WEBRTC,
11773
+ name: "webrtc"
11774
+ }, {
11775
+ code: CODE_P2P_CIRCUIT,
11776
+ name: "p2p-circuit"
11777
+ }, {
11778
+ code: CODE_MEMORY,
11779
+ name: "memory",
11780
+ size: V
11781
+ }];
11782
+ codecs.forEach((codec) => {
11783
+ registry.addProtocol(codec);
11784
+ });
11785
+
11786
+ // ../../node_modules/@multiformats/multiaddr/dist/src/components.js
11787
+ function bytesToComponents(bytes) {
11788
+ const components = [];
11789
+ let i = 0;
11790
+ while (i < bytes.length) {
11791
+ const code2 = decode6(bytes, i);
11792
+ const codec = registry.getProtocol(code2);
11793
+ const codeLength = encodingLength2(code2);
11794
+ const size = sizeForAddr(codec, bytes, i + codeLength);
11795
+ let sizeLength = 0;
11796
+ if (size > 0 && codec.size === V) {
11797
+ sizeLength = encodingLength2(size);
11798
+ }
11799
+ const componentLength = codeLength + sizeLength + size;
11800
+ const component = {
11801
+ code: code2,
11802
+ name: codec.name,
11803
+ bytes: bytes.subarray(i, i + componentLength)
11804
+ };
11805
+ if (size > 0) {
11806
+ const valueOffset = i + codeLength + sizeLength;
11807
+ const valueBytes = bytes.subarray(valueOffset, valueOffset + size);
11808
+ component.value = codec.bytesToValue?.(valueBytes) ?? toString2(valueBytes);
11809
+ }
11810
+ components.push(component);
11811
+ i += componentLength;
11812
+ }
11813
+ return components;
11814
+ }
11815
+ function componentsToBytes(components) {
11816
+ let length2 = 0;
11817
+ const bytes = [];
11818
+ for (const component of components) {
11819
+ if (component.bytes == null) {
11820
+ const codec = registry.getProtocol(component.code);
11821
+ const codecLength = encodingLength2(component.code);
11822
+ let valueBytes;
11823
+ let valueLength = 0;
11824
+ let valueLengthLength = 0;
11825
+ if (component.value != null) {
11826
+ valueBytes = codec.valueToBytes?.(component.value) ?? fromString2(component.value);
11827
+ valueLength = valueBytes.byteLength;
11828
+ if (codec.size === V) {
11829
+ valueLengthLength = encodingLength2(valueLength);
11830
+ }
11831
+ }
11832
+ const bytes2 = new Uint8Array(codecLength + valueLengthLength + valueLength);
11833
+ let offset = 0;
11834
+ encodeUint8Array(component.code, bytes2, offset);
11835
+ offset += codecLength;
11836
+ if (valueBytes != null) {
11837
+ if (codec.size === V) {
11838
+ encodeUint8Array(valueLength, bytes2, offset);
11839
+ offset += valueLengthLength;
11840
+ }
11841
+ bytes2.set(valueBytes, offset);
11842
+ }
11843
+ component.bytes = bytes2;
11844
+ }
11845
+ bytes.push(component.bytes);
11846
+ length2 += component.bytes.byteLength;
11847
+ }
11848
+ return concat(bytes, length2);
11849
+ }
11850
+ function stringToComponents(string2) {
11851
+ if (string2.charAt(0) !== "/") {
11852
+ throw new InvalidMultiaddrError('String multiaddr must start with "/"');
11853
+ }
11854
+ const components = [];
11855
+ let collecting = "protocol";
11856
+ let value = "";
11857
+ let protocol = "";
11858
+ for (let i = 1; i < string2.length; i++) {
11859
+ const char = string2.charAt(i);
11860
+ if (char !== "/") {
11861
+ if (collecting === "protocol") {
11862
+ protocol += string2.charAt(i);
11863
+ } else {
11864
+ value += string2.charAt(i);
11865
+ }
11866
+ }
11867
+ const ended = i === string2.length - 1;
11868
+ if (char === "/" || ended) {
11869
+ const codec = registry.getProtocol(protocol);
11870
+ if (collecting === "protocol") {
11871
+ if (codec.size == null || codec.size === 0) {
11872
+ components.push({
11873
+ code: codec.code,
11874
+ name: codec.name
11875
+ });
11876
+ value = "";
11877
+ protocol = "";
11878
+ collecting = "protocol";
11879
+ continue;
11880
+ } else if (ended) {
11881
+ throw new InvalidMultiaddrError(`Component ${protocol} was missing value`);
11882
+ }
11883
+ collecting = "value";
11884
+ } else if (collecting === "value") {
11885
+ const component = {
11886
+ code: codec.code,
11887
+ name: codec.name
11888
+ };
11889
+ if (codec.size != null && codec.size !== 0) {
11890
+ if (value === "") {
11891
+ throw new InvalidMultiaddrError(`Component ${protocol} was missing value`);
11892
+ }
11893
+ component.value = codec.stringToValue?.(value) ?? value;
11894
+ }
11895
+ components.push(component);
11896
+ value = "";
11897
+ protocol = "";
11898
+ collecting = "protocol";
11899
+ }
11900
+ }
11901
+ }
11902
+ if (protocol !== "" && value !== "") {
11903
+ throw new InvalidMultiaddrError("Incomplete multiaddr");
11904
+ }
11905
+ return components;
11906
+ }
11907
+ function componentsToString(components) {
11908
+ return `/${components.flatMap((component) => {
11909
+ if (component.value == null) {
11910
+ return component.name;
11911
+ }
11912
+ const codec = registry.getProtocol(component.code);
11913
+ if (codec == null) {
11914
+ throw new InvalidMultiaddrError(`Unknown protocol code ${component.code}`);
11915
+ }
11916
+ return [
11917
+ component.name,
11918
+ codec.valueToString?.(component.value) ?? component.value
11919
+ ];
11920
+ }).join("/")}`;
11921
+ }
11922
+ function sizeForAddr(codec, bytes, offset) {
11923
+ if (codec.size == null || codec.size === 0) {
11924
+ return 0;
11925
+ }
11926
+ if (codec.size > 0) {
11927
+ return codec.size / 8;
11928
+ }
11929
+ return decode6(bytes, offset);
11930
+ }
11931
+
11932
+ // ../../node_modules/@multiformats/multiaddr/dist/src/multiaddr.js
11933
+ var inspect = /* @__PURE__ */ Symbol.for("nodejs.util.inspect.custom");
11934
+ var symbol = /* @__PURE__ */ Symbol.for("@multiformats/multiaddr");
11935
+ function toComponents(addr) {
11936
+ if (addr == null) {
11937
+ addr = "/";
11938
+ }
11939
+ if (isMultiaddr(addr)) {
11940
+ return addr.getComponents();
11941
+ }
11942
+ if (addr instanceof Uint8Array) {
11943
+ return bytesToComponents(addr);
11944
+ }
11945
+ if (typeof addr === "string") {
11946
+ addr = addr.replace(/\/(\/)+/, "/").replace(/(\/)+$/, "");
11947
+ if (addr === "") {
11948
+ addr = "/";
11949
+ }
11950
+ return stringToComponents(addr);
11951
+ }
11952
+ if (Array.isArray(addr)) {
11953
+ return addr;
11954
+ }
11955
+ throw new InvalidMultiaddrError("Must be a string, Uint8Array, Component[], or another Multiaddr");
11956
+ }
11957
+ var _a2, _components, _string, _bytes;
11958
+ var _Multiaddr = class _Multiaddr {
11959
+ constructor(addr = "/", options2 = {}) {
11960
+ __publicField(this, _a2, true);
11961
+ __privateAdd(this, _components);
11962
+ // cache string representation
11963
+ __privateAdd(this, _string);
11964
+ // cache byte representation
11965
+ __privateAdd(this, _bytes);
11966
+ __privateSet(this, _components, toComponents(addr));
11967
+ if (options2.validate !== false) {
11968
+ validate2(this);
11969
+ }
11970
+ }
11971
+ get bytes() {
11972
+ if (__privateGet(this, _bytes) == null) {
11973
+ __privateSet(this, _bytes, componentsToBytes(__privateGet(this, _components)));
11974
+ }
11975
+ return __privateGet(this, _bytes);
11976
+ }
11977
+ toString() {
11978
+ if (__privateGet(this, _string) == null) {
11979
+ __privateSet(this, _string, componentsToString(__privateGet(this, _components)));
11980
+ }
11981
+ return __privateGet(this, _string);
11982
+ }
11983
+ toJSON() {
11984
+ return this.toString();
11985
+ }
11986
+ getComponents() {
11987
+ return [
11988
+ ...__privateGet(this, _components).map((c) => ({ ...c }))
11989
+ ];
11990
+ }
11991
+ encapsulate(addr) {
11992
+ const ma = new _Multiaddr(addr);
11993
+ return new _Multiaddr([
11994
+ ...__privateGet(this, _components),
11995
+ ...ma.getComponents()
11996
+ ], {
11997
+ validate: false
11998
+ });
11999
+ }
12000
+ decapsulate(addr) {
12001
+ const addrString = addr.toString();
12002
+ const s = this.toString();
12003
+ const i = s.lastIndexOf(addrString);
12004
+ if (i < 0) {
12005
+ throw new InvalidParametersError(`Address ${this.toString()} does not contain subaddress: ${addrString}`);
12006
+ }
12007
+ return new _Multiaddr(s.slice(0, i), {
12008
+ validate: false
12009
+ });
12010
+ }
12011
+ decapsulateCode(code2) {
12012
+ let index;
12013
+ for (let i = __privateGet(this, _components).length - 1; i > -1; i--) {
12014
+ if (__privateGet(this, _components)[i].code === code2) {
12015
+ index = i;
12016
+ break;
12017
+ }
12018
+ }
12019
+ return new _Multiaddr(__privateGet(this, _components).slice(0, index), {
12020
+ validate: false
12021
+ });
12022
+ }
12023
+ equals(addr) {
12024
+ return equals3(this.bytes, addr.bytes);
12025
+ }
12026
+ /**
12027
+ * Returns Multiaddr as a human-readable string
12028
+ * https://nodejs.org/api/util.html#utilinspectcustom
12029
+ *
12030
+ * @example
12031
+ * ```js
12032
+ * import { multiaddr } from '@multiformats/multiaddr'
12033
+ *
12034
+ * console.info(multiaddr('/ip4/127.0.0.1/tcp/4001'))
12035
+ * // 'Multiaddr(/ip4/127.0.0.1/tcp/4001)'
12036
+ * ```
12037
+ */
12038
+ [(_a2 = symbol, inspect)]() {
12039
+ return `Multiaddr(${this.toString()})`;
12040
+ }
12041
+ };
12042
+ _components = new WeakMap();
12043
+ _string = new WeakMap();
12044
+ _bytes = new WeakMap();
12045
+ var Multiaddr = _Multiaddr;
12046
+ function validate2(addr) {
12047
+ addr.getComponents().forEach((component) => {
12048
+ const codec = registry.getProtocol(component.code);
12049
+ if (component.value == null) {
12050
+ return;
12051
+ }
12052
+ codec.validate?.(component.value);
12053
+ });
12054
+ }
12055
+
12056
+ // ../../node_modules/@multiformats/multiaddr/dist/src/index.js
12057
+ function isMultiaddr(value) {
12058
+ return Boolean(value?.[symbol]);
12059
+ }
12060
+ function multiaddr(addr) {
12061
+ return new Multiaddr(addr);
12062
+ }
12063
+
12064
+ // ../../node_modules/@multiformats/multiaddr-to-uri/dist/src/index.js
12065
+ var ASSUME_HTTP_CODES = [
12066
+ CODE_TCP,
12067
+ CODE_DNS,
12068
+ CODE_DNSADDR,
12069
+ CODE_DNS4,
12070
+ CODE_DNS6
12071
+ ];
12072
+ function extractSNI(ma) {
12073
+ return extractTuple("sni", ma)?.value;
12074
+ }
12075
+ function extractPort(ma) {
12076
+ const port = extractTuple("tcp", ma)?.value;
12077
+ if (port == null) {
12078
+ return "";
12079
+ }
12080
+ return `:${port}`;
12081
+ }
12082
+ function extractTuple(name2, ma) {
12083
+ return ma.find((component) => component.name === name2);
12084
+ }
12085
+ function hasTLS(ma) {
12086
+ return ma.some(({ code: code2 }) => code2 === CODE_TLS);
12087
+ }
12088
+ function interpretNext(head, rest) {
12089
+ const interpreter = interpreters[head.name];
12090
+ if (interpreter == null) {
12091
+ throw new Error(`Can't interpret protocol ${head.name}`);
12092
+ }
12093
+ const restVal = interpreter(head, rest);
12094
+ if (head.code === CODE_IP6) {
12095
+ return `[${restVal}]`;
12096
+ }
12097
+ return restVal;
12098
+ }
12099
+ var interpreters = {
12100
+ ip4: (head, rest) => head.value,
12101
+ ip6: (head, rest) => {
12102
+ if (rest.length === 0) {
12103
+ return head.value;
12104
+ }
12105
+ return `[${head.value}]`;
12106
+ },
12107
+ tcp: (head, rest) => {
12108
+ const tail = rest.pop();
12109
+ if (tail == null) {
12110
+ throw new Error("Unexpected end of multiaddr");
12111
+ }
12112
+ return `tcp://${interpretNext(tail, rest)}:${head.value}`;
12113
+ },
12114
+ udp: (head, rest) => {
12115
+ const tail = rest.pop();
12116
+ if (tail == null) {
12117
+ throw new Error("Unexpected end of multiaddr");
12118
+ }
12119
+ return `udp://${interpretNext(tail, rest)}:${head.value}`;
12120
+ },
12121
+ dnsaddr: (head, rest) => head.value,
12122
+ dns4: (head, rest) => head.value,
12123
+ dns6: (head, rest) => head.value,
12124
+ dns: (head, rest) => head.value,
12125
+ ipfs: (head, rest) => {
12126
+ const tail = rest.pop();
12127
+ if (tail == null) {
12128
+ throw new Error("Unexpected end of multiaddr");
12129
+ }
12130
+ return `${interpretNext(tail, rest)}`;
12131
+ },
12132
+ p2p: (head, rest) => {
12133
+ const tail = rest.pop();
12134
+ if (tail == null) {
12135
+ throw new Error("Unexpected end of multiaddr");
12136
+ }
12137
+ return `${interpretNext(tail, rest)}`;
12138
+ },
12139
+ http: (head, rest) => {
12140
+ const maHasTLS = hasTLS(rest);
12141
+ const sni = extractSNI(rest);
12142
+ const port = extractPort(rest);
12143
+ if (maHasTLS && sni != null) {
12144
+ return `https://${sni}${port}`;
12145
+ }
12146
+ const protocol = maHasTLS ? "https://" : "http://";
12147
+ const tail = rest.pop();
12148
+ if (tail == null) {
12149
+ throw new Error("Unexpected end of multiaddr");
12150
+ }
12151
+ let baseVal = interpretNext(tail, rest);
12152
+ baseVal = baseVal?.replace("tcp://", "");
12153
+ return `${protocol}${baseVal}`;
12154
+ },
12155
+ "http-path": (head, rest) => {
12156
+ const tail = rest.pop();
12157
+ if (tail == null) {
12158
+ throw new Error("Unexpected end of multiaddr");
12159
+ }
12160
+ const baseVal = interpretNext(tail, rest);
12161
+ const decodedValue = decodeURIComponent(head.value ?? "");
12162
+ return `${baseVal}${decodedValue}`;
12163
+ },
12164
+ tls: (head, rest) => {
12165
+ const tail = rest.pop();
12166
+ if (tail == null) {
12167
+ throw new Error("Unexpected end of multiaddr");
12168
+ }
12169
+ return interpretNext(tail, rest);
12170
+ },
12171
+ sni: (head, rest) => {
12172
+ const tail = rest.pop();
12173
+ if (tail == null) {
12174
+ throw new Error("Unexpected end of multiaddr");
12175
+ }
12176
+ return interpretNext(tail, rest);
12177
+ },
12178
+ https: (head, rest) => {
12179
+ const tail = rest.pop();
12180
+ if (tail == null) {
12181
+ throw new Error("Unexpected end of multiaddr");
12182
+ }
12183
+ let baseVal = interpretNext(tail, rest);
12184
+ baseVal = baseVal?.replace("tcp://", "");
12185
+ return `https://${baseVal}`;
12186
+ },
12187
+ ws: (head, rest) => {
12188
+ const maHasTLS = hasTLS(rest);
12189
+ const sni = extractSNI(rest);
12190
+ const port = extractPort(rest);
12191
+ if (maHasTLS && sni != null) {
12192
+ return `wss://${sni}${port}`;
12193
+ }
12194
+ const protocol = maHasTLS ? "wss://" : "ws://";
12195
+ const tail = rest.pop();
12196
+ if (tail == null) {
12197
+ throw new Error("Unexpected end of multiaddr");
12198
+ }
12199
+ let baseVal = interpretNext(tail, rest);
12200
+ baseVal = baseVal?.replace("tcp://", "");
12201
+ return `${protocol}${baseVal}`;
12202
+ },
12203
+ wss: (head, rest) => {
12204
+ const tail = rest.pop();
12205
+ if (tail == null) {
12206
+ throw new Error("Unexpected end of multiaddr");
12207
+ }
12208
+ let baseVal = interpretNext(tail, rest);
12209
+ baseVal = baseVal?.replace("tcp://", "");
12210
+ return `wss://${baseVal}`;
12211
+ }
12212
+ };
12213
+ function multiaddrToUri(input, opts) {
12214
+ const ma = multiaddr(input);
12215
+ const components = ma.getComponents();
12216
+ const head = components.pop();
12217
+ if (head == null) {
12218
+ throw new Error("Unexpected end of multiaddr");
12219
+ }
12220
+ const interpreter = interpreters[head.name];
12221
+ if (interpreter == null) {
12222
+ throw new Error(`No interpreter found for ${head.name}`);
12223
+ }
12224
+ let uri = interpreter(head, components) ?? "";
12225
+ if (opts?.assumeHttp !== false && ASSUME_HTTP_CODES.includes(head.code)) {
12226
+ uri = uri.replace(/^.*:\/\//, "");
12227
+ if (head.value === "443") {
12228
+ uri = `https://${uri}`;
12229
+ } else {
12230
+ uri = `http://${uri}`;
12231
+ }
12232
+ }
12233
+ if (uri.startsWith("http://") || uri.startsWith("https://") || uri.startsWith("ws://") || uri.startsWith("wss://")) {
12234
+ uri = new URL(uri).toString();
12235
+ if (uri.endsWith("/")) {
12236
+ uri = uri.substring(0, uri.length - 1);
12237
+ }
12238
+ }
12239
+ return uri;
12240
+ }
12241
+
12242
+ // ../../node_modules/ip-regex/index.js
12243
+ var word = "[a-fA-F\\d:]";
12244
+ var boundry = (options2) => options2 && options2.includeBoundaries ? `(?:(?<=\\s|^)(?=${word})|(?<=${word})(?=\\s|$))` : "";
12245
+ var v4 = "(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}";
12246
+ var v6segment = "[a-fA-F\\d]{1,4}";
12247
+ var v6 = `
12248
+ (?:
12249
+ (?:${v6segment}:){7}(?:${v6segment}|:)| // 1:2:3:4:5:6:7:: 1:2:3:4:5:6:7:8
12250
+ (?:${v6segment}:){6}(?:${v4}|:${v6segment}|:)| // 1:2:3:4:5:6:: 1:2:3:4:5:6::8 1:2:3:4:5:6::8 1:2:3:4:5:6::1.2.3.4
12251
+ (?:${v6segment}:){5}(?::${v4}|(?::${v6segment}){1,2}|:)| // 1:2:3:4:5:: 1:2:3:4:5::7:8 1:2:3:4:5::8 1:2:3:4:5::7:1.2.3.4
12252
+ (?:${v6segment}:){4}(?:(?::${v6segment}){0,1}:${v4}|(?::${v6segment}){1,3}|:)| // 1:2:3:4:: 1:2:3:4::6:7:8 1:2:3:4::8 1:2:3:4::6:7:1.2.3.4
12253
+ (?:${v6segment}:){3}(?:(?::${v6segment}){0,2}:${v4}|(?::${v6segment}){1,4}|:)| // 1:2:3:: 1:2:3::5:6:7:8 1:2:3::8 1:2:3::5:6:7:1.2.3.4
12254
+ (?:${v6segment}:){2}(?:(?::${v6segment}){0,3}:${v4}|(?::${v6segment}){1,5}|:)| // 1:2:: 1:2::4:5:6:7:8 1:2::8 1:2::4:5:6:7:1.2.3.4
12255
+ (?:${v6segment}:){1}(?:(?::${v6segment}){0,4}:${v4}|(?::${v6segment}){1,6}|:)| // 1:: 1::3:4:5:6:7:8 1::8 1::3:4:5:6:7:1.2.3.4
12256
+ (?::(?:(?::${v6segment}){0,5}:${v4}|(?::${v6segment}){1,7}|:)) // ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 ::1.2.3.4
12257
+ )(?:%[0-9a-zA-Z]{1,})? // %eth0 %1
12258
+ `.replace(/\s*\/\/.*$/gm, "").replace(/\n/g, "").trim();
12259
+ var v46Exact = new RegExp(`(?:^${v4}$)|(?:^${v6}$)`);
12260
+ var v4exact = new RegExp(`^${v4}$`);
12261
+ var v6exact = new RegExp(`^${v6}$`);
12262
+ var ipRegex = (options2) => options2 && options2.exact ? v46Exact : new RegExp(`(?:${boundry(options2)}${v4}${boundry(options2)})|(?:${boundry(options2)}${v6}${boundry(options2)})`, "g");
12263
+ ipRegex.v4 = (options2) => options2 && options2.exact ? v4exact : new RegExp(`${boundry(options2)}${v4}${boundry(options2)}`, "g");
12264
+ ipRegex.v6 = (options2) => options2 && options2.exact ? v6exact : new RegExp(`${boundry(options2)}${v6}${boundry(options2)}`, "g");
12265
+ var ip_regex_default = ipRegex;
12266
+
12267
+ // ../../node_modules/function-timeout/index.js
12268
+ var import_node_vm = __toESM(require("vm"), 1);
12269
+ function functionTimeout(function_, { timeout } = {}) {
12270
+ const script = new import_node_vm.default.Script("returnValue = function_()");
12271
+ const wrappedFunction = (...arguments_) => {
12272
+ const context = {
12273
+ function_: () => function_(...arguments_)
12274
+ };
12275
+ script.runInNewContext(context, { timeout });
12276
+ return context.returnValue;
12277
+ };
12278
+ Object.defineProperty(wrappedFunction, "name", {
12279
+ value: `functionTimeout(${function_.name || "<anonymous>"})`,
12280
+ configurable: true
12281
+ });
12282
+ return wrappedFunction;
12283
+ }
12284
+ function isTimeoutError(error) {
12285
+ return error?.code === "ERR_SCRIPT_EXECUTION_TIMEOUT";
12286
+ }
12287
+
12288
+ // ../../node_modules/clone-regexp/node_modules/is-regexp/index.js
12289
+ var { toString: toString3 } = Object.prototype;
12290
+ function isRegexp(value) {
12291
+ return toString3.call(value) === "[object RegExp]";
12292
+ }
12293
+
12294
+ // ../../node_modules/clone-regexp/index.js
12295
+ var flagMap = {
12296
+ global: "g",
12297
+ ignoreCase: "i",
12298
+ multiline: "m",
12299
+ dotAll: "s",
12300
+ sticky: "y",
12301
+ unicode: "u"
12302
+ };
12303
+ function clonedRegexp(regexp, options2 = {}) {
12304
+ if (!isRegexp(regexp)) {
12305
+ throw new TypeError("Expected a RegExp instance");
12306
+ }
12307
+ const flags = Object.keys(flagMap).map((flag) => (typeof options2[flag] === "boolean" ? options2[flag] : regexp[flag]) ? flagMap[flag] : "").join("");
12308
+ const clonedRegexp2 = new RegExp(options2.source || regexp.source, flags);
12309
+ clonedRegexp2.lastIndex = typeof options2.lastIndex === "number" ? options2.lastIndex : regexp.lastIndex;
12310
+ return clonedRegexp2;
12311
+ }
12312
+
12313
+ // ../../node_modules/super-regex/index.js
12314
+ function isMatch(regex, string2, { timeout } = {}) {
12315
+ try {
12316
+ return functionTimeout(() => clonedRegexp(regex).test(string2), { timeout })();
12317
+ } catch (error) {
12318
+ if (isTimeoutError(error)) {
12319
+ return false;
12320
+ }
12321
+ throw error;
12322
+ }
12323
+ }
12324
+
12325
+ // ../../node_modules/is-ip/index.js
12326
+ var maxIPv4Length = 15;
12327
+ var maxIPv6Length = 45;
12328
+ var options = {
12329
+ timeout: 400
12330
+ };
12331
+ function isIPv62(string2) {
12332
+ if (string2.length > maxIPv6Length) {
12333
+ return false;
12334
+ }
12335
+ return isMatch(ip_regex_default.v6({ exact: true }), string2, options);
12336
+ }
12337
+ function isIPv42(string2) {
12338
+ if (string2.length > maxIPv4Length) {
12339
+ return false;
12340
+ }
12341
+ return isMatch(ip_regex_default.v4({ exact: true }), string2, options);
12342
+ }
12343
+
12344
+ // ../../node_modules/@multiformats/uri-to-multiaddr/dist/src/index.js
12345
+ var portFor = {
12346
+ http: "80",
12347
+ https: "443",
12348
+ ws: "80",
12349
+ wss: "443"
12350
+ };
12351
+ var BROWSER_SCHEMES = ["http", "https", "ws", "wss"];
12352
+ function uriToMultiaddr(uriStr, opts) {
12353
+ opts = opts ?? {};
12354
+ const defaultDnsType = opts.defaultDnsType ?? "dns";
12355
+ const { scheme, hostname, port, path } = parseUri(uriStr);
12356
+ const parts = [
12357
+ tupleForHostname(hostname, defaultDnsType),
12358
+ tupleForPort(port, scheme),
12359
+ tupleForScheme(scheme)
12360
+ ];
12361
+ if (path != null) {
12362
+ parts.push(tupleForPath(path));
12363
+ }
12364
+ const multiaddrStr = "/" + parts.filter((x) => Boolean(x)).reduce((a, b) => a.concat(b), []).join("/");
12365
+ return multiaddr(multiaddrStr);
12366
+ }
12367
+ function parseUri(uriStr) {
12368
+ const [scheme] = uriStr.split(":");
12369
+ if (!BROWSER_SCHEMES.includes(scheme)) {
12370
+ uriStr = "http" + uriStr.substring(scheme.length);
12371
+ }
12372
+ let { protocol, hostname, port, pathname, search } = new URL(uriStr);
12373
+ if (port == null || port === "") {
12374
+ const protocolPort = portForProtocol(scheme);
12375
+ if (protocolPort != null) {
12376
+ port = protocolPort;
12377
+ }
12378
+ if (protocolPort == null && protocol === "http:") {
12379
+ port = "80";
12380
+ }
12381
+ }
12382
+ let path;
12383
+ if (pathname != null && pathname !== "" && pathname !== "/") {
12384
+ if (pathname.startsWith("/")) {
12385
+ pathname = pathname.substring(1);
12386
+ }
12387
+ path = pathname;
12388
+ }
12389
+ if (search != null && search !== "") {
12390
+ path = path ?? "";
12391
+ path += search;
12392
+ }
12393
+ return { scheme, hostname, port, path };
12394
+ }
12395
+ function tupleForHostname(hostname, defaultDnsType) {
12396
+ if (hostname == null || hostname === "") {
12397
+ return void 0;
12398
+ }
12399
+ if (isIPv42(hostname)) {
12400
+ return ["ip4", hostname];
12401
+ }
12402
+ if (isIPv62(hostname)) {
12403
+ return ["ip6", hostname];
12404
+ }
12405
+ if (hostname[0] === "[") {
12406
+ const trimmed = hostname.substring(1, hostname.length - 1);
12407
+ if (isIPv62(trimmed)) {
12408
+ return ["ip6", trimmed];
12409
+ }
12410
+ }
12411
+ return [defaultDnsType, hostname];
12412
+ }
12413
+ function tupleForPort(port, scheme) {
12414
+ if (port == null || port === "") {
12415
+ return void 0;
12416
+ }
12417
+ if (scheme === "udp") {
12418
+ return ["udp", port];
12419
+ }
12420
+ return ["tcp", port];
12421
+ }
12422
+ function tupleForScheme(scheme) {
12423
+ if (scheme.match(/^tcp$|^udp$/) != null) {
12424
+ return void 0;
12425
+ }
12426
+ if (scheme === "https") {
12427
+ return ["/tls/http"];
12428
+ }
12429
+ if (scheme === "wss") {
12430
+ return ["/tls/ws"];
12431
+ }
12432
+ return [scheme];
12433
+ }
12434
+ function tupleForPath(path) {
12435
+ if (path == null || path === "") {
12436
+ return void 0;
12437
+ }
12438
+ return ["http-path", encodeURIComponent(path)];
12439
+ }
12440
+ function portForProtocol(protocol) {
12441
+ if (protocol == null || protocol === "" || portFor[protocol] == null) {
12442
+ return void 0;
12443
+ }
12444
+ return portFor[protocol];
12445
+ }
12446
+
9699
12447
  // src/location.ts
9700
- var import_multiaddr = require("@multiformats/multiaddr");
9701
- var import_multiaddr_to_uri = require("@multiformats/multiaddr-to-uri");
9702
- var import_uri_to_multiaddr = require("@multiformats/uri-to-multiaddr");
9703
12448
  var import_ed255193 = require("@noble/curves/ed25519");
9704
- var import_basics3 = require("multiformats/basics");
9705
12449
  var import_viem5 = require("viem");
9706
12450
  var DEFAULT_TINYCLOUD_LOCATION_REGISTRY_URL = "https://registry.tinycloud.xyz";
9707
12451
  var DEFAULT_TINYCLOUD_FALLBACK_HOST = "https://node.tinycloud.xyz";
@@ -9808,14 +12552,14 @@ async function fetchLocationRecord(registryUrl, subject, fetchFn = globalThis.fe
9808
12552
  }
9809
12553
  return validateLocationRecord(body.record);
9810
12554
  }
9811
- async function resolveCloudLocation(subject, options = {}) {
12555
+ async function resolveCloudLocation(subject, options2 = {}) {
9812
12556
  validateSubject(subject);
9813
- const verifyRecords = options.verifyRecords ?? true;
12557
+ const verifyRecords = options2.verifyRecords ?? true;
9814
12558
  const attempts = await Promise.all([
9815
- resolveExplicit(subject, options.explicitMultiaddrs),
9816
- resolveBlockchain(subject, options.blockchain, verifyRecords),
9817
- resolveCentralized(subject, options, verifyRecords),
9818
- resolveFallback(subject, options.fallbackMultiaddrs)
12559
+ resolveExplicit(subject, options2.explicitMultiaddrs),
12560
+ resolveBlockchain(subject, options2.blockchain, verifyRecords),
12561
+ resolveCentralized(subject, options2, verifyRecords),
12562
+ resolveFallback(subject, options2.fallbackMultiaddrs)
9819
12563
  ]);
9820
12564
  const winner = attempts.find((attempt) => attempt.candidate)?.candidate;
9821
12565
  if (!winner) {
@@ -9830,16 +12574,16 @@ async function resolveCloudLocation(subject, options = {}) {
9830
12574
  resolvedAt: (/* @__PURE__ */ new Date()).toISOString()
9831
12575
  };
9832
12576
  }
9833
- async function resolveTinyCloudHosts(subject, options = {}) {
12577
+ async function resolveTinyCloudHosts(subject, options2 = {}) {
9834
12578
  const location = await resolveCloudLocation(subject, {
9835
- explicitMultiaddrs: hostsToMultiaddrs(options.explicitHosts),
9836
- blockchain: options.blockchain,
9837
- centralizedRegistryUrl: options.registryUrl === null ? void 0 : options.registryUrl ?? DEFAULT_TINYCLOUD_LOCATION_REGISTRY_URL,
12579
+ explicitMultiaddrs: hostsToMultiaddrs(options2.explicitHosts),
12580
+ blockchain: options2.blockchain,
12581
+ centralizedRegistryUrl: options2.registryUrl === null ? void 0 : options2.registryUrl ?? DEFAULT_TINYCLOUD_LOCATION_REGISTRY_URL,
9838
12582
  fallbackMultiaddrs: hostsToMultiaddrs(
9839
- options.fallbackHosts === null ? void 0 : options.fallbackHosts ?? [DEFAULT_TINYCLOUD_FALLBACK_HOST]
12583
+ options2.fallbackHosts === null ? void 0 : options2.fallbackHosts ?? [DEFAULT_TINYCLOUD_FALLBACK_HOST]
9840
12584
  ),
9841
- fetch: options.fetch,
9842
- verifyRecords: options.verifyRecords
12585
+ fetch: options2.fetch,
12586
+ verifyRecords: options2.verifyRecords
9843
12587
  });
9844
12588
  return {
9845
12589
  hosts: location.multiaddrs.map((addr) => multiaddrToHttpUrl(addr)),
@@ -9847,7 +12591,7 @@ async function resolveTinyCloudHosts(subject, options = {}) {
9847
12591
  };
9848
12592
  }
9849
12593
  function multiaddrToHttpUrl(input) {
9850
- const uri = (0, import_multiaddr_to_uri.multiaddrToUri)((0, import_multiaddr.multiaddr)(input));
12594
+ const uri = multiaddrToUri(multiaddr(input));
9851
12595
  if (!uri.startsWith("http://") && !uri.startsWith("https://")) {
9852
12596
  throw new LocationRecordValidationError(
9853
12597
  `multiaddr does not resolve to http/https: ${input}`
@@ -9860,7 +12604,7 @@ function httpUrlToMultiaddr(input) {
9860
12604
  if (url.protocol !== "http:" && url.protocol !== "https:") {
9861
12605
  throw new LocationRecordValidationError("URL must use http or https");
9862
12606
  }
9863
- return (0, import_uri_to_multiaddr.uriToMultiaddr)(url.toString()).toString();
12607
+ return uriToMultiaddr(url.toString()).toString();
9864
12608
  }
9865
12609
  function hostsToMultiaddrs(hosts) {
9866
12610
  if (hosts === void 0 || hosts.length === 0) {
@@ -9891,15 +12635,15 @@ async function resolveBlockchain(subject, resolver, verifyRecords) {
9891
12635
  );
9892
12636
  });
9893
12637
  }
9894
- async function resolveCentralized(subject, options, verifyRecords) {
12638
+ async function resolveCentralized(subject, options2, verifyRecords) {
9895
12639
  return resolveAttempt("centralized", async () => {
9896
- if (!options.centralizedRegistryUrl) {
12640
+ if (!options2.centralizedRegistryUrl) {
9897
12641
  return null;
9898
12642
  }
9899
12643
  const record = await fetchLocationRecord(
9900
- options.centralizedRegistryUrl,
12644
+ options2.centralizedRegistryUrl,
9901
12645
  subject,
9902
- options.fetch
12646
+ options2.fetch
9903
12647
  );
9904
12648
  return toCandidate(subject, "centralized", record, verifyRecords);
9905
12649
  });
@@ -9992,7 +12736,7 @@ function validateMultiaddrs(input) {
9992
12736
  );
9993
12737
  }
9994
12738
  try {
9995
- (0, import_multiaddr.multiaddr)(addr);
12739
+ multiaddr(addr);
9996
12740
  } catch {
9997
12741
  throw new LocationRecordValidationError(`invalid multiaddr: ${addr}`);
9998
12742
  }
@@ -10039,7 +12783,7 @@ function ed25519PublicKeyFromDidKey2(did) {
10039
12783
  "did:key must use base58btc multibase"
10040
12784
  );
10041
12785
  }
10042
- const bytes = import_basics3.bases.base58btc.decode(identifier);
12786
+ const bytes = bases.base58btc.decode(identifier);
10043
12787
  if (bytes.length === 34 && bytes[0] === 237 && bytes[1] === 1) {
10044
12788
  return bytes.slice(2);
10045
12789
  }
@@ -10051,31 +12795,31 @@ function ed25519PublicKeyFromDidKey2(did) {
10051
12795
  );
10052
12796
  }
10053
12797
  function base64UrlEncode3(bytes) {
10054
- const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
12798
+ const alphabet2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
10055
12799
  let output = "";
10056
12800
  for (let i = 0; i < bytes.length; i += 3) {
10057
12801
  const a = bytes[i];
10058
12802
  const b = bytes[i + 1];
10059
12803
  const c = bytes[i + 2];
10060
12804
  const triplet = a << 16 | (b ?? 0) << 8 | (c ?? 0);
10061
- output += alphabet[triplet >> 18 & 63];
10062
- output += alphabet[triplet >> 12 & 63];
12805
+ output += alphabet2[triplet >> 18 & 63];
12806
+ output += alphabet2[triplet >> 12 & 63];
10063
12807
  if (i + 1 < bytes.length) {
10064
- output += alphabet[triplet >> 6 & 63];
12808
+ output += alphabet2[triplet >> 6 & 63];
10065
12809
  }
10066
12810
  if (i + 2 < bytes.length) {
10067
- output += alphabet[triplet & 63];
12811
+ output += alphabet2[triplet & 63];
10068
12812
  }
10069
12813
  }
10070
12814
  return output;
10071
12815
  }
10072
12816
  function decodeBase64Url(value) {
10073
- const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
12817
+ const alphabet2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
10074
12818
  const bytes = [];
10075
12819
  let buffer = 0;
10076
12820
  let bits = 0;
10077
12821
  for (const char of value) {
10078
- const index = alphabet.indexOf(char);
12822
+ const index = alphabet2.indexOf(char);
10079
12823
  if (index < 0) {
10080
12824
  throw new LocationRecordValidationError(
10081
12825
  "did:key signature must be base64url"
@@ -10111,6 +12855,7 @@ function decodeBase64Url(value) {
10111
12855
  CAPABILITY_REGISTRY,
10112
12856
  CapabilityKeyRegistry,
10113
12857
  CapabilityKeyRegistryErrorCodes,
12858
+ CaveatedDelegationUnsupportedError,
10114
12859
  ClientSessionSchema,
10115
12860
  CloudLocationResolutionError,
10116
12861
  DECRYPT_ACTION,
@@ -10129,6 +12874,7 @@ function decodeBase64Url(value) {
10129
12874
  DUCKDB,
10130
12875
  DataVaultService,
10131
12876
  DatabaseHandle,
12877
+ DecryptTransportResponseError,
10132
12878
  DelegationErrorCodes,
10133
12879
  DelegationManager,
10134
12880
  DuckDbAction,
@@ -10236,6 +12982,7 @@ function decodeBase64Url(value) {
10236
12982
  canonicalizeDidUrl,
10237
12983
  canonicalizeEncryptionJson,
10238
12984
  canonicalizeNetworkId,
12985
+ canonicalizeRecapCaveats,
10239
12986
  canonicalizeSecretScope,
10240
12987
  canonicalizeSignedObjectUnsigned,
10241
12988
  checkDecryptInvocationInput,
@@ -10309,6 +13056,7 @@ function decodeBase64Url(value) {
10309
13056
  pkhDid,
10310
13057
  principalDid,
10311
13058
  principalDidEquals,
13059
+ recapCaveatsEqual,
10312
13060
  resolveCloudLocation,
10313
13061
  resolveManifest,
10314
13062
  resolveManifestKnowledgeRoot,