@openvtc/trust-tasks 0.26.13 → 0.26.15

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 (202) hide show
  1. package/CHANGELOG.md +131 -0
  2. package/dist/_shared/components.d.ts +392 -1
  3. package/dist/_shared/components.d.ts.map +1 -1
  4. package/dist/index.d.ts +18 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +18 -0
  7. package/dist/index.js.map +1 -1
  8. package/dist/rooms/_shared/0.1/personal-label.d.ts +16 -0
  9. package/dist/rooms/_shared/0.1/personal-label.d.ts.map +1 -0
  10. package/dist/rooms/_shared/0.1/personal-label.js +6 -0
  11. package/dist/rooms/_shared/0.1/personal-label.js.map +1 -0
  12. package/dist/rooms/_shared/0.1/room.d.ts +1 -1
  13. package/dist/rooms/_shared/0.1/room.d.ts.map +1 -1
  14. package/dist/rooms/blobs/get/0.1/payload.d.ts +4 -4
  15. package/dist/rooms/blobs/get/0.1/payload.js +2 -2
  16. package/dist/rooms/blobs/get/0.1/payload.js.map +1 -1
  17. package/dist/rooms/blobs/get/0.2/payload.d.ts +4 -4
  18. package/dist/rooms/blobs/get/0.2/payload.js +2 -2
  19. package/dist/rooms/blobs/get/0.2/payload.js.map +1 -1
  20. package/dist/rooms/blobs/upload/begin/0.1/payload.d.ts +4 -4
  21. package/dist/rooms/blobs/upload/begin/0.1/payload.js +2 -2
  22. package/dist/rooms/blobs/upload/begin/0.1/payload.js.map +1 -1
  23. package/dist/rooms/blobs/upload/begin/0.2/payload.d.ts +4 -4
  24. package/dist/rooms/blobs/upload/begin/0.2/payload.js +2 -2
  25. package/dist/rooms/blobs/upload/begin/0.2/payload.js.map +1 -1
  26. package/dist/rooms/epoch/chain/0.1/payload.d.ts +4 -4
  27. package/dist/rooms/epoch/chain/0.1/payload.js +2 -2
  28. package/dist/rooms/epoch/chain/0.1/payload.js.map +1 -1
  29. package/dist/rooms/epoch/commits/0.1/payload.d.ts +4 -4
  30. package/dist/rooms/epoch/commits/0.1/payload.js +2 -2
  31. package/dist/rooms/epoch/commits/0.1/payload.js.map +1 -1
  32. package/dist/rooms/epoch/mint/0.1/payload.d.ts +4 -4
  33. package/dist/rooms/epoch/mint/0.1/payload.js +2 -2
  34. package/dist/rooms/epoch/mint/0.1/payload.js.map +1 -1
  35. package/dist/rooms/epoch/prune/0.1/payload.d.ts +4 -4
  36. package/dist/rooms/epoch/prune/0.1/payload.js +2 -2
  37. package/dist/rooms/epoch/prune/0.1/payload.js.map +1 -1
  38. package/dist/rooms/info/0.1/payload.d.ts +4 -4
  39. package/dist/rooms/info/0.1/payload.js +2 -2
  40. package/dist/rooms/info/0.1/payload.js.map +1 -1
  41. package/dist/rooms/keys/label/0.1/payload.d.ts +757 -0
  42. package/dist/rooms/keys/label/0.1/payload.d.ts.map +1 -0
  43. package/dist/rooms/keys/label/0.1/payload.js +388 -0
  44. package/dist/rooms/keys/label/0.1/payload.js.map +1 -0
  45. package/dist/rooms/keys/list/0.2/payload.d.ts +667 -0
  46. package/dist/rooms/keys/list/0.2/payload.d.ts.map +1 -0
  47. package/dist/rooms/keys/list/0.2/payload.js +350 -0
  48. package/dist/rooms/keys/list/0.2/payload.js.map +1 -0
  49. package/dist/rooms/keys/present/0.2/payload.d.ts +4 -4
  50. package/dist/rooms/keys/present/0.2/payload.js +2 -2
  51. package/dist/rooms/keys/present/0.2/payload.js.map +1 -1
  52. package/dist/rooms/keys/profile/read/0.1/payload.d.ts +1652 -0
  53. package/dist/rooms/keys/profile/read/0.1/payload.d.ts.map +1 -0
  54. package/dist/rooms/keys/profile/read/0.1/payload.js +649 -0
  55. package/dist/rooms/keys/profile/read/0.1/payload.js.map +1 -0
  56. package/dist/rooms/keys/profile/write/0.1/payload.d.ts +583 -0
  57. package/dist/rooms/keys/profile/write/0.1/payload.d.ts.map +1 -0
  58. package/dist/rooms/keys/profile/write/0.1/payload.js +319 -0
  59. package/dist/rooms/keys/profile/write/0.1/payload.js.map +1 -0
  60. package/dist/rooms/owner/claim/0.1/payload.d.ts +4 -4
  61. package/dist/rooms/owner/claim/0.1/payload.js +2 -2
  62. package/dist/rooms/owner/claim/0.1/payload.js.map +1 -1
  63. package/dist/rooms/owner/group/remove/0.2/payload.d.ts +600 -0
  64. package/dist/rooms/owner/group/remove/0.2/payload.d.ts.map +1 -0
  65. package/dist/rooms/owner/group/remove/0.2/payload.js +310 -0
  66. package/dist/rooms/owner/group/remove/0.2/payload.js.map +1 -0
  67. package/dist/rooms/owner/revoke/0.1/payload.d.ts +1481 -0
  68. package/dist/rooms/owner/revoke/0.1/payload.d.ts.map +1 -0
  69. package/dist/rooms/owner/revoke/0.1/payload.js +811 -0
  70. package/dist/rooms/owner/revoke/0.1/payload.js.map +1 -0
  71. package/dist/rooms/owner/transfer/0.1/payload.d.ts +4 -4
  72. package/dist/rooms/owner/transfer/0.1/payload.js +2 -2
  73. package/dist/rooms/owner/transfer/0.1/payload.js.map +1 -1
  74. package/dist/rooms/records/curate/0.1/payload.d.ts +4 -4
  75. package/dist/rooms/records/curate/0.1/payload.js +2 -2
  76. package/dist/rooms/records/curate/0.1/payload.js.map +1 -1
  77. package/dist/rooms/records/get/0.1/payload.d.ts +4 -4
  78. package/dist/rooms/records/get/0.1/payload.js +2 -2
  79. package/dist/rooms/records/get/0.1/payload.js.map +1 -1
  80. package/dist/rooms/records/get/0.2/payload.d.ts +4 -4
  81. package/dist/rooms/records/get/0.2/payload.js +2 -2
  82. package/dist/rooms/records/get/0.2/payload.js.map +1 -1
  83. package/dist/rooms/records/list/0.1/payload.d.ts +4 -4
  84. package/dist/rooms/records/list/0.1/payload.js +2 -2
  85. package/dist/rooms/records/list/0.1/payload.js.map +1 -1
  86. package/dist/rooms/records/list/0.2/payload.d.ts +4 -4
  87. package/dist/rooms/records/list/0.2/payload.js +2 -2
  88. package/dist/rooms/records/list/0.2/payload.js.map +1 -1
  89. package/dist/rooms/records/put/0.1/payload.d.ts +4 -4
  90. package/dist/rooms/records/put/0.1/payload.js +2 -2
  91. package/dist/rooms/records/put/0.1/payload.js.map +1 -1
  92. package/dist/rooms/records/put/0.2/payload.d.ts +4 -4
  93. package/dist/rooms/records/put/0.2/payload.js +2 -2
  94. package/dist/rooms/records/put/0.2/payload.js.map +1 -1
  95. package/dist/rooms/revocations/get/0.1/payload.d.ts +905 -0
  96. package/dist/rooms/revocations/get/0.1/payload.d.ts.map +1 -0
  97. package/dist/rooms/revocations/get/0.1/payload.js +512 -0
  98. package/dist/rooms/revocations/get/0.1/payload.js.map +1 -0
  99. package/dist/rooms/revocations/put/0.1/payload.d.ts +1021 -0
  100. package/dist/rooms/revocations/put/0.1/payload.d.ts.map +1 -0
  101. package/dist/rooms/revocations/put/0.1/payload.js +583 -0
  102. package/dist/rooms/revocations/put/0.1/payload.js.map +1 -0
  103. package/dist/rooms/usage/0.1/payload.d.ts +4 -4
  104. package/dist/rooms/usage/0.1/payload.js +2 -2
  105. package/dist/rooms/usage/0.1/payload.js.map +1 -1
  106. package/dist/vtc/_shared/0.1/community-room.d.ts +1 -1
  107. package/dist/vtc/_shared/0.1/community-room.d.ts.map +1 -1
  108. package/dist/vtc/registry/sync-jobs/retry/0.2/payload.d.ts +546 -0
  109. package/dist/vtc/registry/sync-jobs/retry/0.2/payload.d.ts.map +1 -0
  110. package/dist/vtc/registry/sync-jobs/retry/0.2/payload.js +331 -0
  111. package/dist/vtc/registry/sync-jobs/retry/0.2/payload.js.map +1 -0
  112. package/dist/vtc/rooms/community/create/0.1/payload.d.ts +4 -4
  113. package/dist/vtc/rooms/community/create/0.1/payload.js +2 -2
  114. package/dist/vtc/rooms/community/create/0.1/payload.js.map +1 -1
  115. package/dist/vtc/rooms/community/create/0.2/payload.d.ts +989 -0
  116. package/dist/vtc/rooms/community/create/0.2/payload.d.ts.map +1 -0
  117. package/dist/vtc/rooms/community/create/0.2/payload.js +559 -0
  118. package/dist/vtc/rooms/community/create/0.2/payload.js.map +1 -0
  119. package/dist/vtc/rooms/community/create/0.3/payload.d.ts +1013 -0
  120. package/dist/vtc/rooms/community/create/0.3/payload.d.ts.map +1 -0
  121. package/dist/vtc/rooms/community/create/0.3/payload.js +577 -0
  122. package/dist/vtc/rooms/community/create/0.3/payload.js.map +1 -0
  123. package/dist/vtc/rooms/community/get/0.1/payload.d.ts +4 -4
  124. package/dist/vtc/rooms/community/get/0.1/payload.js +2 -2
  125. package/dist/vtc/rooms/community/get/0.1/payload.js.map +1 -1
  126. package/dist/vtc/rooms/community/get/0.2/payload.d.ts +887 -0
  127. package/dist/vtc/rooms/community/get/0.2/payload.d.ts.map +1 -0
  128. package/dist/vtc/rooms/community/get/0.2/payload.js +517 -0
  129. package/dist/vtc/rooms/community/get/0.2/payload.js.map +1 -0
  130. package/dist/vtc/rooms/community/list/0.1/payload.d.ts +4 -4
  131. package/dist/vtc/rooms/community/list/0.1/payload.js +2 -2
  132. package/dist/vtc/rooms/community/list/0.1/payload.js.map +1 -1
  133. package/dist/vtc/rooms/community/list/0.2/payload.d.ts +960 -0
  134. package/dist/vtc/rooms/community/list/0.2/payload.d.ts.map +1 -0
  135. package/dist/vtc/rooms/community/list/0.2/payload.js +544 -0
  136. package/dist/vtc/rooms/community/list/0.2/payload.js.map +1 -0
  137. package/dist/vtc/rooms/community/members/remove/0.2/payload.d.ts +681 -0
  138. package/dist/vtc/rooms/community/members/remove/0.2/payload.d.ts.map +1 -0
  139. package/dist/vtc/rooms/community/members/remove/0.2/payload.js +393 -0
  140. package/dist/vtc/rooms/community/members/remove/0.2/payload.js.map +1 -0
  141. package/dist/vtc/rooms/community/update/0.1/payload.d.ts +1013 -0
  142. package/dist/vtc/rooms/community/update/0.1/payload.d.ts.map +1 -0
  143. package/dist/vtc/rooms/community/update/0.1/payload.js +573 -0
  144. package/dist/vtc/rooms/community/update/0.1/payload.js.map +1 -0
  145. package/dist/vtc/rooms/community/update/0.2/payload.d.ts +1037 -0
  146. package/dist/vtc/rooms/community/update/0.2/payload.d.ts.map +1 -0
  147. package/dist/vtc/rooms/community/update/0.2/payload.js +593 -0
  148. package/dist/vtc/rooms/community/update/0.2/payload.js.map +1 -0
  149. package/dist/vtc/rooms/offers/list/0.1/payload.d.ts +4 -4
  150. package/dist/vtc/rooms/offers/list/0.1/payload.js +2 -2
  151. package/dist/vtc/rooms/offers/list/0.1/payload.js.map +1 -1
  152. package/dist/vtc/rooms/offers/list/0.2/payload.d.ts +736 -0
  153. package/dist/vtc/rooms/offers/list/0.2/payload.d.ts.map +1 -0
  154. package/dist/vtc/rooms/offers/list/0.2/payload.js +430 -0
  155. package/dist/vtc/rooms/offers/list/0.2/payload.js.map +1 -0
  156. package/package.json +1 -1
  157. package/src/_shared/components.ts +426 -1
  158. package/src/index.ts +18 -0
  159. package/src/rooms/_shared/0.1/personal-label.ts +17 -0
  160. package/src/rooms/_shared/0.1/room.ts +1 -1
  161. package/src/rooms/blobs/get/0.1/payload.ts +2 -2
  162. package/src/rooms/blobs/get/0.2/payload.ts +2 -2
  163. package/src/rooms/blobs/upload/begin/0.1/payload.ts +2 -2
  164. package/src/rooms/blobs/upload/begin/0.2/payload.ts +2 -2
  165. package/src/rooms/epoch/chain/0.1/payload.ts +2 -2
  166. package/src/rooms/epoch/commits/0.1/payload.ts +2 -2
  167. package/src/rooms/epoch/mint/0.1/payload.ts +2 -2
  168. package/src/rooms/epoch/prune/0.1/payload.ts +2 -2
  169. package/src/rooms/info/0.1/payload.ts +2 -2
  170. package/src/rooms/keys/label/0.1/payload.ts +474 -0
  171. package/src/rooms/keys/list/0.2/payload.ts +412 -0
  172. package/src/rooms/keys/present/0.2/payload.ts +2 -2
  173. package/src/rooms/keys/profile/read/0.1/payload.ts +1617 -0
  174. package/src/rooms/keys/profile/write/0.1/payload.ts +388 -0
  175. package/src/rooms/owner/claim/0.1/payload.ts +2 -2
  176. package/src/rooms/owner/group/remove/0.2/payload.ts +415 -0
  177. package/src/rooms/owner/revoke/0.1/payload.ts +954 -0
  178. package/src/rooms/owner/transfer/0.1/payload.ts +2 -2
  179. package/src/rooms/records/curate/0.1/payload.ts +2 -2
  180. package/src/rooms/records/get/0.1/payload.ts +2 -2
  181. package/src/rooms/records/get/0.2/payload.ts +2 -2
  182. package/src/rooms/records/list/0.1/payload.ts +2 -2
  183. package/src/rooms/records/list/0.2/payload.ts +2 -2
  184. package/src/rooms/records/put/0.1/payload.ts +2 -2
  185. package/src/rooms/records/put/0.2/payload.ts +2 -2
  186. package/src/rooms/revocations/get/0.1/payload.ts +562 -0
  187. package/src/rooms/revocations/put/0.1/payload.ts +637 -0
  188. package/src/rooms/usage/0.1/payload.ts +2 -2
  189. package/src/vtc/_shared/0.1/community-room.ts +1 -1
  190. package/src/vtc/registry/sync-jobs/retry/0.2/payload.ts +401 -0
  191. package/src/vtc/rooms/community/create/0.1/payload.ts +2 -2
  192. package/src/vtc/rooms/community/create/0.2/payload.ts +613 -0
  193. package/src/vtc/rooms/community/create/0.3/payload.ts +635 -0
  194. package/src/vtc/rooms/community/get/0.1/payload.ts +2 -2
  195. package/src/vtc/rooms/community/get/0.2/payload.ts +549 -0
  196. package/src/vtc/rooms/community/list/0.1/payload.ts +2 -2
  197. package/src/vtc/rooms/community/list/0.2/payload.ts +591 -0
  198. package/src/vtc/rooms/community/members/remove/0.2/payload.ts +439 -0
  199. package/src/vtc/rooms/community/update/0.1/payload.ts +629 -0
  200. package/src/vtc/rooms/community/update/0.2/payload.ts +653 -0
  201. package/src/vtc/rooms/offers/list/0.1/payload.ts +2 -2
  202. package/src/vtc/rooms/offers/list/0.2/payload.ts +473 -0
@@ -0,0 +1,1481 @@
1
+ /**
2
+ * Generated by scripts/build-ts-bindings.mjs — DO NOT EDIT BY HAND.
3
+ * Source: specs/rooms/owner/revoke/0.1/payload.schema.json
4
+ */
5
+ import type { CredentialRevocation, DigestMultibase, Ext, RevocationEntry, RevocationHead, RevocationList, RoomRevocation, SubjectRevocation } from "../../../../_shared/components.js";
6
+ /**
7
+ * One withdrawal to add, discriminated by `kind` as a RevocationEntry is. It carries no `revokedAt`: the recipient stamps the time it signs, so that a subject or room entry withdraws exactly what the room had issued until then and nothing the caller dated.
8
+ */
9
+ export type Withdrawal = WithdrawCredential | WithdrawSubject | WithdrawRoom;
10
+ /**
11
+ * A room's owner asks their own agent to withdraw credentials the room issued: sign the room's next revocation list as the room, keep it, and deliver it to each host serving the room.
12
+ */
13
+ export interface RoomsOwnerRevokePayload {
14
+ /**
15
+ * The room whose credentials are withdrawn. The recipient signs as this room.
16
+ */
17
+ roomId: string;
18
+ /**
19
+ * Which held key signs as the room — named explicitly, as for rooms/owner/issue-authority, because nothing maps a DID to the key it was minted with. A key that is not one the room's DID document lists for `assertionMethod` produces a list every host refuses.
20
+ */
21
+ signingKeyId: string;
22
+ /**
23
+ * Every host serving the room, as DIDs: its primary, any mirror, and a host it is moving to. A withdrawal binds only the hosts that hold it, so a host left off this list honours what the room withdrew.
24
+ *
25
+ * @minItems 1
26
+ * @maxItems 8
27
+ */
28
+ hosts: [string] | [string, string] | [string, string, string] | [string, string, string, string] | [string, string, string, string, string] | [string, string, string, string, string, string] | [string, string, string, string, string, string, string] | [string, string, string, string, string, string, string, string];
29
+ /**
30
+ * What to withdraw now. Absent or empty: sign nothing new, and deliver the list the recipient holds — how a host the room has moved to, or one that missed a delivery, is brought up to date.
31
+ *
32
+ * @maxItems 64
33
+ */
34
+ withdraw?: Withdrawal[];
35
+ /**
36
+ * Why, for the owner's own record. Never put into the list, which reaches every host: it MUST NOT carry personal data or a credential.
37
+ */
38
+ reason?: string;
39
+ /**
40
+ * Ecosystem-defined extension members per SPEC.md §4.5.1.
41
+ */
42
+ ext?: Ext;
43
+ }
44
+ export interface WithdrawCredential {
45
+ kind: "credential";
46
+ /**
47
+ * The `id` of the credential withdrawn.
48
+ */
49
+ credentialId: string;
50
+ /**
51
+ * OPTIONAL. The credential's own `validUntil`, after which the entry can be dropped.
52
+ */
53
+ until?: string;
54
+ }
55
+ export interface WithdrawSubject {
56
+ kind: "subject";
57
+ /**
58
+ * The party withdrawn: every credential naming them as subject or issuer that the room's chain gave them before now. Never the room.
59
+ */
60
+ subject: string;
61
+ /**
62
+ * OPTIONAL. When the last credential the room issued them expires, after which the entry can be dropped.
63
+ */
64
+ until?: string;
65
+ }
66
+ export interface WithdrawRoom {
67
+ kind: "room";
68
+ /**
69
+ * OPTIONAL. When the last credential the room issued before now expires.
70
+ */
71
+ until?: string;
72
+ }
73
+ /**
74
+ * Success response to rooms/owner/revoke. Type https://trusttasks.org/spec/rooms/owner/revoke/0.1#response. The list the recipient now holds for the room, and what each host did with it. A success says the list was signed and kept; only a delivery whose outcome is `accepted` says a host enforces it.
75
+ */
76
+ export interface RoomsOwnerRevokeResponsePayload {
77
+ roomId: string;
78
+ /**
79
+ * The room's current list, as signed. Returned so the owner holds a copy that does not depend on the recipient.
80
+ */
81
+ list: RevocationList;
82
+ head: RevocationHead;
83
+ /**
84
+ * One per host in the request, in its order.
85
+ *
86
+ * @minItems 1
87
+ * @maxItems 8
88
+ */
89
+ deliveries: [Delivery] | [Delivery, Delivery] | [Delivery, Delivery, Delivery] | [Delivery, Delivery, Delivery, Delivery] | [Delivery, Delivery, Delivery, Delivery, Delivery] | [Delivery, Delivery, Delivery, Delivery, Delivery, Delivery] | [Delivery, Delivery, Delivery, Delivery, Delivery, Delivery, Delivery] | [Delivery, Delivery, Delivery, Delivery, Delivery, Delivery, Delivery, Delivery];
90
+ ext?: Ext;
91
+ }
92
+ /**
93
+ * What one host did with the list.
94
+ */
95
+ export interface Delivery {
96
+ host: string;
97
+ /**
98
+ * `accepted`: the host holds this list, or answered it as a repeat, and enforces it from `inForceAt`. `refused`: it answered and declined; its code is in `code`. `unreachable`: no answer, so the outcome is unknown — repeat the request with no `withdraw` to deliver again.
99
+ */
100
+ outcome: "accepted" | "refused" | "unreachable";
101
+ /**
102
+ * The head the host answered with. Present when `accepted`.
103
+ */
104
+ head?: RevocationHead;
105
+ /**
106
+ * When the host began enforcing the list. Present when `accepted`.
107
+ */
108
+ inForceAt?: string;
109
+ /**
110
+ * The host's error code. Present when `refused`.
111
+ */
112
+ code?: string;
113
+ }
114
+ /** Shared definitions this specification references, re-exported under the names it used to declare them with. */
115
+ export type { CredentialRevocation, DigestMultibase, Ext, RevocationEntry, RevocationHead, RevocationList, RoomRevocation, SubjectRevocation };
116
+ /** Trust Task type URI. */
117
+ export declare const TYPE_URI: "https://trusttasks.org/spec/rooms/owner/revoke/0.1";
118
+ /** Stable alias for this specification's request payload shape. */
119
+ export type Payload = RoomsOwnerRevokePayload;
120
+ /** Trust Task response type URI (request type URI + "#response"). */
121
+ export declare const RESPONSE_TYPE_URI: "https://trusttasks.org/spec/rooms/owner/revoke/0.1#response";
122
+ /** Stable alias for this specification's success-response payload shape. */
123
+ export type Response = RoomsOwnerRevokeResponsePayload;
124
+ /**
125
+ * This specification's payload schema, as a value.
126
+ *
127
+ * SPEC.md §7.2 item 2 is performed against this. It is shipped as data
128
+ * rather than only as a `.json` file because TypeScript types are erased
129
+ * at runtime: without a schema a consumer has nothing to validate, and
130
+ * every REQUIRED payload member is optional in practice. Cross-file
131
+ * `$ref`s are already inlined, so it needs no resolver.
132
+ */
133
+ export declare const PAYLOAD_SCHEMA: {
134
+ readonly $schema: "https://json-schema.org/draft/2020-12/schema";
135
+ readonly $id: "https://trusttasks.org/spec/rooms/owner/revoke/0.1";
136
+ readonly title: "Rooms Owner Revoke — payload";
137
+ readonly description: "A room's owner asks their own agent to withdraw credentials the room issued: sign the room's next revocation list as the room, keep it, and deliver it to each host serving the room.";
138
+ readonly type: "object";
139
+ readonly additionalProperties: false;
140
+ readonly required: readonly ["roomId", "signingKeyId", "hosts"];
141
+ readonly properties: {
142
+ readonly roomId: {
143
+ readonly type: "string";
144
+ readonly minLength: 1;
145
+ readonly maxLength: 512;
146
+ readonly description: "The room whose credentials are withdrawn. The recipient signs as this room.";
147
+ };
148
+ readonly signingKeyId: {
149
+ readonly type: "string";
150
+ readonly minLength: 1;
151
+ readonly maxLength: 256;
152
+ readonly description: "Which held key signs as the room — named explicitly, as for rooms/owner/issue-authority, because nothing maps a DID to the key it was minted with. A key that is not one the room's DID document lists for `assertionMethod` produces a list every host refuses.";
153
+ };
154
+ readonly hosts: {
155
+ readonly type: "array";
156
+ readonly minItems: 1;
157
+ readonly maxItems: 8;
158
+ readonly uniqueItems: true;
159
+ readonly items: {
160
+ readonly type: "string";
161
+ readonly pattern: "^did:";
162
+ readonly maxLength: 2048;
163
+ };
164
+ readonly description: "Every host serving the room, as DIDs: its primary, any mirror, and a host it is moving to. A withdrawal binds only the hosts that hold it, so a host left off this list honours what the room withdrew.";
165
+ };
166
+ readonly withdraw: {
167
+ readonly type: "array";
168
+ readonly maxItems: 64;
169
+ readonly items: {
170
+ readonly $ref: "#/$defs/Withdrawal";
171
+ };
172
+ readonly description: "What to withdraw now. Absent or empty: sign nothing new, and deliver the list the recipient holds — how a host the room has moved to, or one that missed a delivery, is brought up to date.";
173
+ };
174
+ readonly reason: {
175
+ readonly type: "string";
176
+ readonly minLength: 1;
177
+ readonly maxLength: 500;
178
+ readonly description: "Why, for the owner's own record. Never put into the list, which reaches every host: it MUST NOT carry personal data or a credential.";
179
+ };
180
+ readonly ext: {
181
+ readonly $ref: "#/$defs/Ext";
182
+ readonly description: "Ecosystem-defined extension members per SPEC.md §4.5.1.";
183
+ };
184
+ };
185
+ readonly $defs: {
186
+ readonly Withdrawal: {
187
+ readonly title: "Withdrawal";
188
+ readonly description: "One withdrawal to add, discriminated by `kind` as a RevocationEntry is. It carries no `revokedAt`: the recipient stamps the time it signs, so that a subject or room entry withdraws exactly what the room had issued until then and nothing the caller dated.";
189
+ readonly oneOf: readonly [{
190
+ readonly $ref: "#/$defs/WithdrawCredential";
191
+ }, {
192
+ readonly $ref: "#/$defs/WithdrawSubject";
193
+ }, {
194
+ readonly $ref: "#/$defs/WithdrawRoom";
195
+ }];
196
+ };
197
+ readonly WithdrawCredential: {
198
+ readonly title: "WithdrawCredential";
199
+ readonly type: "object";
200
+ readonly additionalProperties: false;
201
+ readonly required: readonly ["kind", "credentialId"];
202
+ readonly properties: {
203
+ readonly kind: {
204
+ readonly const: "credential";
205
+ };
206
+ readonly credentialId: {
207
+ readonly type: "string";
208
+ readonly minLength: 1;
209
+ readonly maxLength: 2048;
210
+ readonly description: "The `id` of the credential withdrawn.";
211
+ };
212
+ readonly until: {
213
+ readonly type: "string";
214
+ readonly format: "date-time";
215
+ readonly description: "OPTIONAL. The credential's own `validUntil`, after which the entry can be dropped.";
216
+ };
217
+ };
218
+ };
219
+ readonly WithdrawSubject: {
220
+ readonly title: "WithdrawSubject";
221
+ readonly type: "object";
222
+ readonly additionalProperties: false;
223
+ readonly required: readonly ["kind", "subject"];
224
+ readonly properties: {
225
+ readonly kind: {
226
+ readonly const: "subject";
227
+ };
228
+ readonly subject: {
229
+ readonly type: "string";
230
+ readonly pattern: "^did:";
231
+ readonly maxLength: 2048;
232
+ readonly description: "The party withdrawn: every credential naming them as subject or issuer that the room's chain gave them before now. Never the room.";
233
+ };
234
+ readonly until: {
235
+ readonly type: "string";
236
+ readonly format: "date-time";
237
+ readonly description: "OPTIONAL. When the last credential the room issued them expires, after which the entry can be dropped.";
238
+ };
239
+ };
240
+ };
241
+ readonly WithdrawRoom: {
242
+ readonly title: "WithdrawRoom";
243
+ readonly type: "object";
244
+ readonly additionalProperties: false;
245
+ readonly required: readonly ["kind"];
246
+ readonly properties: {
247
+ readonly kind: {
248
+ readonly const: "room";
249
+ };
250
+ readonly until: {
251
+ readonly type: "string";
252
+ readonly format: "date-time";
253
+ readonly description: "OPTIONAL. When the last credential the room issued before now expires.";
254
+ };
255
+ };
256
+ };
257
+ readonly Delivery: {
258
+ readonly title: "Delivery";
259
+ readonly type: "object";
260
+ readonly additionalProperties: false;
261
+ readonly required: readonly ["host", "outcome"];
262
+ readonly description: "What one host did with the list.";
263
+ readonly properties: {
264
+ readonly host: {
265
+ readonly type: "string";
266
+ readonly pattern: "^did:";
267
+ readonly maxLength: 2048;
268
+ };
269
+ readonly outcome: {
270
+ readonly type: "string";
271
+ readonly enum: readonly ["accepted", "refused", "unreachable"];
272
+ readonly description: "`accepted`: the host holds this list, or answered it as a repeat, and enforces it from `inForceAt`. `refused`: it answered and declined; its code is in `code`. `unreachable`: no answer, so the outcome is unknown — repeat the request with no `withdraw` to deliver again.";
273
+ };
274
+ readonly head: {
275
+ readonly $ref: "#/$defs/RevocationHead";
276
+ readonly description: "The head the host answered with. Present when `accepted`.";
277
+ };
278
+ readonly inForceAt: {
279
+ readonly type: "string";
280
+ readonly format: "date-time";
281
+ readonly description: "When the host began enforcing the list. Present when `accepted`.";
282
+ };
283
+ readonly code: {
284
+ readonly type: "string";
285
+ readonly maxLength: 128;
286
+ readonly description: "The host's error code. Present when `refused`.";
287
+ };
288
+ };
289
+ };
290
+ readonly Response: {
291
+ readonly $anchor: "response";
292
+ readonly title: "Rooms Owner Revoke — response payload";
293
+ readonly description: "Success response to rooms/owner/revoke. Type https://trusttasks.org/spec/rooms/owner/revoke/0.1#response. The list the recipient now holds for the room, and what each host did with it. A success says the list was signed and kept; only a delivery whose outcome is `accepted` says a host enforces it.";
294
+ readonly type: "object";
295
+ readonly additionalProperties: false;
296
+ readonly required: readonly ["roomId", "list", "head", "deliveries"];
297
+ readonly properties: {
298
+ readonly roomId: {
299
+ readonly type: "string";
300
+ readonly minLength: 1;
301
+ readonly maxLength: 512;
302
+ };
303
+ readonly list: {
304
+ readonly $ref: "#/$defs/RevocationList";
305
+ readonly description: "The room's current list, as signed. Returned so the owner holds a copy that does not depend on the recipient.";
306
+ };
307
+ readonly head: {
308
+ readonly $ref: "#/$defs/RevocationHead";
309
+ };
310
+ readonly deliveries: {
311
+ readonly type: "array";
312
+ readonly minItems: 1;
313
+ readonly maxItems: 8;
314
+ readonly items: {
315
+ readonly $ref: "#/$defs/Delivery";
316
+ };
317
+ readonly description: "One per host in the request, in its order.";
318
+ };
319
+ readonly ext: {
320
+ readonly $ref: "#/$defs/Ext";
321
+ };
322
+ };
323
+ };
324
+ readonly Ext: {
325
+ readonly title: "Ext";
326
+ 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.";
327
+ readonly type: "object";
328
+ readonly minProperties: 1;
329
+ readonly additionalProperties: true;
330
+ readonly propertyNames: {
331
+ readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$";
332
+ };
333
+ };
334
+ readonly RevocationHead: {
335
+ readonly title: "RevocationHead";
336
+ readonly type: "object";
337
+ readonly additionalProperties: false;
338
+ readonly required: readonly ["sequence", "digest"];
339
+ readonly description: "Which `RevocationList` a party holds, without its entries: comparable between the room's key holder and a host, and between two hosts, without disclosing whom the room withdrew.";
340
+ readonly properties: {
341
+ readonly sequence: {
342
+ readonly type: "integer";
343
+ readonly minimum: 1;
344
+ readonly description: "The list's `sequence`.";
345
+ };
346
+ readonly digest: {
347
+ readonly $ref: "#/$defs/DigestMultibase";
348
+ readonly description: "SHA-256 multihash of the list's RFC 8785 (JCS) canonicalization, `proof` included. Two parties holding one sequence with different digests have been given two lists the room signed at one sequence.";
349
+ };
350
+ };
351
+ };
352
+ readonly DigestMultibase: {
353
+ readonly title: "DigestMultibase";
354
+ readonly description: "A cryptographic digest as a multibase-encoded multihash — the encoding the W3C Verifiable Credentials Data Model 2.0 defines for `digestMultibase`, and the one `did:webvh` uses for its SCID and entry hashes.\n\nMultihash carries the hash algorithm in-band, so the value is self-describing and the wire format survives an algorithm change without a schema revision; multibase does the same for the base encoding, so a verifier never infers base58 from base64url by context. A bare hex string or a `sha-256:`-style prefix hard-codes one algorithm into the wire contract and is non-conforming here.\n\nThis definition constrains the *encoding only*. What the digest is computed over is stated by each referencing field, because it differs legitimately: a digest over a JSON document is taken over its RFC 8785 (JCS) canonicalization, while a digest over an opaque artifact is taken over its bytes. A field whose input is a JSON document and which does not name a canonicalization is not reproducible.\n\nRestricted to the two multibase headers W3C Controlled Identifiers 1.0 §2.4 normatively requires — `z` (base58btc) and `u` (base64url-no-pad). CID permits others but states that \"interoperability is not guaranteed between implementations using such values\", and a registry whose purpose is interoperability should not mint digests a conforming verifier may be unable to read. The alphabets are enforced rather than assumed: base58btc excludes 0, O, I and l, and an earlier permissive pattern let three published examples carry digests that were not valid base58 at all. base58btc is RECOMMENDED, for consistency with `did:key` and `did:webvh`.";
355
+ readonly type: "string";
356
+ readonly minLength: 16;
357
+ readonly pattern: "^(z[1-9A-HJ-NP-Za-km-z]+|u[A-Za-z0-9_-]+)$";
358
+ readonly examples: readonly ["zQmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR"];
359
+ };
360
+ readonly RevocationList: {
361
+ readonly title: "RevocationList";
362
+ readonly type: "object";
363
+ readonly additionalProperties: false;
364
+ readonly required: readonly ["roomId", "sequence", "issuedAt", "entries", "proof"];
365
+ readonly description: "The room's own statement of which credentials it has withdrawn before they expire — signed by the room, cumulative, and numbered, so that it means the same thing at every host it is delivered to.\n\n**Why the room signs it, and why it is cumulative.** A host authorizes from credentials the room issued and keeps no roster; a withdrawal kept only as a host's own state would make the room unmovable and the host part of the membership. A list the room signed is room state: it moves with the room, any host it is delivered to reaches the same decision, and nothing a host invents can be mistaken for it. It is cumulative — every list carries every entry still in force — so a host holding any one list holds the room's whole withdrawal state, and a host that missed a list loses nothing once it receives a later one.\n\n**Producing.** The room's key holder builds the object without `proof` and signs it with a W3C Data Integrity proof whose `verificationMethod` is a key the room's DID document lists for `assertionMethod` and whose `proofPurpose` is `assertionMethod`. A producer MUST support `eddsa-jcs-2022`. Each list's `sequence` is exactly one greater than the last list the room signed, and the producer MUST NOT sign two different lists at one `sequence`.\n\n**Accepting.** A host MUST refuse a list unless: (1) `roomId` is the room it is delivered for; (2) `proof` verifies with a key of `roomId` listed for `assertionMethod` — a list signed by any other key, however valid the signature, is not the room's; (3) `sequence` is greater than that of the list it holds, or equal with an identical list (a repeat, answered as accepted and changing nothing); (4) it is **append-only** against the list it holds: every entry of the held list appears in it unchanged, unless that entry's `until` has passed. A list that lowers the sequence is a rollback and one that drops a live entry is a reinstatement nobody signed for, and both are refused; two different lists at one `sequence` is the room's key equivocating, and the host keeps the list it holds.\n\n**Applying.** A credential is revoked by an accepted list when any entry matches it (see `RevocationEntry`). An entry whose `until` has passed MAY be discarded by a host and omitted from later lists; no other entry is ever dropped.\n\n**Size.** A list is bounded at 4096 entries. A room that would exceed it uses a `room` entry, which withdraws everything issued before it and lets the room re-issue to those who remain.";
366
+ readonly properties: {
367
+ readonly roomId: {
368
+ readonly type: "string";
369
+ readonly minLength: 1;
370
+ readonly maxLength: 512;
371
+ readonly description: "The room whose credentials this list withdraws, exactly as on the wire. Signed, so a list cannot be replayed against another room.";
372
+ };
373
+ readonly sequence: {
374
+ readonly type: "integer";
375
+ readonly minimum: 1;
376
+ readonly description: "The list's position in the room's sequence: exactly one greater than the last list the room signed. A host accepts only a list whose sequence is above the one it holds, which is what stops a host, a relayer or an attacker holding an old list from rolling the room's withdrawals back.";
377
+ };
378
+ readonly issuedAt: {
379
+ readonly type: "string";
380
+ readonly format: "date-time";
381
+ readonly description: "When the room signed this list.";
382
+ };
383
+ readonly entries: {
384
+ readonly type: "array";
385
+ readonly maxItems: 4096;
386
+ readonly items: {
387
+ readonly $ref: "#/$defs/RevocationEntry";
388
+ };
389
+ readonly description: "Every withdrawal still in force, in the order the room made them. Empty is valid: a room that has revoked nothing, or whose every entry has lapsed, can still state its sequence.";
390
+ };
391
+ readonly proof: {
392
+ readonly type: "object";
393
+ readonly description: "The room's Data Integrity proof over every other member, made with a key the room's DID document lists for `assertionMethod`.";
394
+ };
395
+ };
396
+ };
397
+ readonly RevocationEntry: {
398
+ readonly title: "RevocationEntry";
399
+ readonly description: "One withdrawal in a `RevocationList`, discriminated by `kind`.\n\n - `credential` withdraws one credential, named by its `id`. It matches the membership credential or any authority link whose `id` equals `credentialId`.\n - `subject` withdraws a party: every credential the room's chain gave them **before** `revokedAt`. It matches the membership credential or any authority link whose `credentialSubject` id **or** `issuer` is `subject` and whose `validFrom` is earlier than `revokedAt`. Matching the issuer as well as the subject withdraws what the party delegated before their removal, which no re-admission revives. A credential carrying no `validFrom` is treated as issued before every entry.\n - `room` withdraws every credential whose `validFrom` is earlier than `revokedAt`, whoever holds it. It is how a room resets access — after a compromise, or on a `private` room, where naming a party would disclose who was a member.\n\n**Keyed on time, so a party can come back.** A `subject` or `room` entry withdraws what was issued before it and nothing after, so a room that re-admits a removed party issues fresh credentials and they verify. A `credential` entry is permanent for that one credential, which nobody re-issues.\n\n**Tiers.** On a `private` room a host MUST refuse a list carrying a `credential` or `subject` entry: a presentation there withholds the credential and its subject, so such an entry is one the host cannot apply and a disclosure of who was in the room. Only `room` entries are permitted, and a host serving a `private` room MUST refuse any presentation for which it cannot establish that no credential in it has a `validFrom` earlier than the latest `room` entry's `revokedAt`.";
400
+ readonly oneOf: readonly [{
401
+ readonly $ref: "#/$defs/CredentialRevocation";
402
+ }, {
403
+ readonly $ref: "#/$defs/SubjectRevocation";
404
+ }, {
405
+ readonly $ref: "#/$defs/RoomRevocation";
406
+ }];
407
+ };
408
+ readonly RoomRevocation: {
409
+ readonly title: "RoomRevocation";
410
+ readonly type: "object";
411
+ readonly additionalProperties: false;
412
+ readonly required: readonly ["kind", "revokedAt"];
413
+ readonly description: "Withdraws every credential whose `validFrom` is earlier than `revokedAt`, whoever holds it.";
414
+ readonly properties: {
415
+ readonly kind: {
416
+ readonly const: "room";
417
+ };
418
+ readonly revokedAt: {
419
+ readonly type: "string";
420
+ readonly format: "date-time";
421
+ readonly description: "When the room made this withdrawal.";
422
+ };
423
+ readonly until: {
424
+ readonly type: "string";
425
+ readonly format: "date-time";
426
+ readonly description: "OPTIONAL. After this instant every credential the entry matches has expired anyway, so a host MAY discard the entry and the room MAY omit it from later lists. Absent means the entry is kept for as long as the room keeps a list.";
427
+ };
428
+ };
429
+ };
430
+ readonly SubjectRevocation: {
431
+ readonly title: "SubjectRevocation";
432
+ readonly type: "object";
433
+ readonly additionalProperties: false;
434
+ readonly required: readonly ["kind", "subject", "revokedAt"];
435
+ readonly description: "Withdraws a party: every credential naming them as subject or issuer whose `validFrom` is earlier than `revokedAt`.";
436
+ readonly properties: {
437
+ readonly kind: {
438
+ readonly const: "subject";
439
+ };
440
+ readonly subject: {
441
+ readonly type: "string";
442
+ readonly pattern: "^did:";
443
+ readonly maxLength: 2048;
444
+ readonly description: "The party withdrawn. Never the room itself.";
445
+ };
446
+ readonly revokedAt: {
447
+ readonly type: "string";
448
+ readonly format: "date-time";
449
+ readonly description: "When the room made this withdrawal.";
450
+ };
451
+ readonly until: {
452
+ readonly type: "string";
453
+ readonly format: "date-time";
454
+ readonly description: "OPTIONAL. After this instant every credential the entry matches has expired anyway, so a host MAY discard the entry and the room MAY omit it from later lists. Absent means the entry is kept for as long as the room keeps a list.";
455
+ };
456
+ };
457
+ };
458
+ readonly CredentialRevocation: {
459
+ readonly title: "CredentialRevocation";
460
+ readonly type: "object";
461
+ readonly additionalProperties: false;
462
+ readonly required: readonly ["kind", "credentialId", "revokedAt"];
463
+ readonly description: "Withdraws one credential — a membership credential or any authority link — by its `id`.";
464
+ readonly properties: {
465
+ readonly kind: {
466
+ readonly const: "credential";
467
+ };
468
+ readonly credentialId: {
469
+ readonly type: "string";
470
+ readonly minLength: 1;
471
+ readonly maxLength: 2048;
472
+ readonly description: "The `id` of the credential withdrawn, as `rooms/owner/issue-authority` and `rooms/owner/issue-membership` return it, or as an attenuated credential carries it.";
473
+ };
474
+ readonly revokedAt: {
475
+ readonly type: "string";
476
+ readonly format: "date-time";
477
+ readonly description: "When the room made this withdrawal.";
478
+ };
479
+ readonly until: {
480
+ readonly type: "string";
481
+ readonly format: "date-time";
482
+ readonly description: "OPTIONAL. After this instant every credential the entry matches has expired anyway, so a host MAY discard the entry and the room MAY omit it from later lists. Absent means the entry is kept for as long as the room keeps a list.";
483
+ };
484
+ };
485
+ };
486
+ };
487
+ };
488
+ /** As {@link PAYLOAD_SCHEMA}, for the success-response variant. */
489
+ export declare const RESPONSE_PAYLOAD_SCHEMA: {
490
+ readonly $schema: "https://json-schema.org/draft/2020-12/schema";
491
+ readonly $ref: "#/$defs/Response";
492
+ readonly $defs: {
493
+ readonly Withdrawal: {
494
+ readonly title: "Withdrawal";
495
+ readonly description: "One withdrawal to add, discriminated by `kind` as a RevocationEntry is. It carries no `revokedAt`: the recipient stamps the time it signs, so that a subject or room entry withdraws exactly what the room had issued until then and nothing the caller dated.";
496
+ readonly oneOf: readonly [{
497
+ readonly $ref: "#/$defs/WithdrawCredential";
498
+ }, {
499
+ readonly $ref: "#/$defs/WithdrawSubject";
500
+ }, {
501
+ readonly $ref: "#/$defs/WithdrawRoom";
502
+ }];
503
+ };
504
+ readonly WithdrawCredential: {
505
+ readonly title: "WithdrawCredential";
506
+ readonly type: "object";
507
+ readonly additionalProperties: false;
508
+ readonly required: readonly ["kind", "credentialId"];
509
+ readonly properties: {
510
+ readonly kind: {
511
+ readonly const: "credential";
512
+ };
513
+ readonly credentialId: {
514
+ readonly type: "string";
515
+ readonly minLength: 1;
516
+ readonly maxLength: 2048;
517
+ readonly description: "The `id` of the credential withdrawn.";
518
+ };
519
+ readonly until: {
520
+ readonly type: "string";
521
+ readonly format: "date-time";
522
+ readonly description: "OPTIONAL. The credential's own `validUntil`, after which the entry can be dropped.";
523
+ };
524
+ };
525
+ };
526
+ readonly WithdrawSubject: {
527
+ readonly title: "WithdrawSubject";
528
+ readonly type: "object";
529
+ readonly additionalProperties: false;
530
+ readonly required: readonly ["kind", "subject"];
531
+ readonly properties: {
532
+ readonly kind: {
533
+ readonly const: "subject";
534
+ };
535
+ readonly subject: {
536
+ readonly type: "string";
537
+ readonly pattern: "^did:";
538
+ readonly maxLength: 2048;
539
+ readonly description: "The party withdrawn: every credential naming them as subject or issuer that the room's chain gave them before now. Never the room.";
540
+ };
541
+ readonly until: {
542
+ readonly type: "string";
543
+ readonly format: "date-time";
544
+ readonly description: "OPTIONAL. When the last credential the room issued them expires, after which the entry can be dropped.";
545
+ };
546
+ };
547
+ };
548
+ readonly WithdrawRoom: {
549
+ readonly title: "WithdrawRoom";
550
+ readonly type: "object";
551
+ readonly additionalProperties: false;
552
+ readonly required: readonly ["kind"];
553
+ readonly properties: {
554
+ readonly kind: {
555
+ readonly const: "room";
556
+ };
557
+ readonly until: {
558
+ readonly type: "string";
559
+ readonly format: "date-time";
560
+ readonly description: "OPTIONAL. When the last credential the room issued before now expires.";
561
+ };
562
+ };
563
+ };
564
+ readonly Delivery: {
565
+ readonly title: "Delivery";
566
+ readonly type: "object";
567
+ readonly additionalProperties: false;
568
+ readonly required: readonly ["host", "outcome"];
569
+ readonly description: "What one host did with the list.";
570
+ readonly properties: {
571
+ readonly host: {
572
+ readonly type: "string";
573
+ readonly pattern: "^did:";
574
+ readonly maxLength: 2048;
575
+ };
576
+ readonly outcome: {
577
+ readonly type: "string";
578
+ readonly enum: readonly ["accepted", "refused", "unreachable"];
579
+ readonly description: "`accepted`: the host holds this list, or answered it as a repeat, and enforces it from `inForceAt`. `refused`: it answered and declined; its code is in `code`. `unreachable`: no answer, so the outcome is unknown — repeat the request with no `withdraw` to deliver again.";
580
+ };
581
+ readonly head: {
582
+ readonly $ref: "#/$defs/RevocationHead";
583
+ readonly description: "The head the host answered with. Present when `accepted`.";
584
+ };
585
+ readonly inForceAt: {
586
+ readonly type: "string";
587
+ readonly format: "date-time";
588
+ readonly description: "When the host began enforcing the list. Present when `accepted`.";
589
+ };
590
+ readonly code: {
591
+ readonly type: "string";
592
+ readonly maxLength: 128;
593
+ readonly description: "The host's error code. Present when `refused`.";
594
+ };
595
+ };
596
+ };
597
+ readonly Response: {
598
+ readonly $anchor: "response";
599
+ readonly title: "Rooms Owner Revoke — response payload";
600
+ readonly description: "Success response to rooms/owner/revoke. Type https://trusttasks.org/spec/rooms/owner/revoke/0.1#response. The list the recipient now holds for the room, and what each host did with it. A success says the list was signed and kept; only a delivery whose outcome is `accepted` says a host enforces it.";
601
+ readonly type: "object";
602
+ readonly additionalProperties: false;
603
+ readonly required: readonly ["roomId", "list", "head", "deliveries"];
604
+ readonly properties: {
605
+ readonly roomId: {
606
+ readonly type: "string";
607
+ readonly minLength: 1;
608
+ readonly maxLength: 512;
609
+ };
610
+ readonly list: {
611
+ readonly $ref: "#/$defs/RevocationList";
612
+ readonly description: "The room's current list, as signed. Returned so the owner holds a copy that does not depend on the recipient.";
613
+ };
614
+ readonly head: {
615
+ readonly $ref: "#/$defs/RevocationHead";
616
+ };
617
+ readonly deliveries: {
618
+ readonly type: "array";
619
+ readonly minItems: 1;
620
+ readonly maxItems: 8;
621
+ readonly items: {
622
+ readonly $ref: "#/$defs/Delivery";
623
+ };
624
+ readonly description: "One per host in the request, in its order.";
625
+ };
626
+ readonly ext: {
627
+ readonly $ref: "#/$defs/Ext";
628
+ };
629
+ };
630
+ };
631
+ readonly Ext: {
632
+ readonly title: "Ext";
633
+ 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.";
634
+ readonly type: "object";
635
+ readonly minProperties: 1;
636
+ readonly additionalProperties: true;
637
+ readonly propertyNames: {
638
+ readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$";
639
+ };
640
+ };
641
+ readonly RevocationHead: {
642
+ readonly title: "RevocationHead";
643
+ readonly type: "object";
644
+ readonly additionalProperties: false;
645
+ readonly required: readonly ["sequence", "digest"];
646
+ readonly description: "Which `RevocationList` a party holds, without its entries: comparable between the room's key holder and a host, and between two hosts, without disclosing whom the room withdrew.";
647
+ readonly properties: {
648
+ readonly sequence: {
649
+ readonly type: "integer";
650
+ readonly minimum: 1;
651
+ readonly description: "The list's `sequence`.";
652
+ };
653
+ readonly digest: {
654
+ readonly $ref: "#/$defs/DigestMultibase";
655
+ readonly description: "SHA-256 multihash of the list's RFC 8785 (JCS) canonicalization, `proof` included. Two parties holding one sequence with different digests have been given two lists the room signed at one sequence.";
656
+ };
657
+ };
658
+ };
659
+ readonly DigestMultibase: {
660
+ readonly title: "DigestMultibase";
661
+ readonly description: "A cryptographic digest as a multibase-encoded multihash — the encoding the W3C Verifiable Credentials Data Model 2.0 defines for `digestMultibase`, and the one `did:webvh` uses for its SCID and entry hashes.\n\nMultihash carries the hash algorithm in-band, so the value is self-describing and the wire format survives an algorithm change without a schema revision; multibase does the same for the base encoding, so a verifier never infers base58 from base64url by context. A bare hex string or a `sha-256:`-style prefix hard-codes one algorithm into the wire contract and is non-conforming here.\n\nThis definition constrains the *encoding only*. What the digest is computed over is stated by each referencing field, because it differs legitimately: a digest over a JSON document is taken over its RFC 8785 (JCS) canonicalization, while a digest over an opaque artifact is taken over its bytes. A field whose input is a JSON document and which does not name a canonicalization is not reproducible.\n\nRestricted to the two multibase headers W3C Controlled Identifiers 1.0 §2.4 normatively requires — `z` (base58btc) and `u` (base64url-no-pad). CID permits others but states that \"interoperability is not guaranteed between implementations using such values\", and a registry whose purpose is interoperability should not mint digests a conforming verifier may be unable to read. The alphabets are enforced rather than assumed: base58btc excludes 0, O, I and l, and an earlier permissive pattern let three published examples carry digests that were not valid base58 at all. base58btc is RECOMMENDED, for consistency with `did:key` and `did:webvh`.";
662
+ readonly type: "string";
663
+ readonly minLength: 16;
664
+ readonly pattern: "^(z[1-9A-HJ-NP-Za-km-z]+|u[A-Za-z0-9_-]+)$";
665
+ readonly examples: readonly ["zQmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR"];
666
+ };
667
+ readonly RevocationList: {
668
+ readonly title: "RevocationList";
669
+ readonly type: "object";
670
+ readonly additionalProperties: false;
671
+ readonly required: readonly ["roomId", "sequence", "issuedAt", "entries", "proof"];
672
+ readonly description: "The room's own statement of which credentials it has withdrawn before they expire — signed by the room, cumulative, and numbered, so that it means the same thing at every host it is delivered to.\n\n**Why the room signs it, and why it is cumulative.** A host authorizes from credentials the room issued and keeps no roster; a withdrawal kept only as a host's own state would make the room unmovable and the host part of the membership. A list the room signed is room state: it moves with the room, any host it is delivered to reaches the same decision, and nothing a host invents can be mistaken for it. It is cumulative — every list carries every entry still in force — so a host holding any one list holds the room's whole withdrawal state, and a host that missed a list loses nothing once it receives a later one.\n\n**Producing.** The room's key holder builds the object without `proof` and signs it with a W3C Data Integrity proof whose `verificationMethod` is a key the room's DID document lists for `assertionMethod` and whose `proofPurpose` is `assertionMethod`. A producer MUST support `eddsa-jcs-2022`. Each list's `sequence` is exactly one greater than the last list the room signed, and the producer MUST NOT sign two different lists at one `sequence`.\n\n**Accepting.** A host MUST refuse a list unless: (1) `roomId` is the room it is delivered for; (2) `proof` verifies with a key of `roomId` listed for `assertionMethod` — a list signed by any other key, however valid the signature, is not the room's; (3) `sequence` is greater than that of the list it holds, or equal with an identical list (a repeat, answered as accepted and changing nothing); (4) it is **append-only** against the list it holds: every entry of the held list appears in it unchanged, unless that entry's `until` has passed. A list that lowers the sequence is a rollback and one that drops a live entry is a reinstatement nobody signed for, and both are refused; two different lists at one `sequence` is the room's key equivocating, and the host keeps the list it holds.\n\n**Applying.** A credential is revoked by an accepted list when any entry matches it (see `RevocationEntry`). An entry whose `until` has passed MAY be discarded by a host and omitted from later lists; no other entry is ever dropped.\n\n**Size.** A list is bounded at 4096 entries. A room that would exceed it uses a `room` entry, which withdraws everything issued before it and lets the room re-issue to those who remain.";
673
+ readonly properties: {
674
+ readonly roomId: {
675
+ readonly type: "string";
676
+ readonly minLength: 1;
677
+ readonly maxLength: 512;
678
+ readonly description: "The room whose credentials this list withdraws, exactly as on the wire. Signed, so a list cannot be replayed against another room.";
679
+ };
680
+ readonly sequence: {
681
+ readonly type: "integer";
682
+ readonly minimum: 1;
683
+ readonly description: "The list's position in the room's sequence: exactly one greater than the last list the room signed. A host accepts only a list whose sequence is above the one it holds, which is what stops a host, a relayer or an attacker holding an old list from rolling the room's withdrawals back.";
684
+ };
685
+ readonly issuedAt: {
686
+ readonly type: "string";
687
+ readonly format: "date-time";
688
+ readonly description: "When the room signed this list.";
689
+ };
690
+ readonly entries: {
691
+ readonly type: "array";
692
+ readonly maxItems: 4096;
693
+ readonly items: {
694
+ readonly $ref: "#/$defs/RevocationEntry";
695
+ };
696
+ readonly description: "Every withdrawal still in force, in the order the room made them. Empty is valid: a room that has revoked nothing, or whose every entry has lapsed, can still state its sequence.";
697
+ };
698
+ readonly proof: {
699
+ readonly type: "object";
700
+ readonly description: "The room's Data Integrity proof over every other member, made with a key the room's DID document lists for `assertionMethod`.";
701
+ };
702
+ };
703
+ };
704
+ readonly RevocationEntry: {
705
+ readonly title: "RevocationEntry";
706
+ readonly description: "One withdrawal in a `RevocationList`, discriminated by `kind`.\n\n - `credential` withdraws one credential, named by its `id`. It matches the membership credential or any authority link whose `id` equals `credentialId`.\n - `subject` withdraws a party: every credential the room's chain gave them **before** `revokedAt`. It matches the membership credential or any authority link whose `credentialSubject` id **or** `issuer` is `subject` and whose `validFrom` is earlier than `revokedAt`. Matching the issuer as well as the subject withdraws what the party delegated before their removal, which no re-admission revives. A credential carrying no `validFrom` is treated as issued before every entry.\n - `room` withdraws every credential whose `validFrom` is earlier than `revokedAt`, whoever holds it. It is how a room resets access — after a compromise, or on a `private` room, where naming a party would disclose who was a member.\n\n**Keyed on time, so a party can come back.** A `subject` or `room` entry withdraws what was issued before it and nothing after, so a room that re-admits a removed party issues fresh credentials and they verify. A `credential` entry is permanent for that one credential, which nobody re-issues.\n\n**Tiers.** On a `private` room a host MUST refuse a list carrying a `credential` or `subject` entry: a presentation there withholds the credential and its subject, so such an entry is one the host cannot apply and a disclosure of who was in the room. Only `room` entries are permitted, and a host serving a `private` room MUST refuse any presentation for which it cannot establish that no credential in it has a `validFrom` earlier than the latest `room` entry's `revokedAt`.";
707
+ readonly oneOf: readonly [{
708
+ readonly $ref: "#/$defs/CredentialRevocation";
709
+ }, {
710
+ readonly $ref: "#/$defs/SubjectRevocation";
711
+ }, {
712
+ readonly $ref: "#/$defs/RoomRevocation";
713
+ }];
714
+ };
715
+ readonly RoomRevocation: {
716
+ readonly title: "RoomRevocation";
717
+ readonly type: "object";
718
+ readonly additionalProperties: false;
719
+ readonly required: readonly ["kind", "revokedAt"];
720
+ readonly description: "Withdraws every credential whose `validFrom` is earlier than `revokedAt`, whoever holds it.";
721
+ readonly properties: {
722
+ readonly kind: {
723
+ readonly const: "room";
724
+ };
725
+ readonly revokedAt: {
726
+ readonly type: "string";
727
+ readonly format: "date-time";
728
+ readonly description: "When the room made this withdrawal.";
729
+ };
730
+ readonly until: {
731
+ readonly type: "string";
732
+ readonly format: "date-time";
733
+ readonly description: "OPTIONAL. After this instant every credential the entry matches has expired anyway, so a host MAY discard the entry and the room MAY omit it from later lists. Absent means the entry is kept for as long as the room keeps a list.";
734
+ };
735
+ };
736
+ };
737
+ readonly SubjectRevocation: {
738
+ readonly title: "SubjectRevocation";
739
+ readonly type: "object";
740
+ readonly additionalProperties: false;
741
+ readonly required: readonly ["kind", "subject", "revokedAt"];
742
+ readonly description: "Withdraws a party: every credential naming them as subject or issuer whose `validFrom` is earlier than `revokedAt`.";
743
+ readonly properties: {
744
+ readonly kind: {
745
+ readonly const: "subject";
746
+ };
747
+ readonly subject: {
748
+ readonly type: "string";
749
+ readonly pattern: "^did:";
750
+ readonly maxLength: 2048;
751
+ readonly description: "The party withdrawn. Never the room itself.";
752
+ };
753
+ readonly revokedAt: {
754
+ readonly type: "string";
755
+ readonly format: "date-time";
756
+ readonly description: "When the room made this withdrawal.";
757
+ };
758
+ readonly until: {
759
+ readonly type: "string";
760
+ readonly format: "date-time";
761
+ readonly description: "OPTIONAL. After this instant every credential the entry matches has expired anyway, so a host MAY discard the entry and the room MAY omit it from later lists. Absent means the entry is kept for as long as the room keeps a list.";
762
+ };
763
+ };
764
+ };
765
+ readonly CredentialRevocation: {
766
+ readonly title: "CredentialRevocation";
767
+ readonly type: "object";
768
+ readonly additionalProperties: false;
769
+ readonly required: readonly ["kind", "credentialId", "revokedAt"];
770
+ readonly description: "Withdraws one credential — a membership credential or any authority link — by its `id`.";
771
+ readonly properties: {
772
+ readonly kind: {
773
+ readonly const: "credential";
774
+ };
775
+ readonly credentialId: {
776
+ readonly type: "string";
777
+ readonly minLength: 1;
778
+ readonly maxLength: 2048;
779
+ readonly description: "The `id` of the credential withdrawn, as `rooms/owner/issue-authority` and `rooms/owner/issue-membership` return it, or as an attenuated credential carries it.";
780
+ };
781
+ readonly revokedAt: {
782
+ readonly type: "string";
783
+ readonly format: "date-time";
784
+ readonly description: "When the room made this withdrawal.";
785
+ };
786
+ readonly until: {
787
+ readonly type: "string";
788
+ readonly format: "date-time";
789
+ readonly description: "OPTIONAL. After this instant every credential the entry matches has expired anyway, so a host MAY discard the entry and the room MAY omit it from later lists. Absent means the entry is kept for as long as the room keeps a list.";
790
+ };
791
+ };
792
+ };
793
+ };
794
+ };
795
+ /**
796
+ * SPEC.md §7.2 policy for the request variant, from this specification's
797
+ * front matter. Pass to `consumeInbound` — items 5b, 7 and 8 are
798
+ * per-specification and cannot be derived from the document alone, and
799
+ * item 2 needs the schema this carries.
800
+ */
801
+ export declare const SPEC: {
802
+ readonly typeUri: "https://trusttasks.org/spec/rooms/owner/revoke/0.1";
803
+ readonly isBearer: false;
804
+ readonly isProofRequired: true;
805
+ readonly isRecipientRequired: true;
806
+ readonly isIssuedAtRequired: true;
807
+ readonly payloadSchema: {
808
+ readonly $schema: "https://json-schema.org/draft/2020-12/schema";
809
+ readonly $id: "https://trusttasks.org/spec/rooms/owner/revoke/0.1";
810
+ readonly title: "Rooms Owner Revoke — payload";
811
+ readonly description: "A room's owner asks their own agent to withdraw credentials the room issued: sign the room's next revocation list as the room, keep it, and deliver it to each host serving the room.";
812
+ readonly type: "object";
813
+ readonly additionalProperties: false;
814
+ readonly required: readonly ["roomId", "signingKeyId", "hosts"];
815
+ readonly properties: {
816
+ readonly roomId: {
817
+ readonly type: "string";
818
+ readonly minLength: 1;
819
+ readonly maxLength: 512;
820
+ readonly description: "The room whose credentials are withdrawn. The recipient signs as this room.";
821
+ };
822
+ readonly signingKeyId: {
823
+ readonly type: "string";
824
+ readonly minLength: 1;
825
+ readonly maxLength: 256;
826
+ readonly description: "Which held key signs as the room — named explicitly, as for rooms/owner/issue-authority, because nothing maps a DID to the key it was minted with. A key that is not one the room's DID document lists for `assertionMethod` produces a list every host refuses.";
827
+ };
828
+ readonly hosts: {
829
+ readonly type: "array";
830
+ readonly minItems: 1;
831
+ readonly maxItems: 8;
832
+ readonly uniqueItems: true;
833
+ readonly items: {
834
+ readonly type: "string";
835
+ readonly pattern: "^did:";
836
+ readonly maxLength: 2048;
837
+ };
838
+ readonly description: "Every host serving the room, as DIDs: its primary, any mirror, and a host it is moving to. A withdrawal binds only the hosts that hold it, so a host left off this list honours what the room withdrew.";
839
+ };
840
+ readonly withdraw: {
841
+ readonly type: "array";
842
+ readonly maxItems: 64;
843
+ readonly items: {
844
+ readonly $ref: "#/$defs/Withdrawal";
845
+ };
846
+ readonly description: "What to withdraw now. Absent or empty: sign nothing new, and deliver the list the recipient holds — how a host the room has moved to, or one that missed a delivery, is brought up to date.";
847
+ };
848
+ readonly reason: {
849
+ readonly type: "string";
850
+ readonly minLength: 1;
851
+ readonly maxLength: 500;
852
+ readonly description: "Why, for the owner's own record. Never put into the list, which reaches every host: it MUST NOT carry personal data or a credential.";
853
+ };
854
+ readonly ext: {
855
+ readonly $ref: "#/$defs/Ext";
856
+ readonly description: "Ecosystem-defined extension members per SPEC.md §4.5.1.";
857
+ };
858
+ };
859
+ readonly $defs: {
860
+ readonly Withdrawal: {
861
+ readonly title: "Withdrawal";
862
+ readonly description: "One withdrawal to add, discriminated by `kind` as a RevocationEntry is. It carries no `revokedAt`: the recipient stamps the time it signs, so that a subject or room entry withdraws exactly what the room had issued until then and nothing the caller dated.";
863
+ readonly oneOf: readonly [{
864
+ readonly $ref: "#/$defs/WithdrawCredential";
865
+ }, {
866
+ readonly $ref: "#/$defs/WithdrawSubject";
867
+ }, {
868
+ readonly $ref: "#/$defs/WithdrawRoom";
869
+ }];
870
+ };
871
+ readonly WithdrawCredential: {
872
+ readonly title: "WithdrawCredential";
873
+ readonly type: "object";
874
+ readonly additionalProperties: false;
875
+ readonly required: readonly ["kind", "credentialId"];
876
+ readonly properties: {
877
+ readonly kind: {
878
+ readonly const: "credential";
879
+ };
880
+ readonly credentialId: {
881
+ readonly type: "string";
882
+ readonly minLength: 1;
883
+ readonly maxLength: 2048;
884
+ readonly description: "The `id` of the credential withdrawn.";
885
+ };
886
+ readonly until: {
887
+ readonly type: "string";
888
+ readonly format: "date-time";
889
+ readonly description: "OPTIONAL. The credential's own `validUntil`, after which the entry can be dropped.";
890
+ };
891
+ };
892
+ };
893
+ readonly WithdrawSubject: {
894
+ readonly title: "WithdrawSubject";
895
+ readonly type: "object";
896
+ readonly additionalProperties: false;
897
+ readonly required: readonly ["kind", "subject"];
898
+ readonly properties: {
899
+ readonly kind: {
900
+ readonly const: "subject";
901
+ };
902
+ readonly subject: {
903
+ readonly type: "string";
904
+ readonly pattern: "^did:";
905
+ readonly maxLength: 2048;
906
+ readonly description: "The party withdrawn: every credential naming them as subject or issuer that the room's chain gave them before now. Never the room.";
907
+ };
908
+ readonly until: {
909
+ readonly type: "string";
910
+ readonly format: "date-time";
911
+ readonly description: "OPTIONAL. When the last credential the room issued them expires, after which the entry can be dropped.";
912
+ };
913
+ };
914
+ };
915
+ readonly WithdrawRoom: {
916
+ readonly title: "WithdrawRoom";
917
+ readonly type: "object";
918
+ readonly additionalProperties: false;
919
+ readonly required: readonly ["kind"];
920
+ readonly properties: {
921
+ readonly kind: {
922
+ readonly const: "room";
923
+ };
924
+ readonly until: {
925
+ readonly type: "string";
926
+ readonly format: "date-time";
927
+ readonly description: "OPTIONAL. When the last credential the room issued before now expires.";
928
+ };
929
+ };
930
+ };
931
+ readonly Delivery: {
932
+ readonly title: "Delivery";
933
+ readonly type: "object";
934
+ readonly additionalProperties: false;
935
+ readonly required: readonly ["host", "outcome"];
936
+ readonly description: "What one host did with the list.";
937
+ readonly properties: {
938
+ readonly host: {
939
+ readonly type: "string";
940
+ readonly pattern: "^did:";
941
+ readonly maxLength: 2048;
942
+ };
943
+ readonly outcome: {
944
+ readonly type: "string";
945
+ readonly enum: readonly ["accepted", "refused", "unreachable"];
946
+ readonly description: "`accepted`: the host holds this list, or answered it as a repeat, and enforces it from `inForceAt`. `refused`: it answered and declined; its code is in `code`. `unreachable`: no answer, so the outcome is unknown — repeat the request with no `withdraw` to deliver again.";
947
+ };
948
+ readonly head: {
949
+ readonly $ref: "#/$defs/RevocationHead";
950
+ readonly description: "The head the host answered with. Present when `accepted`.";
951
+ };
952
+ readonly inForceAt: {
953
+ readonly type: "string";
954
+ readonly format: "date-time";
955
+ readonly description: "When the host began enforcing the list. Present when `accepted`.";
956
+ };
957
+ readonly code: {
958
+ readonly type: "string";
959
+ readonly maxLength: 128;
960
+ readonly description: "The host's error code. Present when `refused`.";
961
+ };
962
+ };
963
+ };
964
+ readonly Response: {
965
+ readonly $anchor: "response";
966
+ readonly title: "Rooms Owner Revoke — response payload";
967
+ readonly description: "Success response to rooms/owner/revoke. Type https://trusttasks.org/spec/rooms/owner/revoke/0.1#response. The list the recipient now holds for the room, and what each host did with it. A success says the list was signed and kept; only a delivery whose outcome is `accepted` says a host enforces it.";
968
+ readonly type: "object";
969
+ readonly additionalProperties: false;
970
+ readonly required: readonly ["roomId", "list", "head", "deliveries"];
971
+ readonly properties: {
972
+ readonly roomId: {
973
+ readonly type: "string";
974
+ readonly minLength: 1;
975
+ readonly maxLength: 512;
976
+ };
977
+ readonly list: {
978
+ readonly $ref: "#/$defs/RevocationList";
979
+ readonly description: "The room's current list, as signed. Returned so the owner holds a copy that does not depend on the recipient.";
980
+ };
981
+ readonly head: {
982
+ readonly $ref: "#/$defs/RevocationHead";
983
+ };
984
+ readonly deliveries: {
985
+ readonly type: "array";
986
+ readonly minItems: 1;
987
+ readonly maxItems: 8;
988
+ readonly items: {
989
+ readonly $ref: "#/$defs/Delivery";
990
+ };
991
+ readonly description: "One per host in the request, in its order.";
992
+ };
993
+ readonly ext: {
994
+ readonly $ref: "#/$defs/Ext";
995
+ };
996
+ };
997
+ };
998
+ readonly Ext: {
999
+ readonly title: "Ext";
1000
+ 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.";
1001
+ readonly type: "object";
1002
+ readonly minProperties: 1;
1003
+ readonly additionalProperties: true;
1004
+ readonly propertyNames: {
1005
+ readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$";
1006
+ };
1007
+ };
1008
+ readonly RevocationHead: {
1009
+ readonly title: "RevocationHead";
1010
+ readonly type: "object";
1011
+ readonly additionalProperties: false;
1012
+ readonly required: readonly ["sequence", "digest"];
1013
+ readonly description: "Which `RevocationList` a party holds, without its entries: comparable between the room's key holder and a host, and between two hosts, without disclosing whom the room withdrew.";
1014
+ readonly properties: {
1015
+ readonly sequence: {
1016
+ readonly type: "integer";
1017
+ readonly minimum: 1;
1018
+ readonly description: "The list's `sequence`.";
1019
+ };
1020
+ readonly digest: {
1021
+ readonly $ref: "#/$defs/DigestMultibase";
1022
+ readonly description: "SHA-256 multihash of the list's RFC 8785 (JCS) canonicalization, `proof` included. Two parties holding one sequence with different digests have been given two lists the room signed at one sequence.";
1023
+ };
1024
+ };
1025
+ };
1026
+ readonly DigestMultibase: {
1027
+ readonly title: "DigestMultibase";
1028
+ readonly description: "A cryptographic digest as a multibase-encoded multihash — the encoding the W3C Verifiable Credentials Data Model 2.0 defines for `digestMultibase`, and the one `did:webvh` uses for its SCID and entry hashes.\n\nMultihash carries the hash algorithm in-band, so the value is self-describing and the wire format survives an algorithm change without a schema revision; multibase does the same for the base encoding, so a verifier never infers base58 from base64url by context. A bare hex string or a `sha-256:`-style prefix hard-codes one algorithm into the wire contract and is non-conforming here.\n\nThis definition constrains the *encoding only*. What the digest is computed over is stated by each referencing field, because it differs legitimately: a digest over a JSON document is taken over its RFC 8785 (JCS) canonicalization, while a digest over an opaque artifact is taken over its bytes. A field whose input is a JSON document and which does not name a canonicalization is not reproducible.\n\nRestricted to the two multibase headers W3C Controlled Identifiers 1.0 §2.4 normatively requires — `z` (base58btc) and `u` (base64url-no-pad). CID permits others but states that \"interoperability is not guaranteed between implementations using such values\", and a registry whose purpose is interoperability should not mint digests a conforming verifier may be unable to read. The alphabets are enforced rather than assumed: base58btc excludes 0, O, I and l, and an earlier permissive pattern let three published examples carry digests that were not valid base58 at all. base58btc is RECOMMENDED, for consistency with `did:key` and `did:webvh`.";
1029
+ readonly type: "string";
1030
+ readonly minLength: 16;
1031
+ readonly pattern: "^(z[1-9A-HJ-NP-Za-km-z]+|u[A-Za-z0-9_-]+)$";
1032
+ readonly examples: readonly ["zQmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR"];
1033
+ };
1034
+ readonly RevocationList: {
1035
+ readonly title: "RevocationList";
1036
+ readonly type: "object";
1037
+ readonly additionalProperties: false;
1038
+ readonly required: readonly ["roomId", "sequence", "issuedAt", "entries", "proof"];
1039
+ readonly description: "The room's own statement of which credentials it has withdrawn before they expire — signed by the room, cumulative, and numbered, so that it means the same thing at every host it is delivered to.\n\n**Why the room signs it, and why it is cumulative.** A host authorizes from credentials the room issued and keeps no roster; a withdrawal kept only as a host's own state would make the room unmovable and the host part of the membership. A list the room signed is room state: it moves with the room, any host it is delivered to reaches the same decision, and nothing a host invents can be mistaken for it. It is cumulative — every list carries every entry still in force — so a host holding any one list holds the room's whole withdrawal state, and a host that missed a list loses nothing once it receives a later one.\n\n**Producing.** The room's key holder builds the object without `proof` and signs it with a W3C Data Integrity proof whose `verificationMethod` is a key the room's DID document lists for `assertionMethod` and whose `proofPurpose` is `assertionMethod`. A producer MUST support `eddsa-jcs-2022`. Each list's `sequence` is exactly one greater than the last list the room signed, and the producer MUST NOT sign two different lists at one `sequence`.\n\n**Accepting.** A host MUST refuse a list unless: (1) `roomId` is the room it is delivered for; (2) `proof` verifies with a key of `roomId` listed for `assertionMethod` — a list signed by any other key, however valid the signature, is not the room's; (3) `sequence` is greater than that of the list it holds, or equal with an identical list (a repeat, answered as accepted and changing nothing); (4) it is **append-only** against the list it holds: every entry of the held list appears in it unchanged, unless that entry's `until` has passed. A list that lowers the sequence is a rollback and one that drops a live entry is a reinstatement nobody signed for, and both are refused; two different lists at one `sequence` is the room's key equivocating, and the host keeps the list it holds.\n\n**Applying.** A credential is revoked by an accepted list when any entry matches it (see `RevocationEntry`). An entry whose `until` has passed MAY be discarded by a host and omitted from later lists; no other entry is ever dropped.\n\n**Size.** A list is bounded at 4096 entries. A room that would exceed it uses a `room` entry, which withdraws everything issued before it and lets the room re-issue to those who remain.";
1040
+ readonly properties: {
1041
+ readonly roomId: {
1042
+ readonly type: "string";
1043
+ readonly minLength: 1;
1044
+ readonly maxLength: 512;
1045
+ readonly description: "The room whose credentials this list withdraws, exactly as on the wire. Signed, so a list cannot be replayed against another room.";
1046
+ };
1047
+ readonly sequence: {
1048
+ readonly type: "integer";
1049
+ readonly minimum: 1;
1050
+ readonly description: "The list's position in the room's sequence: exactly one greater than the last list the room signed. A host accepts only a list whose sequence is above the one it holds, which is what stops a host, a relayer or an attacker holding an old list from rolling the room's withdrawals back.";
1051
+ };
1052
+ readonly issuedAt: {
1053
+ readonly type: "string";
1054
+ readonly format: "date-time";
1055
+ readonly description: "When the room signed this list.";
1056
+ };
1057
+ readonly entries: {
1058
+ readonly type: "array";
1059
+ readonly maxItems: 4096;
1060
+ readonly items: {
1061
+ readonly $ref: "#/$defs/RevocationEntry";
1062
+ };
1063
+ readonly description: "Every withdrawal still in force, in the order the room made them. Empty is valid: a room that has revoked nothing, or whose every entry has lapsed, can still state its sequence.";
1064
+ };
1065
+ readonly proof: {
1066
+ readonly type: "object";
1067
+ readonly description: "The room's Data Integrity proof over every other member, made with a key the room's DID document lists for `assertionMethod`.";
1068
+ };
1069
+ };
1070
+ };
1071
+ readonly RevocationEntry: {
1072
+ readonly title: "RevocationEntry";
1073
+ readonly description: "One withdrawal in a `RevocationList`, discriminated by `kind`.\n\n - `credential` withdraws one credential, named by its `id`. It matches the membership credential or any authority link whose `id` equals `credentialId`.\n - `subject` withdraws a party: every credential the room's chain gave them **before** `revokedAt`. It matches the membership credential or any authority link whose `credentialSubject` id **or** `issuer` is `subject` and whose `validFrom` is earlier than `revokedAt`. Matching the issuer as well as the subject withdraws what the party delegated before their removal, which no re-admission revives. A credential carrying no `validFrom` is treated as issued before every entry.\n - `room` withdraws every credential whose `validFrom` is earlier than `revokedAt`, whoever holds it. It is how a room resets access — after a compromise, or on a `private` room, where naming a party would disclose who was a member.\n\n**Keyed on time, so a party can come back.** A `subject` or `room` entry withdraws what was issued before it and nothing after, so a room that re-admits a removed party issues fresh credentials and they verify. A `credential` entry is permanent for that one credential, which nobody re-issues.\n\n**Tiers.** On a `private` room a host MUST refuse a list carrying a `credential` or `subject` entry: a presentation there withholds the credential and its subject, so such an entry is one the host cannot apply and a disclosure of who was in the room. Only `room` entries are permitted, and a host serving a `private` room MUST refuse any presentation for which it cannot establish that no credential in it has a `validFrom` earlier than the latest `room` entry's `revokedAt`.";
1074
+ readonly oneOf: readonly [{
1075
+ readonly $ref: "#/$defs/CredentialRevocation";
1076
+ }, {
1077
+ readonly $ref: "#/$defs/SubjectRevocation";
1078
+ }, {
1079
+ readonly $ref: "#/$defs/RoomRevocation";
1080
+ }];
1081
+ };
1082
+ readonly RoomRevocation: {
1083
+ readonly title: "RoomRevocation";
1084
+ readonly type: "object";
1085
+ readonly additionalProperties: false;
1086
+ readonly required: readonly ["kind", "revokedAt"];
1087
+ readonly description: "Withdraws every credential whose `validFrom` is earlier than `revokedAt`, whoever holds it.";
1088
+ readonly properties: {
1089
+ readonly kind: {
1090
+ readonly const: "room";
1091
+ };
1092
+ readonly revokedAt: {
1093
+ readonly type: "string";
1094
+ readonly format: "date-time";
1095
+ readonly description: "When the room made this withdrawal.";
1096
+ };
1097
+ readonly until: {
1098
+ readonly type: "string";
1099
+ readonly format: "date-time";
1100
+ readonly description: "OPTIONAL. After this instant every credential the entry matches has expired anyway, so a host MAY discard the entry and the room MAY omit it from later lists. Absent means the entry is kept for as long as the room keeps a list.";
1101
+ };
1102
+ };
1103
+ };
1104
+ readonly SubjectRevocation: {
1105
+ readonly title: "SubjectRevocation";
1106
+ readonly type: "object";
1107
+ readonly additionalProperties: false;
1108
+ readonly required: readonly ["kind", "subject", "revokedAt"];
1109
+ readonly description: "Withdraws a party: every credential naming them as subject or issuer whose `validFrom` is earlier than `revokedAt`.";
1110
+ readonly properties: {
1111
+ readonly kind: {
1112
+ readonly const: "subject";
1113
+ };
1114
+ readonly subject: {
1115
+ readonly type: "string";
1116
+ readonly pattern: "^did:";
1117
+ readonly maxLength: 2048;
1118
+ readonly description: "The party withdrawn. Never the room itself.";
1119
+ };
1120
+ readonly revokedAt: {
1121
+ readonly type: "string";
1122
+ readonly format: "date-time";
1123
+ readonly description: "When the room made this withdrawal.";
1124
+ };
1125
+ readonly until: {
1126
+ readonly type: "string";
1127
+ readonly format: "date-time";
1128
+ readonly description: "OPTIONAL. After this instant every credential the entry matches has expired anyway, so a host MAY discard the entry and the room MAY omit it from later lists. Absent means the entry is kept for as long as the room keeps a list.";
1129
+ };
1130
+ };
1131
+ };
1132
+ readonly CredentialRevocation: {
1133
+ readonly title: "CredentialRevocation";
1134
+ readonly type: "object";
1135
+ readonly additionalProperties: false;
1136
+ readonly required: readonly ["kind", "credentialId", "revokedAt"];
1137
+ readonly description: "Withdraws one credential — a membership credential or any authority link — by its `id`.";
1138
+ readonly properties: {
1139
+ readonly kind: {
1140
+ readonly const: "credential";
1141
+ };
1142
+ readonly credentialId: {
1143
+ readonly type: "string";
1144
+ readonly minLength: 1;
1145
+ readonly maxLength: 2048;
1146
+ readonly description: "The `id` of the credential withdrawn, as `rooms/owner/issue-authority` and `rooms/owner/issue-membership` return it, or as an attenuated credential carries it.";
1147
+ };
1148
+ readonly revokedAt: {
1149
+ readonly type: "string";
1150
+ readonly format: "date-time";
1151
+ readonly description: "When the room made this withdrawal.";
1152
+ };
1153
+ readonly until: {
1154
+ readonly type: "string";
1155
+ readonly format: "date-time";
1156
+ readonly description: "OPTIONAL. After this instant every credential the entry matches has expired anyway, so a host MAY discard the entry and the room MAY omit it from later lists. Absent means the entry is kept for as long as the room keeps a list.";
1157
+ };
1158
+ };
1159
+ };
1160
+ };
1161
+ };
1162
+ };
1163
+ /**
1164
+ * SPEC.md §7.2 policy for the success-response variant. `isRecipientRequired`
1165
+ * tracks the *issuer* party's requirement because a response swaps the
1166
+ * parties (§7.3 item 5).
1167
+ */
1168
+ export declare const RESPONSE_SPEC: {
1169
+ readonly typeUri: "https://trusttasks.org/spec/rooms/owner/revoke/0.1#response";
1170
+ readonly isBearer: false;
1171
+ readonly isProofRequired: true;
1172
+ readonly isRecipientRequired: true;
1173
+ readonly isIssuedAtRequired: true;
1174
+ readonly payloadSchema: {
1175
+ readonly $schema: "https://json-schema.org/draft/2020-12/schema";
1176
+ readonly $ref: "#/$defs/Response";
1177
+ readonly $defs: {
1178
+ readonly Withdrawal: {
1179
+ readonly title: "Withdrawal";
1180
+ readonly description: "One withdrawal to add, discriminated by `kind` as a RevocationEntry is. It carries no `revokedAt`: the recipient stamps the time it signs, so that a subject or room entry withdraws exactly what the room had issued until then and nothing the caller dated.";
1181
+ readonly oneOf: readonly [{
1182
+ readonly $ref: "#/$defs/WithdrawCredential";
1183
+ }, {
1184
+ readonly $ref: "#/$defs/WithdrawSubject";
1185
+ }, {
1186
+ readonly $ref: "#/$defs/WithdrawRoom";
1187
+ }];
1188
+ };
1189
+ readonly WithdrawCredential: {
1190
+ readonly title: "WithdrawCredential";
1191
+ readonly type: "object";
1192
+ readonly additionalProperties: false;
1193
+ readonly required: readonly ["kind", "credentialId"];
1194
+ readonly properties: {
1195
+ readonly kind: {
1196
+ readonly const: "credential";
1197
+ };
1198
+ readonly credentialId: {
1199
+ readonly type: "string";
1200
+ readonly minLength: 1;
1201
+ readonly maxLength: 2048;
1202
+ readonly description: "The `id` of the credential withdrawn.";
1203
+ };
1204
+ readonly until: {
1205
+ readonly type: "string";
1206
+ readonly format: "date-time";
1207
+ readonly description: "OPTIONAL. The credential's own `validUntil`, after which the entry can be dropped.";
1208
+ };
1209
+ };
1210
+ };
1211
+ readonly WithdrawSubject: {
1212
+ readonly title: "WithdrawSubject";
1213
+ readonly type: "object";
1214
+ readonly additionalProperties: false;
1215
+ readonly required: readonly ["kind", "subject"];
1216
+ readonly properties: {
1217
+ readonly kind: {
1218
+ readonly const: "subject";
1219
+ };
1220
+ readonly subject: {
1221
+ readonly type: "string";
1222
+ readonly pattern: "^did:";
1223
+ readonly maxLength: 2048;
1224
+ readonly description: "The party withdrawn: every credential naming them as subject or issuer that the room's chain gave them before now. Never the room.";
1225
+ };
1226
+ readonly until: {
1227
+ readonly type: "string";
1228
+ readonly format: "date-time";
1229
+ readonly description: "OPTIONAL. When the last credential the room issued them expires, after which the entry can be dropped.";
1230
+ };
1231
+ };
1232
+ };
1233
+ readonly WithdrawRoom: {
1234
+ readonly title: "WithdrawRoom";
1235
+ readonly type: "object";
1236
+ readonly additionalProperties: false;
1237
+ readonly required: readonly ["kind"];
1238
+ readonly properties: {
1239
+ readonly kind: {
1240
+ readonly const: "room";
1241
+ };
1242
+ readonly until: {
1243
+ readonly type: "string";
1244
+ readonly format: "date-time";
1245
+ readonly description: "OPTIONAL. When the last credential the room issued before now expires.";
1246
+ };
1247
+ };
1248
+ };
1249
+ readonly Delivery: {
1250
+ readonly title: "Delivery";
1251
+ readonly type: "object";
1252
+ readonly additionalProperties: false;
1253
+ readonly required: readonly ["host", "outcome"];
1254
+ readonly description: "What one host did with the list.";
1255
+ readonly properties: {
1256
+ readonly host: {
1257
+ readonly type: "string";
1258
+ readonly pattern: "^did:";
1259
+ readonly maxLength: 2048;
1260
+ };
1261
+ readonly outcome: {
1262
+ readonly type: "string";
1263
+ readonly enum: readonly ["accepted", "refused", "unreachable"];
1264
+ readonly description: "`accepted`: the host holds this list, or answered it as a repeat, and enforces it from `inForceAt`. `refused`: it answered and declined; its code is in `code`. `unreachable`: no answer, so the outcome is unknown — repeat the request with no `withdraw` to deliver again.";
1265
+ };
1266
+ readonly head: {
1267
+ readonly $ref: "#/$defs/RevocationHead";
1268
+ readonly description: "The head the host answered with. Present when `accepted`.";
1269
+ };
1270
+ readonly inForceAt: {
1271
+ readonly type: "string";
1272
+ readonly format: "date-time";
1273
+ readonly description: "When the host began enforcing the list. Present when `accepted`.";
1274
+ };
1275
+ readonly code: {
1276
+ readonly type: "string";
1277
+ readonly maxLength: 128;
1278
+ readonly description: "The host's error code. Present when `refused`.";
1279
+ };
1280
+ };
1281
+ };
1282
+ readonly Response: {
1283
+ readonly $anchor: "response";
1284
+ readonly title: "Rooms Owner Revoke — response payload";
1285
+ readonly description: "Success response to rooms/owner/revoke. Type https://trusttasks.org/spec/rooms/owner/revoke/0.1#response. The list the recipient now holds for the room, and what each host did with it. A success says the list was signed and kept; only a delivery whose outcome is `accepted` says a host enforces it.";
1286
+ readonly type: "object";
1287
+ readonly additionalProperties: false;
1288
+ readonly required: readonly ["roomId", "list", "head", "deliveries"];
1289
+ readonly properties: {
1290
+ readonly roomId: {
1291
+ readonly type: "string";
1292
+ readonly minLength: 1;
1293
+ readonly maxLength: 512;
1294
+ };
1295
+ readonly list: {
1296
+ readonly $ref: "#/$defs/RevocationList";
1297
+ readonly description: "The room's current list, as signed. Returned so the owner holds a copy that does not depend on the recipient.";
1298
+ };
1299
+ readonly head: {
1300
+ readonly $ref: "#/$defs/RevocationHead";
1301
+ };
1302
+ readonly deliveries: {
1303
+ readonly type: "array";
1304
+ readonly minItems: 1;
1305
+ readonly maxItems: 8;
1306
+ readonly items: {
1307
+ readonly $ref: "#/$defs/Delivery";
1308
+ };
1309
+ readonly description: "One per host in the request, in its order.";
1310
+ };
1311
+ readonly ext: {
1312
+ readonly $ref: "#/$defs/Ext";
1313
+ };
1314
+ };
1315
+ };
1316
+ readonly Ext: {
1317
+ readonly title: "Ext";
1318
+ 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.";
1319
+ readonly type: "object";
1320
+ readonly minProperties: 1;
1321
+ readonly additionalProperties: true;
1322
+ readonly propertyNames: {
1323
+ readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$";
1324
+ };
1325
+ };
1326
+ readonly RevocationHead: {
1327
+ readonly title: "RevocationHead";
1328
+ readonly type: "object";
1329
+ readonly additionalProperties: false;
1330
+ readonly required: readonly ["sequence", "digest"];
1331
+ readonly description: "Which `RevocationList` a party holds, without its entries: comparable between the room's key holder and a host, and between two hosts, without disclosing whom the room withdrew.";
1332
+ readonly properties: {
1333
+ readonly sequence: {
1334
+ readonly type: "integer";
1335
+ readonly minimum: 1;
1336
+ readonly description: "The list's `sequence`.";
1337
+ };
1338
+ readonly digest: {
1339
+ readonly $ref: "#/$defs/DigestMultibase";
1340
+ readonly description: "SHA-256 multihash of the list's RFC 8785 (JCS) canonicalization, `proof` included. Two parties holding one sequence with different digests have been given two lists the room signed at one sequence.";
1341
+ };
1342
+ };
1343
+ };
1344
+ readonly DigestMultibase: {
1345
+ readonly title: "DigestMultibase";
1346
+ readonly description: "A cryptographic digest as a multibase-encoded multihash — the encoding the W3C Verifiable Credentials Data Model 2.0 defines for `digestMultibase`, and the one `did:webvh` uses for its SCID and entry hashes.\n\nMultihash carries the hash algorithm in-band, so the value is self-describing and the wire format survives an algorithm change without a schema revision; multibase does the same for the base encoding, so a verifier never infers base58 from base64url by context. A bare hex string or a `sha-256:`-style prefix hard-codes one algorithm into the wire contract and is non-conforming here.\n\nThis definition constrains the *encoding only*. What the digest is computed over is stated by each referencing field, because it differs legitimately: a digest over a JSON document is taken over its RFC 8785 (JCS) canonicalization, while a digest over an opaque artifact is taken over its bytes. A field whose input is a JSON document and which does not name a canonicalization is not reproducible.\n\nRestricted to the two multibase headers W3C Controlled Identifiers 1.0 §2.4 normatively requires — `z` (base58btc) and `u` (base64url-no-pad). CID permits others but states that \"interoperability is not guaranteed between implementations using such values\", and a registry whose purpose is interoperability should not mint digests a conforming verifier may be unable to read. The alphabets are enforced rather than assumed: base58btc excludes 0, O, I and l, and an earlier permissive pattern let three published examples carry digests that were not valid base58 at all. base58btc is RECOMMENDED, for consistency with `did:key` and `did:webvh`.";
1347
+ readonly type: "string";
1348
+ readonly minLength: 16;
1349
+ readonly pattern: "^(z[1-9A-HJ-NP-Za-km-z]+|u[A-Za-z0-9_-]+)$";
1350
+ readonly examples: readonly ["zQmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR"];
1351
+ };
1352
+ readonly RevocationList: {
1353
+ readonly title: "RevocationList";
1354
+ readonly type: "object";
1355
+ readonly additionalProperties: false;
1356
+ readonly required: readonly ["roomId", "sequence", "issuedAt", "entries", "proof"];
1357
+ readonly description: "The room's own statement of which credentials it has withdrawn before they expire — signed by the room, cumulative, and numbered, so that it means the same thing at every host it is delivered to.\n\n**Why the room signs it, and why it is cumulative.** A host authorizes from credentials the room issued and keeps no roster; a withdrawal kept only as a host's own state would make the room unmovable and the host part of the membership. A list the room signed is room state: it moves with the room, any host it is delivered to reaches the same decision, and nothing a host invents can be mistaken for it. It is cumulative — every list carries every entry still in force — so a host holding any one list holds the room's whole withdrawal state, and a host that missed a list loses nothing once it receives a later one.\n\n**Producing.** The room's key holder builds the object without `proof` and signs it with a W3C Data Integrity proof whose `verificationMethod` is a key the room's DID document lists for `assertionMethod` and whose `proofPurpose` is `assertionMethod`. A producer MUST support `eddsa-jcs-2022`. Each list's `sequence` is exactly one greater than the last list the room signed, and the producer MUST NOT sign two different lists at one `sequence`.\n\n**Accepting.** A host MUST refuse a list unless: (1) `roomId` is the room it is delivered for; (2) `proof` verifies with a key of `roomId` listed for `assertionMethod` — a list signed by any other key, however valid the signature, is not the room's; (3) `sequence` is greater than that of the list it holds, or equal with an identical list (a repeat, answered as accepted and changing nothing); (4) it is **append-only** against the list it holds: every entry of the held list appears in it unchanged, unless that entry's `until` has passed. A list that lowers the sequence is a rollback and one that drops a live entry is a reinstatement nobody signed for, and both are refused; two different lists at one `sequence` is the room's key equivocating, and the host keeps the list it holds.\n\n**Applying.** A credential is revoked by an accepted list when any entry matches it (see `RevocationEntry`). An entry whose `until` has passed MAY be discarded by a host and omitted from later lists; no other entry is ever dropped.\n\n**Size.** A list is bounded at 4096 entries. A room that would exceed it uses a `room` entry, which withdraws everything issued before it and lets the room re-issue to those who remain.";
1358
+ readonly properties: {
1359
+ readonly roomId: {
1360
+ readonly type: "string";
1361
+ readonly minLength: 1;
1362
+ readonly maxLength: 512;
1363
+ readonly description: "The room whose credentials this list withdraws, exactly as on the wire. Signed, so a list cannot be replayed against another room.";
1364
+ };
1365
+ readonly sequence: {
1366
+ readonly type: "integer";
1367
+ readonly minimum: 1;
1368
+ readonly description: "The list's position in the room's sequence: exactly one greater than the last list the room signed. A host accepts only a list whose sequence is above the one it holds, which is what stops a host, a relayer or an attacker holding an old list from rolling the room's withdrawals back.";
1369
+ };
1370
+ readonly issuedAt: {
1371
+ readonly type: "string";
1372
+ readonly format: "date-time";
1373
+ readonly description: "When the room signed this list.";
1374
+ };
1375
+ readonly entries: {
1376
+ readonly type: "array";
1377
+ readonly maxItems: 4096;
1378
+ readonly items: {
1379
+ readonly $ref: "#/$defs/RevocationEntry";
1380
+ };
1381
+ readonly description: "Every withdrawal still in force, in the order the room made them. Empty is valid: a room that has revoked nothing, or whose every entry has lapsed, can still state its sequence.";
1382
+ };
1383
+ readonly proof: {
1384
+ readonly type: "object";
1385
+ readonly description: "The room's Data Integrity proof over every other member, made with a key the room's DID document lists for `assertionMethod`.";
1386
+ };
1387
+ };
1388
+ };
1389
+ readonly RevocationEntry: {
1390
+ readonly title: "RevocationEntry";
1391
+ readonly description: "One withdrawal in a `RevocationList`, discriminated by `kind`.\n\n - `credential` withdraws one credential, named by its `id`. It matches the membership credential or any authority link whose `id` equals `credentialId`.\n - `subject` withdraws a party: every credential the room's chain gave them **before** `revokedAt`. It matches the membership credential or any authority link whose `credentialSubject` id **or** `issuer` is `subject` and whose `validFrom` is earlier than `revokedAt`. Matching the issuer as well as the subject withdraws what the party delegated before their removal, which no re-admission revives. A credential carrying no `validFrom` is treated as issued before every entry.\n - `room` withdraws every credential whose `validFrom` is earlier than `revokedAt`, whoever holds it. It is how a room resets access — after a compromise, or on a `private` room, where naming a party would disclose who was a member.\n\n**Keyed on time, so a party can come back.** A `subject` or `room` entry withdraws what was issued before it and nothing after, so a room that re-admits a removed party issues fresh credentials and they verify. A `credential` entry is permanent for that one credential, which nobody re-issues.\n\n**Tiers.** On a `private` room a host MUST refuse a list carrying a `credential` or `subject` entry: a presentation there withholds the credential and its subject, so such an entry is one the host cannot apply and a disclosure of who was in the room. Only `room` entries are permitted, and a host serving a `private` room MUST refuse any presentation for which it cannot establish that no credential in it has a `validFrom` earlier than the latest `room` entry's `revokedAt`.";
1392
+ readonly oneOf: readonly [{
1393
+ readonly $ref: "#/$defs/CredentialRevocation";
1394
+ }, {
1395
+ readonly $ref: "#/$defs/SubjectRevocation";
1396
+ }, {
1397
+ readonly $ref: "#/$defs/RoomRevocation";
1398
+ }];
1399
+ };
1400
+ readonly RoomRevocation: {
1401
+ readonly title: "RoomRevocation";
1402
+ readonly type: "object";
1403
+ readonly additionalProperties: false;
1404
+ readonly required: readonly ["kind", "revokedAt"];
1405
+ readonly description: "Withdraws every credential whose `validFrom` is earlier than `revokedAt`, whoever holds it.";
1406
+ readonly properties: {
1407
+ readonly kind: {
1408
+ readonly const: "room";
1409
+ };
1410
+ readonly revokedAt: {
1411
+ readonly type: "string";
1412
+ readonly format: "date-time";
1413
+ readonly description: "When the room made this withdrawal.";
1414
+ };
1415
+ readonly until: {
1416
+ readonly type: "string";
1417
+ readonly format: "date-time";
1418
+ readonly description: "OPTIONAL. After this instant every credential the entry matches has expired anyway, so a host MAY discard the entry and the room MAY omit it from later lists. Absent means the entry is kept for as long as the room keeps a list.";
1419
+ };
1420
+ };
1421
+ };
1422
+ readonly SubjectRevocation: {
1423
+ readonly title: "SubjectRevocation";
1424
+ readonly type: "object";
1425
+ readonly additionalProperties: false;
1426
+ readonly required: readonly ["kind", "subject", "revokedAt"];
1427
+ readonly description: "Withdraws a party: every credential naming them as subject or issuer whose `validFrom` is earlier than `revokedAt`.";
1428
+ readonly properties: {
1429
+ readonly kind: {
1430
+ readonly const: "subject";
1431
+ };
1432
+ readonly subject: {
1433
+ readonly type: "string";
1434
+ readonly pattern: "^did:";
1435
+ readonly maxLength: 2048;
1436
+ readonly description: "The party withdrawn. Never the room itself.";
1437
+ };
1438
+ readonly revokedAt: {
1439
+ readonly type: "string";
1440
+ readonly format: "date-time";
1441
+ readonly description: "When the room made this withdrawal.";
1442
+ };
1443
+ readonly until: {
1444
+ readonly type: "string";
1445
+ readonly format: "date-time";
1446
+ readonly description: "OPTIONAL. After this instant every credential the entry matches has expired anyway, so a host MAY discard the entry and the room MAY omit it from later lists. Absent means the entry is kept for as long as the room keeps a list.";
1447
+ };
1448
+ };
1449
+ };
1450
+ readonly CredentialRevocation: {
1451
+ readonly title: "CredentialRevocation";
1452
+ readonly type: "object";
1453
+ readonly additionalProperties: false;
1454
+ readonly required: readonly ["kind", "credentialId", "revokedAt"];
1455
+ readonly description: "Withdraws one credential — a membership credential or any authority link — by its `id`.";
1456
+ readonly properties: {
1457
+ readonly kind: {
1458
+ readonly const: "credential";
1459
+ };
1460
+ readonly credentialId: {
1461
+ readonly type: "string";
1462
+ readonly minLength: 1;
1463
+ readonly maxLength: 2048;
1464
+ readonly description: "The `id` of the credential withdrawn, as `rooms/owner/issue-authority` and `rooms/owner/issue-membership` return it, or as an attenuated credential carries it.";
1465
+ };
1466
+ readonly revokedAt: {
1467
+ readonly type: "string";
1468
+ readonly format: "date-time";
1469
+ readonly description: "When the room made this withdrawal.";
1470
+ };
1471
+ readonly until: {
1472
+ readonly type: "string";
1473
+ readonly format: "date-time";
1474
+ readonly description: "OPTIONAL. After this instant every credential the entry matches has expired anyway, so a host MAY discard the entry and the room MAY omit it from later lists. Absent means the entry is kept for as long as the room keeps a list.";
1475
+ };
1476
+ };
1477
+ };
1478
+ };
1479
+ };
1480
+ };
1481
+ //# sourceMappingURL=payload.d.ts.map