@suveren/gateway 0.8.1 → 0.8.3

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.
Files changed (90) hide show
  1. package/content/integrations/deploy-github.json +3 -5
  2. package/dist/mcp-server/http.mjs +77 -66
  3. package/dist/ui/assets/{index-BFnSVa9N.js → index-76gJM-3o.js} +2 -2
  4. package/dist/ui/index.html +1 -1
  5. package/node_modules/jose/dist/types/index.d.ts +1 -2
  6. package/node_modules/jose/dist/types/jwe/compact/decrypt.d.ts +7 -11
  7. package/node_modules/jose/dist/types/jwe/compact/encrypt.d.ts +13 -16
  8. package/node_modules/jose/dist/types/jwe/flattened/decrypt.d.ts +7 -11
  9. package/node_modules/jose/dist/types/jwe/flattened/encrypt.d.ts +16 -19
  10. package/node_modules/jose/dist/types/jwe/general/decrypt.d.ts +10 -16
  11. package/node_modules/jose/dist/types/jwe/general/encrypt.d.ts +18 -21
  12. package/node_modules/jose/dist/types/jwk/embedded.d.ts +3 -1
  13. package/node_modules/jose/dist/types/jwk/thumbprint.d.ts +4 -6
  14. package/node_modules/jose/dist/types/jwks/local.d.ts +5 -4
  15. package/node_modules/jose/dist/types/jwks/remote.d.ts +20 -21
  16. package/node_modules/jose/dist/types/jws/compact/sign.d.ts +4 -4
  17. package/node_modules/jose/dist/types/jws/compact/verify.d.ts +8 -11
  18. package/node_modules/jose/dist/types/jws/flattened/sign.d.ts +5 -5
  19. package/node_modules/jose/dist/types/jws/flattened/verify.d.ts +8 -11
  20. package/node_modules/jose/dist/types/jws/general/sign.d.ts +10 -14
  21. package/node_modules/jose/dist/types/jws/general/verify.d.ts +11 -17
  22. package/node_modules/jose/dist/types/jwt/decrypt.d.ts +14 -11
  23. package/node_modules/jose/dist/types/jwt/encrypt.d.ts +24 -22
  24. package/node_modules/jose/dist/types/jwt/sign.d.ts +3 -7
  25. package/node_modules/jose/dist/types/jwt/unsecured.d.ts +2 -6
  26. package/node_modules/jose/dist/types/jwt/verify.d.ts +13 -6
  27. package/node_modules/jose/dist/types/key/export.d.ts +6 -6
  28. package/node_modules/jose/dist/types/key/generate_key_pair.d.ts +9 -14
  29. package/node_modules/jose/dist/types/key/generate_secret.d.ts +10 -10
  30. package/node_modules/jose/dist/types/key/import.d.ts +19 -18
  31. package/node_modules/jose/dist/types/types.d.ts +152 -247
  32. package/node_modules/jose/dist/types/util/base64url.d.ts +7 -7
  33. package/node_modules/jose/dist/types/util/decode_jwt.d.ts +6 -1
  34. package/node_modules/jose/dist/types/util/decode_protected_header.d.ts +4 -3
  35. package/node_modules/jose/dist/types/util/errors.d.ts +29 -40
  36. package/node_modules/jose/dist/webapi/jwe/compact/decrypt.js +1 -2
  37. package/node_modules/jose/dist/webapi/jwe/compact/encrypt.js +9 -26
  38. package/node_modules/jose/dist/webapi/jwe/flattened/decrypt.js +3 -3
  39. package/node_modules/jose/dist/webapi/jwe/flattened/encrypt.js +11 -30
  40. package/node_modules/jose/dist/webapi/jwe/general/decrypt.js +6 -6
  41. package/node_modules/jose/dist/webapi/jwe/general/encrypt.js +33 -57
  42. package/node_modules/jose/dist/webapi/jwk/embedded.js +3 -4
  43. package/node_modules/jose/dist/webapi/jwk/thumbprint.js +3 -6
  44. package/node_modules/jose/dist/webapi/jwks/local.js +16 -10
  45. package/node_modules/jose/dist/webapi/jwks/remote.js +2 -2
  46. package/node_modules/jose/dist/webapi/jws/compact/sign.js +2 -4
  47. package/node_modules/jose/dist/webapi/jws/compact/verify.js +2 -2
  48. package/node_modules/jose/dist/webapi/jws/flattened/sign.js +8 -15
  49. package/node_modules/jose/dist/webapi/jws/flattened/verify.js +4 -14
  50. package/node_modules/jose/dist/webapi/jws/general/sign.js +4 -11
  51. package/node_modules/jose/dist/webapi/jws/general/verify.js +5 -7
  52. package/node_modules/jose/dist/webapi/jwt/decrypt.js +2 -3
  53. package/node_modules/jose/dist/webapi/jwt/encrypt.js +11 -25
  54. package/node_modules/jose/dist/webapi/jwt/sign.js +1 -1
  55. package/node_modules/jose/dist/webapi/jwt/unsecured.js +1 -2
  56. package/node_modules/jose/dist/webapi/jwt/verify.js +4 -4
  57. package/node_modules/jose/dist/webapi/key/export.js +12 -16
  58. package/node_modules/jose/dist/webapi/key/generate_key_pair.js +4 -13
  59. package/node_modules/jose/dist/webapi/key/generate_secret.js +1 -1
  60. package/node_modules/jose/dist/webapi/key/import.js +5 -9
  61. package/node_modules/jose/dist/webapi/lib/asn1.js +2 -4
  62. package/node_modules/jose/dist/webapi/lib/buffer_utils.js +35 -0
  63. package/node_modules/jose/dist/webapi/lib/content_encryption.js +21 -29
  64. package/node_modules/jose/dist/webapi/lib/deflate.js +9 -19
  65. package/node_modules/jose/dist/webapi/lib/jwe_algorithms.js +0 -4
  66. package/node_modules/jose/dist/webapi/lib/jwe_decrypt.js +21 -54
  67. package/node_modules/jose/dist/webapi/lib/jwe_encrypt.js +26 -59
  68. package/node_modules/jose/dist/webapi/lib/jws_sign.js +29 -43
  69. package/node_modules/jose/dist/webapi/lib/jws_verify.js +37 -45
  70. package/node_modules/jose/dist/webapi/lib/jwt_claims_set.js +1 -1
  71. package/node_modules/jose/dist/webapi/lib/key.js +119 -59
  72. package/node_modules/jose/dist/webapi/lib/key_management.js +45 -80
  73. package/node_modules/jose/dist/webapi/lib/{options.js → validate.js} +64 -3
  74. package/node_modules/jose/dist/webapi/util/base64url.js +5 -19
  75. package/node_modules/jose/dist/webapi/util/decode_jwt.js +1 -1
  76. package/node_modules/jose/dist/webapi/util/decode_protected_header.js +1 -1
  77. package/node_modules/jose/package.json +1 -1
  78. package/package.json +1 -1
  79. package/profiles/deploy/0.10.profile.json +178 -0
  80. package/profiles/index.json +1 -0
  81. package/node_modules/jose/dist/webapi/lib/base64.js +0 -20
  82. package/node_modules/jose/dist/webapi/lib/crypto_key.js +0 -27
  83. package/node_modules/jose/dist/webapi/lib/helpers.js +0 -45
  84. package/node_modules/jose/dist/webapi/lib/invalid_key_input.js +0 -12
  85. package/node_modules/jose/dist/webapi/lib/is_key_like.js +0 -19
  86. package/node_modules/jose/dist/webapi/lib/jwk_metadata.js +0 -19
  87. package/node_modules/jose/dist/webapi/lib/jwk_to_key.js +0 -10
  88. package/node_modules/jose/dist/webapi/lib/key_options.js +0 -8
  89. package/node_modules/jose/dist/webapi/lib/signing.js +0 -22
  90. package/node_modules/jose/dist/webapi/lib/type_checks.js +0 -30
@@ -0,0 +1,178 @@
1
+ {
2
+ "id": "github.com/humanagencyprotocol/hap-profiles/deploy@0.10",
3
+ "name": "Deploy",
4
+ "version": "0.10",
5
+ "description": "Authority to make an already-built version live. Successor to deploy@0.6, which gated 'build and deploy this commit'; this gates the act of putting something in front of real users, because building is not consequential and going live is. The action is a RELEASE: it activates bytes that already exist, so the human can look at the artifact before approving and no rebuild can diverge from what was approved. Host-agnostic — the artifact identifier is a Vercel deployment id, a container image digest, an Azure slot — named by the connector manifest, never here.",
6
+ "boundsSchema": {
7
+ "actionTypes": [
8
+ "release"
9
+ ],
10
+ "keyOrder": [
11
+ "profile",
12
+ "release_daily_max",
13
+ "rollback_allowed"
14
+ ],
15
+ "fields": {
16
+ "profile": {
17
+ "type": "string",
18
+ "required": true
19
+ },
20
+ "release_daily_max": {
21
+ "type": "number",
22
+ "required": true,
23
+ "displayName": "Times per day something may go live",
24
+ "description": "How often the agent may make a build live for real users. Counted by the Authority Server, so a compromised gateway cannot exceed it. Building a preview is NOT counted: previews harm nobody, and charging them against this limit would exhaust it before anything reached anyone.",
25
+ "unit": "count",
26
+ "boundType": {
27
+ "kind": "cumulative_count",
28
+ "window": "daily"
29
+ },
30
+ "appliesTo": [
31
+ "release"
32
+ ]
33
+ },
34
+ "rollback_allowed": {
35
+ "type": "string",
36
+ "required": false,
37
+ "displayName": "May put a previous version back live",
38
+ "description": "Whether the agent may promote a PREVIOUS artifact back to live. Reverting carries different risk from releasing: the artifact being restored was approved for a moment that has passed. NOT CURRENTLY ENFORCED: no executor yet distinguishes a revert from a release — a rollback arrives as a release of older bytes and is counted by release_daily_max. Hidden from the authorization editor until an executor emits action_type \"rollback\" for it; kept in the schema so the distinction stays declared.",
39
+ "enum": [
40
+ "yes",
41
+ "no"
42
+ ],
43
+ "boundType": {
44
+ "kind": "enum",
45
+ "values": [
46
+ "yes",
47
+ "no"
48
+ ]
49
+ },
50
+ "enforced": false,
51
+ "appliesTo": []
52
+ }
53
+ }
54
+ },
55
+ "contextSchema": {
56
+ "keyOrder": [
57
+ "allowed_repos",
58
+ "allowed_environments",
59
+ "allowed_workflows",
60
+ "allowed_branches"
61
+ ],
62
+ "fields": {
63
+ "allowed_repos": {
64
+ "type": "string",
65
+ "required": true,
66
+ "displayName": "Allowed repositories",
67
+ "description": "Repositories the agent may deploy from, e.g. humanagencyprotocol/hap",
68
+ "constraint": {
69
+ "type": "string",
70
+ "enforceable": [
71
+ "subset"
72
+ ]
73
+ }
74
+ },
75
+ "allowed_environments": {
76
+ "type": "string",
77
+ "required": true,
78
+ "displayName": "Allowed environments",
79
+ "description": "Deployment targets the agent may reach. Deliberately NOT an enum: hosts disagree — GitHub uses names you define, Vercel has production and preview, Netlify has deploy-preview and branch-deploy. The connector discovers the real list.",
80
+ "constraint": {
81
+ "type": "string",
82
+ "enforceable": [
83
+ "subset"
84
+ ]
85
+ }
86
+ },
87
+ "allowed_workflows": {
88
+ "type": "string",
89
+ "required": true,
90
+ "displayName": "Allowed pipelines",
91
+ "description": "Named pipelines the agent may run, e.g. deploy.yml. Scoping by pipeline rather than by 'deploy' means adding CI later — a migration, an infrastructure apply — is an edit to this list, not a new profile. The limit of this approach: the grant knows a pipeline is permitted, not what it does. The name has to carry that meaning to the human signing.",
92
+ "constraint": {
93
+ "type": "string",
94
+ "enforceable": [
95
+ "subset"
96
+ ]
97
+ }
98
+ },
99
+ "allowed_branches": {
100
+ "type": "string",
101
+ "required": false,
102
+ "displayName": "Allowed branches",
103
+ "description": "Branches a deployable commit may come from. Optional: a host with no branch concept leaves it empty.",
104
+ "constraint": {
105
+ "type": "string",
106
+ "enforceable": [
107
+ "subset"
108
+ ]
109
+ }
110
+ }
111
+ }
112
+ },
113
+ "executionContextSchema": {
114
+ "fields": {
115
+ "action_type": {
116
+ "source": "static",
117
+ "description": "release or rollback — declared by the manifest, never taken from an agent argument",
118
+ "required": true,
119
+ "constraint": {
120
+ "type": "string",
121
+ "enforceable": [
122
+ "equals"
123
+ ]
124
+ }
125
+ },
126
+ "allowed_repos": {
127
+ "source": "declared",
128
+ "description": "Repository this action targets, checked against the authorized set",
129
+ "required": true,
130
+ "constraint": {
131
+ "type": "string",
132
+ "enforceable": [
133
+ "subset"
134
+ ]
135
+ }
136
+ },
137
+ "allowed_environments": {
138
+ "source": "declared",
139
+ "description": "Environment this action targets, checked against the authorized set. Recorded in the receipt, so the proof names where the release went.",
140
+ "required": true,
141
+ "constraint": {
142
+ "type": "string",
143
+ "enforceable": [
144
+ "subset"
145
+ ]
146
+ }
147
+ },
148
+ "allowed_workflows": {
149
+ "source": "declared",
150
+ "description": "Pipeline this action runs, checked against the authorized set. Recorded in the receipt, so the proof names what ran.",
151
+ "required": true,
152
+ "constraint": {
153
+ "type": "string",
154
+ "enforceable": [
155
+ "subset"
156
+ ]
157
+ }
158
+ }
159
+ }
160
+ },
161
+ "requiredGates": [
162
+ "bounds",
163
+ "intent",
164
+ "commitment",
165
+ "decision_owner"
166
+ ],
167
+ "ttl": {
168
+ "default": 2592000,
169
+ "max": 31536000
170
+ },
171
+ "retention_minimum": 7776000,
172
+ "content_binding": {
173
+ "version": "1",
174
+ "kind": "text"
175
+ },
176
+ "receipt_lookup": true,
177
+ "whatsNew": "Binds the source commit the build came from, not only the artifact address. A released page can show its commit but never its own deployment URL, so this is what lets a reader tie the page they are on to the approval that put it there."
178
+ }
@@ -21,6 +21,7 @@
21
21
  "github.com/humanagencyprotocol/hap-profiles/email@0.6": "email/0.6.profile.json",
22
22
  "github.com/humanagencyprotocol/hap-profiles/customers@0.7": "customers/0.7.profile.json",
23
23
  "github.com/humanagencyprotocol/hap-profiles/deploy@0.9": "deploy/0.9.profile.json",
24
+ "github.com/humanagencyprotocol/hap-profiles/deploy@0.10": "deploy/0.10.profile.json",
24
25
  "github.com/humanagencyprotocol/hap-profiles/charge@0.5": "charge/0.5.profile.json"
25
26
  }
26
27
  }
@@ -1,20 +0,0 @@
1
- function encodeBase64(input) {
2
- if (Uint8Array.prototype.toBase64)
3
- return input.toBase64();
4
- const CHUNK_SIZE = 32768, arr = [];
5
- for (let i = 0; i < input.length; i += CHUNK_SIZE)
6
- arr.push(String.fromCharCode.apply(null, input.subarray(i, i + CHUNK_SIZE)));
7
- return btoa(arr.join(""));
8
- }
9
- function decodeBase64(encoded) {
10
- if (Uint8Array.fromBase64)
11
- return Uint8Array.fromBase64(encoded);
12
- const binary = atob(encoded), bytes = new Uint8Array(binary.length);
13
- for (let i = 0; i < binary.length; i++)
14
- bytes[i] = binary.charCodeAt(i);
15
- return bytes;
16
- }
17
- export {
18
- decodeBase64,
19
- encodeBase64
20
- };
@@ -1,27 +0,0 @@
1
- const unusable = (name, prop = "algorithm.name") => new TypeError(`CryptoKey does not support this operation, its ${prop} must be ${name}`);
2
- function checkUsage(key, usage) {
3
- if (usage && !key.usages.includes(usage))
4
- throw new TypeError(`CryptoKey does not support this operation, its usages must include ${usage}.`);
5
- }
6
- function checkModulusLength(alg, key) {
7
- const { modulusLength } = key.algorithm;
8
- if (typeof modulusLength != "number" || modulusLength < 2048)
9
- throw new TypeError(`${alg} requires key modulusLength to be 2048 bits or larger`);
10
- }
11
- function checkCryptoKey(key, expected, usage) {
12
- const algorithm = key.algorithm;
13
- if (algorithm.name !== expected.name)
14
- throw unusable(expected.name);
15
- if (expected.hash && algorithm.hash?.name !== expected.hash)
16
- throw unusable(expected.hash, "algorithm.hash");
17
- if (expected.namedCurve && algorithm.namedCurve !== expected.namedCurve)
18
- throw unusable(expected.namedCurve, "algorithm.namedCurve");
19
- if (expected.length !== void 0 && algorithm.length !== expected.length)
20
- throw unusable(expected.length, "algorithm.length");
21
- checkUsage(key, usage);
22
- }
23
- export {
24
- checkCryptoKey,
25
- checkModulusLength,
26
- checkUsage
27
- };
@@ -1,45 +0,0 @@
1
- import { decode } from "../util/base64url.js";
2
- import { encode, strictDecoder } from "./buffer_utils.js";
3
- import { isObject } from "./type_checks.js";
4
- const unprotected = /* @__PURE__ */ Symbol();
5
- function assertNotSet(value, name) {
6
- if (value !== void 0)
7
- throw new TypeError(`${name} can only be called once`);
8
- }
9
- function decodeBase64url(value, label, ErrorClass) {
10
- try {
11
- return decode(value);
12
- } catch {
13
- throw new ErrorClass(`Failed to base64url decode the ${label}`);
14
- }
15
- }
16
- function encodeBase64url(value, label, ErrorClass) {
17
- try {
18
- return encode(value);
19
- } catch {
20
- throw new ErrorClass(`The ${label} is not a valid base64url string`);
21
- }
22
- }
23
- async function digest(algorithm, data) {
24
- const subtleDigest = `SHA-${algorithm.slice(-3)}`;
25
- return new Uint8Array(await crypto.subtle.digest(subtleDigest, data));
26
- }
27
- function parseJoseHeader(b64, ErrorClass, message) {
28
- let parsed;
29
- try {
30
- parsed = JSON.parse(strictDecoder.decode(decode(b64)));
31
- } catch {
32
- throw new ErrorClass(message);
33
- }
34
- if (!isObject(parsed))
35
- throw new ErrorClass(message);
36
- return parsed;
37
- }
38
- export {
39
- assertNotSet,
40
- decodeBase64url,
41
- digest,
42
- encodeBase64url,
43
- parseJoseHeader,
44
- unprotected
45
- };
@@ -1,12 +0,0 @@
1
- function message(msg, actual, ...types) {
2
- if (types.length > 2) {
3
- const last = types.pop();
4
- msg += `one of type ${types.join(", ")}, or ${last}.`;
5
- } else types.length === 2 ? msg += `one of type ${types[0]} or ${types[1]}.` : msg += `of type ${types[0]}.`;
6
- return actual == null ? msg += ` Received ${actual}` : typeof actual == "function" && actual.name ? msg += ` Received function ${actual.name}` : typeof actual == "object" && actual != null && actual.constructor?.name && (msg += ` Received an instance of ${actual.constructor.name}`), msg;
7
- }
8
- const invalidKeyInput = (actual, ...types) => message("Key must be ", actual, ...types), withAlg = (alg, actual, ...types) => message(`Key for the ${alg} algorithm must be `, actual, ...types);
9
- export {
10
- invalidKeyInput,
11
- withAlg
12
- };
@@ -1,19 +0,0 @@
1
- function assertCryptoKey(key) {
2
- if (!isCryptoKey(key))
3
- throw new Error("CryptoKey instance expected");
4
- }
5
- const isCryptoKey = (key) => {
6
- if (key?.[Symbol.toStringTag] === "CryptoKey")
7
- return !0;
8
- try {
9
- return key instanceof CryptoKey;
10
- } catch {
11
- return !1;
12
- }
13
- }, isKeyObject = (key) => key?.[Symbol.toStringTag] === "KeyObject", isKeyLike = (key) => isCryptoKey(key) || isKeyObject(key);
14
- export {
15
- assertCryptoKey,
16
- isCryptoKey,
17
- isKeyLike,
18
- isKeyObject
19
- };
@@ -1,19 +0,0 @@
1
- function snapshotJwk(jwk) {
2
- return { __proto__: null, ...jwk };
3
- }
4
- function normalizeJwk(jwk) {
5
- const normalized = snapshotJwk(jwk);
6
- if (normalized.ext !== void 0 && typeof normalized.ext != "boolean")
7
- throw new TypeError('"ext" (Extractable) Parameter must be a boolean');
8
- if (normalized.key_ops !== void 0) {
9
- const value = normalized.key_ops, keyOps = Array.isArray(value) ? [...value] : void 0;
10
- if (!keyOps || keyOps.some((operation) => typeof operation != "string") || new Set(keyOps).size !== keyOps.length)
11
- throw new TypeError('"key_ops" (Key Operations) Parameter must be an array of unique strings');
12
- normalized.key_ops = keyOps;
13
- }
14
- return normalized;
15
- }
16
- export {
17
- normalizeJwk,
18
- snapshotJwk
19
- };
@@ -1,10 +0,0 @@
1
- import { JOSENotSupported } from "../util/errors.js";
2
- async function jwkToKey(entry, jwk) {
3
- if (!entry.kty.includes(jwk.kty))
4
- throw new JOSENotSupported('Invalid or unsupported JWK "alg" (Algorithm) Parameter value');
5
- const algorithm = entry.resolve?.({ kty: jwk.kty, crv: jwk.crv }) ?? entry.subtle, isPrivate = !!(jwk.d || jwk.priv), keyData = { ...jwk };
6
- return keyData.kty !== "AKP" && delete keyData.alg, delete keyData.use, crypto.subtle.importKey("jwk", keyData, algorithm, jwk.ext ?? !isPrivate, jwk.key_ops ?? entry.usages[isPrivate ? 1 : 0]);
7
- }
8
- export {
9
- jwkToKey
10
- };
@@ -1,8 +0,0 @@
1
- function validateExtractableOption(extractable) {
2
- if (extractable !== void 0 && typeof extractable != "boolean")
3
- throw new TypeError('"extractable" option must be a boolean');
4
- return extractable;
5
- }
6
- export {
7
- validateExtractableOption
8
- };
@@ -1,22 +0,0 @@
1
- import { checkCryptoKey, checkModulusLength } from "./crypto_key.js";
2
- async function getSigKey(entry, key, usage) {
3
- return key instanceof Uint8Array ? crypto.subtle.importKey("raw", key, entry.subtle, !1, [
4
- usage
5
- ]) : (checkCryptoKey(key, entry.subtle, usage), entry.minRsaBits && checkModulusLength(entry.alg, key), key);
6
- }
7
- async function sign(entry, key, data) {
8
- const cryptoKey = await getSigKey(entry, key, "sign"), signature = await crypto.subtle.sign(entry.signing, cryptoKey, data);
9
- return new Uint8Array(signature);
10
- }
11
- async function verify(entry, key, signature, data) {
12
- const cryptoKey = await getSigKey(entry, key, "verify");
13
- try {
14
- return await crypto.subtle.verify(entry.signing, cryptoKey, signature, data);
15
- } catch {
16
- return !1;
17
- }
18
- }
19
- export {
20
- sign,
21
- verify
22
- };
@@ -1,30 +0,0 @@
1
- function assertUint8Array(input, label) {
2
- if (!(input instanceof Uint8Array))
3
- throw new TypeError(`${label} must be an instance of Uint8Array`);
4
- }
5
- function isObject(input) {
6
- if (typeof input != "object" || input === null || Object.prototype.toString.call(input) !== "[object Object]")
7
- return !1;
8
- const prototype = Object.getPrototypeOf(input);
9
- return prototype === null || Object.getPrototypeOf(prototype) === null;
10
- }
11
- function isJwkSet(input) {
12
- return isObject(input) && Array.isArray(input.keys) && Array.from(input.keys).every(isObject);
13
- }
14
- function isDisjoint(...headers) {
15
- const parameters = /* @__PURE__ */ new Set();
16
- for (const header of headers)
17
- if (header)
18
- for (const parameter of Object.keys(header)) {
19
- if (parameters.has(parameter))
20
- return !1;
21
- parameters.add(parameter);
22
- }
23
- return !0;
24
- }
25
- export {
26
- assertUint8Array,
27
- isDisjoint,
28
- isJwkSet,
29
- isObject
30
- };