@openvtc/trust-tasks 0.21.5 → 0.21.6

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.
@@ -0,0 +1,206 @@
1
+ /**
2
+ * Generated by scripts/build-ts-bindings.mjs — DO NOT EDIT BY HAND.
3
+ * Source: specs/keys/import-wrapping-key/0.1/payload.schema.json
4
+ */
5
+
6
+ import type { Ext } from "../../../_shared/components.js";
7
+
8
+
9
+ /**
10
+ * Asks a key custodian for a fresh, short-lived, single-use public key to seal a private key to before sending it in a keys/import request's `privateKeySealed` carrier. The request carries nothing. The outer document members (id, type, issuer, recipient, issuedAt, expiresAt, proof) are owned by the framework — SPEC §6.3.
11
+ */
12
+ export interface KeysImportWrappingKeyPayload {
13
+ /**
14
+ * Ecosystem-defined extension members per SPEC.md §4.5.1.
15
+ */
16
+ ext?: Ext;
17
+ }
18
+ /**
19
+ * The wrapping key the custodian has just generated, carried in a Trust Task document whose type is https://trusttasks.org/spec/keys/import-wrapping-key/0.1#response. Failures use trust-task-error, not this shape.
20
+ */
21
+ export interface KeysImportWrappingKeyResponsePayload {
22
+ /**
23
+ * The wrapping key as an Ed25519 did:key. A producer seals to its X25519 counterpart (the birational map of RFC 7748 §4.1 applied to the Ed25519 public key), exactly as the sealed-transfer recipient of vta/attestation/mnemonic-export is addressed. Generated for this response alone: the custodian MUST NOT return the same key twice.
24
+ */
25
+ wrappingKey: string;
26
+ /**
27
+ * The custodian's opaque handle for this wrapping key. A `privateKeyJwe` carrier names it as its JWE `kid`. A `privateKeySealed` carrier does not need it: the custodian finds the key by trying the bundle against its unexpired, unused wrapping keys. Carries no meaning to the producer beyond equality.
28
+ */
29
+ keyId: string;
30
+ /**
31
+ * The instant after which the custodian will no longer open anything sealed to this key. RFC 3339 with an explicit offset. A producer that cannot complete keys/import before it asks for a new wrapping key rather than sending a bundle it knows will be refused.
32
+ */
33
+ expiresAt: string;
34
+ /**
35
+ * Ecosystem-defined extension members per SPEC.md §4.5.1.
36
+ */
37
+ ext?: Ext;
38
+ }
39
+
40
+ /** Shared definitions this specification references, re-exported under the names it used to declare them with. */
41
+ export type { Ext };
42
+
43
+ /** Trust Task type URI. */
44
+ export const TYPE_URI = "https://trusttasks.org/spec/keys/import-wrapping-key/0.1" as const;
45
+
46
+ /** Stable alias for this specification's request payload shape. */
47
+ export type Payload = KeysImportWrappingKeyPayload;
48
+
49
+ /** Trust Task response type URI (request type URI + "#response"). */
50
+ export const RESPONSE_TYPE_URI = "https://trusttasks.org/spec/keys/import-wrapping-key/0.1#response" as const;
51
+
52
+ /** Stable alias for this specification's success-response payload shape. */
53
+ export type Response = KeysImportWrappingKeyResponsePayload;
54
+
55
+ /**
56
+ * This specification's payload schema, as a value.
57
+ *
58
+ * SPEC.md §7.2 item 2 is performed against this. It is shipped as data
59
+ * rather than only as a `.json` file because TypeScript types are erased
60
+ * at runtime: without a schema a consumer has nothing to validate, and
61
+ * every REQUIRED payload member is optional in practice. Cross-file
62
+ * `$ref`s are already inlined, so it needs no resolver.
63
+ */
64
+ export const PAYLOAD_SCHEMA = {
65
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
66
+ "$id": "https://trusttasks.org/spec/keys/import-wrapping-key/0.1",
67
+ "title": "Keys — Import Wrapping Key — payload",
68
+ "description": "Asks a key custodian for a fresh, short-lived, single-use public key to seal a private key to before sending it in a keys/import request's `privateKeySealed` carrier. The request carries nothing. The outer document members (id, type, issuer, recipient, issuedAt, expiresAt, proof) are owned by the framework — SPEC §6.3.",
69
+ "type": "object",
70
+ "additionalProperties": false,
71
+ "properties": {
72
+ "ext": {
73
+ "$ref": "#/$defs/Ext",
74
+ "description": "Ecosystem-defined extension members per SPEC.md §4.5.1."
75
+ }
76
+ },
77
+ "$defs": {
78
+ "Response": {
79
+ "$anchor": "response",
80
+ "title": "Keys — Import Wrapping Key — response payload",
81
+ "description": "The wrapping key the custodian has just generated, carried in a Trust Task document whose type is https://trusttasks.org/spec/keys/import-wrapping-key/0.1#response. Failures use trust-task-error, not this shape.",
82
+ "type": "object",
83
+ "additionalProperties": false,
84
+ "required": [
85
+ "wrappingKey",
86
+ "keyId",
87
+ "expiresAt"
88
+ ],
89
+ "properties": {
90
+ "wrappingKey": {
91
+ "type": "string",
92
+ "pattern": "^did:key:z6Mk[1-9A-HJ-NP-Za-km-z]+$",
93
+ "maxLength": 128,
94
+ "description": "The wrapping key as an Ed25519 did:key. A producer seals to its X25519 counterpart (the birational map of RFC 7748 §4.1 applied to the Ed25519 public key), exactly as the sealed-transfer recipient of vta/attestation/mnemonic-export is addressed. Generated for this response alone: the custodian MUST NOT return the same key twice."
95
+ },
96
+ "keyId": {
97
+ "type": "string",
98
+ "minLength": 1,
99
+ "maxLength": 128,
100
+ "description": "The custodian's opaque handle for this wrapping key. A `privateKeyJwe` carrier names it as its JWE `kid`. A `privateKeySealed` carrier does not need it: the custodian finds the key by trying the bundle against its unexpired, unused wrapping keys. Carries no meaning to the producer beyond equality."
101
+ },
102
+ "expiresAt": {
103
+ "type": "string",
104
+ "format": "date-time",
105
+ "description": "The instant after which the custodian will no longer open anything sealed to this key. RFC 3339 with an explicit offset. A producer that cannot complete keys/import before it asks for a new wrapping key rather than sending a bundle it knows will be refused."
106
+ },
107
+ "ext": {
108
+ "$ref": "#/$defs/Ext",
109
+ "description": "Ecosystem-defined extension members per SPEC.md §4.5.1."
110
+ }
111
+ }
112
+ },
113
+ "Ext": {
114
+ "title": "Ext",
115
+ "description": "Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.",
116
+ "type": "object",
117
+ "minProperties": 1,
118
+ "additionalProperties": true,
119
+ "propertyNames": {
120
+ "pattern": "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$"
121
+ }
122
+ }
123
+ }
124
+ } as const;
125
+
126
+ /** As {@link PAYLOAD_SCHEMA}, for the success-response variant. */
127
+ export const RESPONSE_PAYLOAD_SCHEMA = {
128
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
129
+ "$ref": "#/$defs/Response",
130
+ "$defs": {
131
+ "Response": {
132
+ "$anchor": "response",
133
+ "title": "Keys — Import Wrapping Key — response payload",
134
+ "description": "The wrapping key the custodian has just generated, carried in a Trust Task document whose type is https://trusttasks.org/spec/keys/import-wrapping-key/0.1#response. Failures use trust-task-error, not this shape.",
135
+ "type": "object",
136
+ "additionalProperties": false,
137
+ "required": [
138
+ "wrappingKey",
139
+ "keyId",
140
+ "expiresAt"
141
+ ],
142
+ "properties": {
143
+ "wrappingKey": {
144
+ "type": "string",
145
+ "pattern": "^did:key:z6Mk[1-9A-HJ-NP-Za-km-z]+$",
146
+ "maxLength": 128,
147
+ "description": "The wrapping key as an Ed25519 did:key. A producer seals to its X25519 counterpart (the birational map of RFC 7748 §4.1 applied to the Ed25519 public key), exactly as the sealed-transfer recipient of vta/attestation/mnemonic-export is addressed. Generated for this response alone: the custodian MUST NOT return the same key twice."
148
+ },
149
+ "keyId": {
150
+ "type": "string",
151
+ "minLength": 1,
152
+ "maxLength": 128,
153
+ "description": "The custodian's opaque handle for this wrapping key. A `privateKeyJwe` carrier names it as its JWE `kid`. A `privateKeySealed` carrier does not need it: the custodian finds the key by trying the bundle against its unexpired, unused wrapping keys. Carries no meaning to the producer beyond equality."
154
+ },
155
+ "expiresAt": {
156
+ "type": "string",
157
+ "format": "date-time",
158
+ "description": "The instant after which the custodian will no longer open anything sealed to this key. RFC 3339 with an explicit offset. A producer that cannot complete keys/import before it asks for a new wrapping key rather than sending a bundle it knows will be refused."
159
+ },
160
+ "ext": {
161
+ "$ref": "#/$defs/Ext",
162
+ "description": "Ecosystem-defined extension members per SPEC.md §4.5.1."
163
+ }
164
+ }
165
+ },
166
+ "Ext": {
167
+ "title": "Ext",
168
+ "description": "Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.",
169
+ "type": "object",
170
+ "minProperties": 1,
171
+ "additionalProperties": true,
172
+ "propertyNames": {
173
+ "pattern": "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$"
174
+ }
175
+ }
176
+ }
177
+ } as const;
178
+
179
+ /**
180
+ * SPEC.md §7.2 policy for the request variant, from this specification's
181
+ * front matter. Pass to `consumeInbound` — items 5b, 7 and 8 are
182
+ * per-specification and cannot be derived from the document alone, and
183
+ * item 2 needs the schema this carries.
184
+ */
185
+ export const SPEC = {
186
+ typeUri: TYPE_URI,
187
+ isBearer: false,
188
+ isProofRequired: false,
189
+ isRecipientRequired: true,
190
+ isIssuedAtRequired: false,
191
+ payloadSchema: PAYLOAD_SCHEMA,
192
+ } as const;
193
+
194
+ /**
195
+ * SPEC.md §7.2 policy for the success-response variant. `isRecipientRequired`
196
+ * tracks the *issuer* party's requirement because a response swaps the
197
+ * parties (§7.3 item 5).
198
+ */
199
+ export const RESPONSE_SPEC = {
200
+ typeUri: RESPONSE_TYPE_URI,
201
+ isBearer: false,
202
+ isProofRequired: true,
203
+ isRecipientRequired: true,
204
+ isIssuedAtRequired: false,
205
+ payloadSchema: RESPONSE_PAYLOAD_SCHEMA,
206
+ } as const;
@@ -0,0 +1,336 @@
1
+ /**
2
+ * Generated by scripts/build-ts-bindings.mjs — DO NOT EDIT BY HAND.
3
+ * Source: specs/vta/health/details/0.1/payload.schema.json
4
+ */
5
+
6
+ import type { Ext } from "../../../../_shared/components.js";
7
+
8
+
9
+ /**
10
+ * Asks a Verifiable Trust Agent for its public health flags: messaging configuration, seal and storage-encryption state, trusted-execution status and transport advertisement. Deliberately carries neither the software version nor the restore record — see vta/restore/status. The payload carries nothing. The outer document members (id, type, issuer, recipient, issuedAt, expiresAt, proof) are owned by the framework — SPEC §6.3.
11
+ */
12
+ export interface VTAHealthDetailsPayload {
13
+ /**
14
+ * Ecosystem-defined extension members per SPEC.md §4.5.1.
15
+ */
16
+ ext?: Ext;
17
+ }
18
+ /**
19
+ * The agent's public report on its own deployment, carried in a Trust Task document whose type is https://trusttasks.org/spec/vta/health/details/0.1#response. Fixed for every asker. It MUST NOT carry the software version or the restore record, and additionalProperties: false means it cannot: those are served only by vta/restore/status. Failures use trust-task-error, not this shape.
20
+ */
21
+ export interface VTAHealthDetailsResponsePayload {
22
+ /**
23
+ * The agent's overall health. `ok` is the only value this version defines: an agent able to answer is serving.
24
+ */
25
+ status: "ok";
26
+ /**
27
+ * The endpoint of the mediator the agent's messaging routes through. Absent when the agent has no messaging configured.
28
+ */
29
+ mediatorUrl?: string;
30
+ /**
31
+ * The DID of that mediator — the one DIDComm and TSP share. Absent when the agent has no messaging configured.
32
+ */
33
+ mediatorDid?: string;
34
+ teeStatus?: TeeStatus;
35
+ /**
36
+ * Whether the agent is sealed: offline, host-side commands that would change its access control, keys or configuration, or export secrets, are refused, so it is managed only through authenticated tasks.
37
+ */
38
+ sealed: boolean;
39
+ /**
40
+ * Whether the agent's key store is encrypted at rest.
41
+ */
42
+ storageEncrypted: boolean;
43
+ /**
44
+ * Whether the agent advertises the Trust Spanning Protocol as a transport. TSP routes through the same mediator as DIDComm (mediatorDid), so no separate endpoint is reported.
45
+ */
46
+ tspEnabled: boolean;
47
+ /**
48
+ * Ecosystem-defined extension members per SPEC.md §4.5.1.
49
+ */
50
+ ext?: Ext;
51
+ }
52
+ /**
53
+ * The trusted execution environment the agent detected at boot. Absent when the agent has no attestation provider.
54
+ */
55
+ export interface TeeStatus {
56
+ /**
57
+ * nitro (AWS Nitro Enclaves), sev-snp (AMD SEV-SNP), or simulated (a development build whose evidence no verifier should accept).
58
+ */
59
+ teeType: "nitro" | "sev-snp" | "simulated";
60
+ /**
61
+ * Whether the agent found the platform at boot. False means it was configured for one it did not find.
62
+ */
63
+ detected: boolean;
64
+ /**
65
+ * The platform's own version string, when it reports one. Informational.
66
+ */
67
+ platformVersion?: string;
68
+ }
69
+
70
+ /** Shared definitions this specification references, re-exported under the names it used to declare them with. */
71
+ export type { Ext };
72
+
73
+ /** Trust Task type URI. */
74
+ export const TYPE_URI = "https://trusttasks.org/spec/vta/health/details/0.1" as const;
75
+
76
+ /** Stable alias for this specification's request payload shape. */
77
+ export type Payload = VTAHealthDetailsPayload;
78
+
79
+ /** Trust Task response type URI (request type URI + "#response"). */
80
+ export const RESPONSE_TYPE_URI = "https://trusttasks.org/spec/vta/health/details/0.1#response" as const;
81
+
82
+ /** Stable alias for this specification's success-response payload shape. */
83
+ export type Response = VTAHealthDetailsResponsePayload;
84
+
85
+ /**
86
+ * This specification's payload schema, as a value.
87
+ *
88
+ * SPEC.md §7.2 item 2 is performed against this. It is shipped as data
89
+ * rather than only as a `.json` file because TypeScript types are erased
90
+ * at runtime: without a schema a consumer has nothing to validate, and
91
+ * every REQUIRED payload member is optional in practice. Cross-file
92
+ * `$ref`s are already inlined, so it needs no resolver.
93
+ */
94
+ export const PAYLOAD_SCHEMA = {
95
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
96
+ "$id": "https://trusttasks.org/spec/vta/health/details/0.1",
97
+ "title": "VTA Health — Details — payload",
98
+ "description": "Asks a Verifiable Trust Agent for its public health flags: messaging configuration, seal and storage-encryption state, trusted-execution status and transport advertisement. Deliberately carries neither the software version nor the restore record — see vta/restore/status. The payload carries nothing. The outer document members (id, type, issuer, recipient, issuedAt, expiresAt, proof) are owned by the framework — SPEC §6.3.",
99
+ "type": "object",
100
+ "additionalProperties": false,
101
+ "properties": {
102
+ "ext": {
103
+ "$ref": "#/$defs/Ext",
104
+ "description": "Ecosystem-defined extension members per SPEC.md §4.5.1."
105
+ }
106
+ },
107
+ "$defs": {
108
+ "TeeStatus": {
109
+ "title": "TeeStatus",
110
+ "description": "The trusted execution environment the agent detected at boot. Mirrors the response of vta/attestation/status/0.1 member for member, so a verifier reading either sees the same claim. A claim, not evidence: only vta/attestation/report proves what code runs.",
111
+ "type": "object",
112
+ "additionalProperties": false,
113
+ "required": [
114
+ "teeType",
115
+ "detected"
116
+ ],
117
+ "properties": {
118
+ "teeType": {
119
+ "type": "string",
120
+ "enum": [
121
+ "nitro",
122
+ "sev-snp",
123
+ "simulated"
124
+ ],
125
+ "description": "nitro (AWS Nitro Enclaves), sev-snp (AMD SEV-SNP), or simulated (a development build whose evidence no verifier should accept)."
126
+ },
127
+ "detected": {
128
+ "type": "boolean",
129
+ "description": "Whether the agent found the platform at boot. False means it was configured for one it did not find."
130
+ },
131
+ "platformVersion": {
132
+ "type": "string",
133
+ "minLength": 1,
134
+ "maxLength": 256,
135
+ "description": "The platform's own version string, when it reports one. Informational."
136
+ }
137
+ }
138
+ },
139
+ "Response": {
140
+ "$anchor": "response",
141
+ "title": "VTA Health Details — response payload",
142
+ "description": "The agent's public report on its own deployment, carried in a Trust Task document whose type is https://trusttasks.org/spec/vta/health/details/0.1#response. Fixed for every asker. It MUST NOT carry the software version or the restore record, and additionalProperties: false means it cannot: those are served only by vta/restore/status. Failures use trust-task-error, not this shape.",
143
+ "type": "object",
144
+ "additionalProperties": false,
145
+ "required": [
146
+ "status",
147
+ "sealed",
148
+ "storageEncrypted",
149
+ "tspEnabled"
150
+ ],
151
+ "properties": {
152
+ "status": {
153
+ "type": "string",
154
+ "enum": [
155
+ "ok"
156
+ ],
157
+ "description": "The agent's overall health. `ok` is the only value this version defines: an agent able to answer is serving."
158
+ },
159
+ "mediatorUrl": {
160
+ "type": "string",
161
+ "format": "uri",
162
+ "maxLength": 2048,
163
+ "description": "The endpoint of the mediator the agent's messaging routes through. Absent when the agent has no messaging configured."
164
+ },
165
+ "mediatorDid": {
166
+ "type": "string",
167
+ "pattern": "^did:",
168
+ "maxLength": 2048,
169
+ "description": "The DID of that mediator — the one DIDComm and TSP share. Absent when the agent has no messaging configured."
170
+ },
171
+ "teeStatus": {
172
+ "$ref": "#/$defs/TeeStatus",
173
+ "description": "The trusted execution environment the agent detected at boot. Absent when the agent has no attestation provider."
174
+ },
175
+ "sealed": {
176
+ "type": "boolean",
177
+ "description": "Whether the agent is sealed: offline, host-side commands that would change its access control, keys or configuration, or export secrets, are refused, so it is managed only through authenticated tasks."
178
+ },
179
+ "storageEncrypted": {
180
+ "type": "boolean",
181
+ "description": "Whether the agent's key store is encrypted at rest."
182
+ },
183
+ "tspEnabled": {
184
+ "type": "boolean",
185
+ "description": "Whether the agent advertises the Trust Spanning Protocol as a transport. TSP routes through the same mediator as DIDComm (mediatorDid), so no separate endpoint is reported."
186
+ },
187
+ "ext": {
188
+ "$ref": "#/$defs/Ext",
189
+ "description": "Ecosystem-defined extension members per SPEC.md §4.5.1."
190
+ }
191
+ }
192
+ },
193
+ "Ext": {
194
+ "title": "Ext",
195
+ "description": "Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.",
196
+ "type": "object",
197
+ "minProperties": 1,
198
+ "additionalProperties": true,
199
+ "propertyNames": {
200
+ "pattern": "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$"
201
+ }
202
+ }
203
+ }
204
+ } as const;
205
+
206
+ /** As {@link PAYLOAD_SCHEMA}, for the success-response variant. */
207
+ export const RESPONSE_PAYLOAD_SCHEMA = {
208
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
209
+ "$ref": "#/$defs/Response",
210
+ "$defs": {
211
+ "TeeStatus": {
212
+ "title": "TeeStatus",
213
+ "description": "The trusted execution environment the agent detected at boot. Mirrors the response of vta/attestation/status/0.1 member for member, so a verifier reading either sees the same claim. A claim, not evidence: only vta/attestation/report proves what code runs.",
214
+ "type": "object",
215
+ "additionalProperties": false,
216
+ "required": [
217
+ "teeType",
218
+ "detected"
219
+ ],
220
+ "properties": {
221
+ "teeType": {
222
+ "type": "string",
223
+ "enum": [
224
+ "nitro",
225
+ "sev-snp",
226
+ "simulated"
227
+ ],
228
+ "description": "nitro (AWS Nitro Enclaves), sev-snp (AMD SEV-SNP), or simulated (a development build whose evidence no verifier should accept)."
229
+ },
230
+ "detected": {
231
+ "type": "boolean",
232
+ "description": "Whether the agent found the platform at boot. False means it was configured for one it did not find."
233
+ },
234
+ "platformVersion": {
235
+ "type": "string",
236
+ "minLength": 1,
237
+ "maxLength": 256,
238
+ "description": "The platform's own version string, when it reports one. Informational."
239
+ }
240
+ }
241
+ },
242
+ "Response": {
243
+ "$anchor": "response",
244
+ "title": "VTA Health Details — response payload",
245
+ "description": "The agent's public report on its own deployment, carried in a Trust Task document whose type is https://trusttasks.org/spec/vta/health/details/0.1#response. Fixed for every asker. It MUST NOT carry the software version or the restore record, and additionalProperties: false means it cannot: those are served only by vta/restore/status. Failures use trust-task-error, not this shape.",
246
+ "type": "object",
247
+ "additionalProperties": false,
248
+ "required": [
249
+ "status",
250
+ "sealed",
251
+ "storageEncrypted",
252
+ "tspEnabled"
253
+ ],
254
+ "properties": {
255
+ "status": {
256
+ "type": "string",
257
+ "enum": [
258
+ "ok"
259
+ ],
260
+ "description": "The agent's overall health. `ok` is the only value this version defines: an agent able to answer is serving."
261
+ },
262
+ "mediatorUrl": {
263
+ "type": "string",
264
+ "format": "uri",
265
+ "maxLength": 2048,
266
+ "description": "The endpoint of the mediator the agent's messaging routes through. Absent when the agent has no messaging configured."
267
+ },
268
+ "mediatorDid": {
269
+ "type": "string",
270
+ "pattern": "^did:",
271
+ "maxLength": 2048,
272
+ "description": "The DID of that mediator — the one DIDComm and TSP share. Absent when the agent has no messaging configured."
273
+ },
274
+ "teeStatus": {
275
+ "$ref": "#/$defs/TeeStatus",
276
+ "description": "The trusted execution environment the agent detected at boot. Absent when the agent has no attestation provider."
277
+ },
278
+ "sealed": {
279
+ "type": "boolean",
280
+ "description": "Whether the agent is sealed: offline, host-side commands that would change its access control, keys or configuration, or export secrets, are refused, so it is managed only through authenticated tasks."
281
+ },
282
+ "storageEncrypted": {
283
+ "type": "boolean",
284
+ "description": "Whether the agent's key store is encrypted at rest."
285
+ },
286
+ "tspEnabled": {
287
+ "type": "boolean",
288
+ "description": "Whether the agent advertises the Trust Spanning Protocol as a transport. TSP routes through the same mediator as DIDComm (mediatorDid), so no separate endpoint is reported."
289
+ },
290
+ "ext": {
291
+ "$ref": "#/$defs/Ext",
292
+ "description": "Ecosystem-defined extension members per SPEC.md §4.5.1."
293
+ }
294
+ }
295
+ },
296
+ "Ext": {
297
+ "title": "Ext",
298
+ "description": "Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.",
299
+ "type": "object",
300
+ "minProperties": 1,
301
+ "additionalProperties": true,
302
+ "propertyNames": {
303
+ "pattern": "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$"
304
+ }
305
+ }
306
+ }
307
+ } as const;
308
+
309
+ /**
310
+ * SPEC.md §7.2 policy for the request variant, from this specification's
311
+ * front matter. Pass to `consumeInbound` — items 5b, 7 and 8 are
312
+ * per-specification and cannot be derived from the document alone, and
313
+ * item 2 needs the schema this carries.
314
+ */
315
+ export const SPEC = {
316
+ typeUri: TYPE_URI,
317
+ isBearer: false,
318
+ isProofRequired: false,
319
+ isRecipientRequired: true,
320
+ isIssuedAtRequired: false,
321
+ payloadSchema: PAYLOAD_SCHEMA,
322
+ } as const;
323
+
324
+ /**
325
+ * SPEC.md §7.2 policy for the success-response variant. `isRecipientRequired`
326
+ * tracks the *issuer* party's requirement because a response swaps the
327
+ * parties (§7.3 item 5).
328
+ */
329
+ export const RESPONSE_SPEC = {
330
+ typeUri: RESPONSE_TYPE_URI,
331
+ isBearer: false,
332
+ isProofRequired: true,
333
+ isRecipientRequired: true,
334
+ isIssuedAtRequired: false,
335
+ payloadSchema: RESPONSE_PAYLOAD_SCHEMA,
336
+ } as const;