@openvtc/trust-tasks 0.19.3 → 0.19.5

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 (80) hide show
  1. package/CHANGELOG.md +209 -0
  2. package/dist/_shared/components.d.ts +298 -0
  3. package/dist/_shared/components.d.ts.map +1 -1
  4. package/dist/index.d.ts +14 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +14 -0
  7. package/dist/index.js.map +1 -1
  8. package/dist/vetting/_shared/0.1/identity-vetting.d.ts +11 -0
  9. package/dist/vetting/_shared/0.1/identity-vetting.d.ts.map +1 -0
  10. package/dist/vetting/_shared/0.1/identity-vetting.js +6 -0
  11. package/dist/vetting/_shared/0.1/identity-vetting.js.map +1 -0
  12. package/dist/vetting/_shared/0.1/vetting-card.d.ts +16 -0
  13. package/dist/vetting/_shared/0.1/vetting-card.d.ts.map +1 -0
  14. package/dist/vetting/_shared/0.1/vetting-card.js +6 -0
  15. package/dist/vetting/_shared/0.1/vetting-card.js.map +1 -0
  16. package/dist/vetting/_shared/0.1/vetting.d.ts +16 -0
  17. package/dist/vetting/_shared/0.1/vetting.d.ts.map +1 -0
  18. package/dist/vetting/_shared/0.1/vetting.js +6 -0
  19. package/dist/vetting/_shared/0.1/vetting.js.map +1 -0
  20. package/dist/vetting/decline/0.1/payload.d.ts +138 -0
  21. package/dist/vetting/decline/0.1/payload.d.ts.map +1 -0
  22. package/dist/vetting/decline/0.1/payload.js +81 -0
  23. package/dist/vetting/decline/0.1/payload.js.map +1 -0
  24. package/dist/vetting/request/0.1/payload.d.ts +1188 -0
  25. package/dist/vetting/request/0.1/payload.d.ts.map +1 -0
  26. package/dist/vetting/request/0.1/payload.js +596 -0
  27. package/dist/vetting/request/0.1/payload.js.map +1 -0
  28. package/dist/vetting/session/0.1/payload.d.ts +978 -0
  29. package/dist/vetting/session/0.1/payload.d.ts.map +1 -0
  30. package/dist/vetting/session/0.1/payload.js +570 -0
  31. package/dist/vetting/session/0.1/payload.js.map +1 -0
  32. package/dist/vta/webvh/dids/realign-keys/1.0/payload.d.ts +484 -0
  33. package/dist/vta/webvh/dids/realign-keys/1.0/payload.d.ts.map +1 -0
  34. package/dist/vta/webvh/dids/realign-keys/1.0/payload.js +259 -0
  35. package/dist/vta/webvh/dids/realign-keys/1.0/payload.js.map +1 -0
  36. package/dist/vtc/_shared/0.1/vetter-profile.d.ts +16 -0
  37. package/dist/vtc/_shared/0.1/vetter-profile.d.ts.map +1 -0
  38. package/dist/vtc/_shared/0.1/vetter-profile.js +6 -0
  39. package/dist/vtc/_shared/0.1/vetter-profile.js.map +1 -0
  40. package/dist/vtc/join-requests/manifest/0.2/payload.d.ts +1294 -0
  41. package/dist/vtc/join-requests/manifest/0.2/payload.d.ts.map +1 -0
  42. package/dist/vtc/join-requests/manifest/0.2/payload.js +667 -0
  43. package/dist/vtc/join-requests/manifest/0.2/payload.js.map +1 -0
  44. package/dist/vtc/vetting/revoke-statement/0.1/payload.d.ts +299 -0
  45. package/dist/vtc/vetting/revoke-statement/0.1/payload.d.ts.map +1 -0
  46. package/dist/vtc/vetting/revoke-statement/0.1/payload.js +172 -0
  47. package/dist/vtc/vetting/revoke-statement/0.1/payload.js.map +1 -0
  48. package/dist/vtc/vetting/vetters/grant/0.1/payload.d.ts +337 -0
  49. package/dist/vtc/vetting/vetters/grant/0.1/payload.d.ts.map +1 -0
  50. package/dist/vtc/vetting/vetters/grant/0.1/payload.js +183 -0
  51. package/dist/vtc/vetting/vetters/grant/0.1/payload.js.map +1 -0
  52. package/dist/vtc/vetting/vetters/list/0.1/payload.d.ts +1257 -0
  53. package/dist/vtc/vetting/vetters/list/0.1/payload.d.ts.map +1 -0
  54. package/dist/vtc/vetting/vetters/list/0.1/payload.js +597 -0
  55. package/dist/vtc/vetting/vetters/list/0.1/payload.js.map +1 -0
  56. package/dist/vtc/vetting/vetters/profile/0.1/payload.d.ts +970 -0
  57. package/dist/vtc/vetting/vetters/profile/0.1/payload.d.ts.map +1 -0
  58. package/dist/vtc/vetting/vetters/profile/0.1/payload.js +463 -0
  59. package/dist/vtc/vetting/vetters/profile/0.1/payload.js.map +1 -0
  60. package/dist/vtc/vetting/vetters/resend/0.1/payload.d.ts +240 -0
  61. package/dist/vtc/vetting/vetters/resend/0.1/payload.d.ts.map +1 -0
  62. package/dist/vtc/vetting/vetters/resend/0.1/payload.js +137 -0
  63. package/dist/vtc/vetting/vetters/resend/0.1/payload.js.map +1 -0
  64. package/package.json +1 -1
  65. package/src/_shared/components.ts +318 -0
  66. package/src/index.ts +14 -0
  67. package/src/vetting/_shared/0.1/identity-vetting.ts +11 -0
  68. package/src/vetting/_shared/0.1/vetting-card.ts +17 -0
  69. package/src/vetting/_shared/0.1/vetting.ts +17 -0
  70. package/src/vetting/decline/0.1/payload.ts +111 -0
  71. package/src/vetting/request/0.1/payload.ts +799 -0
  72. package/src/vetting/session/0.1/payload.ts +629 -0
  73. package/src/vta/webvh/dids/realign-keys/1.0/payload.ts +332 -0
  74. package/src/vtc/_shared/0.1/vetter-profile.ts +17 -0
  75. package/src/vtc/join-requests/manifest/0.2/payload.ts +815 -0
  76. package/src/vtc/vetting/revoke-statement/0.1/payload.ts +218 -0
  77. package/src/vtc/vetting/vetters/grant/0.1/payload.ts +237 -0
  78. package/src/vtc/vetting/vetters/list/0.1/payload.ts +816 -0
  79. package/src/vtc/vetting/vetters/profile/0.1/payload.ts +647 -0
  80. package/src/vtc/vetting/vetters/resend/0.1/payload.ts +174 -0
@@ -0,0 +1,647 @@
1
+ /**
2
+ * Generated by scripts/build-ts-bindings.mjs — DO NOT EDIT BY HAND.
3
+ * Source: specs/vtc/vetting/vetters/profile/0.1/payload.schema.json
4
+ */
5
+
6
+ import type { CalendarDate, CountryCode, Ext, LanguageTag, PlaceName, VetterAcceptsDocumentation, VetterAvailability, VetterContactHint, VetterDisplayName, VetterEvent, VetterLocation, VetterMethods, VettingDocumentation, VettingMethod } from "../../../../../_shared/components.js";
7
+
8
+
9
+ /**
10
+ * A vetter publishes, replaces or unlists their vetter profile with their community: the languages, coarse location, methods, documentation and events an applicant looking for a vetter can filter on. The payload is the whole profile and replaces whatever the community held. `listed: false` keeps the profile but removes it from vtc/vetting/vetters/list.
11
+ */
12
+ export interface VTCVettingVettersProfilePayload {
13
+ /**
14
+ * Whether the profile appears in vtc/vetting/vetters/list. `false` keeps it stored and hidden.
15
+ */
16
+ listed: boolean;
17
+ displayName?: VetterDisplayName;
18
+ /**
19
+ * BCP 47 tags of the languages the vetter can hold a session in, most preferred first. May be empty.
20
+ *
21
+ * @maxItems 16
22
+ */
23
+ languages:
24
+ | []
25
+ | [LanguageTag]
26
+ | [LanguageTag, LanguageTag]
27
+ | [LanguageTag, LanguageTag, LanguageTag]
28
+ | [LanguageTag, LanguageTag, LanguageTag, LanguageTag]
29
+ | [LanguageTag, LanguageTag, LanguageTag, LanguageTag, LanguageTag]
30
+ | [LanguageTag, LanguageTag, LanguageTag, LanguageTag, LanguageTag, LanguageTag]
31
+ | [LanguageTag, LanguageTag, LanguageTag, LanguageTag, LanguageTag, LanguageTag, LanguageTag]
32
+ | [LanguageTag, LanguageTag, LanguageTag, LanguageTag, LanguageTag, LanguageTag, LanguageTag, LanguageTag]
33
+ | [
34
+ LanguageTag,
35
+ LanguageTag,
36
+ LanguageTag,
37
+ LanguageTag,
38
+ LanguageTag,
39
+ LanguageTag,
40
+ LanguageTag,
41
+ LanguageTag,
42
+ LanguageTag
43
+ ]
44
+ | [
45
+ LanguageTag,
46
+ LanguageTag,
47
+ LanguageTag,
48
+ LanguageTag,
49
+ LanguageTag,
50
+ LanguageTag,
51
+ LanguageTag,
52
+ LanguageTag,
53
+ LanguageTag,
54
+ LanguageTag
55
+ ]
56
+ | [
57
+ LanguageTag,
58
+ LanguageTag,
59
+ LanguageTag,
60
+ LanguageTag,
61
+ LanguageTag,
62
+ LanguageTag,
63
+ LanguageTag,
64
+ LanguageTag,
65
+ LanguageTag,
66
+ LanguageTag,
67
+ LanguageTag
68
+ ]
69
+ | [
70
+ LanguageTag,
71
+ LanguageTag,
72
+ LanguageTag,
73
+ LanguageTag,
74
+ LanguageTag,
75
+ LanguageTag,
76
+ LanguageTag,
77
+ LanguageTag,
78
+ LanguageTag,
79
+ LanguageTag,
80
+ LanguageTag,
81
+ LanguageTag
82
+ ]
83
+ | [
84
+ LanguageTag,
85
+ LanguageTag,
86
+ LanguageTag,
87
+ LanguageTag,
88
+ LanguageTag,
89
+ LanguageTag,
90
+ LanguageTag,
91
+ LanguageTag,
92
+ LanguageTag,
93
+ LanguageTag,
94
+ LanguageTag,
95
+ LanguageTag,
96
+ LanguageTag
97
+ ]
98
+ | [
99
+ LanguageTag,
100
+ LanguageTag,
101
+ LanguageTag,
102
+ LanguageTag,
103
+ LanguageTag,
104
+ LanguageTag,
105
+ LanguageTag,
106
+ LanguageTag,
107
+ LanguageTag,
108
+ LanguageTag,
109
+ LanguageTag,
110
+ LanguageTag,
111
+ LanguageTag,
112
+ LanguageTag
113
+ ]
114
+ | [
115
+ LanguageTag,
116
+ LanguageTag,
117
+ LanguageTag,
118
+ LanguageTag,
119
+ LanguageTag,
120
+ LanguageTag,
121
+ LanguageTag,
122
+ LanguageTag,
123
+ LanguageTag,
124
+ LanguageTag,
125
+ LanguageTag,
126
+ LanguageTag,
127
+ LanguageTag,
128
+ LanguageTag,
129
+ LanguageTag
130
+ ]
131
+ | [
132
+ LanguageTag,
133
+ LanguageTag,
134
+ LanguageTag,
135
+ LanguageTag,
136
+ LanguageTag,
137
+ LanguageTag,
138
+ LanguageTag,
139
+ LanguageTag,
140
+ LanguageTag,
141
+ LanguageTag,
142
+ LanguageTag,
143
+ LanguageTag,
144
+ LanguageTag,
145
+ LanguageTag,
146
+ LanguageTag,
147
+ LanguageTag
148
+ ];
149
+ location?: VetterLocation;
150
+ methods: VetterMethods;
151
+ acceptsDocumentation: VetterAcceptsDocumentation;
152
+ availability?: VetterAvailability;
153
+ contactHint?: VetterContactHint;
154
+ /**
155
+ * Events the vetter will attend and vet at. May be empty. Events that have ended stay stored but are not listed.
156
+ *
157
+ * @maxItems 32
158
+ */
159
+ events: VetterEvent[];
160
+ ext?: Ext;
161
+ }
162
+ /**
163
+ * The community stored the profile.
164
+ */
165
+ export interface VTCVettingVettersProfileResponsePayload {
166
+ /**
167
+ * The stored profile's `listed` value.
168
+ */
169
+ listed: boolean;
170
+ /**
171
+ * When the community stored this profile. vtc/vetting/vetters/list returns the same value.
172
+ */
173
+ updatedAt: string;
174
+ }
175
+
176
+ /** Shared definitions this specification references, re-exported under the names it used to declare them with. */
177
+ export type { CalendarDate, CountryCode, Ext, LanguageTag, PlaceName, VetterAcceptsDocumentation, VetterAvailability, VetterContactHint, VetterDisplayName, VetterEvent, VetterLocation, VetterMethods, VettingDocumentation, VettingMethod };
178
+
179
+ /** Trust Task type URI. */
180
+ export const TYPE_URI = "https://trusttasks.org/spec/vtc/vetting/vetters/profile/0.1" as const;
181
+
182
+ /** Stable alias for this specification's request payload shape. */
183
+ export type Payload = VTCVettingVettersProfilePayload;
184
+
185
+ /** Trust Task response type URI (request type URI + "#response"). */
186
+ export const RESPONSE_TYPE_URI = "https://trusttasks.org/spec/vtc/vetting/vetters/profile/0.1#response" as const;
187
+
188
+ /** Stable alias for this specification's success-response payload shape. */
189
+ export type Response = VTCVettingVettersProfileResponsePayload;
190
+
191
+ /**
192
+ * This specification's payload schema, as a value.
193
+ *
194
+ * SPEC.md §7.2 item 2 is performed against this. It is shipped as data
195
+ * rather than only as a `.json` file because TypeScript types are erased
196
+ * at runtime: without a schema a consumer has nothing to validate, and
197
+ * every REQUIRED payload member is optional in practice. Cross-file
198
+ * `$ref`s are already inlined, so it needs no resolver.
199
+ */
200
+ export const PAYLOAD_SCHEMA = {
201
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
202
+ "$id": "https://trusttasks.org/spec/vtc/vetting/vetters/profile/0.1",
203
+ "title": "VTC Vetting — Vetters Profile — payload",
204
+ "description": "A vetter publishes, replaces or unlists their vetter profile with their community: the languages, coarse location, methods, documentation and events an applicant looking for a vetter can filter on. The payload is the whole profile and replaces whatever the community held. `listed: false` keeps the profile but removes it from vtc/vetting/vetters/list.",
205
+ "type": "object",
206
+ "additionalProperties": false,
207
+ "required": [
208
+ "listed",
209
+ "languages",
210
+ "methods",
211
+ "acceptsDocumentation",
212
+ "events"
213
+ ],
214
+ "properties": {
215
+ "listed": {
216
+ "type": "boolean",
217
+ "description": "Whether the profile appears in vtc/vetting/vetters/list. `false` keeps it stored and hidden."
218
+ },
219
+ "displayName": {
220
+ "$ref": "#/$defs/VetterDisplayName"
221
+ },
222
+ "languages": {
223
+ "type": "array",
224
+ "maxItems": 16,
225
+ "uniqueItems": true,
226
+ "items": {
227
+ "$ref": "#/$defs/LanguageTag"
228
+ },
229
+ "description": "BCP 47 tags of the languages the vetter can hold a session in, most preferred first. May be empty."
230
+ },
231
+ "location": {
232
+ "$ref": "#/$defs/VetterLocation"
233
+ },
234
+ "methods": {
235
+ "$ref": "#/$defs/VetterMethods"
236
+ },
237
+ "acceptsDocumentation": {
238
+ "$ref": "#/$defs/VetterAcceptsDocumentation"
239
+ },
240
+ "availability": {
241
+ "$ref": "#/$defs/VetterAvailability"
242
+ },
243
+ "contactHint": {
244
+ "$ref": "#/$defs/VetterContactHint"
245
+ },
246
+ "events": {
247
+ "type": "array",
248
+ "maxItems": 32,
249
+ "items": {
250
+ "$ref": "#/$defs/VetterEvent"
251
+ },
252
+ "description": "Events the vetter will attend and vet at. May be empty. Events that have ended stay stored but are not listed."
253
+ },
254
+ "ext": {
255
+ "$ref": "#/$defs/Ext"
256
+ }
257
+ },
258
+ "$defs": {
259
+ "Response": {
260
+ "$anchor": "response",
261
+ "title": "VTC Vetting — Vetters Profile — response payload",
262
+ "description": "The community stored the profile.",
263
+ "type": "object",
264
+ "additionalProperties": false,
265
+ "required": [
266
+ "listed",
267
+ "updatedAt"
268
+ ],
269
+ "properties": {
270
+ "listed": {
271
+ "type": "boolean",
272
+ "description": "The stored profile's `listed` value."
273
+ },
274
+ "updatedAt": {
275
+ "type": "string",
276
+ "format": "date-time",
277
+ "description": "When the community stored this profile. vtc/vetting/vetters/list returns the same value."
278
+ }
279
+ }
280
+ },
281
+ "Ext": {
282
+ "title": "Ext",
283
+ "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.",
284
+ "type": "object",
285
+ "minProperties": 1,
286
+ "additionalProperties": true,
287
+ "propertyNames": {
288
+ "pattern": "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$"
289
+ }
290
+ },
291
+ "VetterEvent": {
292
+ "title": "VetterEvent",
293
+ "type": "object",
294
+ "additionalProperties": false,
295
+ "required": [
296
+ "name",
297
+ "startDate",
298
+ "endDate"
299
+ ],
300
+ "properties": {
301
+ "name": {
302
+ "type": "string",
303
+ "minLength": 1,
304
+ "maxLength": 200,
305
+ "description": "The event's name, e.g. `Linux Plumbers Conference 2026`."
306
+ },
307
+ "startDate": {
308
+ "$ref": "#/$defs/CalendarDate"
309
+ },
310
+ "endDate": {
311
+ "$ref": "#/$defs/CalendarDate"
312
+ },
313
+ "location": {
314
+ "$ref": "#/$defs/VetterLocation"
315
+ },
316
+ "url": {
317
+ "type": "string",
318
+ "format": "uri",
319
+ "pattern": "^https://",
320
+ "maxLength": 2048,
321
+ "description": "OPTIONAL. The event's own https page."
322
+ }
323
+ },
324
+ "description": "An event the vetter will attend and vet at. `endDate` is on or after `startDate` and no more than 31 days after it; JSON Schema cannot compare two members, so the community checks both and refuses a violation with `malformedRequest`."
325
+ },
326
+ "VetterLocation": {
327
+ "title": "VetterLocation",
328
+ "type": "object",
329
+ "additionalProperties": false,
330
+ "required": [
331
+ "country"
332
+ ],
333
+ "properties": {
334
+ "country": {
335
+ "$ref": "#/$defs/CountryCode"
336
+ },
337
+ "region": {
338
+ "$ref": "#/$defs/PlaceName"
339
+ },
340
+ "city": {
341
+ "$ref": "#/$defs/PlaceName"
342
+ }
343
+ },
344
+ "description": "Where a vetter can meet people, as coarse as the vetter chooses: a country, optionally a region, optionally a city. Never a street address."
345
+ },
346
+ "PlaceName": {
347
+ "title": "PlaceName",
348
+ "type": "string",
349
+ "minLength": 1,
350
+ "maxLength": 128,
351
+ "description": "A region or city name as the vetter writes it. Compared case-insensitively and otherwise exactly."
352
+ },
353
+ "CountryCode": {
354
+ "title": "CountryCode",
355
+ "type": "string",
356
+ "pattern": "^[A-Z]{2}$",
357
+ "description": "An ISO 3166-1 alpha-2 country code, upper case, e.g. `DE`."
358
+ },
359
+ "CalendarDate": {
360
+ "title": "CalendarDate",
361
+ "type": "string",
362
+ "format": "date",
363
+ "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$",
364
+ "description": "A calendar date, `YYYY-MM-DD` (RFC 3339 full-date), with no time or zone. Compared as a UTC date."
365
+ },
366
+ "VetterContactHint": {
367
+ "title": "VetterContactHint",
368
+ "type": "string",
369
+ "minLength": 1,
370
+ "maxLength": 300,
371
+ "description": "Vetter-authored free text on how to obtain a ticket from them, e.g. `Find me at the OpenVTC booth`. A hint, not an address a request can be sent to: vetting/request still needs a ticket or an introduction the vetter accepts."
372
+ },
373
+ "VetterAvailability": {
374
+ "title": "VetterAvailability",
375
+ "type": "string",
376
+ "minLength": 1,
377
+ "maxLength": 500,
378
+ "description": "Vetter-authored free text on when they are available to vet. Attributed to the vetter."
379
+ },
380
+ "VetterAcceptsDocumentation": {
381
+ "title": "VetterAcceptsDocumentation",
382
+ "type": "array",
383
+ "maxItems": 16,
384
+ "uniqueItems": true,
385
+ "items": {
386
+ "$ref": "#/$defs/VettingDocumentation"
387
+ },
388
+ "description": "What documentation the vetter relies on, in the same tokens as vetting/request's `acceptsDocumentation` — `passport`, `nationalId`, `driverLicence`, `none`, or another lowerCamelCase class. The vetter's own choice; empty says nothing either way."
389
+ },
390
+ "VettingDocumentation": {
391
+ "title": "VettingDocumentation",
392
+ "type": "string",
393
+ "minLength": 1,
394
+ "maxLength": 64,
395
+ "pattern": "^[a-z][a-zA-Z0-9]*$",
396
+ "description": "A class of documentation, named in lowerCamelCase. Open rather than enumerated, because what documentation a vetter accepts is each vetter's own choice. Well-known values: `passport`, `nationalId`, `driverLicence`, and `none` — the vetter will attest without a document, which is the `priorAcquaintance` case. Only the class ever travels — never a document number, an image, an issuing authority or an expiry date. `none` states a policy (what a vetter accepts); a record of what was relied on expresses 'no document' as an empty list instead."
397
+ },
398
+ "VetterMethods": {
399
+ "title": "VetterMethods",
400
+ "type": "array",
401
+ "minItems": 1,
402
+ "maxItems": 3,
403
+ "uniqueItems": true,
404
+ "items": {
405
+ "$ref": "#/$defs/VettingMethod"
406
+ },
407
+ "description": "The methods the vetter offers, from `inPerson`, `video`, `priorAcquaintance`."
408
+ },
409
+ "VettingMethod": {
410
+ "title": "VettingMethod",
411
+ "type": "string",
412
+ "enum": [
413
+ "inPerson",
414
+ "video",
415
+ "priorAcquaintance"
416
+ ],
417
+ "description": "How the vetter established that the person they checked is the person controlling the applicant's DID. `inPerson` — both people were physically together. `video` — a live, two-way video call. `priorAcquaintance` — the vetter has known or worked with this person over a period, and attests from that knowledge rather than from a document. A method is a description of what happened, not an assurance level: which methods count, and how many of each, is community policy."
418
+ },
419
+ "LanguageTag": {
420
+ "title": "LanguageTag",
421
+ "type": "string",
422
+ "minLength": 2,
423
+ "maxLength": 35,
424
+ "pattern": "^[A-Za-z]{2,3}(-[A-Za-z0-9]{1,8})*$",
425
+ "description": "A BCP 47 language tag, e.g. `en`, `de-AT`. Compared case-insensitively."
426
+ },
427
+ "VetterDisplayName": {
428
+ "title": "VetterDisplayName",
429
+ "type": "string",
430
+ "minLength": 1,
431
+ "maxLength": 128,
432
+ "description": "The name the vetter chooses to be listed under. Self-asserted and unverified: it is not the name on any document, and a client MUST attribute it to the vetter."
433
+ }
434
+ }
435
+ } as const;
436
+
437
+ /** As {@link PAYLOAD_SCHEMA}, for the success-response variant. */
438
+ export const RESPONSE_PAYLOAD_SCHEMA = {
439
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
440
+ "$ref": "#/$defs/Response",
441
+ "$defs": {
442
+ "Response": {
443
+ "$anchor": "response",
444
+ "title": "VTC Vetting — Vetters Profile — response payload",
445
+ "description": "The community stored the profile.",
446
+ "type": "object",
447
+ "additionalProperties": false,
448
+ "required": [
449
+ "listed",
450
+ "updatedAt"
451
+ ],
452
+ "properties": {
453
+ "listed": {
454
+ "type": "boolean",
455
+ "description": "The stored profile's `listed` value."
456
+ },
457
+ "updatedAt": {
458
+ "type": "string",
459
+ "format": "date-time",
460
+ "description": "When the community stored this profile. vtc/vetting/vetters/list returns the same value."
461
+ }
462
+ }
463
+ },
464
+ "Ext": {
465
+ "title": "Ext",
466
+ "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.",
467
+ "type": "object",
468
+ "minProperties": 1,
469
+ "additionalProperties": true,
470
+ "propertyNames": {
471
+ "pattern": "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$"
472
+ }
473
+ },
474
+ "VetterEvent": {
475
+ "title": "VetterEvent",
476
+ "type": "object",
477
+ "additionalProperties": false,
478
+ "required": [
479
+ "name",
480
+ "startDate",
481
+ "endDate"
482
+ ],
483
+ "properties": {
484
+ "name": {
485
+ "type": "string",
486
+ "minLength": 1,
487
+ "maxLength": 200,
488
+ "description": "The event's name, e.g. `Linux Plumbers Conference 2026`."
489
+ },
490
+ "startDate": {
491
+ "$ref": "#/$defs/CalendarDate"
492
+ },
493
+ "endDate": {
494
+ "$ref": "#/$defs/CalendarDate"
495
+ },
496
+ "location": {
497
+ "$ref": "#/$defs/VetterLocation"
498
+ },
499
+ "url": {
500
+ "type": "string",
501
+ "format": "uri",
502
+ "pattern": "^https://",
503
+ "maxLength": 2048,
504
+ "description": "OPTIONAL. The event's own https page."
505
+ }
506
+ },
507
+ "description": "An event the vetter will attend and vet at. `endDate` is on or after `startDate` and no more than 31 days after it; JSON Schema cannot compare two members, so the community checks both and refuses a violation with `malformedRequest`."
508
+ },
509
+ "VetterLocation": {
510
+ "title": "VetterLocation",
511
+ "type": "object",
512
+ "additionalProperties": false,
513
+ "required": [
514
+ "country"
515
+ ],
516
+ "properties": {
517
+ "country": {
518
+ "$ref": "#/$defs/CountryCode"
519
+ },
520
+ "region": {
521
+ "$ref": "#/$defs/PlaceName"
522
+ },
523
+ "city": {
524
+ "$ref": "#/$defs/PlaceName"
525
+ }
526
+ },
527
+ "description": "Where a vetter can meet people, as coarse as the vetter chooses: a country, optionally a region, optionally a city. Never a street address."
528
+ },
529
+ "PlaceName": {
530
+ "title": "PlaceName",
531
+ "type": "string",
532
+ "minLength": 1,
533
+ "maxLength": 128,
534
+ "description": "A region or city name as the vetter writes it. Compared case-insensitively and otherwise exactly."
535
+ },
536
+ "CountryCode": {
537
+ "title": "CountryCode",
538
+ "type": "string",
539
+ "pattern": "^[A-Z]{2}$",
540
+ "description": "An ISO 3166-1 alpha-2 country code, upper case, e.g. `DE`."
541
+ },
542
+ "CalendarDate": {
543
+ "title": "CalendarDate",
544
+ "type": "string",
545
+ "format": "date",
546
+ "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$",
547
+ "description": "A calendar date, `YYYY-MM-DD` (RFC 3339 full-date), with no time or zone. Compared as a UTC date."
548
+ },
549
+ "VetterContactHint": {
550
+ "title": "VetterContactHint",
551
+ "type": "string",
552
+ "minLength": 1,
553
+ "maxLength": 300,
554
+ "description": "Vetter-authored free text on how to obtain a ticket from them, e.g. `Find me at the OpenVTC booth`. A hint, not an address a request can be sent to: vetting/request still needs a ticket or an introduction the vetter accepts."
555
+ },
556
+ "VetterAvailability": {
557
+ "title": "VetterAvailability",
558
+ "type": "string",
559
+ "minLength": 1,
560
+ "maxLength": 500,
561
+ "description": "Vetter-authored free text on when they are available to vet. Attributed to the vetter."
562
+ },
563
+ "VetterAcceptsDocumentation": {
564
+ "title": "VetterAcceptsDocumentation",
565
+ "type": "array",
566
+ "maxItems": 16,
567
+ "uniqueItems": true,
568
+ "items": {
569
+ "$ref": "#/$defs/VettingDocumentation"
570
+ },
571
+ "description": "What documentation the vetter relies on, in the same tokens as vetting/request's `acceptsDocumentation` — `passport`, `nationalId`, `driverLicence`, `none`, or another lowerCamelCase class. The vetter's own choice; empty says nothing either way."
572
+ },
573
+ "VettingDocumentation": {
574
+ "title": "VettingDocumentation",
575
+ "type": "string",
576
+ "minLength": 1,
577
+ "maxLength": 64,
578
+ "pattern": "^[a-z][a-zA-Z0-9]*$",
579
+ "description": "A class of documentation, named in lowerCamelCase. Open rather than enumerated, because what documentation a vetter accepts is each vetter's own choice. Well-known values: `passport`, `nationalId`, `driverLicence`, and `none` — the vetter will attest without a document, which is the `priorAcquaintance` case. Only the class ever travels — never a document number, an image, an issuing authority or an expiry date. `none` states a policy (what a vetter accepts); a record of what was relied on expresses 'no document' as an empty list instead."
580
+ },
581
+ "VetterMethods": {
582
+ "title": "VetterMethods",
583
+ "type": "array",
584
+ "minItems": 1,
585
+ "maxItems": 3,
586
+ "uniqueItems": true,
587
+ "items": {
588
+ "$ref": "#/$defs/VettingMethod"
589
+ },
590
+ "description": "The methods the vetter offers, from `inPerson`, `video`, `priorAcquaintance`."
591
+ },
592
+ "VettingMethod": {
593
+ "title": "VettingMethod",
594
+ "type": "string",
595
+ "enum": [
596
+ "inPerson",
597
+ "video",
598
+ "priorAcquaintance"
599
+ ],
600
+ "description": "How the vetter established that the person they checked is the person controlling the applicant's DID. `inPerson` — both people were physically together. `video` — a live, two-way video call. `priorAcquaintance` — the vetter has known or worked with this person over a period, and attests from that knowledge rather than from a document. A method is a description of what happened, not an assurance level: which methods count, and how many of each, is community policy."
601
+ },
602
+ "LanguageTag": {
603
+ "title": "LanguageTag",
604
+ "type": "string",
605
+ "minLength": 2,
606
+ "maxLength": 35,
607
+ "pattern": "^[A-Za-z]{2,3}(-[A-Za-z0-9]{1,8})*$",
608
+ "description": "A BCP 47 language tag, e.g. `en`, `de-AT`. Compared case-insensitively."
609
+ },
610
+ "VetterDisplayName": {
611
+ "title": "VetterDisplayName",
612
+ "type": "string",
613
+ "minLength": 1,
614
+ "maxLength": 128,
615
+ "description": "The name the vetter chooses to be listed under. Self-asserted and unverified: it is not the name on any document, and a client MUST attribute it to the vetter."
616
+ }
617
+ }
618
+ } as const;
619
+
620
+ /**
621
+ * SPEC.md §7.2 policy for the request variant, from this specification's
622
+ * front matter. Pass to `consumeInbound` — items 5b, 7 and 8 are
623
+ * per-specification and cannot be derived from the document alone, and
624
+ * item 2 needs the schema this carries.
625
+ */
626
+ export const SPEC = {
627
+ typeUri: TYPE_URI,
628
+ isBearer: false,
629
+ isProofRequired: false,
630
+ isRecipientRequired: true,
631
+ isIssuedAtRequired: true,
632
+ payloadSchema: PAYLOAD_SCHEMA,
633
+ } as const;
634
+
635
+ /**
636
+ * SPEC.md §7.2 policy for the success-response variant. `isRecipientRequired`
637
+ * tracks the *issuer* party's requirement because a response swaps the
638
+ * parties (§7.3 item 5).
639
+ */
640
+ export const RESPONSE_SPEC = {
641
+ typeUri: RESPONSE_TYPE_URI,
642
+ isBearer: false,
643
+ isProofRequired: false,
644
+ isRecipientRequired: true,
645
+ isIssuedAtRequired: true,
646
+ payloadSchema: RESPONSE_PAYLOAD_SCHEMA,
647
+ } as const;