@openvtc/trust-tasks 0.16.9 → 0.16.11
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/CHANGELOG.md +220 -0
- package/dist/_shared/components.d.ts +206 -5
- package/dist/_shared/components.d.ts.map +1 -1
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -1
- package/dist/persona/_shared/0.1/persona-record.d.ts +22 -0
- package/dist/persona/_shared/0.1/persona-record.d.ts.map +1 -0
- package/dist/persona/_shared/0.1/persona-record.js +6 -0
- package/dist/persona/_shared/0.1/persona-record.js.map +1 -0
- package/dist/persona/attribute/delete/1.0/payload.d.ts +351 -0
- package/dist/persona/attribute/delete/1.0/payload.d.ts.map +1 -0
- package/dist/persona/attribute/delete/1.0/payload.js +188 -0
- package/dist/persona/attribute/delete/1.0/payload.js.map +1 -0
- package/dist/persona/attribute/list/1.0/payload.d.ts +895 -0
- package/dist/persona/attribute/list/1.0/payload.d.ts.map +1 -0
- package/dist/persona/attribute/list/1.0/payload.js +530 -0
- package/dist/persona/attribute/list/1.0/payload.js.map +1 -0
- package/dist/persona/attribute/put/1.0/payload.d.ts +829 -0
- package/dist/persona/attribute/put/1.0/payload.d.ts.map +1 -0
- package/dist/persona/attribute/put/1.0/payload.js +487 -0
- package/dist/persona/attribute/put/1.0/payload.js.map +1 -0
- package/dist/persona/binding/get/1.0/payload.d.ts +382 -0
- package/dist/persona/binding/get/1.0/payload.d.ts.map +1 -0
- package/dist/persona/binding/get/1.0/payload.js +206 -0
- package/dist/persona/binding/get/1.0/payload.js.map +1 -0
- package/dist/persona/binding/list/1.0/payload.d.ts +387 -0
- package/dist/persona/binding/list/1.0/payload.d.ts.map +1 -0
- package/dist/persona/binding/list/1.0/payload.js +210 -0
- package/dist/persona/binding/list/1.0/payload.js.map +1 -0
- package/dist/persona/binding/set/1.0/payload.d.ts +545 -0
- package/dist/persona/binding/set/1.0/payload.d.ts.map +1 -0
- package/dist/persona/binding/set/1.0/payload.js +302 -0
- package/dist/persona/binding/set/1.0/payload.js.map +1 -0
- package/dist/persona/contact/delete/1.0/payload.d.ts +313 -0
- package/dist/persona/contact/delete/1.0/payload.d.ts.map +1 -0
- package/dist/persona/contact/delete/1.0/payload.js +174 -0
- package/dist/persona/contact/delete/1.0/payload.js.map +1 -0
- package/dist/persona/contact/get/1.0/payload.d.ts +1027 -0
- package/dist/persona/contact/get/1.0/payload.d.ts.map +1 -0
- package/dist/persona/contact/get/1.0/payload.js +606 -0
- package/dist/persona/contact/get/1.0/payload.js.map +1 -0
- package/dist/persona/contact/list/1.0/payload.d.ts +490 -0
- package/dist/persona/contact/list/1.0/payload.d.ts.map +1 -0
- package/dist/persona/contact/list/1.0/payload.js +262 -0
- package/dist/persona/contact/list/1.0/payload.js.map +1 -0
- package/dist/persona/contact/put/1.0/payload.d.ts +885 -0
- package/dist/persona/contact/put/1.0/payload.d.ts.map +1 -0
- package/dist/persona/contact/put/1.0/payload.js +518 -0
- package/dist/persona/contact/put/1.0/payload.js.map +1 -0
- package/dist/persona/correlation/analyze/1.0/payload.d.ts +648 -0
- package/dist/persona/correlation/analyze/1.0/payload.d.ts.map +1 -0
- package/dist/persona/correlation/analyze/1.0/payload.js +338 -0
- package/dist/persona/correlation/analyze/1.0/payload.js.map +1 -0
- package/dist/persona/disclosure/history/1.0/payload.d.ts +639 -0
- package/dist/persona/disclosure/history/1.0/payload.d.ts.map +1 -0
- package/dist/persona/disclosure/history/1.0/payload.js +339 -0
- package/dist/persona/disclosure/history/1.0/payload.js.map +1 -0
- package/dist/persona/disclosure/present/1.0/payload.d.ts +400 -0
- package/dist/persona/disclosure/present/1.0/payload.d.ts.map +1 -0
- package/dist/persona/disclosure/present/1.0/payload.js +211 -0
- package/dist/persona/disclosure/present/1.0/payload.js.map +1 -0
- package/dist/persona/disclosure/preview/1.0/payload.d.ts +858 -0
- package/dist/persona/disclosure/preview/1.0/payload.d.ts.map +1 -0
- package/dist/persona/disclosure/preview/1.0/payload.js +480 -0
- package/dist/persona/disclosure/preview/1.0/payload.js.map +1 -0
- package/dist/persona/local/binding/set/1.0/payload.d.ts +394 -0
- package/dist/persona/local/binding/set/1.0/payload.d.ts.map +1 -0
- package/dist/persona/local/binding/set/1.0/payload.js +226 -0
- package/dist/persona/local/binding/set/1.0/payload.js.map +1 -0
- package/dist/persona/local/profile/delete/1.0/payload.d.ts +311 -0
- package/dist/persona/local/profile/delete/1.0/payload.d.ts.map +1 -0
- package/dist/persona/local/profile/delete/1.0/payload.js +173 -0
- package/dist/persona/local/profile/delete/1.0/payload.js.map +1 -0
- package/dist/persona/local/profile/get/1.0/payload.d.ts +368 -0
- package/dist/persona/local/profile/get/1.0/payload.d.ts.map +1 -0
- package/dist/persona/local/profile/get/1.0/payload.js +210 -0
- package/dist/persona/local/profile/get/1.0/payload.js.map +1 -0
- package/dist/persona/local/profile/list/1.0/payload.d.ts +387 -0
- package/dist/persona/local/profile/list/1.0/payload.d.ts.map +1 -0
- package/dist/persona/local/profile/list/1.0/payload.js +214 -0
- package/dist/persona/local/profile/list/1.0/payload.js.map +1 -0
- package/dist/persona/local/profile/put/1.0/payload.d.ts +545 -0
- package/dist/persona/local/profile/put/1.0/payload.d.ts.map +1 -0
- package/dist/persona/local/profile/put/1.0/payload.js +315 -0
- package/dist/persona/local/profile/put/1.0/payload.js.map +1 -0
- package/dist/persona/profile/delete/1.0/payload.d.ts +350 -0
- package/dist/persona/profile/delete/1.0/payload.d.ts.map +1 -0
- package/dist/persona/profile/delete/1.0/payload.js +189 -0
- package/dist/persona/profile/delete/1.0/payload.js.map +1 -0
- package/dist/persona/profile/get/1.0/payload.d.ts +1307 -0
- package/dist/persona/profile/get/1.0/payload.d.ts.map +1 -0
- package/dist/persona/profile/get/1.0/payload.js +802 -0
- package/dist/persona/profile/get/1.0/payload.js.map +1 -0
- package/dist/persona/profile/list/1.0/payload.d.ts +1120 -0
- package/dist/persona/profile/list/1.0/payload.d.ts.map +1 -0
- package/dist/persona/profile/list/1.0/payload.js +680 -0
- package/dist/persona/profile/list/1.0/payload.js.map +1 -0
- package/dist/persona/profile/put/1.0/payload.d.ts +1115 -0
- package/dist/persona/profile/put/1.0/payload.d.ts.map +1 -0
- package/dist/persona/profile/put/1.0/payload.js +675 -0
- package/dist/persona/profile/put/1.0/payload.js.map +1 -0
- package/dist/persona/renderers/list/1.0/payload.d.ts +362 -0
- package/dist/persona/renderers/list/1.0/payload.d.ts.map +1 -0
- package/dist/persona/renderers/list/1.0/payload.js +197 -0
- package/dist/persona/renderers/list/1.0/payload.js.map +1 -0
- package/dist/rooms/owner/claim/0.1/payload.d.ts +391 -0
- package/dist/rooms/owner/claim/0.1/payload.d.ts.map +1 -0
- package/dist/rooms/owner/claim/0.1/payload.js +214 -0
- package/dist/rooms/owner/claim/0.1/payload.js.map +1 -0
- package/dist/rooms/owner/transfer/0.1/payload.d.ts +391 -0
- package/dist/rooms/owner/transfer/0.1/payload.d.ts.map +1 -0
- package/dist/rooms/owner/transfer/0.1/payload.js +214 -0
- package/dist/rooms/owner/transfer/0.1/payload.js.map +1 -0
- package/dist/vta/_shared/0.1/app-state-record.d.ts +1 -1
- package/dist/vta/_shared/0.1/app-state-record.d.ts.map +1 -1
- package/dist/vta/app-state/delete/1.0/payload.d.ts +1 -1
- package/dist/vta/app-state/delete/1.0/payload.d.ts.map +1 -1
- package/dist/vta/app-state/get/1.0/payload.d.ts +1 -1
- package/dist/vta/app-state/get/1.0/payload.d.ts.map +1 -1
- package/dist/vta/app-state/get-many/1.0/payload.d.ts +1 -1
- package/dist/vta/app-state/get-many/1.0/payload.d.ts.map +1 -1
- package/dist/vta/app-state/list/1.0/payload.d.ts +1 -1
- package/dist/vta/app-state/list/1.0/payload.d.ts.map +1 -1
- package/dist/vta/app-state/put/1.0/payload.d.ts +1 -1
- package/dist/vta/app-state/put/1.0/payload.d.ts.map +1 -1
- package/dist/vta/app-state/put-many/1.0/payload.d.ts +1 -1
- package/dist/vta/app-state/put-many/1.0/payload.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/_shared/components.ts +213 -5
- package/src/index.ts +27 -0
- package/src/persona/_shared/0.1/persona-record.ts +23 -0
- package/src/persona/attribute/delete/1.0/payload.ts +238 -0
- package/src/persona/attribute/list/1.0/payload.ts +588 -0
- package/src/persona/attribute/put/1.0/payload.ts +559 -0
- package/src/persona/binding/get/1.0/payload.ts +257 -0
- package/src/persona/binding/list/1.0/payload.ts +260 -0
- package/src/persona/binding/set/1.0/payload.ts +370 -0
- package/src/persona/contact/delete/1.0/payload.ts +216 -0
- package/src/persona/contact/get/1.0/payload.ts +662 -0
- package/src/persona/contact/list/1.0/payload.ts +323 -0
- package/src/persona/contact/put/1.0/payload.ts +580 -0
- package/src/persona/correlation/analyze/1.0/payload.ts +466 -0
- package/src/persona/disclosure/history/1.0/payload.ts +415 -0
- package/src/persona/disclosure/present/1.0/payload.ts +274 -0
- package/src/persona/disclosure/preview/1.0/payload.ts +597 -0
- package/src/persona/local/binding/set/1.0/payload.ts +267 -0
- package/src/persona/local/profile/delete/1.0/payload.ts +215 -0
- package/src/persona/local/profile/get/1.0/payload.ts +251 -0
- package/src/persona/local/profile/list/1.0/payload.ts +260 -0
- package/src/persona/local/profile/put/1.0/payload.ts +373 -0
- package/src/persona/profile/delete/1.0/payload.ts +236 -0
- package/src/persona/profile/get/1.0/payload.ts +844 -0
- package/src/persona/profile/list/1.0/payload.ts +723 -0
- package/src/persona/profile/put/1.0/payload.ts +741 -0
- package/src/persona/renderers/list/1.0/payload.ts +248 -0
- package/src/rooms/owner/claim/0.1/payload.ts +268 -0
- package/src/rooms/owner/transfer/0.1/payload.ts +268 -0
- package/src/vta/_shared/0.1/app-state-record.ts +1 -1
- package/src/vta/app-state/delete/1.0/payload.ts +1 -1
- package/src/vta/app-state/get/1.0/payload.ts +1 -1
- package/src/vta/app-state/get-many/1.0/payload.ts +1 -1
- package/src/vta/app-state/list/1.0/payload.ts +1 -1
- package/src/vta/app-state/put/1.0/payload.ts +1 -1
- package/src/vta/app-state/put-many/1.0/payload.ts +1 -1
|
@@ -0,0 +1,858 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated by scripts/build-ts-bindings.mjs — DO NOT EDIT BY HAND.
|
|
3
|
+
* Source: specs/persona/disclosure/preview/1.0/payload.schema.json
|
|
4
|
+
*/
|
|
5
|
+
import type { ClaimType, Ext, ProofRung, Ulid } from "../../../../_shared/components.js";
|
|
6
|
+
/**
|
|
7
|
+
* Determine exactly what a disclosure would reveal, and to whom, without signing or sending anything. The first of two calls that cannot be collapsed: there is no path to a disclosure that did not first produce the summary a human can be shown.
|
|
8
|
+
*/
|
|
9
|
+
export interface PersonaDisclosurePreviewPayload {
|
|
10
|
+
contextId: string;
|
|
11
|
+
/**
|
|
12
|
+
* The persona that would present. Its binding supplies the profile.
|
|
13
|
+
*/
|
|
14
|
+
personaDid: string;
|
|
15
|
+
/**
|
|
16
|
+
* Who would receive it. Required, and not optional, because half of what a preview says is who is asking — a preview that could not name the recipient would be a list of fields rather than a decision.
|
|
17
|
+
*/
|
|
18
|
+
verifierDid: string;
|
|
19
|
+
/**
|
|
20
|
+
* The verifier's stated reason, carried through to the preview and the disclosure record so a holder deciding later has the same context as one deciding now.
|
|
21
|
+
*/
|
|
22
|
+
purpose?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Claim types the verifier asked for. Omit to preview everything the bound profile would present. A maintainer MUST NOT return a claim that was not requested when this member is present — narrowing is the caller's to ask for and the maintainer's to honour.
|
|
25
|
+
*
|
|
26
|
+
* @maxItems 128
|
|
27
|
+
*/
|
|
28
|
+
requestedClaims?: ClaimType[];
|
|
29
|
+
/**
|
|
30
|
+
* Which output format to prepare for. Omit for the maintainer's canonical form. The choice matters to the preview because renderers differ in what they can carry, and a holder is owed that before deciding.
|
|
31
|
+
*/
|
|
32
|
+
renderer?: string;
|
|
33
|
+
ext?: Ext;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Success response to persona/disclosure/preview. Type https://trusttasks.org/spec/persona/disclosure/preview/1.0#response. Signs nothing and sends nothing. The `previewId` returned here is consumed by persona/disclosure/present, which is the mechanism by which the two calls cannot be collapsed.
|
|
37
|
+
*/
|
|
38
|
+
export interface PersonaDisclosurePreviewResponsePayload {
|
|
39
|
+
/**
|
|
40
|
+
* Consumed by present. Single-use and short-lived: a preview a holder approved an hour ago is not evidence they approve it now, and one that could be replayed would let a second disclosure ride an earlier decision.
|
|
41
|
+
*/
|
|
42
|
+
previewId: Ulid;
|
|
43
|
+
/**
|
|
44
|
+
* The identifier that would appear as the subject of the disclosure. Pairwise by default — a fresh per-relationship DID rather than the persona DID — so that two verifiers cannot recognise the holder as the same party. The persona DID is the account; this is the face.
|
|
45
|
+
*/
|
|
46
|
+
subject: string;
|
|
47
|
+
/**
|
|
48
|
+
* @maxItems 128
|
|
49
|
+
*/
|
|
50
|
+
claims: {
|
|
51
|
+
type: ClaimType;
|
|
52
|
+
/**
|
|
53
|
+
* What would be disclosed. Absent for a predicate claim, which discloses no value at all — that absence is the point and a consumer MUST NOT render it as missing data.
|
|
54
|
+
*/
|
|
55
|
+
value?: {
|
|
56
|
+
[k: string]: unknown | undefined;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Present instead of `value` when the claim would be proven rather than shown, e.g. that a date of birth implies an age threshold. The underlying attribute stays in the pool; the predicate is a disclosure-time projection over it, which is what keeps the pool from filling with derived facts that are all the same fact asked differently.
|
|
60
|
+
*/
|
|
61
|
+
predicate?: {
|
|
62
|
+
op: "gte" | "gt" | "lte" | "lt" | "eq" | "ne" | "memberOf";
|
|
63
|
+
arg: unknown;
|
|
64
|
+
over?: ClaimType;
|
|
65
|
+
};
|
|
66
|
+
provenance: "selfAsserted" | "credentialBacked" | "generated";
|
|
67
|
+
rung: ProofRung;
|
|
68
|
+
/**
|
|
69
|
+
* True when this verifier has not previously received this claim type from this persona. What makes a preview rankable rather than a flat list — a holder needs the unusual ask to stand out from the routine one.
|
|
70
|
+
*/
|
|
71
|
+
newToThisVerifier?: boolean;
|
|
72
|
+
/**
|
|
73
|
+
* True when a credential-backed claim could not be re-derived. Such a claim MUST NOT be disclosed; it is shown in the preview so the holder learns why the disclosure will be short.
|
|
74
|
+
*/
|
|
75
|
+
stale?: boolean;
|
|
76
|
+
}[];
|
|
77
|
+
/**
|
|
78
|
+
* The output format and, crucially, what it cannot carry. Lossiness is DECLARED rather than discovered: a holder is owed 'this verifier will see your work number but not that your employer attested it' before deciding, not after.
|
|
79
|
+
*/
|
|
80
|
+
renderer?: {
|
|
81
|
+
id: string;
|
|
82
|
+
/**
|
|
83
|
+
* What this renderer discards — commonly provenance. Empty for a lossless renderer.
|
|
84
|
+
*
|
|
85
|
+
* @maxItems 32
|
|
86
|
+
*/
|
|
87
|
+
drops: string[];
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* How much this disclosure would link the holder. Note the inversion that is easy to get backwards: a credential presented WHOLE correlates more than a self-asserted value, because the issuer signature is identical at every verifier — while a derived proof correlates LESS, because it differs on every presentation. Severity is therefore a function of value and rung together, not of provenance alone.
|
|
91
|
+
*/
|
|
92
|
+
correlation?: {
|
|
93
|
+
severity: "none" | "low" | "high";
|
|
94
|
+
reason?: string;
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* Claim types unusual for this verifier's stated purpose. A preview that lists fourteen fields with fourteen equal weights is a notice-and-consent dialog, which is the pattern that trains people to click through; ranking by what is out of place is what makes the surfaced line the one worth reading.
|
|
98
|
+
*
|
|
99
|
+
* @maxItems 128
|
|
100
|
+
*/
|
|
101
|
+
anomalous?: ClaimType[];
|
|
102
|
+
expiresAt: string;
|
|
103
|
+
ext?: Ext;
|
|
104
|
+
}
|
|
105
|
+
/** Shared definitions this specification references, re-exported under the names it used to declare them with. */
|
|
106
|
+
export type { ClaimType, Ext, ProofRung, Ulid };
|
|
107
|
+
/** Trust Task type URI. */
|
|
108
|
+
export declare const TYPE_URI: "https://trusttasks.org/spec/persona/disclosure/preview/1.0";
|
|
109
|
+
/** Stable alias for this specification's request payload shape. */
|
|
110
|
+
export type Payload = PersonaDisclosurePreviewPayload;
|
|
111
|
+
/** Trust Task response type URI (request type URI + "#response"). */
|
|
112
|
+
export declare const RESPONSE_TYPE_URI: "https://trusttasks.org/spec/persona/disclosure/preview/1.0#response";
|
|
113
|
+
/** Stable alias for this specification's success-response payload shape. */
|
|
114
|
+
export type Response = PersonaDisclosurePreviewResponsePayload;
|
|
115
|
+
/**
|
|
116
|
+
* This specification's payload schema, as a value.
|
|
117
|
+
*
|
|
118
|
+
* SPEC.md §7.2 item 2 is performed against this. It is shipped as data
|
|
119
|
+
* rather than only as a `.json` file because TypeScript types are erased
|
|
120
|
+
* at runtime: without a schema a consumer has nothing to validate, and
|
|
121
|
+
* every REQUIRED payload member is optional in practice. Cross-file
|
|
122
|
+
* `$ref`s are already inlined, so it needs no resolver.
|
|
123
|
+
*/
|
|
124
|
+
export declare const PAYLOAD_SCHEMA: {
|
|
125
|
+
readonly $schema: "https://json-schema.org/draft/2020-12/schema";
|
|
126
|
+
readonly $id: "https://trusttasks.org/spec/persona/disclosure/preview/1.0";
|
|
127
|
+
readonly title: "Persona Disclosure Preview — payload";
|
|
128
|
+
readonly description: "Determine exactly what a disclosure would reveal, and to whom, without signing or sending anything. The first of two calls that cannot be collapsed: there is no path to a disclosure that did not first produce the summary a human can be shown.";
|
|
129
|
+
readonly type: "object";
|
|
130
|
+
readonly additionalProperties: false;
|
|
131
|
+
readonly required: readonly ["contextId", "personaDid", "verifierDid"];
|
|
132
|
+
readonly properties: {
|
|
133
|
+
readonly contextId: {
|
|
134
|
+
readonly type: "string";
|
|
135
|
+
readonly minLength: 1;
|
|
136
|
+
};
|
|
137
|
+
readonly personaDid: {
|
|
138
|
+
readonly type: "string";
|
|
139
|
+
readonly minLength: 1;
|
|
140
|
+
readonly maxLength: 2048;
|
|
141
|
+
readonly description: "The persona that would present. Its binding supplies the profile.";
|
|
142
|
+
};
|
|
143
|
+
readonly verifierDid: {
|
|
144
|
+
readonly type: "string";
|
|
145
|
+
readonly minLength: 1;
|
|
146
|
+
readonly maxLength: 2048;
|
|
147
|
+
readonly description: "Who would receive it. Required, and not optional, because half of what a preview says is who is asking — a preview that could not name the recipient would be a list of fields rather than a decision.";
|
|
148
|
+
};
|
|
149
|
+
readonly purpose: {
|
|
150
|
+
readonly type: "string";
|
|
151
|
+
readonly maxLength: 512;
|
|
152
|
+
readonly description: "The verifier's stated reason, carried through to the preview and the disclosure record so a holder deciding later has the same context as one deciding now.";
|
|
153
|
+
};
|
|
154
|
+
readonly requestedClaims: {
|
|
155
|
+
readonly type: "array";
|
|
156
|
+
readonly maxItems: 128;
|
|
157
|
+
readonly items: {
|
|
158
|
+
readonly $ref: "#/$defs/ClaimType";
|
|
159
|
+
};
|
|
160
|
+
readonly description: "Claim types the verifier asked for. Omit to preview everything the bound profile would present. A maintainer MUST NOT return a claim that was not requested when this member is present — narrowing is the caller's to ask for and the maintainer's to honour.";
|
|
161
|
+
};
|
|
162
|
+
readonly renderer: {
|
|
163
|
+
readonly type: "string";
|
|
164
|
+
readonly maxLength: 64;
|
|
165
|
+
readonly description: "Which output format to prepare for. Omit for the maintainer's canonical form. The choice matters to the preview because renderers differ in what they can carry, and a holder is owed that before deciding.";
|
|
166
|
+
};
|
|
167
|
+
readonly ext: {
|
|
168
|
+
readonly $ref: "#/$defs/Ext";
|
|
169
|
+
};
|
|
170
|
+
};
|
|
171
|
+
readonly $defs: {
|
|
172
|
+
readonly Response: {
|
|
173
|
+
readonly $anchor: "response";
|
|
174
|
+
readonly title: "Persona Disclosure Preview — response payload";
|
|
175
|
+
readonly description: "Success response to persona/disclosure/preview. Type https://trusttasks.org/spec/persona/disclosure/preview/1.0#response. Signs nothing and sends nothing. The `previewId` returned here is consumed by persona/disclosure/present, which is the mechanism by which the two calls cannot be collapsed.";
|
|
176
|
+
readonly type: "object";
|
|
177
|
+
readonly additionalProperties: false;
|
|
178
|
+
readonly required: readonly ["previewId", "subject", "claims", "expiresAt"];
|
|
179
|
+
readonly properties: {
|
|
180
|
+
readonly previewId: {
|
|
181
|
+
readonly $ref: "#/$defs/Ulid";
|
|
182
|
+
readonly description: "Consumed by present. Single-use and short-lived: a preview a holder approved an hour ago is not evidence they approve it now, and one that could be replayed would let a second disclosure ride an earlier decision.";
|
|
183
|
+
};
|
|
184
|
+
readonly subject: {
|
|
185
|
+
readonly type: "string";
|
|
186
|
+
readonly minLength: 1;
|
|
187
|
+
readonly description: "The identifier that would appear as the subject of the disclosure. Pairwise by default — a fresh per-relationship DID rather than the persona DID — so that two verifiers cannot recognise the holder as the same party. The persona DID is the account; this is the face.";
|
|
188
|
+
};
|
|
189
|
+
readonly claims: {
|
|
190
|
+
readonly type: "array";
|
|
191
|
+
readonly maxItems: 128;
|
|
192
|
+
readonly items: {
|
|
193
|
+
readonly type: "object";
|
|
194
|
+
readonly additionalProperties: false;
|
|
195
|
+
readonly required: readonly ["type", "provenance", "rung"];
|
|
196
|
+
readonly properties: {
|
|
197
|
+
readonly type: {
|
|
198
|
+
readonly $ref: "#/$defs/ClaimType";
|
|
199
|
+
};
|
|
200
|
+
readonly value: {
|
|
201
|
+
readonly description: "What would be disclosed. Absent for a predicate claim, which discloses no value at all — that absence is the point and a consumer MUST NOT render it as missing data.";
|
|
202
|
+
};
|
|
203
|
+
readonly predicate: {
|
|
204
|
+
readonly type: "object";
|
|
205
|
+
readonly additionalProperties: false;
|
|
206
|
+
readonly required: readonly ["op", "arg"];
|
|
207
|
+
readonly description: "Present instead of `value` when the claim would be proven rather than shown, e.g. that a date of birth implies an age threshold. The underlying attribute stays in the pool; the predicate is a disclosure-time projection over it, which is what keeps the pool from filling with derived facts that are all the same fact asked differently.";
|
|
208
|
+
readonly properties: {
|
|
209
|
+
readonly op: {
|
|
210
|
+
readonly type: "string";
|
|
211
|
+
readonly enum: readonly ["gte", "gt", "lte", "lt", "eq", "ne", "memberOf"];
|
|
212
|
+
};
|
|
213
|
+
readonly arg: {};
|
|
214
|
+
readonly over: {
|
|
215
|
+
readonly $ref: "#/$defs/ClaimType";
|
|
216
|
+
};
|
|
217
|
+
};
|
|
218
|
+
};
|
|
219
|
+
readonly provenance: {
|
|
220
|
+
readonly type: "string";
|
|
221
|
+
readonly enum: readonly ["selfAsserted", "credentialBacked", "generated"];
|
|
222
|
+
};
|
|
223
|
+
readonly rung: {
|
|
224
|
+
readonly $ref: "#/$defs/ProofRung";
|
|
225
|
+
};
|
|
226
|
+
readonly newToThisVerifier: {
|
|
227
|
+
readonly type: "boolean";
|
|
228
|
+
readonly description: "True when this verifier has not previously received this claim type from this persona. What makes a preview rankable rather than a flat list — a holder needs the unusual ask to stand out from the routine one.";
|
|
229
|
+
};
|
|
230
|
+
readonly stale: {
|
|
231
|
+
readonly type: "boolean";
|
|
232
|
+
readonly description: "True when a credential-backed claim could not be re-derived. Such a claim MUST NOT be disclosed; it is shown in the preview so the holder learns why the disclosure will be short.";
|
|
233
|
+
};
|
|
234
|
+
};
|
|
235
|
+
};
|
|
236
|
+
};
|
|
237
|
+
readonly renderer: {
|
|
238
|
+
readonly type: "object";
|
|
239
|
+
readonly additionalProperties: false;
|
|
240
|
+
readonly required: readonly ["id", "drops"];
|
|
241
|
+
readonly description: "The output format and, crucially, what it cannot carry. Lossiness is DECLARED rather than discovered: a holder is owed 'this verifier will see your work number but not that your employer attested it' before deciding, not after.";
|
|
242
|
+
readonly properties: {
|
|
243
|
+
readonly id: {
|
|
244
|
+
readonly type: "string";
|
|
245
|
+
readonly maxLength: 64;
|
|
246
|
+
};
|
|
247
|
+
readonly drops: {
|
|
248
|
+
readonly type: "array";
|
|
249
|
+
readonly maxItems: 32;
|
|
250
|
+
readonly items: {
|
|
251
|
+
readonly type: "string";
|
|
252
|
+
readonly maxLength: 64;
|
|
253
|
+
};
|
|
254
|
+
readonly description: "What this renderer discards — commonly provenance. Empty for a lossless renderer.";
|
|
255
|
+
};
|
|
256
|
+
};
|
|
257
|
+
};
|
|
258
|
+
readonly correlation: {
|
|
259
|
+
readonly type: "object";
|
|
260
|
+
readonly additionalProperties: false;
|
|
261
|
+
readonly required: readonly ["severity"];
|
|
262
|
+
readonly description: "How much this disclosure would link the holder. Note the inversion that is easy to get backwards: a credential presented WHOLE correlates more than a self-asserted value, because the issuer signature is identical at every verifier — while a derived proof correlates LESS, because it differs on every presentation. Severity is therefore a function of value and rung together, not of provenance alone.";
|
|
263
|
+
readonly properties: {
|
|
264
|
+
readonly severity: {
|
|
265
|
+
readonly type: "string";
|
|
266
|
+
readonly enum: readonly ["none", "low", "high"];
|
|
267
|
+
};
|
|
268
|
+
readonly reason: {
|
|
269
|
+
readonly type: "string";
|
|
270
|
+
readonly maxLength: 512;
|
|
271
|
+
};
|
|
272
|
+
};
|
|
273
|
+
};
|
|
274
|
+
readonly anomalous: {
|
|
275
|
+
readonly type: "array";
|
|
276
|
+
readonly maxItems: 128;
|
|
277
|
+
readonly items: {
|
|
278
|
+
readonly $ref: "#/$defs/ClaimType";
|
|
279
|
+
};
|
|
280
|
+
readonly description: "Claim types unusual for this verifier's stated purpose. A preview that lists fourteen fields with fourteen equal weights is a notice-and-consent dialog, which is the pattern that trains people to click through; ranking by what is out of place is what makes the surfaced line the one worth reading.";
|
|
281
|
+
};
|
|
282
|
+
readonly expiresAt: {
|
|
283
|
+
readonly type: "string";
|
|
284
|
+
readonly format: "date-time";
|
|
285
|
+
};
|
|
286
|
+
readonly ext: {
|
|
287
|
+
readonly $ref: "#/$defs/Ext";
|
|
288
|
+
};
|
|
289
|
+
};
|
|
290
|
+
};
|
|
291
|
+
readonly Ext: {
|
|
292
|
+
readonly title: "Ext";
|
|
293
|
+
readonly 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.";
|
|
294
|
+
readonly type: "object";
|
|
295
|
+
readonly minProperties: 1;
|
|
296
|
+
readonly additionalProperties: true;
|
|
297
|
+
readonly propertyNames: {
|
|
298
|
+
readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$";
|
|
299
|
+
};
|
|
300
|
+
};
|
|
301
|
+
readonly ClaimType: {
|
|
302
|
+
readonly title: "ClaimType";
|
|
303
|
+
readonly description: "The vocabulary token naming what a value IS — `name.legal`, `phone.mobile`, `address.postal`, `person.birthDate`. Dotted, most-general segment first, so that a consumer with no knowledge of the specific token can still group by its prefix.\n\nThe token is the maintainer's own; no external vocabulary is primary. External vocabularies (vCard/jCard, OIDC standard claims, schema.org) are mappings applied at PRESENTATION by a renderer, not at rest, so that a query written in any of them can be matched without the store having to live inside any one of them.\n\nThe `x:` prefix is an open extension namespace and is not decoration. The closest prior art — Windows CardSpace's self-issued card — supported exactly fifteen predefined claim types with no extensibility, and that is the specific way it failed the requirement a holder actually has. An `x:` attribute stores, composes, binds and discloses exactly like a known one; it renders generically and matches only an explicit query.";
|
|
304
|
+
readonly type: "string";
|
|
305
|
+
readonly minLength: 1;
|
|
306
|
+
readonly maxLength: 128;
|
|
307
|
+
readonly pattern: "^(x:)?[a-z][a-zA-Z0-9]*(\\.[a-z][a-zA-Z0-9]*)*$";
|
|
308
|
+
};
|
|
309
|
+
readonly ProofRung: {
|
|
310
|
+
readonly title: "ProofRung";
|
|
311
|
+
readonly description: "How strongly a credential-backed claim is hidden when presented, ordered most private first. `predicate` proves a statement over a claim without disclosing the claim. `derived` discloses exactly the claims needed via an unlinkable derived proof, so two presentations cannot be joined. `selectiveDisclosure` discloses exactly the claims needed but carries the issuer's signature unchanged, so two presentations ARE linkable. `whole` discloses the entire credential.\n\nThe distinction between the first two and the last two is of kind, not degree: only `predicate` and `derived` avoid handing two verifiers a join key. A maintainer MUST default to the highest rung the credential's format supports, and MUST NOT silently fall to a lower one — a request that cannot be satisfied at the rung a producer asked for is refused, because a silent privacy downgrade discloses material the holder believed was hidden.";
|
|
312
|
+
readonly type: "string";
|
|
313
|
+
readonly enum: readonly ["predicate", "derived", "selectiveDisclosure", "whole"];
|
|
314
|
+
};
|
|
315
|
+
readonly Ulid: {
|
|
316
|
+
readonly title: "Ulid";
|
|
317
|
+
readonly description: "A ULID in Crockford base32, uppercase. Used for `attributeId` and `profileId`. Chosen over a UUID because the leading 48 bits are a timestamp, so a key-ordered scan of the store is also creation-ordered and a `list` needs no secondary sort. Server-assigned on create; a producer MAY supply one to make a create idempotent, and a maintainer MUST reject a supplied value that already exists rather than silently overwriting.";
|
|
318
|
+
readonly type: "string";
|
|
319
|
+
readonly pattern: "^[0-9A-HJKMNP-TV-Z]{26}$";
|
|
320
|
+
};
|
|
321
|
+
};
|
|
322
|
+
};
|
|
323
|
+
/** As {@link PAYLOAD_SCHEMA}, for the success-response variant. */
|
|
324
|
+
export declare const RESPONSE_PAYLOAD_SCHEMA: {
|
|
325
|
+
readonly $schema: "https://json-schema.org/draft/2020-12/schema";
|
|
326
|
+
readonly $ref: "#/$defs/Response";
|
|
327
|
+
readonly $defs: {
|
|
328
|
+
readonly Response: {
|
|
329
|
+
readonly $anchor: "response";
|
|
330
|
+
readonly title: "Persona Disclosure Preview — response payload";
|
|
331
|
+
readonly description: "Success response to persona/disclosure/preview. Type https://trusttasks.org/spec/persona/disclosure/preview/1.0#response. Signs nothing and sends nothing. The `previewId` returned here is consumed by persona/disclosure/present, which is the mechanism by which the two calls cannot be collapsed.";
|
|
332
|
+
readonly type: "object";
|
|
333
|
+
readonly additionalProperties: false;
|
|
334
|
+
readonly required: readonly ["previewId", "subject", "claims", "expiresAt"];
|
|
335
|
+
readonly properties: {
|
|
336
|
+
readonly previewId: {
|
|
337
|
+
readonly $ref: "#/$defs/Ulid";
|
|
338
|
+
readonly description: "Consumed by present. Single-use and short-lived: a preview a holder approved an hour ago is not evidence they approve it now, and one that could be replayed would let a second disclosure ride an earlier decision.";
|
|
339
|
+
};
|
|
340
|
+
readonly subject: {
|
|
341
|
+
readonly type: "string";
|
|
342
|
+
readonly minLength: 1;
|
|
343
|
+
readonly description: "The identifier that would appear as the subject of the disclosure. Pairwise by default — a fresh per-relationship DID rather than the persona DID — so that two verifiers cannot recognise the holder as the same party. The persona DID is the account; this is the face.";
|
|
344
|
+
};
|
|
345
|
+
readonly claims: {
|
|
346
|
+
readonly type: "array";
|
|
347
|
+
readonly maxItems: 128;
|
|
348
|
+
readonly items: {
|
|
349
|
+
readonly type: "object";
|
|
350
|
+
readonly additionalProperties: false;
|
|
351
|
+
readonly required: readonly ["type", "provenance", "rung"];
|
|
352
|
+
readonly properties: {
|
|
353
|
+
readonly type: {
|
|
354
|
+
readonly $ref: "#/$defs/ClaimType";
|
|
355
|
+
};
|
|
356
|
+
readonly value: {
|
|
357
|
+
readonly description: "What would be disclosed. Absent for a predicate claim, which discloses no value at all — that absence is the point and a consumer MUST NOT render it as missing data.";
|
|
358
|
+
};
|
|
359
|
+
readonly predicate: {
|
|
360
|
+
readonly type: "object";
|
|
361
|
+
readonly additionalProperties: false;
|
|
362
|
+
readonly required: readonly ["op", "arg"];
|
|
363
|
+
readonly description: "Present instead of `value` when the claim would be proven rather than shown, e.g. that a date of birth implies an age threshold. The underlying attribute stays in the pool; the predicate is a disclosure-time projection over it, which is what keeps the pool from filling with derived facts that are all the same fact asked differently.";
|
|
364
|
+
readonly properties: {
|
|
365
|
+
readonly op: {
|
|
366
|
+
readonly type: "string";
|
|
367
|
+
readonly enum: readonly ["gte", "gt", "lte", "lt", "eq", "ne", "memberOf"];
|
|
368
|
+
};
|
|
369
|
+
readonly arg: {};
|
|
370
|
+
readonly over: {
|
|
371
|
+
readonly $ref: "#/$defs/ClaimType";
|
|
372
|
+
};
|
|
373
|
+
};
|
|
374
|
+
};
|
|
375
|
+
readonly provenance: {
|
|
376
|
+
readonly type: "string";
|
|
377
|
+
readonly enum: readonly ["selfAsserted", "credentialBacked", "generated"];
|
|
378
|
+
};
|
|
379
|
+
readonly rung: {
|
|
380
|
+
readonly $ref: "#/$defs/ProofRung";
|
|
381
|
+
};
|
|
382
|
+
readonly newToThisVerifier: {
|
|
383
|
+
readonly type: "boolean";
|
|
384
|
+
readonly description: "True when this verifier has not previously received this claim type from this persona. What makes a preview rankable rather than a flat list — a holder needs the unusual ask to stand out from the routine one.";
|
|
385
|
+
};
|
|
386
|
+
readonly stale: {
|
|
387
|
+
readonly type: "boolean";
|
|
388
|
+
readonly description: "True when a credential-backed claim could not be re-derived. Such a claim MUST NOT be disclosed; it is shown in the preview so the holder learns why the disclosure will be short.";
|
|
389
|
+
};
|
|
390
|
+
};
|
|
391
|
+
};
|
|
392
|
+
};
|
|
393
|
+
readonly renderer: {
|
|
394
|
+
readonly type: "object";
|
|
395
|
+
readonly additionalProperties: false;
|
|
396
|
+
readonly required: readonly ["id", "drops"];
|
|
397
|
+
readonly description: "The output format and, crucially, what it cannot carry. Lossiness is DECLARED rather than discovered: a holder is owed 'this verifier will see your work number but not that your employer attested it' before deciding, not after.";
|
|
398
|
+
readonly properties: {
|
|
399
|
+
readonly id: {
|
|
400
|
+
readonly type: "string";
|
|
401
|
+
readonly maxLength: 64;
|
|
402
|
+
};
|
|
403
|
+
readonly drops: {
|
|
404
|
+
readonly type: "array";
|
|
405
|
+
readonly maxItems: 32;
|
|
406
|
+
readonly items: {
|
|
407
|
+
readonly type: "string";
|
|
408
|
+
readonly maxLength: 64;
|
|
409
|
+
};
|
|
410
|
+
readonly description: "What this renderer discards — commonly provenance. Empty for a lossless renderer.";
|
|
411
|
+
};
|
|
412
|
+
};
|
|
413
|
+
};
|
|
414
|
+
readonly correlation: {
|
|
415
|
+
readonly type: "object";
|
|
416
|
+
readonly additionalProperties: false;
|
|
417
|
+
readonly required: readonly ["severity"];
|
|
418
|
+
readonly description: "How much this disclosure would link the holder. Note the inversion that is easy to get backwards: a credential presented WHOLE correlates more than a self-asserted value, because the issuer signature is identical at every verifier — while a derived proof correlates LESS, because it differs on every presentation. Severity is therefore a function of value and rung together, not of provenance alone.";
|
|
419
|
+
readonly properties: {
|
|
420
|
+
readonly severity: {
|
|
421
|
+
readonly type: "string";
|
|
422
|
+
readonly enum: readonly ["none", "low", "high"];
|
|
423
|
+
};
|
|
424
|
+
readonly reason: {
|
|
425
|
+
readonly type: "string";
|
|
426
|
+
readonly maxLength: 512;
|
|
427
|
+
};
|
|
428
|
+
};
|
|
429
|
+
};
|
|
430
|
+
readonly anomalous: {
|
|
431
|
+
readonly type: "array";
|
|
432
|
+
readonly maxItems: 128;
|
|
433
|
+
readonly items: {
|
|
434
|
+
readonly $ref: "#/$defs/ClaimType";
|
|
435
|
+
};
|
|
436
|
+
readonly description: "Claim types unusual for this verifier's stated purpose. A preview that lists fourteen fields with fourteen equal weights is a notice-and-consent dialog, which is the pattern that trains people to click through; ranking by what is out of place is what makes the surfaced line the one worth reading.";
|
|
437
|
+
};
|
|
438
|
+
readonly expiresAt: {
|
|
439
|
+
readonly type: "string";
|
|
440
|
+
readonly format: "date-time";
|
|
441
|
+
};
|
|
442
|
+
readonly ext: {
|
|
443
|
+
readonly $ref: "#/$defs/Ext";
|
|
444
|
+
};
|
|
445
|
+
};
|
|
446
|
+
};
|
|
447
|
+
readonly Ext: {
|
|
448
|
+
readonly title: "Ext";
|
|
449
|
+
readonly 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.";
|
|
450
|
+
readonly type: "object";
|
|
451
|
+
readonly minProperties: 1;
|
|
452
|
+
readonly additionalProperties: true;
|
|
453
|
+
readonly propertyNames: {
|
|
454
|
+
readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$";
|
|
455
|
+
};
|
|
456
|
+
};
|
|
457
|
+
readonly ClaimType: {
|
|
458
|
+
readonly title: "ClaimType";
|
|
459
|
+
readonly description: "The vocabulary token naming what a value IS — `name.legal`, `phone.mobile`, `address.postal`, `person.birthDate`. Dotted, most-general segment first, so that a consumer with no knowledge of the specific token can still group by its prefix.\n\nThe token is the maintainer's own; no external vocabulary is primary. External vocabularies (vCard/jCard, OIDC standard claims, schema.org) are mappings applied at PRESENTATION by a renderer, not at rest, so that a query written in any of them can be matched without the store having to live inside any one of them.\n\nThe `x:` prefix is an open extension namespace and is not decoration. The closest prior art — Windows CardSpace's self-issued card — supported exactly fifteen predefined claim types with no extensibility, and that is the specific way it failed the requirement a holder actually has. An `x:` attribute stores, composes, binds and discloses exactly like a known one; it renders generically and matches only an explicit query.";
|
|
460
|
+
readonly type: "string";
|
|
461
|
+
readonly minLength: 1;
|
|
462
|
+
readonly maxLength: 128;
|
|
463
|
+
readonly pattern: "^(x:)?[a-z][a-zA-Z0-9]*(\\.[a-z][a-zA-Z0-9]*)*$";
|
|
464
|
+
};
|
|
465
|
+
readonly ProofRung: {
|
|
466
|
+
readonly title: "ProofRung";
|
|
467
|
+
readonly description: "How strongly a credential-backed claim is hidden when presented, ordered most private first. `predicate` proves a statement over a claim without disclosing the claim. `derived` discloses exactly the claims needed via an unlinkable derived proof, so two presentations cannot be joined. `selectiveDisclosure` discloses exactly the claims needed but carries the issuer's signature unchanged, so two presentations ARE linkable. `whole` discloses the entire credential.\n\nThe distinction between the first two and the last two is of kind, not degree: only `predicate` and `derived` avoid handing two verifiers a join key. A maintainer MUST default to the highest rung the credential's format supports, and MUST NOT silently fall to a lower one — a request that cannot be satisfied at the rung a producer asked for is refused, because a silent privacy downgrade discloses material the holder believed was hidden.";
|
|
468
|
+
readonly type: "string";
|
|
469
|
+
readonly enum: readonly ["predicate", "derived", "selectiveDisclosure", "whole"];
|
|
470
|
+
};
|
|
471
|
+
readonly Ulid: {
|
|
472
|
+
readonly title: "Ulid";
|
|
473
|
+
readonly description: "A ULID in Crockford base32, uppercase. Used for `attributeId` and `profileId`. Chosen over a UUID because the leading 48 bits are a timestamp, so a key-ordered scan of the store is also creation-ordered and a `list` needs no secondary sort. Server-assigned on create; a producer MAY supply one to make a create idempotent, and a maintainer MUST reject a supplied value that already exists rather than silently overwriting.";
|
|
474
|
+
readonly type: "string";
|
|
475
|
+
readonly pattern: "^[0-9A-HJKMNP-TV-Z]{26}$";
|
|
476
|
+
};
|
|
477
|
+
};
|
|
478
|
+
};
|
|
479
|
+
/**
|
|
480
|
+
* SPEC.md §7.2 policy for the request variant, from this specification's
|
|
481
|
+
* front matter. Pass to `consumeInbound` — items 5b, 7 and 8 are
|
|
482
|
+
* per-specification and cannot be derived from the document alone, and
|
|
483
|
+
* item 2 needs the schema this carries.
|
|
484
|
+
*/
|
|
485
|
+
export declare const SPEC: {
|
|
486
|
+
readonly typeUri: "https://trusttasks.org/spec/persona/disclosure/preview/1.0";
|
|
487
|
+
readonly isBearer: false;
|
|
488
|
+
readonly isProofRequired: true;
|
|
489
|
+
readonly isRecipientRequired: true;
|
|
490
|
+
readonly isIssuedAtRequired: true;
|
|
491
|
+
readonly payloadSchema: {
|
|
492
|
+
readonly $schema: "https://json-schema.org/draft/2020-12/schema";
|
|
493
|
+
readonly $id: "https://trusttasks.org/spec/persona/disclosure/preview/1.0";
|
|
494
|
+
readonly title: "Persona Disclosure Preview — payload";
|
|
495
|
+
readonly description: "Determine exactly what a disclosure would reveal, and to whom, without signing or sending anything. The first of two calls that cannot be collapsed: there is no path to a disclosure that did not first produce the summary a human can be shown.";
|
|
496
|
+
readonly type: "object";
|
|
497
|
+
readonly additionalProperties: false;
|
|
498
|
+
readonly required: readonly ["contextId", "personaDid", "verifierDid"];
|
|
499
|
+
readonly properties: {
|
|
500
|
+
readonly contextId: {
|
|
501
|
+
readonly type: "string";
|
|
502
|
+
readonly minLength: 1;
|
|
503
|
+
};
|
|
504
|
+
readonly personaDid: {
|
|
505
|
+
readonly type: "string";
|
|
506
|
+
readonly minLength: 1;
|
|
507
|
+
readonly maxLength: 2048;
|
|
508
|
+
readonly description: "The persona that would present. Its binding supplies the profile.";
|
|
509
|
+
};
|
|
510
|
+
readonly verifierDid: {
|
|
511
|
+
readonly type: "string";
|
|
512
|
+
readonly minLength: 1;
|
|
513
|
+
readonly maxLength: 2048;
|
|
514
|
+
readonly description: "Who would receive it. Required, and not optional, because half of what a preview says is who is asking — a preview that could not name the recipient would be a list of fields rather than a decision.";
|
|
515
|
+
};
|
|
516
|
+
readonly purpose: {
|
|
517
|
+
readonly type: "string";
|
|
518
|
+
readonly maxLength: 512;
|
|
519
|
+
readonly description: "The verifier's stated reason, carried through to the preview and the disclosure record so a holder deciding later has the same context as one deciding now.";
|
|
520
|
+
};
|
|
521
|
+
readonly requestedClaims: {
|
|
522
|
+
readonly type: "array";
|
|
523
|
+
readonly maxItems: 128;
|
|
524
|
+
readonly items: {
|
|
525
|
+
readonly $ref: "#/$defs/ClaimType";
|
|
526
|
+
};
|
|
527
|
+
readonly description: "Claim types the verifier asked for. Omit to preview everything the bound profile would present. A maintainer MUST NOT return a claim that was not requested when this member is present — narrowing is the caller's to ask for and the maintainer's to honour.";
|
|
528
|
+
};
|
|
529
|
+
readonly renderer: {
|
|
530
|
+
readonly type: "string";
|
|
531
|
+
readonly maxLength: 64;
|
|
532
|
+
readonly description: "Which output format to prepare for. Omit for the maintainer's canonical form. The choice matters to the preview because renderers differ in what they can carry, and a holder is owed that before deciding.";
|
|
533
|
+
};
|
|
534
|
+
readonly ext: {
|
|
535
|
+
readonly $ref: "#/$defs/Ext";
|
|
536
|
+
};
|
|
537
|
+
};
|
|
538
|
+
readonly $defs: {
|
|
539
|
+
readonly Response: {
|
|
540
|
+
readonly $anchor: "response";
|
|
541
|
+
readonly title: "Persona Disclosure Preview — response payload";
|
|
542
|
+
readonly description: "Success response to persona/disclosure/preview. Type https://trusttasks.org/spec/persona/disclosure/preview/1.0#response. Signs nothing and sends nothing. The `previewId` returned here is consumed by persona/disclosure/present, which is the mechanism by which the two calls cannot be collapsed.";
|
|
543
|
+
readonly type: "object";
|
|
544
|
+
readonly additionalProperties: false;
|
|
545
|
+
readonly required: readonly ["previewId", "subject", "claims", "expiresAt"];
|
|
546
|
+
readonly properties: {
|
|
547
|
+
readonly previewId: {
|
|
548
|
+
readonly $ref: "#/$defs/Ulid";
|
|
549
|
+
readonly description: "Consumed by present. Single-use and short-lived: a preview a holder approved an hour ago is not evidence they approve it now, and one that could be replayed would let a second disclosure ride an earlier decision.";
|
|
550
|
+
};
|
|
551
|
+
readonly subject: {
|
|
552
|
+
readonly type: "string";
|
|
553
|
+
readonly minLength: 1;
|
|
554
|
+
readonly description: "The identifier that would appear as the subject of the disclosure. Pairwise by default — a fresh per-relationship DID rather than the persona DID — so that two verifiers cannot recognise the holder as the same party. The persona DID is the account; this is the face.";
|
|
555
|
+
};
|
|
556
|
+
readonly claims: {
|
|
557
|
+
readonly type: "array";
|
|
558
|
+
readonly maxItems: 128;
|
|
559
|
+
readonly items: {
|
|
560
|
+
readonly type: "object";
|
|
561
|
+
readonly additionalProperties: false;
|
|
562
|
+
readonly required: readonly ["type", "provenance", "rung"];
|
|
563
|
+
readonly properties: {
|
|
564
|
+
readonly type: {
|
|
565
|
+
readonly $ref: "#/$defs/ClaimType";
|
|
566
|
+
};
|
|
567
|
+
readonly value: {
|
|
568
|
+
readonly description: "What would be disclosed. Absent for a predicate claim, which discloses no value at all — that absence is the point and a consumer MUST NOT render it as missing data.";
|
|
569
|
+
};
|
|
570
|
+
readonly predicate: {
|
|
571
|
+
readonly type: "object";
|
|
572
|
+
readonly additionalProperties: false;
|
|
573
|
+
readonly required: readonly ["op", "arg"];
|
|
574
|
+
readonly description: "Present instead of `value` when the claim would be proven rather than shown, e.g. that a date of birth implies an age threshold. The underlying attribute stays in the pool; the predicate is a disclosure-time projection over it, which is what keeps the pool from filling with derived facts that are all the same fact asked differently.";
|
|
575
|
+
readonly properties: {
|
|
576
|
+
readonly op: {
|
|
577
|
+
readonly type: "string";
|
|
578
|
+
readonly enum: readonly ["gte", "gt", "lte", "lt", "eq", "ne", "memberOf"];
|
|
579
|
+
};
|
|
580
|
+
readonly arg: {};
|
|
581
|
+
readonly over: {
|
|
582
|
+
readonly $ref: "#/$defs/ClaimType";
|
|
583
|
+
};
|
|
584
|
+
};
|
|
585
|
+
};
|
|
586
|
+
readonly provenance: {
|
|
587
|
+
readonly type: "string";
|
|
588
|
+
readonly enum: readonly ["selfAsserted", "credentialBacked", "generated"];
|
|
589
|
+
};
|
|
590
|
+
readonly rung: {
|
|
591
|
+
readonly $ref: "#/$defs/ProofRung";
|
|
592
|
+
};
|
|
593
|
+
readonly newToThisVerifier: {
|
|
594
|
+
readonly type: "boolean";
|
|
595
|
+
readonly description: "True when this verifier has not previously received this claim type from this persona. What makes a preview rankable rather than a flat list — a holder needs the unusual ask to stand out from the routine one.";
|
|
596
|
+
};
|
|
597
|
+
readonly stale: {
|
|
598
|
+
readonly type: "boolean";
|
|
599
|
+
readonly description: "True when a credential-backed claim could not be re-derived. Such a claim MUST NOT be disclosed; it is shown in the preview so the holder learns why the disclosure will be short.";
|
|
600
|
+
};
|
|
601
|
+
};
|
|
602
|
+
};
|
|
603
|
+
};
|
|
604
|
+
readonly renderer: {
|
|
605
|
+
readonly type: "object";
|
|
606
|
+
readonly additionalProperties: false;
|
|
607
|
+
readonly required: readonly ["id", "drops"];
|
|
608
|
+
readonly description: "The output format and, crucially, what it cannot carry. Lossiness is DECLARED rather than discovered: a holder is owed 'this verifier will see your work number but not that your employer attested it' before deciding, not after.";
|
|
609
|
+
readonly properties: {
|
|
610
|
+
readonly id: {
|
|
611
|
+
readonly type: "string";
|
|
612
|
+
readonly maxLength: 64;
|
|
613
|
+
};
|
|
614
|
+
readonly drops: {
|
|
615
|
+
readonly type: "array";
|
|
616
|
+
readonly maxItems: 32;
|
|
617
|
+
readonly items: {
|
|
618
|
+
readonly type: "string";
|
|
619
|
+
readonly maxLength: 64;
|
|
620
|
+
};
|
|
621
|
+
readonly description: "What this renderer discards — commonly provenance. Empty for a lossless renderer.";
|
|
622
|
+
};
|
|
623
|
+
};
|
|
624
|
+
};
|
|
625
|
+
readonly correlation: {
|
|
626
|
+
readonly type: "object";
|
|
627
|
+
readonly additionalProperties: false;
|
|
628
|
+
readonly required: readonly ["severity"];
|
|
629
|
+
readonly description: "How much this disclosure would link the holder. Note the inversion that is easy to get backwards: a credential presented WHOLE correlates more than a self-asserted value, because the issuer signature is identical at every verifier — while a derived proof correlates LESS, because it differs on every presentation. Severity is therefore a function of value and rung together, not of provenance alone.";
|
|
630
|
+
readonly properties: {
|
|
631
|
+
readonly severity: {
|
|
632
|
+
readonly type: "string";
|
|
633
|
+
readonly enum: readonly ["none", "low", "high"];
|
|
634
|
+
};
|
|
635
|
+
readonly reason: {
|
|
636
|
+
readonly type: "string";
|
|
637
|
+
readonly maxLength: 512;
|
|
638
|
+
};
|
|
639
|
+
};
|
|
640
|
+
};
|
|
641
|
+
readonly anomalous: {
|
|
642
|
+
readonly type: "array";
|
|
643
|
+
readonly maxItems: 128;
|
|
644
|
+
readonly items: {
|
|
645
|
+
readonly $ref: "#/$defs/ClaimType";
|
|
646
|
+
};
|
|
647
|
+
readonly description: "Claim types unusual for this verifier's stated purpose. A preview that lists fourteen fields with fourteen equal weights is a notice-and-consent dialog, which is the pattern that trains people to click through; ranking by what is out of place is what makes the surfaced line the one worth reading.";
|
|
648
|
+
};
|
|
649
|
+
readonly expiresAt: {
|
|
650
|
+
readonly type: "string";
|
|
651
|
+
readonly format: "date-time";
|
|
652
|
+
};
|
|
653
|
+
readonly ext: {
|
|
654
|
+
readonly $ref: "#/$defs/Ext";
|
|
655
|
+
};
|
|
656
|
+
};
|
|
657
|
+
};
|
|
658
|
+
readonly Ext: {
|
|
659
|
+
readonly title: "Ext";
|
|
660
|
+
readonly 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.";
|
|
661
|
+
readonly type: "object";
|
|
662
|
+
readonly minProperties: 1;
|
|
663
|
+
readonly additionalProperties: true;
|
|
664
|
+
readonly propertyNames: {
|
|
665
|
+
readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$";
|
|
666
|
+
};
|
|
667
|
+
};
|
|
668
|
+
readonly ClaimType: {
|
|
669
|
+
readonly title: "ClaimType";
|
|
670
|
+
readonly description: "The vocabulary token naming what a value IS — `name.legal`, `phone.mobile`, `address.postal`, `person.birthDate`. Dotted, most-general segment first, so that a consumer with no knowledge of the specific token can still group by its prefix.\n\nThe token is the maintainer's own; no external vocabulary is primary. External vocabularies (vCard/jCard, OIDC standard claims, schema.org) are mappings applied at PRESENTATION by a renderer, not at rest, so that a query written in any of them can be matched without the store having to live inside any one of them.\n\nThe `x:` prefix is an open extension namespace and is not decoration. The closest prior art — Windows CardSpace's self-issued card — supported exactly fifteen predefined claim types with no extensibility, and that is the specific way it failed the requirement a holder actually has. An `x:` attribute stores, composes, binds and discloses exactly like a known one; it renders generically and matches only an explicit query.";
|
|
671
|
+
readonly type: "string";
|
|
672
|
+
readonly minLength: 1;
|
|
673
|
+
readonly maxLength: 128;
|
|
674
|
+
readonly pattern: "^(x:)?[a-z][a-zA-Z0-9]*(\\.[a-z][a-zA-Z0-9]*)*$";
|
|
675
|
+
};
|
|
676
|
+
readonly ProofRung: {
|
|
677
|
+
readonly title: "ProofRung";
|
|
678
|
+
readonly description: "How strongly a credential-backed claim is hidden when presented, ordered most private first. `predicate` proves a statement over a claim without disclosing the claim. `derived` discloses exactly the claims needed via an unlinkable derived proof, so two presentations cannot be joined. `selectiveDisclosure` discloses exactly the claims needed but carries the issuer's signature unchanged, so two presentations ARE linkable. `whole` discloses the entire credential.\n\nThe distinction between the first two and the last two is of kind, not degree: only `predicate` and `derived` avoid handing two verifiers a join key. A maintainer MUST default to the highest rung the credential's format supports, and MUST NOT silently fall to a lower one — a request that cannot be satisfied at the rung a producer asked for is refused, because a silent privacy downgrade discloses material the holder believed was hidden.";
|
|
679
|
+
readonly type: "string";
|
|
680
|
+
readonly enum: readonly ["predicate", "derived", "selectiveDisclosure", "whole"];
|
|
681
|
+
};
|
|
682
|
+
readonly Ulid: {
|
|
683
|
+
readonly title: "Ulid";
|
|
684
|
+
readonly description: "A ULID in Crockford base32, uppercase. Used for `attributeId` and `profileId`. Chosen over a UUID because the leading 48 bits are a timestamp, so a key-ordered scan of the store is also creation-ordered and a `list` needs no secondary sort. Server-assigned on create; a producer MAY supply one to make a create idempotent, and a maintainer MUST reject a supplied value that already exists rather than silently overwriting.";
|
|
685
|
+
readonly type: "string";
|
|
686
|
+
readonly pattern: "^[0-9A-HJKMNP-TV-Z]{26}$";
|
|
687
|
+
};
|
|
688
|
+
};
|
|
689
|
+
};
|
|
690
|
+
};
|
|
691
|
+
/**
|
|
692
|
+
* SPEC.md §7.2 policy for the success-response variant. `isRecipientRequired`
|
|
693
|
+
* tracks the *issuer* party's requirement because a response swaps the
|
|
694
|
+
* parties (§7.3 item 5).
|
|
695
|
+
*/
|
|
696
|
+
export declare const RESPONSE_SPEC: {
|
|
697
|
+
readonly typeUri: "https://trusttasks.org/spec/persona/disclosure/preview/1.0#response";
|
|
698
|
+
readonly isBearer: false;
|
|
699
|
+
readonly isProofRequired: true;
|
|
700
|
+
readonly isRecipientRequired: true;
|
|
701
|
+
readonly isIssuedAtRequired: true;
|
|
702
|
+
readonly payloadSchema: {
|
|
703
|
+
readonly $schema: "https://json-schema.org/draft/2020-12/schema";
|
|
704
|
+
readonly $ref: "#/$defs/Response";
|
|
705
|
+
readonly $defs: {
|
|
706
|
+
readonly Response: {
|
|
707
|
+
readonly $anchor: "response";
|
|
708
|
+
readonly title: "Persona Disclosure Preview — response payload";
|
|
709
|
+
readonly description: "Success response to persona/disclosure/preview. Type https://trusttasks.org/spec/persona/disclosure/preview/1.0#response. Signs nothing and sends nothing. The `previewId` returned here is consumed by persona/disclosure/present, which is the mechanism by which the two calls cannot be collapsed.";
|
|
710
|
+
readonly type: "object";
|
|
711
|
+
readonly additionalProperties: false;
|
|
712
|
+
readonly required: readonly ["previewId", "subject", "claims", "expiresAt"];
|
|
713
|
+
readonly properties: {
|
|
714
|
+
readonly previewId: {
|
|
715
|
+
readonly $ref: "#/$defs/Ulid";
|
|
716
|
+
readonly description: "Consumed by present. Single-use and short-lived: a preview a holder approved an hour ago is not evidence they approve it now, and one that could be replayed would let a second disclosure ride an earlier decision.";
|
|
717
|
+
};
|
|
718
|
+
readonly subject: {
|
|
719
|
+
readonly type: "string";
|
|
720
|
+
readonly minLength: 1;
|
|
721
|
+
readonly description: "The identifier that would appear as the subject of the disclosure. Pairwise by default — a fresh per-relationship DID rather than the persona DID — so that two verifiers cannot recognise the holder as the same party. The persona DID is the account; this is the face.";
|
|
722
|
+
};
|
|
723
|
+
readonly claims: {
|
|
724
|
+
readonly type: "array";
|
|
725
|
+
readonly maxItems: 128;
|
|
726
|
+
readonly items: {
|
|
727
|
+
readonly type: "object";
|
|
728
|
+
readonly additionalProperties: false;
|
|
729
|
+
readonly required: readonly ["type", "provenance", "rung"];
|
|
730
|
+
readonly properties: {
|
|
731
|
+
readonly type: {
|
|
732
|
+
readonly $ref: "#/$defs/ClaimType";
|
|
733
|
+
};
|
|
734
|
+
readonly value: {
|
|
735
|
+
readonly description: "What would be disclosed. Absent for a predicate claim, which discloses no value at all — that absence is the point and a consumer MUST NOT render it as missing data.";
|
|
736
|
+
};
|
|
737
|
+
readonly predicate: {
|
|
738
|
+
readonly type: "object";
|
|
739
|
+
readonly additionalProperties: false;
|
|
740
|
+
readonly required: readonly ["op", "arg"];
|
|
741
|
+
readonly description: "Present instead of `value` when the claim would be proven rather than shown, e.g. that a date of birth implies an age threshold. The underlying attribute stays in the pool; the predicate is a disclosure-time projection over it, which is what keeps the pool from filling with derived facts that are all the same fact asked differently.";
|
|
742
|
+
readonly properties: {
|
|
743
|
+
readonly op: {
|
|
744
|
+
readonly type: "string";
|
|
745
|
+
readonly enum: readonly ["gte", "gt", "lte", "lt", "eq", "ne", "memberOf"];
|
|
746
|
+
};
|
|
747
|
+
readonly arg: {};
|
|
748
|
+
readonly over: {
|
|
749
|
+
readonly $ref: "#/$defs/ClaimType";
|
|
750
|
+
};
|
|
751
|
+
};
|
|
752
|
+
};
|
|
753
|
+
readonly provenance: {
|
|
754
|
+
readonly type: "string";
|
|
755
|
+
readonly enum: readonly ["selfAsserted", "credentialBacked", "generated"];
|
|
756
|
+
};
|
|
757
|
+
readonly rung: {
|
|
758
|
+
readonly $ref: "#/$defs/ProofRung";
|
|
759
|
+
};
|
|
760
|
+
readonly newToThisVerifier: {
|
|
761
|
+
readonly type: "boolean";
|
|
762
|
+
readonly description: "True when this verifier has not previously received this claim type from this persona. What makes a preview rankable rather than a flat list — a holder needs the unusual ask to stand out from the routine one.";
|
|
763
|
+
};
|
|
764
|
+
readonly stale: {
|
|
765
|
+
readonly type: "boolean";
|
|
766
|
+
readonly description: "True when a credential-backed claim could not be re-derived. Such a claim MUST NOT be disclosed; it is shown in the preview so the holder learns why the disclosure will be short.";
|
|
767
|
+
};
|
|
768
|
+
};
|
|
769
|
+
};
|
|
770
|
+
};
|
|
771
|
+
readonly renderer: {
|
|
772
|
+
readonly type: "object";
|
|
773
|
+
readonly additionalProperties: false;
|
|
774
|
+
readonly required: readonly ["id", "drops"];
|
|
775
|
+
readonly description: "The output format and, crucially, what it cannot carry. Lossiness is DECLARED rather than discovered: a holder is owed 'this verifier will see your work number but not that your employer attested it' before deciding, not after.";
|
|
776
|
+
readonly properties: {
|
|
777
|
+
readonly id: {
|
|
778
|
+
readonly type: "string";
|
|
779
|
+
readonly maxLength: 64;
|
|
780
|
+
};
|
|
781
|
+
readonly drops: {
|
|
782
|
+
readonly type: "array";
|
|
783
|
+
readonly maxItems: 32;
|
|
784
|
+
readonly items: {
|
|
785
|
+
readonly type: "string";
|
|
786
|
+
readonly maxLength: 64;
|
|
787
|
+
};
|
|
788
|
+
readonly description: "What this renderer discards — commonly provenance. Empty for a lossless renderer.";
|
|
789
|
+
};
|
|
790
|
+
};
|
|
791
|
+
};
|
|
792
|
+
readonly correlation: {
|
|
793
|
+
readonly type: "object";
|
|
794
|
+
readonly additionalProperties: false;
|
|
795
|
+
readonly required: readonly ["severity"];
|
|
796
|
+
readonly description: "How much this disclosure would link the holder. Note the inversion that is easy to get backwards: a credential presented WHOLE correlates more than a self-asserted value, because the issuer signature is identical at every verifier — while a derived proof correlates LESS, because it differs on every presentation. Severity is therefore a function of value and rung together, not of provenance alone.";
|
|
797
|
+
readonly properties: {
|
|
798
|
+
readonly severity: {
|
|
799
|
+
readonly type: "string";
|
|
800
|
+
readonly enum: readonly ["none", "low", "high"];
|
|
801
|
+
};
|
|
802
|
+
readonly reason: {
|
|
803
|
+
readonly type: "string";
|
|
804
|
+
readonly maxLength: 512;
|
|
805
|
+
};
|
|
806
|
+
};
|
|
807
|
+
};
|
|
808
|
+
readonly anomalous: {
|
|
809
|
+
readonly type: "array";
|
|
810
|
+
readonly maxItems: 128;
|
|
811
|
+
readonly items: {
|
|
812
|
+
readonly $ref: "#/$defs/ClaimType";
|
|
813
|
+
};
|
|
814
|
+
readonly description: "Claim types unusual for this verifier's stated purpose. A preview that lists fourteen fields with fourteen equal weights is a notice-and-consent dialog, which is the pattern that trains people to click through; ranking by what is out of place is what makes the surfaced line the one worth reading.";
|
|
815
|
+
};
|
|
816
|
+
readonly expiresAt: {
|
|
817
|
+
readonly type: "string";
|
|
818
|
+
readonly format: "date-time";
|
|
819
|
+
};
|
|
820
|
+
readonly ext: {
|
|
821
|
+
readonly $ref: "#/$defs/Ext";
|
|
822
|
+
};
|
|
823
|
+
};
|
|
824
|
+
};
|
|
825
|
+
readonly Ext: {
|
|
826
|
+
readonly title: "Ext";
|
|
827
|
+
readonly 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.";
|
|
828
|
+
readonly type: "object";
|
|
829
|
+
readonly minProperties: 1;
|
|
830
|
+
readonly additionalProperties: true;
|
|
831
|
+
readonly propertyNames: {
|
|
832
|
+
readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$";
|
|
833
|
+
};
|
|
834
|
+
};
|
|
835
|
+
readonly ClaimType: {
|
|
836
|
+
readonly title: "ClaimType";
|
|
837
|
+
readonly description: "The vocabulary token naming what a value IS — `name.legal`, `phone.mobile`, `address.postal`, `person.birthDate`. Dotted, most-general segment first, so that a consumer with no knowledge of the specific token can still group by its prefix.\n\nThe token is the maintainer's own; no external vocabulary is primary. External vocabularies (vCard/jCard, OIDC standard claims, schema.org) are mappings applied at PRESENTATION by a renderer, not at rest, so that a query written in any of them can be matched without the store having to live inside any one of them.\n\nThe `x:` prefix is an open extension namespace and is not decoration. The closest prior art — Windows CardSpace's self-issued card — supported exactly fifteen predefined claim types with no extensibility, and that is the specific way it failed the requirement a holder actually has. An `x:` attribute stores, composes, binds and discloses exactly like a known one; it renders generically and matches only an explicit query.";
|
|
838
|
+
readonly type: "string";
|
|
839
|
+
readonly minLength: 1;
|
|
840
|
+
readonly maxLength: 128;
|
|
841
|
+
readonly pattern: "^(x:)?[a-z][a-zA-Z0-9]*(\\.[a-z][a-zA-Z0-9]*)*$";
|
|
842
|
+
};
|
|
843
|
+
readonly ProofRung: {
|
|
844
|
+
readonly title: "ProofRung";
|
|
845
|
+
readonly description: "How strongly a credential-backed claim is hidden when presented, ordered most private first. `predicate` proves a statement over a claim without disclosing the claim. `derived` discloses exactly the claims needed via an unlinkable derived proof, so two presentations cannot be joined. `selectiveDisclosure` discloses exactly the claims needed but carries the issuer's signature unchanged, so two presentations ARE linkable. `whole` discloses the entire credential.\n\nThe distinction between the first two and the last two is of kind, not degree: only `predicate` and `derived` avoid handing two verifiers a join key. A maintainer MUST default to the highest rung the credential's format supports, and MUST NOT silently fall to a lower one — a request that cannot be satisfied at the rung a producer asked for is refused, because a silent privacy downgrade discloses material the holder believed was hidden.";
|
|
846
|
+
readonly type: "string";
|
|
847
|
+
readonly enum: readonly ["predicate", "derived", "selectiveDisclosure", "whole"];
|
|
848
|
+
};
|
|
849
|
+
readonly Ulid: {
|
|
850
|
+
readonly title: "Ulid";
|
|
851
|
+
readonly description: "A ULID in Crockford base32, uppercase. Used for `attributeId` and `profileId`. Chosen over a UUID because the leading 48 bits are a timestamp, so a key-ordered scan of the store is also creation-ordered and a `list` needs no secondary sort. Server-assigned on create; a producer MAY supply one to make a create idempotent, and a maintainer MUST reject a supplied value that already exists rather than silently overwriting.";
|
|
852
|
+
readonly type: "string";
|
|
853
|
+
readonly pattern: "^[0-9A-HJKMNP-TV-Z]{26}$";
|
|
854
|
+
};
|
|
855
|
+
};
|
|
856
|
+
};
|
|
857
|
+
};
|
|
858
|
+
//# sourceMappingURL=payload.d.ts.map
|