@openvtc/trust-tasks 0.26.14 → 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 (197) hide show
  1. package/CHANGELOG.md +114 -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 +17 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +17 -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/rooms/community/create/0.1/payload.d.ts +4 -4
  109. package/dist/vtc/rooms/community/create/0.1/payload.js +2 -2
  110. package/dist/vtc/rooms/community/create/0.1/payload.js.map +1 -1
  111. package/dist/vtc/rooms/community/create/0.2/payload.d.ts +989 -0
  112. package/dist/vtc/rooms/community/create/0.2/payload.d.ts.map +1 -0
  113. package/dist/vtc/rooms/community/create/0.2/payload.js +559 -0
  114. package/dist/vtc/rooms/community/create/0.2/payload.js.map +1 -0
  115. package/dist/vtc/rooms/community/create/0.3/payload.d.ts +1013 -0
  116. package/dist/vtc/rooms/community/create/0.3/payload.d.ts.map +1 -0
  117. package/dist/vtc/rooms/community/create/0.3/payload.js +577 -0
  118. package/dist/vtc/rooms/community/create/0.3/payload.js.map +1 -0
  119. package/dist/vtc/rooms/community/get/0.1/payload.d.ts +4 -4
  120. package/dist/vtc/rooms/community/get/0.1/payload.js +2 -2
  121. package/dist/vtc/rooms/community/get/0.1/payload.js.map +1 -1
  122. package/dist/vtc/rooms/community/get/0.2/payload.d.ts +887 -0
  123. package/dist/vtc/rooms/community/get/0.2/payload.d.ts.map +1 -0
  124. package/dist/vtc/rooms/community/get/0.2/payload.js +517 -0
  125. package/dist/vtc/rooms/community/get/0.2/payload.js.map +1 -0
  126. package/dist/vtc/rooms/community/list/0.1/payload.d.ts +4 -4
  127. package/dist/vtc/rooms/community/list/0.1/payload.js +2 -2
  128. package/dist/vtc/rooms/community/list/0.1/payload.js.map +1 -1
  129. package/dist/vtc/rooms/community/list/0.2/payload.d.ts +960 -0
  130. package/dist/vtc/rooms/community/list/0.2/payload.d.ts.map +1 -0
  131. package/dist/vtc/rooms/community/list/0.2/payload.js +544 -0
  132. package/dist/vtc/rooms/community/list/0.2/payload.js.map +1 -0
  133. package/dist/vtc/rooms/community/members/remove/0.2/payload.d.ts +681 -0
  134. package/dist/vtc/rooms/community/members/remove/0.2/payload.d.ts.map +1 -0
  135. package/dist/vtc/rooms/community/members/remove/0.2/payload.js +393 -0
  136. package/dist/vtc/rooms/community/members/remove/0.2/payload.js.map +1 -0
  137. package/dist/vtc/rooms/community/update/0.1/payload.d.ts +1013 -0
  138. package/dist/vtc/rooms/community/update/0.1/payload.d.ts.map +1 -0
  139. package/dist/vtc/rooms/community/update/0.1/payload.js +573 -0
  140. package/dist/vtc/rooms/community/update/0.1/payload.js.map +1 -0
  141. package/dist/vtc/rooms/community/update/0.2/payload.d.ts +1037 -0
  142. package/dist/vtc/rooms/community/update/0.2/payload.d.ts.map +1 -0
  143. package/dist/vtc/rooms/community/update/0.2/payload.js +593 -0
  144. package/dist/vtc/rooms/community/update/0.2/payload.js.map +1 -0
  145. package/dist/vtc/rooms/offers/list/0.1/payload.d.ts +4 -4
  146. package/dist/vtc/rooms/offers/list/0.1/payload.js +2 -2
  147. package/dist/vtc/rooms/offers/list/0.1/payload.js.map +1 -1
  148. package/dist/vtc/rooms/offers/list/0.2/payload.d.ts +736 -0
  149. package/dist/vtc/rooms/offers/list/0.2/payload.d.ts.map +1 -0
  150. package/dist/vtc/rooms/offers/list/0.2/payload.js +430 -0
  151. package/dist/vtc/rooms/offers/list/0.2/payload.js.map +1 -0
  152. package/package.json +1 -1
  153. package/src/_shared/components.ts +426 -1
  154. package/src/index.ts +17 -0
  155. package/src/rooms/_shared/0.1/personal-label.ts +17 -0
  156. package/src/rooms/_shared/0.1/room.ts +1 -1
  157. package/src/rooms/blobs/get/0.1/payload.ts +2 -2
  158. package/src/rooms/blobs/get/0.2/payload.ts +2 -2
  159. package/src/rooms/blobs/upload/begin/0.1/payload.ts +2 -2
  160. package/src/rooms/blobs/upload/begin/0.2/payload.ts +2 -2
  161. package/src/rooms/epoch/chain/0.1/payload.ts +2 -2
  162. package/src/rooms/epoch/commits/0.1/payload.ts +2 -2
  163. package/src/rooms/epoch/mint/0.1/payload.ts +2 -2
  164. package/src/rooms/epoch/prune/0.1/payload.ts +2 -2
  165. package/src/rooms/info/0.1/payload.ts +2 -2
  166. package/src/rooms/keys/label/0.1/payload.ts +474 -0
  167. package/src/rooms/keys/list/0.2/payload.ts +412 -0
  168. package/src/rooms/keys/present/0.2/payload.ts +2 -2
  169. package/src/rooms/keys/profile/read/0.1/payload.ts +1617 -0
  170. package/src/rooms/keys/profile/write/0.1/payload.ts +388 -0
  171. package/src/rooms/owner/claim/0.1/payload.ts +2 -2
  172. package/src/rooms/owner/group/remove/0.2/payload.ts +415 -0
  173. package/src/rooms/owner/revoke/0.1/payload.ts +954 -0
  174. package/src/rooms/owner/transfer/0.1/payload.ts +2 -2
  175. package/src/rooms/records/curate/0.1/payload.ts +2 -2
  176. package/src/rooms/records/get/0.1/payload.ts +2 -2
  177. package/src/rooms/records/get/0.2/payload.ts +2 -2
  178. package/src/rooms/records/list/0.1/payload.ts +2 -2
  179. package/src/rooms/records/list/0.2/payload.ts +2 -2
  180. package/src/rooms/records/put/0.1/payload.ts +2 -2
  181. package/src/rooms/records/put/0.2/payload.ts +2 -2
  182. package/src/rooms/revocations/get/0.1/payload.ts +562 -0
  183. package/src/rooms/revocations/put/0.1/payload.ts +637 -0
  184. package/src/rooms/usage/0.1/payload.ts +2 -2
  185. package/src/vtc/_shared/0.1/community-room.ts +1 -1
  186. package/src/vtc/rooms/community/create/0.1/payload.ts +2 -2
  187. package/src/vtc/rooms/community/create/0.2/payload.ts +613 -0
  188. package/src/vtc/rooms/community/create/0.3/payload.ts +635 -0
  189. package/src/vtc/rooms/community/get/0.1/payload.ts +2 -2
  190. package/src/vtc/rooms/community/get/0.2/payload.ts +549 -0
  191. package/src/vtc/rooms/community/list/0.1/payload.ts +2 -2
  192. package/src/vtc/rooms/community/list/0.2/payload.ts +591 -0
  193. package/src/vtc/rooms/community/members/remove/0.2/payload.ts +439 -0
  194. package/src/vtc/rooms/community/update/0.1/payload.ts +629 -0
  195. package/src/vtc/rooms/community/update/0.2/payload.ts +653 -0
  196. package/src/vtc/rooms/offers/list/0.1/payload.ts +2 -2
  197. package/src/vtc/rooms/offers/list/0.2/payload.ts +473 -0
package/CHANGELOG.md CHANGED
@@ -11,6 +11,120 @@ The package versions over **its own API** — what a consumer compiles against
11
11
  not over `SPEC.md`. Below 1.0 a breaking change bumps the leading non-zero
12
12
  component.
13
13
 
14
+ ## 0.26.15 — 2026-10-17
15
+
16
+
17
+ ### Added
18
+
19
+ - **rooms/keys/profile**: A room's own profile — name and description sealed inside the room, readable only by its members (#807)
20
+
21
+ A member holding keys to many rooms saw a DID per room: nothing a member
22
+ could read said what a room was, and the community's label for a room it
23
+ owns reached only administrators and members it was offered to.
24
+
25
+ - rooms/_shared/0.1: RoomProfile (name required ≤128, description ≤1000,
26
+ tags ≤8, one emoji, ext) and RoomProfileStatement — the profile as a
27
+ SealedRecordBody's new `roomProfile` member, signed by its author, with
28
+ the author's authority chain and issuedAt. One record per epoch at
29
+ profile_key(E) = HKDF(storage_key(E), "openvtc/room/profile/v1" ||
30
+ roomId || u64be(E)) — 22 chars, indistinguishable from a random key, so
31
+ the host cannot tell which record names the room; fixed key
32
+ `room-profile` on open rooms. Readers accept only a chain conferring
33
+ curate or admin, valid at issuedAt, issuedAt within the host's
34
+ updatedAt window, not revoked at or before issuedAt; newest accepted
35
+ epoch wins; a retraction (curate-gated at the host) clears it.
36
+ Revocation is not retroactive.
37
+ - rooms/keys/profile/read 0.1 (new): the member's key holder derives the
38
+ location, walks epochs down, fetches as the member, verifies, and
39
+ answers found/absent/cleared with stale, searched and rejected.
40
+ - rooms/keys/profile/write 0.1 (new): the key holder signs as the member,
41
+ embeds the chain, pads, seals under the current epoch and puts; clear
42
+ retracts. Carries the rule that a key holder advancing an epoch
43
+ re-writes the profile under the new one (fromJoin members can read it).
44
+ - vtc/rooms/community/create 0.3, update 0.2: the community's VTA writes
45
+ label/description (never tags) as the room's profile; the community's
46
+ own authority confers admin, write and curate; response `roomProfile`.
47
+ - Editorial pointers in rooms/owner/group/{add 0.2, remove 0.2, renew
48
+ 0.1}; vtc/_shared RoomLabel/RoomDescription say where they now go.
49
+ - Rust, TypeScript, Go and Dart bindings regenerated.
50
+
51
+ - **rooms/keys/label**: A member's own private name, description, notes and tags for a room they hold (#806)
52
+
53
+ A member holding several rooms could tell them apart only by names other
54
+ parties gave them — the room's own profile, a community's offer label — or
55
+ by their DIDs. Nothing let a member keep their own name for a room, and a
56
+ person holding one room as two personas could not even tell the two
57
+ rooms/keys/list entries apart (implementations carried the member in ext).
58
+
59
+ - rooms/keys/label 0.1 (new): set, change or remove the member's personal
60
+ label for one room — label (one line, 128), description (1000), notes
61
+ (4000), tags (1–16 × 32) — kept by their key holder, keyed by room AND
62
+ member, never sent to the room, its host, its owner or a community, never
63
+ logged. Patch semantics (each detail given replaces, absent unchanged,
64
+ removeX removes one), idempotent (changed: false on a repeat), no
65
+ precondition. notHeld answers both "no group state" and "not a member you
66
+ act as". Delegates refused. Kept and backed up with the group state for
67
+ that room and member, discarded with it, and not on removal from the room.
68
+ - rooms/keys/list 0.2: each entry names its `member` (one entry per room
69
+ and member, for the members the caller may act as); `includePersonal`
70
+ (off by default) returns each entry's `personal` label. A consumer sends
71
+ a label nowhere but to the member; a wallet does not hand one to a
72
+ website unless the member chose to.
73
+ - rooms/_shared/0.1/personal-label (new): PersonalLabel and its details.
74
+
75
+ Informative display precedence: personal label, then the room's own
76
+ profile name, then the community's offer label, then the DID.
77
+
78
+ - **vtc/rooms/community**: Update — administrators name, describe and tag the rooms the community owns (#805)
79
+
80
+ A community could name a room it owns only once, at create, with no
81
+ description, and nothing could change it afterwards — so neither its
82
+ administrators nor the members it offers a room to could tell what each
83
+ room was for.
84
+
85
+ - vtc/rooms/community/update 0.1 (new): change a community-owned room's
86
+ label, description (or removeDescription) and tags. vtc.rooms.manage;
87
+ proof and issuedAt REQUIRED; reason audited with each changed detail's
88
+ previous and new value; same values answer changed: false and write
89
+ nothing; notFound for a room the community only hosts. Designed for
90
+ no operation-bound step-up: it reaches no key holder and confers
91
+ nothing.
92
+ - vtc/rooms/community/create 0.2: optional description and tags.
93
+ - vtc/rooms/community/get 0.2, list 0.2: CommunityRoomV2 — description,
94
+ tags, detailsUpdatedAt/detailsUpdatedBy; list filters by tag.
95
+ - vtc/rooms/offers/list 0.2: OfferV2 carries the room's current
96
+ description (never its tags).
97
+ - vtc/_shared/0.1/community-room: additive $defs RoomDescription,
98
+ RoomTag, RoomTags, CommunityRoomV2, OfferV2 (the RecordMetadataV2
99
+ pattern), so every 0.1 task keeps its published shape.
100
+
101
+ Details stay the community's owner-side record: never in the host
102
+ record, the room, or anything sent on its host path.
103
+
104
+ - **rooms**: Revocation — a removal takes effect at the host at once (#804)
105
+
106
+ A room can now withdraw credentials it issued before they expire, and a
107
+ host refuses them from the moment it accepts the withdrawal.
108
+
109
+ - rooms/_shared/0.1: RevocationList (room-signed, cumulative, sequenced,
110
+ append-only), RevocationEntry (credential | subject | room, keyed on
111
+ validFrom vs revokedAt so a party can be re-admitted), RevocationHead.
112
+ AuthorityPresentation states that every credential's proof must be made
113
+ by a key of its own issuer, and that a host holding a list refuses any
114
+ chain containing a revoked link, under every task and version.
115
+ - rooms/revocations/put 0.1 (new): an admin delivers the list; the host
116
+ enforces it immediately on every path.
117
+ - rooms/revocations/get 0.1 (new): an admin reads the held list, to
118
+ confirm enforcement or recover a lost list.
119
+ - rooms/owner/revoke 0.1 (new): the owner's key holder signs the next
120
+ list as the room and pushes it to every host — outbound only.
121
+ - rooms/owner/group/remove 0.2: withdraws the member first, then
122
+ advances the group; refuses a private room.
123
+ - vtc/rooms/community/members/remove 0.2: open and attributed rooms
124
+ withdraw the member's credentials (and an open offer's) at the host.
125
+ - Editorial pointers in group/remove 0.1, owner/claim 0.1 and
126
+ vtc/rooms/community/members/remove 0.1.
127
+
14
128
  ## 0.26.14 — 2026-10-16
15
129
 
16
130
 
@@ -754,6 +754,154 @@ export type OobKey = string;
754
754
  * A web origin (`https://host[:port]`, no path, no trailing slash) — for `login`, the origin of the portal where the starter runs, which is the origin of the `serviceEndpoint` of the service's `SignInPortal` service in its DID document.
755
755
  */
756
756
  export type Origin = string;
757
+ /**
758
+ * What the room is to the member, in a sentence or a short paragraph. Line breaks and tabs are allowed; other control characters are not.
759
+ */
760
+ export type PersonalLabelDescription = string;
761
+ /**
762
+ * The member's own name for the room, on one line: no control characters, line breaks included. Shown before every name a third party gave the room, because it is the only one nobody else wrote.
763
+ */
764
+ export type PersonalLabelName = string;
765
+ /**
766
+ * Longer free-form notes the member keeps about the room: who introduced them, what to look for in it, what they agreed there. Line breaks and tabs are allowed; other control characters are not.
767
+ */
768
+ export type PersonalLabelNotes = string;
769
+ /**
770
+ * A word or short phrase the member files the room under, in any script, so their own surfaces can group and filter their rooms. Compared exactly, as a string: a key holder does not case-fold or normalise it.
771
+ */
772
+ export type PersonalLabelTag = string;
773
+ /**
774
+ * The member's tags for the room, one to sixteen, as a set: order carries no meaning. A room with no tags has no `tags` member, never an empty list, so there is one way to say "none".
775
+ *
776
+ * @minItems 1
777
+ * @maxItems 16
778
+ */
779
+ export type PersonalLabelTags = [PersonalLabelTag] | [PersonalLabelTag, PersonalLabelTag] | [PersonalLabelTag, PersonalLabelTag, PersonalLabelTag] | [PersonalLabelTag, PersonalLabelTag, PersonalLabelTag, PersonalLabelTag] | [PersonalLabelTag, PersonalLabelTag, PersonalLabelTag, PersonalLabelTag, PersonalLabelTag] | [PersonalLabelTag, PersonalLabelTag, PersonalLabelTag, PersonalLabelTag, PersonalLabelTag, PersonalLabelTag] | [
780
+ PersonalLabelTag,
781
+ PersonalLabelTag,
782
+ PersonalLabelTag,
783
+ PersonalLabelTag,
784
+ PersonalLabelTag,
785
+ PersonalLabelTag,
786
+ PersonalLabelTag
787
+ ] | [
788
+ PersonalLabelTag,
789
+ PersonalLabelTag,
790
+ PersonalLabelTag,
791
+ PersonalLabelTag,
792
+ PersonalLabelTag,
793
+ PersonalLabelTag,
794
+ PersonalLabelTag,
795
+ PersonalLabelTag
796
+ ] | [
797
+ PersonalLabelTag,
798
+ PersonalLabelTag,
799
+ PersonalLabelTag,
800
+ PersonalLabelTag,
801
+ PersonalLabelTag,
802
+ PersonalLabelTag,
803
+ PersonalLabelTag,
804
+ PersonalLabelTag,
805
+ PersonalLabelTag
806
+ ] | [
807
+ PersonalLabelTag,
808
+ PersonalLabelTag,
809
+ PersonalLabelTag,
810
+ PersonalLabelTag,
811
+ PersonalLabelTag,
812
+ PersonalLabelTag,
813
+ PersonalLabelTag,
814
+ PersonalLabelTag,
815
+ PersonalLabelTag,
816
+ PersonalLabelTag
817
+ ] | [
818
+ PersonalLabelTag,
819
+ PersonalLabelTag,
820
+ PersonalLabelTag,
821
+ PersonalLabelTag,
822
+ PersonalLabelTag,
823
+ PersonalLabelTag,
824
+ PersonalLabelTag,
825
+ PersonalLabelTag,
826
+ PersonalLabelTag,
827
+ PersonalLabelTag,
828
+ PersonalLabelTag
829
+ ] | [
830
+ PersonalLabelTag,
831
+ PersonalLabelTag,
832
+ PersonalLabelTag,
833
+ PersonalLabelTag,
834
+ PersonalLabelTag,
835
+ PersonalLabelTag,
836
+ PersonalLabelTag,
837
+ PersonalLabelTag,
838
+ PersonalLabelTag,
839
+ PersonalLabelTag,
840
+ PersonalLabelTag,
841
+ PersonalLabelTag
842
+ ] | [
843
+ PersonalLabelTag,
844
+ PersonalLabelTag,
845
+ PersonalLabelTag,
846
+ PersonalLabelTag,
847
+ PersonalLabelTag,
848
+ PersonalLabelTag,
849
+ PersonalLabelTag,
850
+ PersonalLabelTag,
851
+ PersonalLabelTag,
852
+ PersonalLabelTag,
853
+ PersonalLabelTag,
854
+ PersonalLabelTag,
855
+ PersonalLabelTag
856
+ ] | [
857
+ PersonalLabelTag,
858
+ PersonalLabelTag,
859
+ PersonalLabelTag,
860
+ PersonalLabelTag,
861
+ PersonalLabelTag,
862
+ PersonalLabelTag,
863
+ PersonalLabelTag,
864
+ PersonalLabelTag,
865
+ PersonalLabelTag,
866
+ PersonalLabelTag,
867
+ PersonalLabelTag,
868
+ PersonalLabelTag,
869
+ PersonalLabelTag,
870
+ PersonalLabelTag
871
+ ] | [
872
+ PersonalLabelTag,
873
+ PersonalLabelTag,
874
+ PersonalLabelTag,
875
+ PersonalLabelTag,
876
+ PersonalLabelTag,
877
+ PersonalLabelTag,
878
+ PersonalLabelTag,
879
+ PersonalLabelTag,
880
+ PersonalLabelTag,
881
+ PersonalLabelTag,
882
+ PersonalLabelTag,
883
+ PersonalLabelTag,
884
+ PersonalLabelTag,
885
+ PersonalLabelTag,
886
+ PersonalLabelTag
887
+ ] | [
888
+ PersonalLabelTag,
889
+ PersonalLabelTag,
890
+ PersonalLabelTag,
891
+ PersonalLabelTag,
892
+ PersonalLabelTag,
893
+ PersonalLabelTag,
894
+ PersonalLabelTag,
895
+ PersonalLabelTag,
896
+ PersonalLabelTag,
897
+ PersonalLabelTag,
898
+ PersonalLabelTag,
899
+ PersonalLabelTag,
900
+ PersonalLabelTag,
901
+ PersonalLabelTag,
902
+ PersonalLabelTag,
903
+ PersonalLabelTag
904
+ ];
757
905
  /**
758
906
  * A region or city name as the vetter writes it. Compared case-insensitively and otherwise exactly.
759
907
  */
@@ -977,6 +1125,18 @@ export type ResumeToken = string;
977
1125
  * Whether a room keeps its history readable across a membership change, fixed at creation and immutable thereafter — like `Visibility`, and for the same reason: the rungs of an epoch key chain either exist for an epoch or they do not, and no later change of mind can seal key material that was never sealed or unseal what was already severed. `chained`: each advance produces an `EpochLink`, so every member reads the room's whole retained history however long they have been in it — what a **library** wants, at the cost of post-compromise security for record content, since a compromised current key then reaches every retained epoch. `fromJoin`: no rungs are produced, so a member reads only from the epoch their group state is at — what a **stream** wants, and what a room under a strict forward-secrecy obligation wants, at the cost that a joining member finds an empty-looking room and nobody can reread a record once their group state has moved past the epoch it was sealed under. Absent means `chained`; see the prose on why the absent case is the readable one.
978
1126
  */
979
1127
  export type RetentionPolicy = "chained" | "fromJoin";
1128
+ /**
1129
+ * One withdrawal in a `RevocationList`, discriminated by `kind`.
1130
+ *
1131
+ * - `credential` withdraws one credential, named by its `id`. It matches the membership credential or any authority link whose `id` equals `credentialId`.
1132
+ * - `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.
1133
+ * - `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.
1134
+ *
1135
+ * **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.
1136
+ *
1137
+ * **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`.
1138
+ */
1139
+ export type RevocationEntry = CredentialRevocation | SubjectRevocation | RoomRevocation;
980
1140
  /**
981
1141
  * One of the five git rights. Each string is also the TRQP `action` the VTC publishes the right under in its Trust Registry, so it is carried verbatim. `git.ns.admin` and `git.repo.create` apply to a namespace resource; `git.repo.own` and `git.repo.maintain` to a repository resource; `git.commit.sign` to either.
982
1142
  */
@@ -994,9 +1154,23 @@ export type RoleKeyState = "pending" | "staged" | "active" | "retiring" | "retir
994
1154
  */
995
1155
  export type RoleName = string;
996
1156
  /**
997
- * A name for the room, chosen by an administrator: shown to administrators and to the members a room is offered to. Not part of the room's identity and not sent to the room's host path. MUST NOT carry personal data.
1157
+ * What the room is for, in a sentence or a short paragraph, written by an administrator: shown to administrators holding `vtc.rooms.manage` and to the members the room is offered to. Plain text — a consumer renders it as text, never as markup. Like `RoomLabel`, it is the community's own record as the room's owner: not part of the room's identity and never in anything a room's host can read. From `vtc/rooms/community/create` 0.3 and `vtc/rooms/community/update` 0.2 the community also writes it, through its own VTA, as the `description` of the room's own profile (`RoomProfile` in rooms/_shared), sealed inside the room for its members; earlier versions keep it out of the room altogether. It MUST NOT carry personal data or a credential, and a reader MUST NOT treat it as instructions.
1158
+ */
1159
+ export type RoomDescription = string;
1160
+ /**
1161
+ * A name for the room, chosen by an administrator: shown to administrators and to the members a room is offered to. Not part of the room's identity and never in anything a room's host can read. From `vtc/rooms/community/create` 0.3 and `vtc/rooms/community/update` 0.2 the community also writes it, through its own VTA, as the `name` of the room's own profile (`RoomProfile` in rooms/_shared), sealed inside the room for its members; earlier versions keep it out of the room altogether. MUST NOT carry personal data.
998
1162
  */
999
1163
  export type RoomLabel = string;
1164
+ /**
1165
+ * A short identifier an administrator files a community-owned room under — `board`, `working-group`, `finance` — so the room list can be filtered. Lower-case letters, digits and hyphens, starting with a letter or digit. Owner-side tracking metadata for holders of `vtc.rooms.manage` only: never shown to members, never sent on the room's host path, and it confers nothing.
1166
+ */
1167
+ export type RoomTag = string;
1168
+ /**
1169
+ * The room's tags, at most eight, as a set: order carries no meaning. An empty list means the room has none — a tag grants nothing, so empty has no more dangerous reading.
1170
+ *
1171
+ * @maxItems 8
1172
+ */
1173
+ export type RoomTags = [] | [RoomTag] | [RoomTag, RoomTag] | [RoomTag, RoomTag, RoomTag] | [RoomTag, RoomTag, RoomTag, RoomTag] | [RoomTag, RoomTag, RoomTag, RoomTag, RoomTag] | [RoomTag, RoomTag, RoomTag, RoomTag, RoomTag, RoomTag] | [RoomTag, RoomTag, RoomTag, RoomTag, RoomTag, RoomTag, RoomTag] | [RoomTag, RoomTag, RoomTag, RoomTag, RoomTag, RoomTag, RoomTag, RoomTag];
1000
1174
  /**
1001
1175
  * `planned` — a successor was staged, activated, and the predecessor retired on the operator's schedule. `compromise` — a key was revoked and, where the role would otherwise be empty, replaced in the same log entry. `addition` — a key was added to a role without anything leaving it (for example a post-quantum key alongside a classical one).
1002
1176
  */
@@ -3976,6 +4150,10 @@ export interface AuthenticatorAttestationResponseRegistration {
3976
4150
  }
3977
4151
  /**
3978
4152
  * What a party presents to act on a room. Carries the whole authority chain: a host MUST NOT dereference an authority credential's `parent` to fetch a link it was not given. Resolving over the network would make verification depend on availability, turn every identifier into a request the host can be induced to make against an address the holder chooses, and signal credential use to whoever hosts the identifier. A host MUST bind the presenter to the chain's leaf. A chain that verifies is evidence that authority was conferred on somebody; it is not evidence that the party presenting it is that somebody. The leaf's subject MUST equal the party the host authenticated for this request — an identity the transport established or a document `proof` proved, never one named in a payload. A host that omits this check authorizes every captured presentation, and the omission is silent, because the chain still verifies.
4153
+ *
4154
+ * **Every credential is its issuer's attestation, and only its issuer's.** For the membership credential and for every link of `authority`, a host MUST verify the credential's `proof` with a key that the credential's own `issuer` lists for `assertionMethod` in its DID document, and MUST refuse a credential whose proof names a verification method that is not its issuer's. A proof that verifies under some other party's key is that party's statement, not the issuer's, and confers nothing. The same binding holds for every other document a room signs, such as a `RevocationList`.
4155
+ *
4156
+ * **A chain that verifies may still be revoked.** A host that has accepted a `RevocationList` for the room (`rooms/revocations/put`) MUST, from the moment it accepted it, refuse every presentation in which the membership credential or any link of `authority` is revoked by that list, under every task and every version of every task it serves for the room. A chain from which any link is revoked is refused whole: a credential delegated from a revoked one confers nothing, however it was attenuated. The refusal is the same `permissionDenied` as any other failed presentation.
3979
4157
  */
3980
4158
  export interface AuthorityPresentation {
3981
4159
  /**
@@ -4433,6 +4611,49 @@ export interface CommunityRoom {
4433
4611
  */
4434
4612
  createdBy?: string;
4435
4613
  }
4614
+ /**
4615
+ * What vtc/rooms/community/{create,get,list}/0.2 and vtc/rooms/community/update/0.1 return: `CommunityRoom` plus the details an administrator keeps track of a room by — `description`, `tags`, and who last changed them and when. A separate definition, not a change to `CommunityRoom`, so that the 0.1 versions of those tasks keep the exact shape they published. The room's creation is `room.createdAt` and `createdBy`.
4616
+ */
4617
+ export interface CommunityRoomV2 {
4618
+ room: HostedRoom;
4619
+ label: RoomLabel;
4620
+ /**
4621
+ * Absent when the room has none.
4622
+ */
4623
+ description?: RoomDescription;
4624
+ /**
4625
+ * Absent or empty when the room has none.
4626
+ */
4627
+ tags?: RoomTags;
4628
+ /**
4629
+ * The storage config receiving the room's new uploads.
4630
+ */
4631
+ storageConfig?: StorageConfigId;
4632
+ /**
4633
+ * Members in state `admitted`.
4634
+ */
4635
+ admitted: number;
4636
+ /**
4637
+ * Offers not yet accepted or withdrawn.
4638
+ */
4639
+ offered: number;
4640
+ /**
4641
+ * When the community's own `admin` authority over the room expires. A room whose owner's authority lapses can no longer advance its epoch, admit or remove; a community SHOULD renew it well before.
4642
+ */
4643
+ ownerAuthorityValidUntil?: string;
4644
+ /**
4645
+ * The administrator who created it.
4646
+ */
4647
+ createdBy?: string;
4648
+ /**
4649
+ * When `label`, `description` or `tags` last changed. Absent until the first change after creation. Distinct from `room.updatedAt`, which is the host record's and moves with the room's epoch and lifecycle.
4650
+ */
4651
+ detailsUpdatedAt?: string;
4652
+ /**
4653
+ * The administrator who made that change. Present exactly when `detailsUpdatedAt` is. The earlier values and who set them are in the community's audit trail, not here.
4654
+ */
4655
+ detailsUpdatedBy?: string;
4656
+ }
4436
4657
  /**
4437
4658
  * A community's portable configuration: its profile plus the configuration overrides a maintainer stores for itself. Deliberately excludes per-host layers (environment variables, on-disk config files) — those describe where a maintainer runs, not what the community is, and carrying them would make an import overwrite the target host's own deployment settings.
4438
4659
  *
@@ -4704,6 +4925,24 @@ export interface CredentialReference {
4704
4925
  */
4705
4926
  expiresAt?: string | null;
4706
4927
  }
4928
+ /**
4929
+ * Withdraws one credential — a membership credential or any authority link — by its `id`.
4930
+ */
4931
+ export interface CredentialRevocation {
4932
+ kind: "credential";
4933
+ /**
4934
+ * 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.
4935
+ */
4936
+ credentialId: string;
4937
+ /**
4938
+ * When the room made this withdrawal.
4939
+ */
4940
+ revokedAt: string;
4941
+ /**
4942
+ * 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.
4943
+ */
4944
+ until?: string;
4945
+ }
4707
4946
  /**
4708
4947
  * A JSON Schema (the W3C `credentialSchema` a credential of this type must conform to), carried as data. Any JSON Schema the community's validator compiles; this specification does not constrain its members. Absent means the type is registered with no schema constraint.
4709
4948
  */
@@ -6622,6 +6861,30 @@ export interface OfferCredentials {
6622
6861
  */
6623
6862
  authority: string;
6624
6863
  }
6864
+ /**
6865
+ * What vtc/rooms/offers/list/0.2 returns: `Offer` plus `description`. A separate definition, not a change to `Offer`, so that vtc/rooms/offers/list/0.1 keeps the exact shape it published. `label` and `description` are the room's as they stand when the offer is read, not as they stood when it was made.
6866
+ */
6867
+ export interface OfferV2 {
6868
+ roomId: string;
6869
+ /**
6870
+ * The room's host: this community.
6871
+ */
6872
+ host: string;
6873
+ label: RoomLabel;
6874
+ /**
6875
+ * Absent when the room has none.
6876
+ */
6877
+ description?: RoomDescription;
6878
+ visibility: Visibility;
6879
+ actions: MemberActions;
6880
+ validUntil: string;
6881
+ offeredAt: string;
6882
+ /**
6883
+ * `open`: not yet accepted. `accepted`: accepted, kept listed while a repeated accept can still be answered.
6884
+ */
6885
+ state: "open" | "accepted";
6886
+ credentials: OfferCredentials;
6887
+ }
6625
6888
  /**
6626
6889
  * One witnessing session's outcome evidence. `session` is the initiating witness/session document; `outcome` is the terminal witness/session/submit #response that the initiating document's own specification declares as its outcome evidence, under the witness's proof, delivering the VWC and its vwcDigestMultibase. A consumer pairs them with a presented VWC by SPEC §4.9.4's four checks and the witnessing checks of witness/session/submit (This response is the outcome evidence).
6627
6890
  */
@@ -6696,6 +6959,19 @@ export interface PeerDepth {
6696
6959
  bytes: number;
6697
6960
  oldestAgeSeconds?: number;
6698
6961
  }
6962
+ /**
6963
+ * A member's personal label for one room, as their key holder keeps it: at least one detail (`minProperties` counts `updatedAt`), and when it last changed. A key holder that holds no detail for the room holds no label, and returns none — there is no empty label.
6964
+ */
6965
+ export interface PersonalLabel {
6966
+ label?: PersonalLabelName;
6967
+ description?: PersonalLabelDescription;
6968
+ notes?: PersonalLabelNotes;
6969
+ tags?: PersonalLabelTags;
6970
+ /**
6971
+ * When the label last changed, as the key holder recorded it. A request that changed nothing does not move it.
6972
+ */
6973
+ updatedAt: string;
6974
+ }
6699
6975
  /**
6700
6976
  * A community's published position on personhood.
6701
6977
  *
@@ -7508,6 +7784,56 @@ export interface ResolvedClaim {
7508
7784
  */
7509
7785
  updatedAt?: string;
7510
7786
  }
7787
+ /**
7788
+ * 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.
7789
+ */
7790
+ export interface RevocationHead {
7791
+ /**
7792
+ * The list's `sequence`.
7793
+ */
7794
+ sequence: number;
7795
+ /**
7796
+ * 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.
7797
+ */
7798
+ digest: DigestMultibase;
7799
+ }
7800
+ /**
7801
+ * 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.
7802
+ *
7803
+ * **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.
7804
+ *
7805
+ * **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`.
7806
+ *
7807
+ * **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.
7808
+ *
7809
+ * **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.
7810
+ *
7811
+ * **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.
7812
+ */
7813
+ export interface RevocationList {
7814
+ /**
7815
+ * The room whose credentials this list withdraws, exactly as on the wire. Signed, so a list cannot be replayed against another room.
7816
+ */
7817
+ roomId: string;
7818
+ /**
7819
+ * 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.
7820
+ */
7821
+ sequence: number;
7822
+ /**
7823
+ * When the room signed this list.
7824
+ */
7825
+ issuedAt: string;
7826
+ /**
7827
+ * 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.
7828
+ *
7829
+ * @maxItems 4096
7830
+ */
7831
+ entries: RevocationEntry[];
7832
+ /**
7833
+ * The room's Data Integrity proof over every other member, made with a key the room's DID document lists for `assertionMethod`.
7834
+ */
7835
+ proof: {};
7836
+ }
7511
7837
  /**
7512
7838
  * The receipt for a successful revocation. Consumers MUST report the family's `alreadyRevoked` / `already_revoked` error when the credential was already revoked, rather than returning a second receipt silently — the caller has to be able to distinguish "I revoked it now" from "it was already gone".
7513
7839
  *
@@ -7808,6 +8134,53 @@ export interface RoomMember {
7808
8134
  admittedAt?: string;
7809
8135
  removedAt?: string;
7810
8136
  }
8137
+ /**
8138
+ * What a room says about itself to its own members: a name and, optionally, a description, short tags and an emoji, so that a member's wallet, portal or CLI can show what each room is rather than a DID.
8139
+ *
8140
+ * **It lives in the room, and only there.** A profile is carried in a record of the room (`RoomProfileStatement`), sealed on `attributed` and `private` rooms like every other record, so the room's host stores ciphertext and learns neither the name nor anything else here. It is never put in a credential — credentials are presented to hosts — nor in a host's record of the room, in `rooms/create` or `rooms/owner/register`, or in any member a host can read. On an `open` room it is cleartext, as everything in an open room is.
8141
+ *
8142
+ * **Plain text, never instructions.** Every member is free text chosen by whoever wrote the profile and shown to every member of the room. A reader renders `name`, `description` and `tags` as text — never as markup, never as a link it follows — removes or replaces control characters before showing them, and MUST NOT treat any of it as instructions, which matters most for an agent acting for a member. A writer MUST NOT put personal data or a credential in any member.
8143
+ *
8144
+ * **Growth.** A new optional member arrives in a later version of this component. A reader refuses a member it does not know (the `SealedRecordBody` rules), so a profile carrying one is not shown by a reader that predates it, and a writer SHOULD NOT use a member it cannot expect the room's readers to know. An ecosystem extension goes in `ext`, which a reader that does not understand it ignores. A change no earlier reader could survive is a new statement under a new derivation label (`openvtc/room/profile/v2`), written beside this one until the room's readers have moved.
8145
+ */
8146
+ export interface RoomProfile {
8147
+ /**
8148
+ * The room's name as its members see it. Plain text, one line. Bounded like the label a community gives a room it owns (`RoomLabel` in vtc/_shared), so a community can write the same name here that it shows its administrators and the members it offers the room to.
8149
+ */
8150
+ name: string;
8151
+ /**
8152
+ * What the room is for, in a sentence or a short paragraph. Plain text. Absent when the room has none; an empty string is not a description.
8153
+ */
8154
+ description?: string;
8155
+ /**
8156
+ * Short identifiers the room files itself under, as a set: order carries no meaning. A member's surface MAY filter or group rooms by them. They are the room's own and shown to its members — distinct from the tags a community files the rooms it owns under for its administrators, which are never written here.
8157
+ *
8158
+ * @maxItems 8
8159
+ */
8160
+ tags?: [] | [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];
8161
+ /**
8162
+ * One emoji — a single extended grapheme cluster, such as `📋` — that a surface MAY show beside the name. Text, rendered as text: never an image, never a URL, never anything a reader fetches, since a fetched icon would tell whoever serves it which member opened which room, and when. A reader that cannot render it shows nothing in its place.
8163
+ */
8164
+ emoji?: string;
8165
+ /**
8166
+ * Ecosystem-defined extension members per SPEC.md §4.5.1. A reader ignores what it does not understand.
8167
+ */
8168
+ ext?: Ext;
8169
+ }
8170
+ /**
8171
+ * Withdraws every credential whose `validFrom` is earlier than `revokedAt`, whoever holds it.
8172
+ */
8173
+ export interface RoomRevocation {
8174
+ kind: "room";
8175
+ /**
8176
+ * When the room made this withdrawal.
8177
+ */
8178
+ revokedAt: string;
8179
+ /**
8180
+ * 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.
8181
+ */
8182
+ until?: string;
8183
+ }
7811
8184
  /**
7812
8185
  * One change to a role's key set, from preview to completion. The rotation history of a DID is the list of these; the log is the authority for what was published, and this record adds what the log cannot say — which change was which, and (custody projection only) who asked, who approved, and why.
7813
8186
  */
@@ -8555,6 +8928,24 @@ export interface StreamDescriptor {
8555
8928
  expectedSizeBytes: ExpectedSizeBytes;
8556
8929
  expiresAt: ExpiresAt;
8557
8930
  }
8931
+ /**
8932
+ * Withdraws a party: every credential naming them as subject or issuer whose `validFrom` is earlier than `revokedAt`.
8933
+ */
8934
+ export interface SubjectRevocation {
8935
+ kind: "subject";
8936
+ /**
8937
+ * The party withdrawn. Never the room itself.
8938
+ */
8939
+ subject: string;
8940
+ /**
8941
+ * When the room made this withdrawal.
8942
+ */
8943
+ revokedAt: string;
8944
+ /**
8945
+ * 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.
8946
+ */
8947
+ until?: string;
8948
+ }
8558
8949
  /**
8559
8950
  * One attestation as a submission carries it: its metadata and its token. The attestation itself is inside the submission's `proof`, in the same order.
8560
8951
  */