@openvtc/trust-tasks 0.26.14 → 0.26.16

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 (212) hide show
  1. package/CHANGELOG.md +183 -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 +20 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +20 -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/act/0.4/payload.d.ts +546 -0
  42. package/dist/rooms/keys/act/0.4/payload.d.ts.map +1 -0
  43. package/dist/rooms/keys/act/0.4/payload.js +305 -0
  44. package/dist/rooms/keys/act/0.4/payload.js.map +1 -0
  45. package/dist/rooms/keys/label/0.1/payload.d.ts +757 -0
  46. package/dist/rooms/keys/label/0.1/payload.d.ts.map +1 -0
  47. package/dist/rooms/keys/label/0.1/payload.js +388 -0
  48. package/dist/rooms/keys/label/0.1/payload.js.map +1 -0
  49. package/dist/rooms/keys/list/0.2/payload.d.ts +667 -0
  50. package/dist/rooms/keys/list/0.2/payload.d.ts.map +1 -0
  51. package/dist/rooms/keys/list/0.2/payload.js +350 -0
  52. package/dist/rooms/keys/list/0.2/payload.js.map +1 -0
  53. package/dist/rooms/keys/present/0.2/payload.d.ts +4 -4
  54. package/dist/rooms/keys/present/0.2/payload.js +2 -2
  55. package/dist/rooms/keys/present/0.2/payload.js.map +1 -1
  56. package/dist/rooms/keys/profile/read/0.1/payload.d.ts +1652 -0
  57. package/dist/rooms/keys/profile/read/0.1/payload.d.ts.map +1 -0
  58. package/dist/rooms/keys/profile/read/0.1/payload.js +649 -0
  59. package/dist/rooms/keys/profile/read/0.1/payload.js.map +1 -0
  60. package/dist/rooms/keys/profile/write/0.1/payload.d.ts +583 -0
  61. package/dist/rooms/keys/profile/write/0.1/payload.d.ts.map +1 -0
  62. package/dist/rooms/keys/profile/write/0.1/payload.js +319 -0
  63. package/dist/rooms/keys/profile/write/0.1/payload.js.map +1 -0
  64. package/dist/rooms/owner/claim/0.1/payload.d.ts +4 -4
  65. package/dist/rooms/owner/claim/0.1/payload.js +2 -2
  66. package/dist/rooms/owner/claim/0.1/payload.js.map +1 -1
  67. package/dist/rooms/owner/group/remove/0.2/payload.d.ts +600 -0
  68. package/dist/rooms/owner/group/remove/0.2/payload.d.ts.map +1 -0
  69. package/dist/rooms/owner/group/remove/0.2/payload.js +310 -0
  70. package/dist/rooms/owner/group/remove/0.2/payload.js.map +1 -0
  71. package/dist/rooms/owner/revoke/0.1/payload.d.ts +1481 -0
  72. package/dist/rooms/owner/revoke/0.1/payload.d.ts.map +1 -0
  73. package/dist/rooms/owner/revoke/0.1/payload.js +811 -0
  74. package/dist/rooms/owner/revoke/0.1/payload.js.map +1 -0
  75. package/dist/rooms/owner/transfer/0.1/payload.d.ts +4 -4
  76. package/dist/rooms/owner/transfer/0.1/payload.js +2 -2
  77. package/dist/rooms/owner/transfer/0.1/payload.js.map +1 -1
  78. package/dist/rooms/records/curate/0.1/payload.d.ts +4 -4
  79. package/dist/rooms/records/curate/0.1/payload.js +2 -2
  80. package/dist/rooms/records/curate/0.1/payload.js.map +1 -1
  81. package/dist/rooms/records/get/0.1/payload.d.ts +4 -4
  82. package/dist/rooms/records/get/0.1/payload.js +2 -2
  83. package/dist/rooms/records/get/0.1/payload.js.map +1 -1
  84. package/dist/rooms/records/get/0.2/payload.d.ts +4 -4
  85. package/dist/rooms/records/get/0.2/payload.js +2 -2
  86. package/dist/rooms/records/get/0.2/payload.js.map +1 -1
  87. package/dist/rooms/records/list/0.1/payload.d.ts +4 -4
  88. package/dist/rooms/records/list/0.1/payload.js +2 -2
  89. package/dist/rooms/records/list/0.1/payload.js.map +1 -1
  90. package/dist/rooms/records/list/0.2/payload.d.ts +4 -4
  91. package/dist/rooms/records/list/0.2/payload.js +2 -2
  92. package/dist/rooms/records/list/0.2/payload.js.map +1 -1
  93. package/dist/rooms/records/put/0.1/payload.d.ts +4 -4
  94. package/dist/rooms/records/put/0.1/payload.js +2 -2
  95. package/dist/rooms/records/put/0.1/payload.js.map +1 -1
  96. package/dist/rooms/records/put/0.2/payload.d.ts +4 -4
  97. package/dist/rooms/records/put/0.2/payload.js +2 -2
  98. package/dist/rooms/records/put/0.2/payload.js.map +1 -1
  99. package/dist/rooms/revocations/get/0.1/payload.d.ts +905 -0
  100. package/dist/rooms/revocations/get/0.1/payload.d.ts.map +1 -0
  101. package/dist/rooms/revocations/get/0.1/payload.js +512 -0
  102. package/dist/rooms/revocations/get/0.1/payload.js.map +1 -0
  103. package/dist/rooms/revocations/put/0.1/payload.d.ts +1021 -0
  104. package/dist/rooms/revocations/put/0.1/payload.d.ts.map +1 -0
  105. package/dist/rooms/revocations/put/0.1/payload.js +583 -0
  106. package/dist/rooms/revocations/put/0.1/payload.js.map +1 -0
  107. package/dist/rooms/usage/0.1/payload.d.ts +4 -4
  108. package/dist/rooms/usage/0.1/payload.js +2 -2
  109. package/dist/rooms/usage/0.1/payload.js.map +1 -1
  110. package/dist/vtc/_shared/0.1/community-room.d.ts +1 -1
  111. package/dist/vtc/_shared/0.1/community-room.d.ts.map +1 -1
  112. package/dist/vtc/community/theme/show/0.1/payload.d.ts +238 -0
  113. package/dist/vtc/community/theme/show/0.1/payload.d.ts.map +1 -0
  114. package/dist/vtc/community/theme/show/0.1/payload.js +135 -0
  115. package/dist/vtc/community/theme/show/0.1/payload.js.map +1 -0
  116. package/dist/vtc/community/theme/update/0.1/payload.d.ts +286 -0
  117. package/dist/vtc/community/theme/update/0.1/payload.d.ts.map +1 -0
  118. package/dist/vtc/community/theme/update/0.1/payload.js +157 -0
  119. package/dist/vtc/community/theme/update/0.1/payload.js.map +1 -0
  120. package/dist/vtc/rooms/community/create/0.1/payload.d.ts +4 -4
  121. package/dist/vtc/rooms/community/create/0.1/payload.js +2 -2
  122. package/dist/vtc/rooms/community/create/0.1/payload.js.map +1 -1
  123. package/dist/vtc/rooms/community/create/0.2/payload.d.ts +989 -0
  124. package/dist/vtc/rooms/community/create/0.2/payload.d.ts.map +1 -0
  125. package/dist/vtc/rooms/community/create/0.2/payload.js +559 -0
  126. package/dist/vtc/rooms/community/create/0.2/payload.js.map +1 -0
  127. package/dist/vtc/rooms/community/create/0.3/payload.d.ts +1013 -0
  128. package/dist/vtc/rooms/community/create/0.3/payload.d.ts.map +1 -0
  129. package/dist/vtc/rooms/community/create/0.3/payload.js +577 -0
  130. package/dist/vtc/rooms/community/create/0.3/payload.js.map +1 -0
  131. package/dist/vtc/rooms/community/get/0.1/payload.d.ts +4 -4
  132. package/dist/vtc/rooms/community/get/0.1/payload.js +2 -2
  133. package/dist/vtc/rooms/community/get/0.1/payload.js.map +1 -1
  134. package/dist/vtc/rooms/community/get/0.2/payload.d.ts +887 -0
  135. package/dist/vtc/rooms/community/get/0.2/payload.d.ts.map +1 -0
  136. package/dist/vtc/rooms/community/get/0.2/payload.js +517 -0
  137. package/dist/vtc/rooms/community/get/0.2/payload.js.map +1 -0
  138. package/dist/vtc/rooms/community/list/0.1/payload.d.ts +4 -4
  139. package/dist/vtc/rooms/community/list/0.1/payload.js +2 -2
  140. package/dist/vtc/rooms/community/list/0.1/payload.js.map +1 -1
  141. package/dist/vtc/rooms/community/list/0.2/payload.d.ts +960 -0
  142. package/dist/vtc/rooms/community/list/0.2/payload.d.ts.map +1 -0
  143. package/dist/vtc/rooms/community/list/0.2/payload.js +544 -0
  144. package/dist/vtc/rooms/community/list/0.2/payload.js.map +1 -0
  145. package/dist/vtc/rooms/community/members/remove/0.2/payload.d.ts +681 -0
  146. package/dist/vtc/rooms/community/members/remove/0.2/payload.d.ts.map +1 -0
  147. package/dist/vtc/rooms/community/members/remove/0.2/payload.js +393 -0
  148. package/dist/vtc/rooms/community/members/remove/0.2/payload.js.map +1 -0
  149. package/dist/vtc/rooms/community/update/0.1/payload.d.ts +1013 -0
  150. package/dist/vtc/rooms/community/update/0.1/payload.d.ts.map +1 -0
  151. package/dist/vtc/rooms/community/update/0.1/payload.js +573 -0
  152. package/dist/vtc/rooms/community/update/0.1/payload.js.map +1 -0
  153. package/dist/vtc/rooms/community/update/0.2/payload.d.ts +1037 -0
  154. package/dist/vtc/rooms/community/update/0.2/payload.d.ts.map +1 -0
  155. package/dist/vtc/rooms/community/update/0.2/payload.js +593 -0
  156. package/dist/vtc/rooms/community/update/0.2/payload.js.map +1 -0
  157. package/dist/vtc/rooms/offers/list/0.1/payload.d.ts +4 -4
  158. package/dist/vtc/rooms/offers/list/0.1/payload.js +2 -2
  159. package/dist/vtc/rooms/offers/list/0.1/payload.js.map +1 -1
  160. package/dist/vtc/rooms/offers/list/0.2/payload.d.ts +736 -0
  161. package/dist/vtc/rooms/offers/list/0.2/payload.d.ts.map +1 -0
  162. package/dist/vtc/rooms/offers/list/0.2/payload.js +430 -0
  163. package/dist/vtc/rooms/offers/list/0.2/payload.js.map +1 -0
  164. package/package.json +1 -1
  165. package/src/_shared/components.ts +426 -1
  166. package/src/index.ts +20 -0
  167. package/src/rooms/_shared/0.1/personal-label.ts +17 -0
  168. package/src/rooms/_shared/0.1/room.ts +1 -1
  169. package/src/rooms/blobs/get/0.1/payload.ts +2 -2
  170. package/src/rooms/blobs/get/0.2/payload.ts +2 -2
  171. package/src/rooms/blobs/upload/begin/0.1/payload.ts +2 -2
  172. package/src/rooms/blobs/upload/begin/0.2/payload.ts +2 -2
  173. package/src/rooms/epoch/chain/0.1/payload.ts +2 -2
  174. package/src/rooms/epoch/commits/0.1/payload.ts +2 -2
  175. package/src/rooms/epoch/mint/0.1/payload.ts +2 -2
  176. package/src/rooms/epoch/prune/0.1/payload.ts +2 -2
  177. package/src/rooms/info/0.1/payload.ts +2 -2
  178. package/src/rooms/keys/act/0.4/payload.ts +380 -0
  179. package/src/rooms/keys/label/0.1/payload.ts +474 -0
  180. package/src/rooms/keys/list/0.2/payload.ts +412 -0
  181. package/src/rooms/keys/present/0.2/payload.ts +2 -2
  182. package/src/rooms/keys/profile/read/0.1/payload.ts +1617 -0
  183. package/src/rooms/keys/profile/write/0.1/payload.ts +388 -0
  184. package/src/rooms/owner/claim/0.1/payload.ts +2 -2
  185. package/src/rooms/owner/group/remove/0.2/payload.ts +415 -0
  186. package/src/rooms/owner/revoke/0.1/payload.ts +954 -0
  187. package/src/rooms/owner/transfer/0.1/payload.ts +2 -2
  188. package/src/rooms/records/curate/0.1/payload.ts +2 -2
  189. package/src/rooms/records/get/0.1/payload.ts +2 -2
  190. package/src/rooms/records/get/0.2/payload.ts +2 -2
  191. package/src/rooms/records/list/0.1/payload.ts +2 -2
  192. package/src/rooms/records/list/0.2/payload.ts +2 -2
  193. package/src/rooms/records/put/0.1/payload.ts +2 -2
  194. package/src/rooms/records/put/0.2/payload.ts +2 -2
  195. package/src/rooms/revocations/get/0.1/payload.ts +562 -0
  196. package/src/rooms/revocations/put/0.1/payload.ts +637 -0
  197. package/src/rooms/usage/0.1/payload.ts +2 -2
  198. package/src/vtc/_shared/0.1/community-room.ts +1 -1
  199. package/src/vtc/community/theme/show/0.1/payload.ts +170 -0
  200. package/src/vtc/community/theme/update/0.1/payload.ts +204 -0
  201. package/src/vtc/rooms/community/create/0.1/payload.ts +2 -2
  202. package/src/vtc/rooms/community/create/0.2/payload.ts +613 -0
  203. package/src/vtc/rooms/community/create/0.3/payload.ts +635 -0
  204. package/src/vtc/rooms/community/get/0.1/payload.ts +2 -2
  205. package/src/vtc/rooms/community/get/0.2/payload.ts +549 -0
  206. package/src/vtc/rooms/community/list/0.1/payload.ts +2 -2
  207. package/src/vtc/rooms/community/list/0.2/payload.ts +591 -0
  208. package/src/vtc/rooms/community/members/remove/0.2/payload.ts +439 -0
  209. package/src/vtc/rooms/community/update/0.1/payload.ts +629 -0
  210. package/src/vtc/rooms/community/update/0.2/payload.ts +653 -0
  211. package/src/vtc/rooms/offers/list/0.1/payload.ts +2 -2
  212. package/src/vtc/rooms/offers/list/0.2/payload.ts +473 -0
@@ -0,0 +1,412 @@
1
+ /**
2
+ * Generated by scripts/build-ts-bindings.mjs — DO NOT EDIT BY HAND.
3
+ * Source: specs/rooms/keys/list/0.2/payload.schema.json
4
+ */
5
+
6
+ import type { Ext, PersonalLabel, PersonalLabelDescription, PersonalLabelName, PersonalLabelNotes, PersonalLabelTag, PersonalLabelTags } from "../../../../_shared/components.js";
7
+
8
+
9
+ /**
10
+ * List the rooms the key holder can open for members the caller may act as. `includePersonal` asks for each entry's personal label as well; absent, none is returned. Carries no filter: the recipient answers for the members its caller acts as, and there is nothing to ask it about. The outer document members are owned by the framework — SPEC §6.3.
11
+ */
12
+ export interface RoomsKeysListPayload {
13
+ /**
14
+ * `true` asks for each entry's personal label (rooms/keys/label) in `personal`. Absent or `false`: no entry carries one. A request option, not a filter — it changes which members of an entry are returned, never which entries — and off by default so that a caller that has no use for the member's own names, or will pass the list on, never receives them.
15
+ */
16
+ includePersonal?: boolean;
17
+ /**
18
+ * Ecosystem-defined extension members per SPEC.md §4.5.1.
19
+ */
20
+ ext?: Ext;
21
+ }
22
+ /**
23
+ * Success response to rooms/keys/list. Type https://trusttasks.org/spec/rooms/keys/list/0.2#response. The rooms this key holder can open, one entry per room and member, for the members the caller may act as. This is key custody, not membership: a room whose group state was never delivered is absent here and the member may still hold a perfectly good VMC for it.
24
+ */
25
+ export interface RoomsKeysListResponsePayload {
26
+ /**
27
+ * One entry per room and member, in no guaranteed order. A room held as two members the caller may act as appears twice, once per member.
28
+ */
29
+ rooms: {
30
+ /**
31
+ * The room's identifier.
32
+ */
33
+ roomId: string;
34
+ /**
35
+ * The member this entry's group state is held for: the DID the room admitted. What a client names as `member` to rooms/keys/label, and as `issuer` to rooms/keys/act, to act on this entry rather than on the same room held as another member.
36
+ */
37
+ member: string;
38
+ /**
39
+ * The epoch this key holder is at for this member. Behind the room's own epoch means a commit has not been delivered, and records sealed since will not open.
40
+ */
41
+ epoch: number;
42
+ /**
43
+ * The earliest epoch this key holder can derive a key for, for this member, walking the epoch key chain it holds. Equal to `epoch` means it reads only from where it joined; `1` means the room's whole retained history. Anything between is a chain that has been delivered in part, or one deliberately severed below that point.
44
+ */
45
+ earliestReadableEpoch: number;
46
+ /**
47
+ * The member's own label for the room (rooms/keys/label). Present only when the request set `includePersonal: true` and the member has one. Private to the member: a caller MUST NOT pass it to the room's host, its owner, a community or a website the member has not chosen to show it to.
48
+ */
49
+ personal?: PersonalLabel;
50
+ }[];
51
+ ext?: Ext;
52
+ }
53
+
54
+ /** Shared definitions this specification references, re-exported under the names it used to declare them with. */
55
+ export type { Ext, PersonalLabel, PersonalLabelDescription, PersonalLabelName, PersonalLabelNotes, PersonalLabelTag, PersonalLabelTags };
56
+
57
+ /** Trust Task type URI. */
58
+ export const TYPE_URI = "https://trusttasks.org/spec/rooms/keys/list/0.2" as const;
59
+
60
+ /** Stable alias for this specification's request payload shape. */
61
+ export type Payload = RoomsKeysListPayload;
62
+
63
+ /** Trust Task response type URI (request type URI + "#response"). */
64
+ export const RESPONSE_TYPE_URI = "https://trusttasks.org/spec/rooms/keys/list/0.2#response" as const;
65
+
66
+ /** Stable alias for this specification's success-response payload shape. */
67
+ export type Response = RoomsKeysListResponsePayload;
68
+
69
+ /**
70
+ * This specification's payload schema, as a value.
71
+ *
72
+ * SPEC.md §7.2 item 2 is performed against this. It is shipped as data
73
+ * rather than only as a `.json` file because TypeScript types are erased
74
+ * at runtime: without a schema a consumer has nothing to validate, and
75
+ * every REQUIRED payload member is optional in practice. Cross-file
76
+ * `$ref`s are already inlined, so it needs no resolver.
77
+ */
78
+ export const PAYLOAD_SCHEMA = {
79
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
80
+ "$id": "https://trusttasks.org/spec/rooms/keys/list/0.2",
81
+ "title": "Rooms Keys List — payload",
82
+ "description": "List the rooms the key holder can open for members the caller may act as. `includePersonal` asks for each entry's personal label as well; absent, none is returned. Carries no filter: the recipient answers for the members its caller acts as, and there is nothing to ask it about. The outer document members are owned by the framework — SPEC §6.3.",
83
+ "type": "object",
84
+ "additionalProperties": false,
85
+ "properties": {
86
+ "includePersonal": {
87
+ "type": "boolean",
88
+ "description": "`true` asks for each entry's personal label (rooms/keys/label) in `personal`. Absent or `false`: no entry carries one. A request option, not a filter — it changes which members of an entry are returned, never which entries — and off by default so that a caller that has no use for the member's own names, or will pass the list on, never receives them."
89
+ },
90
+ "ext": {
91
+ "$ref": "#/$defs/Ext",
92
+ "description": "Ecosystem-defined extension members per SPEC.md §4.5.1."
93
+ }
94
+ },
95
+ "$defs": {
96
+ "Response": {
97
+ "$anchor": "response",
98
+ "title": "Rooms Keys List — response payload",
99
+ "description": "Success response to rooms/keys/list. Type https://trusttasks.org/spec/rooms/keys/list/0.2#response. The rooms this key holder can open, one entry per room and member, for the members the caller may act as. This is key custody, not membership: a room whose group state was never delivered is absent here and the member may still hold a perfectly good VMC for it.",
100
+ "type": "object",
101
+ "additionalProperties": false,
102
+ "required": [
103
+ "rooms"
104
+ ],
105
+ "properties": {
106
+ "rooms": {
107
+ "type": "array",
108
+ "description": "One entry per room and member, in no guaranteed order. A room held as two members the caller may act as appears twice, once per member.",
109
+ "items": {
110
+ "type": "object",
111
+ "additionalProperties": false,
112
+ "required": [
113
+ "roomId",
114
+ "member",
115
+ "epoch",
116
+ "earliestReadableEpoch"
117
+ ],
118
+ "properties": {
119
+ "roomId": {
120
+ "type": "string",
121
+ "minLength": 1,
122
+ "maxLength": 512,
123
+ "description": "The room's identifier."
124
+ },
125
+ "member": {
126
+ "type": "string",
127
+ "pattern": "^did:",
128
+ "maxLength": 2048,
129
+ "description": "The member this entry's group state is held for: the DID the room admitted. What a client names as `member` to rooms/keys/label, and as `issuer` to rooms/keys/act, to act on this entry rather than on the same room held as another member."
130
+ },
131
+ "epoch": {
132
+ "type": "integer",
133
+ "minimum": 1,
134
+ "description": "The epoch this key holder is at for this member. Behind the room's own epoch means a commit has not been delivered, and records sealed since will not open."
135
+ },
136
+ "earliestReadableEpoch": {
137
+ "type": "integer",
138
+ "minimum": 1,
139
+ "description": "The earliest epoch this key holder can derive a key for, for this member, walking the epoch key chain it holds. Equal to `epoch` means it reads only from where it joined; `1` means the room's whole retained history. Anything between is a chain that has been delivered in part, or one deliberately severed below that point."
140
+ },
141
+ "personal": {
142
+ "$ref": "#/$defs/PersonalLabel",
143
+ "description": "The member's own label for the room (rooms/keys/label). Present only when the request set `includePersonal: true` and the member has one. Private to the member: a caller MUST NOT pass it to the room's host, its owner, a community or a website the member has not chosen to show it to."
144
+ }
145
+ }
146
+ }
147
+ },
148
+ "ext": {
149
+ "$ref": "#/$defs/Ext"
150
+ }
151
+ }
152
+ },
153
+ "Ext": {
154
+ "title": "Ext",
155
+ "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.",
156
+ "type": "object",
157
+ "minProperties": 1,
158
+ "additionalProperties": true,
159
+ "propertyNames": {
160
+ "pattern": "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$"
161
+ }
162
+ },
163
+ "PersonalLabel": {
164
+ "title": "PersonalLabel",
165
+ "type": "object",
166
+ "additionalProperties": false,
167
+ "required": [
168
+ "updatedAt"
169
+ ],
170
+ "minProperties": 2,
171
+ "description": "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.",
172
+ "properties": {
173
+ "label": {
174
+ "$ref": "#/$defs/PersonalLabelName"
175
+ },
176
+ "description": {
177
+ "$ref": "#/$defs/PersonalLabelDescription"
178
+ },
179
+ "notes": {
180
+ "$ref": "#/$defs/PersonalLabelNotes"
181
+ },
182
+ "tags": {
183
+ "$ref": "#/$defs/PersonalLabelTags"
184
+ },
185
+ "updatedAt": {
186
+ "type": "string",
187
+ "format": "date-time",
188
+ "description": "When the label last changed, as the key holder recorded it. A request that changed nothing does not move it."
189
+ }
190
+ }
191
+ },
192
+ "PersonalLabelTags": {
193
+ "title": "PersonalLabelTags",
194
+ "type": "array",
195
+ "minItems": 1,
196
+ "maxItems": 16,
197
+ "uniqueItems": true,
198
+ "items": {
199
+ "$ref": "#/$defs/PersonalLabelTag"
200
+ },
201
+ "description": "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\"."
202
+ },
203
+ "PersonalLabelTag": {
204
+ "title": "PersonalLabelTag",
205
+ "type": "string",
206
+ "minLength": 1,
207
+ "maxLength": 32,
208
+ "pattern": "^[^\\u0000-\\u001F\\u007F]+$",
209
+ "description": "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."
210
+ },
211
+ "PersonalLabelNotes": {
212
+ "title": "PersonalLabelNotes",
213
+ "type": "string",
214
+ "minLength": 1,
215
+ "maxLength": 4000,
216
+ "pattern": "^[^\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F\\u007F]+$",
217
+ "description": "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."
218
+ },
219
+ "PersonalLabelDescription": {
220
+ "title": "PersonalLabelDescription",
221
+ "type": "string",
222
+ "minLength": 1,
223
+ "maxLength": 1000,
224
+ "pattern": "^[^\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F\\u007F]+$",
225
+ "description": "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."
226
+ },
227
+ "PersonalLabelName": {
228
+ "title": "PersonalLabelName",
229
+ "type": "string",
230
+ "minLength": 1,
231
+ "maxLength": 128,
232
+ "pattern": "^[^\\u0000-\\u001F\\u007F]+$",
233
+ "description": "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."
234
+ }
235
+ }
236
+ } as const;
237
+
238
+ /** As {@link PAYLOAD_SCHEMA}, for the success-response variant. */
239
+ export const RESPONSE_PAYLOAD_SCHEMA = {
240
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
241
+ "$ref": "#/$defs/Response",
242
+ "$defs": {
243
+ "Response": {
244
+ "$anchor": "response",
245
+ "title": "Rooms Keys List — response payload",
246
+ "description": "Success response to rooms/keys/list. Type https://trusttasks.org/spec/rooms/keys/list/0.2#response. The rooms this key holder can open, one entry per room and member, for the members the caller may act as. This is key custody, not membership: a room whose group state was never delivered is absent here and the member may still hold a perfectly good VMC for it.",
247
+ "type": "object",
248
+ "additionalProperties": false,
249
+ "required": [
250
+ "rooms"
251
+ ],
252
+ "properties": {
253
+ "rooms": {
254
+ "type": "array",
255
+ "description": "One entry per room and member, in no guaranteed order. A room held as two members the caller may act as appears twice, once per member.",
256
+ "items": {
257
+ "type": "object",
258
+ "additionalProperties": false,
259
+ "required": [
260
+ "roomId",
261
+ "member",
262
+ "epoch",
263
+ "earliestReadableEpoch"
264
+ ],
265
+ "properties": {
266
+ "roomId": {
267
+ "type": "string",
268
+ "minLength": 1,
269
+ "maxLength": 512,
270
+ "description": "The room's identifier."
271
+ },
272
+ "member": {
273
+ "type": "string",
274
+ "pattern": "^did:",
275
+ "maxLength": 2048,
276
+ "description": "The member this entry's group state is held for: the DID the room admitted. What a client names as `member` to rooms/keys/label, and as `issuer` to rooms/keys/act, to act on this entry rather than on the same room held as another member."
277
+ },
278
+ "epoch": {
279
+ "type": "integer",
280
+ "minimum": 1,
281
+ "description": "The epoch this key holder is at for this member. Behind the room's own epoch means a commit has not been delivered, and records sealed since will not open."
282
+ },
283
+ "earliestReadableEpoch": {
284
+ "type": "integer",
285
+ "minimum": 1,
286
+ "description": "The earliest epoch this key holder can derive a key for, for this member, walking the epoch key chain it holds. Equal to `epoch` means it reads only from where it joined; `1` means the room's whole retained history. Anything between is a chain that has been delivered in part, or one deliberately severed below that point."
287
+ },
288
+ "personal": {
289
+ "$ref": "#/$defs/PersonalLabel",
290
+ "description": "The member's own label for the room (rooms/keys/label). Present only when the request set `includePersonal: true` and the member has one. Private to the member: a caller MUST NOT pass it to the room's host, its owner, a community or a website the member has not chosen to show it to."
291
+ }
292
+ }
293
+ }
294
+ },
295
+ "ext": {
296
+ "$ref": "#/$defs/Ext"
297
+ }
298
+ }
299
+ },
300
+ "Ext": {
301
+ "title": "Ext",
302
+ "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.",
303
+ "type": "object",
304
+ "minProperties": 1,
305
+ "additionalProperties": true,
306
+ "propertyNames": {
307
+ "pattern": "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$"
308
+ }
309
+ },
310
+ "PersonalLabel": {
311
+ "title": "PersonalLabel",
312
+ "type": "object",
313
+ "additionalProperties": false,
314
+ "required": [
315
+ "updatedAt"
316
+ ],
317
+ "minProperties": 2,
318
+ "description": "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.",
319
+ "properties": {
320
+ "label": {
321
+ "$ref": "#/$defs/PersonalLabelName"
322
+ },
323
+ "description": {
324
+ "$ref": "#/$defs/PersonalLabelDescription"
325
+ },
326
+ "notes": {
327
+ "$ref": "#/$defs/PersonalLabelNotes"
328
+ },
329
+ "tags": {
330
+ "$ref": "#/$defs/PersonalLabelTags"
331
+ },
332
+ "updatedAt": {
333
+ "type": "string",
334
+ "format": "date-time",
335
+ "description": "When the label last changed, as the key holder recorded it. A request that changed nothing does not move it."
336
+ }
337
+ }
338
+ },
339
+ "PersonalLabelTags": {
340
+ "title": "PersonalLabelTags",
341
+ "type": "array",
342
+ "minItems": 1,
343
+ "maxItems": 16,
344
+ "uniqueItems": true,
345
+ "items": {
346
+ "$ref": "#/$defs/PersonalLabelTag"
347
+ },
348
+ "description": "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\"."
349
+ },
350
+ "PersonalLabelTag": {
351
+ "title": "PersonalLabelTag",
352
+ "type": "string",
353
+ "minLength": 1,
354
+ "maxLength": 32,
355
+ "pattern": "^[^\\u0000-\\u001F\\u007F]+$",
356
+ "description": "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."
357
+ },
358
+ "PersonalLabelNotes": {
359
+ "title": "PersonalLabelNotes",
360
+ "type": "string",
361
+ "minLength": 1,
362
+ "maxLength": 4000,
363
+ "pattern": "^[^\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F\\u007F]+$",
364
+ "description": "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."
365
+ },
366
+ "PersonalLabelDescription": {
367
+ "title": "PersonalLabelDescription",
368
+ "type": "string",
369
+ "minLength": 1,
370
+ "maxLength": 1000,
371
+ "pattern": "^[^\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F\\u007F]+$",
372
+ "description": "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."
373
+ },
374
+ "PersonalLabelName": {
375
+ "title": "PersonalLabelName",
376
+ "type": "string",
377
+ "minLength": 1,
378
+ "maxLength": 128,
379
+ "pattern": "^[^\\u0000-\\u001F\\u007F]+$",
380
+ "description": "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."
381
+ }
382
+ }
383
+ } as const;
384
+
385
+ /**
386
+ * SPEC.md §7.2 policy for the request variant, from this specification's
387
+ * front matter. Pass to `consumeInbound` — items 5b, 7 and 8 are
388
+ * per-specification and cannot be derived from the document alone, and
389
+ * item 2 needs the schema this carries.
390
+ */
391
+ export const SPEC = {
392
+ typeUri: TYPE_URI,
393
+ isBearer: false,
394
+ isProofRequired: true,
395
+ isRecipientRequired: true,
396
+ isIssuedAtRequired: true,
397
+ payloadSchema: PAYLOAD_SCHEMA,
398
+ } as const;
399
+
400
+ /**
401
+ * SPEC.md §7.2 policy for the success-response variant. `isRecipientRequired`
402
+ * tracks the *issuer* party's requirement because a response swaps the
403
+ * parties (§7.3 item 5).
404
+ */
405
+ export const RESPONSE_SPEC = {
406
+ typeUri: RESPONSE_TYPE_URI,
407
+ isBearer: false,
408
+ isProofRequired: true,
409
+ isRecipientRequired: true,
410
+ isIssuedAtRequired: true,
411
+ payloadSchema: RESPONSE_PAYLOAD_SCHEMA,
412
+ } as const;
@@ -136,7 +136,7 @@ export const PAYLOAD_SCHEMA = {
136
136
  "membership",
137
137
  "authority"
138
138
  ],
139
- "description": "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.",
139
+ "description": "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.\n\n**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`.\n\n**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.",
140
140
  "properties": {
141
141
  "membership": {
142
142
  "type": "string",
@@ -207,7 +207,7 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
207
207
  "membership",
208
208
  "authority"
209
209
  ],
210
- "description": "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.",
210
+ "description": "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.\n\n**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`.\n\n**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.",
211
211
  "properties": {
212
212
  "membership": {
213
213
  "type": "string",