@openvtc/trust-tasks 0.28.25 → 0.28.26

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 (223) hide show
  1. package/CHANGELOG.md +84 -0
  2. package/dist/_extends.d.ts.map +1 -1
  3. package/dist/_extends.js +9 -0
  4. package/dist/_extends.js.map +1 -1
  5. package/dist/_shared/components.d.ts +117 -0
  6. package/dist/_shared/components.d.ts.map +1 -1
  7. package/dist/acl/_shared/0.3/acl-entry.d.ts +24 -0
  8. package/dist/acl/_shared/0.3/acl-entry.d.ts.map +1 -0
  9. package/dist/acl/_shared/0.3/acl-entry.js +6 -0
  10. package/dist/acl/_shared/0.3/acl-entry.js.map +1 -0
  11. package/dist/acl/change-role/0.1/payload.d.ts +4 -4
  12. package/dist/acl/change-role/0.1/payload.js +1 -1
  13. package/dist/acl/change-role/0.2/payload.d.ts +14 -2
  14. package/dist/acl/change-role/0.2/payload.d.ts.map +1 -1
  15. package/dist/acl/change-role/0.2/payload.js +1 -1
  16. package/dist/acl/change-role/0.2/payload.js.map +1 -1
  17. package/dist/acl/change-role/0.3/payload.d.ts +1925 -0
  18. package/dist/acl/change-role/0.3/payload.d.ts.map +1 -0
  19. package/dist/acl/change-role/0.3/payload.js +1109 -0
  20. package/dist/acl/change-role/0.3/payload.js.map +1 -0
  21. package/dist/acl/grant/0.1/payload.d.ts +4 -4
  22. package/dist/acl/grant/0.1/payload.js +1 -1
  23. package/dist/acl/grant/0.2/payload.d.ts +14 -2
  24. package/dist/acl/grant/0.2/payload.d.ts.map +1 -1
  25. package/dist/acl/grant/0.2/payload.js +1 -1
  26. package/dist/acl/grant/0.2/payload.js.map +1 -1
  27. package/dist/acl/grant/0.3/payload.d.ts +1895 -0
  28. package/dist/acl/grant/0.3/payload.d.ts.map +1 -0
  29. package/dist/acl/grant/0.3/payload.js +1096 -0
  30. package/dist/acl/grant/0.3/payload.js.map +1 -0
  31. package/dist/acl/list/0.1/payload.d.ts +4 -4
  32. package/dist/acl/list/0.1/payload.js +1 -1
  33. package/dist/acl/list/0.2/payload.d.ts +4 -4
  34. package/dist/acl/list/0.2/payload.js +1 -1
  35. package/dist/acl/list/0.3/payload.d.ts +14 -2
  36. package/dist/acl/list/0.3/payload.d.ts.map +1 -1
  37. package/dist/acl/list/0.3/payload.js +1 -1
  38. package/dist/acl/list/0.3/payload.js.map +1 -1
  39. package/dist/acl/list/0.4/payload.d.ts +2079 -0
  40. package/dist/acl/list/0.4/payload.d.ts.map +1 -0
  41. package/dist/acl/list/0.4/payload.js +1185 -0
  42. package/dist/acl/list/0.4/payload.js.map +1 -0
  43. package/dist/acl/revoke/0.1/payload.d.ts +4 -4
  44. package/dist/acl/revoke/0.1/payload.js +1 -1
  45. package/dist/acl/revoke/0.2/payload.d.ts +14 -2
  46. package/dist/acl/revoke/0.2/payload.d.ts.map +1 -1
  47. package/dist/acl/revoke/0.2/payload.js +1 -1
  48. package/dist/acl/revoke/0.2/payload.js.map +1 -1
  49. package/dist/acl/revoke/0.3/payload.d.ts +2090 -0
  50. package/dist/acl/revoke/0.3/payload.d.ts.map +1 -0
  51. package/dist/acl/revoke/0.3/payload.js +1206 -0
  52. package/dist/acl/revoke/0.3/payload.js.map +1 -0
  53. package/dist/acl/show/0.1/payload.d.ts +4 -4
  54. package/dist/acl/show/0.1/payload.js +1 -1
  55. package/dist/acl/show/0.2/payload.d.ts +14 -2
  56. package/dist/acl/show/0.2/payload.d.ts.map +1 -1
  57. package/dist/acl/show/0.2/payload.js +1 -1
  58. package/dist/acl/show/0.2/payload.js.map +1 -1
  59. package/dist/acl/show/0.3/payload.d.ts +1935 -0
  60. package/dist/acl/show/0.3/payload.d.ts.map +1 -0
  61. package/dist/acl/show/0.3/payload.js +1122 -0
  62. package/dist/acl/show/0.3/payload.js.map +1 -0
  63. package/dist/acl/update/0.1/payload.d.ts +4 -4
  64. package/dist/acl/update/0.1/payload.js +1 -1
  65. package/dist/acl/update/0.2/payload.d.ts +14 -2
  66. package/dist/acl/update/0.2/payload.d.ts.map +1 -1
  67. package/dist/acl/update/0.2/payload.js +1 -1
  68. package/dist/acl/update/0.2/payload.js.map +1 -1
  69. package/dist/acl/update/0.3/payload.d.ts +2042 -0
  70. package/dist/acl/update/0.3/payload.d.ts.map +1 -0
  71. package/dist/acl/update/0.3/payload.js +1163 -0
  72. package/dist/acl/update/0.3/payload.js.map +1 -0
  73. package/dist/index.d.ts +48 -0
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +48 -0
  76. package/dist/index.js.map +1 -1
  77. package/dist/rooms/_shared/0.2/room.d.ts +1 -1
  78. package/dist/rooms/_shared/0.2/room.d.ts.map +1 -1
  79. package/dist/rooms/keys/file-key/0.1/payload.d.ts +4 -4
  80. package/dist/rooms/keys/file-key/0.1/payload.js +1 -1
  81. package/dist/rooms/keys/file-key/0.2/payload.d.ts +14 -2
  82. package/dist/rooms/keys/file-key/0.2/payload.d.ts.map +1 -1
  83. package/dist/rooms/keys/file-key/0.2/payload.js +1 -1
  84. package/dist/rooms/keys/file-key/0.2/payload.js.map +1 -1
  85. package/dist/rooms/keys/file-key/0.3/payload.d.ts +396 -0
  86. package/dist/rooms/keys/file-key/0.3/payload.d.ts.map +1 -0
  87. package/dist/rooms/keys/file-key/0.3/payload.js +223 -0
  88. package/dist/rooms/keys/file-key/0.3/payload.js.map +1 -0
  89. package/dist/rooms/keys/open/0.1/payload.d.ts +4 -4
  90. package/dist/rooms/keys/open/0.1/payload.js +1 -1
  91. package/dist/rooms/keys/open/0.2/payload.d.ts +14 -2
  92. package/dist/rooms/keys/open/0.2/payload.d.ts.map +1 -1
  93. package/dist/rooms/keys/open/0.2/payload.js +1 -1
  94. package/dist/rooms/keys/open/0.2/payload.js.map +1 -1
  95. package/dist/rooms/keys/open/0.3/payload.d.ts +413 -0
  96. package/dist/rooms/keys/open/0.3/payload.d.ts.map +1 -0
  97. package/dist/rooms/keys/open/0.3/payload.js +227 -0
  98. package/dist/rooms/keys/open/0.3/payload.js.map +1 -0
  99. package/dist/rooms/keys/read/0.1/payload.d.ts +4 -4
  100. package/dist/rooms/keys/read/0.1/payload.js +1 -1
  101. package/dist/rooms/keys/read/0.2/payload.d.ts +14 -2
  102. package/dist/rooms/keys/read/0.2/payload.d.ts.map +1 -1
  103. package/dist/rooms/keys/read/0.2/payload.js +1 -1
  104. package/dist/rooms/keys/read/0.2/payload.js.map +1 -1
  105. package/dist/rooms/keys/read/0.3/payload.d.ts +1363 -0
  106. package/dist/rooms/keys/read/0.3/payload.d.ts.map +1 -0
  107. package/dist/rooms/keys/read/0.3/payload.js +731 -0
  108. package/dist/rooms/keys/read/0.3/payload.js.map +1 -0
  109. package/dist/rooms/owner/issue-authority/0.2/payload.d.ts +13 -2
  110. package/dist/rooms/owner/issue-authority/0.2/payload.d.ts.map +1 -1
  111. package/dist/rooms/owner/issue-authority/0.2/payload.js +1 -1
  112. package/dist/rooms/owner/issue-authority/0.2/payload.js.map +1 -1
  113. package/dist/rooms/owner/issue-authority/0.3/payload.d.ts +557 -0
  114. package/dist/rooms/owner/issue-authority/0.3/payload.d.ts.map +1 -0
  115. package/dist/rooms/owner/issue-authority/0.3/payload.js +322 -0
  116. package/dist/rooms/owner/issue-authority/0.3/payload.js.map +1 -0
  117. package/dist/rooms/records/get/0.1/payload.d.ts +4 -4
  118. package/dist/rooms/records/get/0.1/payload.js +1 -1
  119. package/dist/rooms/records/get/0.2/payload.d.ts +4 -4
  120. package/dist/rooms/records/get/0.2/payload.js +1 -1
  121. package/dist/rooms/records/get/0.3/payload.d.ts +13 -2
  122. package/dist/rooms/records/get/0.3/payload.d.ts.map +1 -1
  123. package/dist/rooms/records/get/0.3/payload.js +1 -1
  124. package/dist/rooms/records/get/0.3/payload.js.map +1 -1
  125. package/dist/rooms/records/get/0.4/payload.d.ts +1140 -0
  126. package/dist/rooms/records/get/0.4/payload.d.ts.map +1 -0
  127. package/dist/rooms/records/get/0.4/payload.js +613 -0
  128. package/dist/rooms/records/get/0.4/payload.js.map +1 -0
  129. package/dist/vault/sign-trust-task/0.2/payload.d.ts +5 -5
  130. package/dist/vault/sign-trust-task/0.2/payload.js +2 -2
  131. package/dist/vta/_shared/0.1/memory-record.d.ts +1 -1
  132. package/dist/vta/_shared/0.1/memory-record.d.ts.map +1 -1
  133. package/dist/vta/memory/delete/0.1/payload.d.ts +4 -4
  134. package/dist/vta/memory/delete/0.1/payload.js +1 -1
  135. package/dist/vta/memory/delete/0.2/payload.d.ts +14 -2
  136. package/dist/vta/memory/delete/0.2/payload.d.ts.map +1 -1
  137. package/dist/vta/memory/delete/0.2/payload.js +1 -1
  138. package/dist/vta/memory/delete/0.2/payload.js.map +1 -1
  139. package/dist/vta/memory/delete/0.3/payload.d.ts +491 -0
  140. package/dist/vta/memory/delete/0.3/payload.d.ts.map +1 -0
  141. package/dist/vta/memory/delete/0.3/payload.js +266 -0
  142. package/dist/vta/memory/delete/0.3/payload.js.map +1 -0
  143. package/dist/vta/memory/get/0.1/payload.d.ts +14 -2
  144. package/dist/vta/memory/get/0.1/payload.d.ts.map +1 -1
  145. package/dist/vta/memory/get/0.1/payload.js +1 -1
  146. package/dist/vta/memory/get/0.1/payload.js.map +1 -1
  147. package/dist/vta/memory/get/0.2/payload.d.ts +722 -0
  148. package/dist/vta/memory/get/0.2/payload.d.ts.map +1 -0
  149. package/dist/vta/memory/get/0.2/payload.js +391 -0
  150. package/dist/vta/memory/get/0.2/payload.js.map +1 -0
  151. package/dist/vta/memory/list/0.1/payload.d.ts +4 -4
  152. package/dist/vta/memory/list/0.1/payload.js +1 -1
  153. package/dist/vta/memory/list/0.2/payload.d.ts +14 -2
  154. package/dist/vta/memory/list/0.2/payload.d.ts.map +1 -1
  155. package/dist/vta/memory/list/0.2/payload.js +1 -1
  156. package/dist/vta/memory/list/0.2/payload.js.map +1 -1
  157. package/dist/vta/memory/list/0.3/payload.d.ts +769 -0
  158. package/dist/vta/memory/list/0.3/payload.d.ts.map +1 -0
  159. package/dist/vta/memory/list/0.3/payload.js +405 -0
  160. package/dist/vta/memory/list/0.3/payload.js.map +1 -0
  161. package/dist/vta/memory/put/0.1/payload.d.ts +4 -4
  162. package/dist/vta/memory/put/0.1/payload.js +1 -1
  163. package/dist/vta/memory/put/0.2/payload.d.ts +14 -2
  164. package/dist/vta/memory/put/0.2/payload.d.ts.map +1 -1
  165. package/dist/vta/memory/put/0.2/payload.js +1 -1
  166. package/dist/vta/memory/put/0.2/payload.js.map +1 -1
  167. package/dist/vta/memory/put/0.3/payload.d.ts +566 -0
  168. package/dist/vta/memory/put/0.3/payload.d.ts.map +1 -0
  169. package/dist/vta/memory/put/0.3/payload.js +306 -0
  170. package/dist/vta/memory/put/0.3/payload.js.map +1 -0
  171. package/package.json +1 -1
  172. package/src/_extends.ts +9 -0
  173. package/src/_shared/components.ts +117 -0
  174. package/src/acl/_shared/0.3/acl-entry.ts +25 -0
  175. package/src/acl/change-role/0.1/payload.ts +5 -5
  176. package/src/acl/change-role/0.2/payload.ts +15 -3
  177. package/src/acl/change-role/0.3/payload.ts +1167 -0
  178. package/src/acl/grant/0.1/payload.ts +5 -5
  179. package/src/acl/grant/0.2/payload.ts +15 -3
  180. package/src/acl/grant/0.3/payload.ts +1146 -0
  181. package/src/acl/list/0.1/payload.ts +5 -5
  182. package/src/acl/list/0.2/payload.ts +5 -5
  183. package/src/acl/list/0.3/payload.ts +15 -3
  184. package/src/acl/list/0.4/payload.ts +1267 -0
  185. package/src/acl/revoke/0.1/payload.ts +5 -5
  186. package/src/acl/revoke/0.2/payload.ts +15 -3
  187. package/src/acl/revoke/0.3/payload.ts +1278 -0
  188. package/src/acl/show/0.1/payload.ts +5 -5
  189. package/src/acl/show/0.2/payload.ts +15 -3
  190. package/src/acl/show/0.3/payload.ts +1172 -0
  191. package/src/acl/update/0.1/payload.ts +5 -5
  192. package/src/acl/update/0.2/payload.ts +15 -3
  193. package/src/acl/update/0.3/payload.ts +1258 -0
  194. package/src/index.ts +48 -0
  195. package/src/rooms/_shared/0.2/room.ts +1 -1
  196. package/src/rooms/keys/file-key/0.1/payload.ts +5 -5
  197. package/src/rooms/keys/file-key/0.2/payload.ts +15 -3
  198. package/src/rooms/keys/file-key/0.3/payload.ts +286 -0
  199. package/src/rooms/keys/open/0.1/payload.ts +5 -5
  200. package/src/rooms/keys/open/0.2/payload.ts +15 -3
  201. package/src/rooms/keys/open/0.3/payload.ts +299 -0
  202. package/src/rooms/keys/read/0.1/payload.ts +5 -5
  203. package/src/rooms/keys/read/0.2/payload.ts +15 -3
  204. package/src/rooms/keys/read/0.3/payload.ts +901 -0
  205. package/src/rooms/owner/issue-authority/0.2/payload.ts +14 -3
  206. package/src/rooms/owner/issue-authority/0.3/payload.ts +388 -0
  207. package/src/rooms/records/get/0.1/payload.ts +5 -5
  208. package/src/rooms/records/get/0.2/payload.ts +5 -5
  209. package/src/rooms/records/get/0.3/payload.ts +14 -3
  210. package/src/rooms/records/get/0.4/payload.ts +730 -0
  211. package/src/vault/sign-trust-task/0.2/payload.ts +3 -3
  212. package/src/vta/_shared/0.1/memory-record.ts +1 -1
  213. package/src/vta/memory/delete/0.1/payload.ts +5 -5
  214. package/src/vta/memory/delete/0.2/payload.ts +15 -3
  215. package/src/vta/memory/delete/0.3/payload.ts +334 -0
  216. package/src/vta/memory/get/0.1/payload.ts +15 -3
  217. package/src/vta/memory/get/0.2/payload.ts +460 -0
  218. package/src/vta/memory/list/0.1/payload.ts +5 -5
  219. package/src/vta/memory/list/0.2/payload.ts +15 -3
  220. package/src/vta/memory/list/0.3/payload.ts +491 -0
  221. package/src/vta/memory/put/0.1/payload.ts +5 -5
  222. package/src/vta/memory/put/0.2/payload.ts +15 -3
  223. package/src/vta/memory/put/0.3/payload.ts +379 -0
@@ -6,6 +6,7 @@
6
6
  import type { Ext } from "../../../../_shared/components.js";
7
7
 
8
8
 
9
+ /** @deprecated superseded by rooms/owner/issue-authority/0.3 */
9
10
  export interface RoomsOwnerIssueAuthorityPayload {
10
11
  /**
11
12
  * The room whose identity issues this credential. The recipient MUST hold a signing key for it — it is signing AS the room, not as itself.
@@ -36,6 +37,8 @@ export interface RoomsOwnerIssueAuthorityPayload {
36
37
  }
37
38
  /**
38
39
  * Success response to rooms/owner/issue-authority. Type https://trusttasks.org/spec/rooms/owner/issue-authority/0.2#response. The signed VAC, a chain root at the room's scope.
40
+ *
41
+ * @deprecated superseded by rooms/owner/issue-authority/0.3
39
42
  */
40
43
  export interface RoomsOwnerIssueAuthorityResponsePayload {
41
44
  /**
@@ -69,15 +72,23 @@ export const EXTENDS: string | null = null;
69
72
  * this package in a later scheduled batch (SPEC "Superseded and Withdrawn
70
73
  * Versions").
71
74
  */
72
- export const DEPRECATION: string | null = null;
75
+ export const DEPRECATION: string | null = "superseded by rooms/owner/issue-authority/0.3";
73
76
 
74
- /** Stable alias for this specification's request payload shape. */
77
+ /**
78
+ * Stable alias for this specification's request payload shape.
79
+ *
80
+ * @deprecated superseded by rooms/owner/issue-authority/0.3
81
+ */
75
82
  export type Payload = RoomsOwnerIssueAuthorityPayload;
76
83
 
77
84
  /** Trust Task response type URI (request type URI + "#response"). */
78
85
  export const RESPONSE_TYPE_URI = "https://trusttasks.org/spec/rooms/owner/issue-authority/0.2#response" as const;
79
86
 
80
- /** Stable alias for this specification's success-response payload shape. */
87
+ /**
88
+ * Stable alias for this specification's success-response payload shape.
89
+ *
90
+ * @deprecated superseded by rooms/owner/issue-authority/0.3
91
+ */
81
92
  export type Response = RoomsOwnerIssueAuthorityResponsePayload;
82
93
 
83
94
  /**
@@ -0,0 +1,388 @@
1
+ /**
2
+ * Generated by scripts/build-ts-bindings.mjs — DO NOT EDIT BY HAND.
3
+ * Source: specs/rooms/owner/issue-authority/0.3/payload.schema.json
4
+ */
5
+
6
+ import type { Ext, Purpose_AclV0_3 as Purpose, Purpose_AclV0_31, Purpose_AclV0_32, PurposeScope, PurposeScopeAny, PurposeScopeListed } from "../../../../_shared/components.js";
7
+
8
+
9
+ export interface RoomsOwnerIssueAuthorityPayload {
10
+ /**
11
+ * The room whose identity issues this credential. The recipient MUST hold a signing key for it — it is signing AS the room, not as itself.
12
+ */
13
+ roomId: string;
14
+ /**
15
+ * Which held key signs. Named explicitly rather than looked up from `roomId`, because nothing maps a DID to a key it was minted with and inventing that mapping would add a lifecycle to get wrong. A key that is not the room's produces a credential that fails to verify against the room's DID document — loud, and at the first use rather than later.
16
+ */
17
+ signingKeyId: string;
18
+ /**
19
+ * Ecosystem-defined extension members per SPEC.md §4.5.1.
20
+ */
21
+ ext?: Ext;
22
+ /**
23
+ * The party this grants to. A chain ROOT: the room is the governing party, so this is the grant everything else descends from. A holder narrows their own grant with attenuation instead, which needs no issuer.
24
+ */
25
+ subject: string;
26
+ /**
27
+ * What the subject may do. MUST NOT be empty — an empty list confers nothing rather than everything, and a schema that allowed it would make the more dangerous reading available to a careless consumer. `curate` is not implied by `write`: pinning, deprecating and retracting are judgements over shared knowledge, not writes.
28
+ *
29
+ * @minItems 1
30
+ */
31
+ actions: ["read" | "write" | "curate" | "admin", ...("read" | "write" | "curate" | "admin")[]];
32
+ /**
33
+ * When the grant lapses. REQUIRED, and not merely recommended: nothing about the subject's current standing is consulted when an authority credential is verified, so a grant that never expires is authority nobody can withdraw by waiting. A verifier refuses a chain link carrying none, so a grant minted without one could not have been used. Changing what a party may do reissues this one small credential and leaves the membership edge alone, which is why the two are separate credentials.
34
+ */
35
+ validUntil: string;
36
+ /**
37
+ * OPTIONAL. What the subject may use the content it reads under this grant for (VTI-ACL-110): `{"scope": "any"}` or a non-empty list. Stated in the credential exactly as given; absent, the credential states none, which grants `any` — never `modelTraining`, which a grant must name.
38
+ */
39
+ purposes?: PurposeScope;
40
+ }
41
+ /**
42
+ * Success response to rooms/owner/issue-authority. Type https://trusttasks.org/spec/rooms/owner/issue-authority/0.2#response. The signed VAC, a chain root at the room's scope.
43
+ */
44
+ export interface RoomsOwnerIssueAuthorityResponsePayload {
45
+ /**
46
+ * The signed Verifiable Authority Credential, serialised.
47
+ */
48
+ credential: string;
49
+ /**
50
+ * Its `id`.
51
+ */
52
+ credentialId: string;
53
+ ext?: Ext;
54
+ }
55
+
56
+ /** Shared definitions this specification references, re-exported under the names it used to declare them with. */
57
+ export type { Ext, Purpose, Purpose_AclV0_31, Purpose_AclV0_32, PurposeScope, PurposeScopeAny, PurposeScopeListed };
58
+
59
+ /** Trust Task type URI. */
60
+ export const TYPE_URI = "https://trusttasks.org/spec/rooms/owner/issue-authority/0.3" as const;
61
+
62
+ /**
63
+ * The earlier version of this specification that this one declares it
64
+ * extends (front matter `extends`, SPEC §5.2 "Declared extension"), or
65
+ * `null`. Only the direct declaration — follow the chain with
66
+ * `extendsChain` / `readForSpec`.
67
+ */
68
+ export const EXTENDS: string | null = "0.2";
69
+
70
+ /**
71
+ * Why this version is deprecated, or `null` while it is current. A
72
+ * superseded or retired version is still supported, and is withdrawn from
73
+ * this package in a later scheduled batch (SPEC "Superseded and Withdrawn
74
+ * Versions").
75
+ */
76
+ export const DEPRECATION: string | null = null;
77
+
78
+ /** Stable alias for this specification's request payload shape. */
79
+ export type Payload = RoomsOwnerIssueAuthorityPayload;
80
+
81
+ /** Trust Task response type URI (request type URI + "#response"). */
82
+ export const RESPONSE_TYPE_URI = "https://trusttasks.org/spec/rooms/owner/issue-authority/0.3#response" as const;
83
+
84
+ /** Stable alias for this specification's success-response payload shape. */
85
+ export type Response = RoomsOwnerIssueAuthorityResponsePayload;
86
+
87
+ /**
88
+ * This specification's payload schema, as a value.
89
+ *
90
+ * SPEC.md §7.2 item 2 is performed against this. It is shipped as data
91
+ * rather than only as a `.json` file because TypeScript types are erased
92
+ * at runtime: without a schema a consumer has nothing to validate, and
93
+ * every REQUIRED payload member is optional in practice. Cross-file
94
+ * `$ref`s are already inlined, so it needs no resolver.
95
+ */
96
+ export const PAYLOAD_SCHEMA = {
97
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
98
+ "$id": "https://trusttasks.org/spec/rooms/owner/issue-authority/0.3",
99
+ "title": "Rooms Owner Issue Authority — payload",
100
+ "type": "object",
101
+ "additionalProperties": false,
102
+ "required": [
103
+ "roomId",
104
+ "signingKeyId",
105
+ "subject",
106
+ "actions",
107
+ "validUntil"
108
+ ],
109
+ "properties": {
110
+ "roomId": {
111
+ "type": "string",
112
+ "description": "The room whose identity issues this credential. The recipient MUST hold a signing key for it — it is signing AS the room, not as itself."
113
+ },
114
+ "signingKeyId": {
115
+ "type": "string",
116
+ "maxLength": 256,
117
+ "description": "Which held key signs. Named explicitly rather than looked up from `roomId`, because nothing maps a DID to a key it was minted with and inventing that mapping would add a lifecycle to get wrong. A key that is not the room's produces a credential that fails to verify against the room's DID document — loud, and at the first use rather than later."
118
+ },
119
+ "ext": {
120
+ "$ref": "#/$defs/Ext",
121
+ "description": "Ecosystem-defined extension members per SPEC.md §4.5.1."
122
+ },
123
+ "subject": {
124
+ "type": "string",
125
+ "description": "The party this grants to. A chain ROOT: the room is the governing party, so this is the grant everything else descends from. A holder narrows their own grant with attenuation instead, which needs no issuer."
126
+ },
127
+ "actions": {
128
+ "type": "array",
129
+ "minItems": 1,
130
+ "items": {
131
+ "type": "string",
132
+ "enum": [
133
+ "read",
134
+ "write",
135
+ "curate",
136
+ "admin"
137
+ ]
138
+ },
139
+ "description": "What the subject may do. MUST NOT be empty — an empty list confers nothing rather than everything, and a schema that allowed it would make the more dangerous reading available to a careless consumer. `curate` is not implied by `write`: pinning, deprecating and retracting are judgements over shared knowledge, not writes."
140
+ },
141
+ "validUntil": {
142
+ "type": "string",
143
+ "format": "date-time",
144
+ "description": "When the grant lapses. REQUIRED, and not merely recommended: nothing about the subject's current standing is consulted when an authority credential is verified, so a grant that never expires is authority nobody can withdraw by waiting. A verifier refuses a chain link carrying none, so a grant minted without one could not have been used. Changing what a party may do reissues this one small credential and leaves the membership edge alone, which is why the two are separate credentials."
145
+ },
146
+ "purposes": {
147
+ "$ref": "#/$defs/PurposeScope",
148
+ "description": "OPTIONAL. What the subject may use the content it reads under this grant for (VTI-ACL-110): `{\"scope\": \"any\"}` or a non-empty list. Stated in the credential exactly as given; absent, the credential states none, which grants `any` — never `modelTraining`, which a grant must name."
149
+ }
150
+ },
151
+ "$defs": {
152
+ "Response": {
153
+ "$anchor": "response",
154
+ "title": "Rooms Owner Issue Authority — response payload",
155
+ "description": "Success response to rooms/owner/issue-authority. Type https://trusttasks.org/spec/rooms/owner/issue-authority/0.2#response. The signed VAC, a chain root at the room's scope.",
156
+ "type": "object",
157
+ "additionalProperties": false,
158
+ "required": [
159
+ "credential",
160
+ "credentialId"
161
+ ],
162
+ "properties": {
163
+ "credential": {
164
+ "type": "string",
165
+ "description": "The signed Verifiable Authority Credential, serialised."
166
+ },
167
+ "credentialId": {
168
+ "type": "string",
169
+ "description": "Its `id`."
170
+ },
171
+ "ext": {
172
+ "$ref": "#/$defs/Ext"
173
+ }
174
+ }
175
+ },
176
+ "Ext": {
177
+ "title": "Ext",
178
+ "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.",
179
+ "type": "object",
180
+ "minProperties": 1,
181
+ "additionalProperties": true,
182
+ "propertyNames": {
183
+ "pattern": "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$"
184
+ }
185
+ },
186
+ "PurposeScope": {
187
+ "title": "PurposeScope",
188
+ "description": "An explicit purpose scope. Exactly one of two shapes, discriminated by `scope`: `any`, or `listed` with a NON-EMPTY list of purposes. The empty list is invalid, not a third shape.",
189
+ "oneOf": [
190
+ {
191
+ "$ref": "#/$defs/PurposeScopeAny"
192
+ },
193
+ {
194
+ "$ref": "#/$defs/PurposeScopeListed"
195
+ }
196
+ ]
197
+ },
198
+ "PurposeScopeListed": {
199
+ "title": "PurposeScopeListed",
200
+ "description": "Exactly the listed purposes. A request naming any other purpose is refused.",
201
+ "type": "object",
202
+ "additionalProperties": false,
203
+ "required": [
204
+ "scope",
205
+ "purposes"
206
+ ],
207
+ "properties": {
208
+ "scope": {
209
+ "const": "listed"
210
+ },
211
+ "purposes": {
212
+ "type": "array",
213
+ "minItems": 1,
214
+ "maxItems": 32,
215
+ "uniqueItems": true,
216
+ "items": {
217
+ "$ref": "#/$defs/Purpose"
218
+ },
219
+ "description": "Non-empty set of purposes. An empty array is invalid (it is not `any`)."
220
+ }
221
+ }
222
+ },
223
+ "Purpose": {
224
+ "title": "Purpose",
225
+ "description": "What content is used for: a lowerCamelCase name registered in the VTI specification's purpose registry (Appendix H) — `personalisation`, `taskExecution`, `analytics`, `modelTraining` at the time of writing — or an absolute IRI naming a purpose defined elsewhere, such as a purpose of the W3C Data Privacy Vocabulary (`https://w3id.org/dpv#ServicePersonalisation`). Compared by exact string equality: a consumer MUST NOT treat a purpose it does not recognise as equal to any other, and grants only a request naming exactly a listed purpose (VTI-ACL-109). A registered name is never an IRI, because it contains no `:`.",
226
+ "type": "string",
227
+ "maxLength": 2048,
228
+ "anyOf": [
229
+ {
230
+ "pattern": "^[a-z][a-zA-Z0-9]{0,63}$"
231
+ },
232
+ {
233
+ "pattern": "^[a-zA-Z][a-zA-Z0-9+.-]*:[^\\s]+$"
234
+ }
235
+ ]
236
+ },
237
+ "PurposeScopeAny": {
238
+ "title": "PurposeScopeAny",
239
+ "description": "Any purpose except `modelTraining` (training, fine-tuning or evaluating a machine-learning model on the content), which `any` never grants (VTI-ACL-105).",
240
+ "type": "object",
241
+ "additionalProperties": false,
242
+ "required": [
243
+ "scope"
244
+ ],
245
+ "properties": {
246
+ "scope": {
247
+ "const": "any"
248
+ }
249
+ }
250
+ }
251
+ }
252
+ } as const;
253
+
254
+ /** As {@link PAYLOAD_SCHEMA}, for the success-response variant. */
255
+ export const RESPONSE_PAYLOAD_SCHEMA = {
256
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
257
+ "$ref": "#/$defs/Response",
258
+ "$defs": {
259
+ "Response": {
260
+ "$anchor": "response",
261
+ "title": "Rooms Owner Issue Authority — response payload",
262
+ "description": "Success response to rooms/owner/issue-authority. Type https://trusttasks.org/spec/rooms/owner/issue-authority/0.2#response. The signed VAC, a chain root at the room's scope.",
263
+ "type": "object",
264
+ "additionalProperties": false,
265
+ "required": [
266
+ "credential",
267
+ "credentialId"
268
+ ],
269
+ "properties": {
270
+ "credential": {
271
+ "type": "string",
272
+ "description": "The signed Verifiable Authority Credential, serialised."
273
+ },
274
+ "credentialId": {
275
+ "type": "string",
276
+ "description": "Its `id`."
277
+ },
278
+ "ext": {
279
+ "$ref": "#/$defs/Ext"
280
+ }
281
+ }
282
+ },
283
+ "Ext": {
284
+ "title": "Ext",
285
+ "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.",
286
+ "type": "object",
287
+ "minProperties": 1,
288
+ "additionalProperties": true,
289
+ "propertyNames": {
290
+ "pattern": "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$"
291
+ }
292
+ },
293
+ "PurposeScope": {
294
+ "title": "PurposeScope",
295
+ "description": "An explicit purpose scope. Exactly one of two shapes, discriminated by `scope`: `any`, or `listed` with a NON-EMPTY list of purposes. The empty list is invalid, not a third shape.",
296
+ "oneOf": [
297
+ {
298
+ "$ref": "#/$defs/PurposeScopeAny"
299
+ },
300
+ {
301
+ "$ref": "#/$defs/PurposeScopeListed"
302
+ }
303
+ ]
304
+ },
305
+ "PurposeScopeListed": {
306
+ "title": "PurposeScopeListed",
307
+ "description": "Exactly the listed purposes. A request naming any other purpose is refused.",
308
+ "type": "object",
309
+ "additionalProperties": false,
310
+ "required": [
311
+ "scope",
312
+ "purposes"
313
+ ],
314
+ "properties": {
315
+ "scope": {
316
+ "const": "listed"
317
+ },
318
+ "purposes": {
319
+ "type": "array",
320
+ "minItems": 1,
321
+ "maxItems": 32,
322
+ "uniqueItems": true,
323
+ "items": {
324
+ "$ref": "#/$defs/Purpose"
325
+ },
326
+ "description": "Non-empty set of purposes. An empty array is invalid (it is not `any`)."
327
+ }
328
+ }
329
+ },
330
+ "Purpose": {
331
+ "title": "Purpose",
332
+ "description": "What content is used for: a lowerCamelCase name registered in the VTI specification's purpose registry (Appendix H) — `personalisation`, `taskExecution`, `analytics`, `modelTraining` at the time of writing — or an absolute IRI naming a purpose defined elsewhere, such as a purpose of the W3C Data Privacy Vocabulary (`https://w3id.org/dpv#ServicePersonalisation`). Compared by exact string equality: a consumer MUST NOT treat a purpose it does not recognise as equal to any other, and grants only a request naming exactly a listed purpose (VTI-ACL-109). A registered name is never an IRI, because it contains no `:`.",
333
+ "type": "string",
334
+ "maxLength": 2048,
335
+ "anyOf": [
336
+ {
337
+ "pattern": "^[a-z][a-zA-Z0-9]{0,63}$"
338
+ },
339
+ {
340
+ "pattern": "^[a-zA-Z][a-zA-Z0-9+.-]*:[^\\s]+$"
341
+ }
342
+ ]
343
+ },
344
+ "PurposeScopeAny": {
345
+ "title": "PurposeScopeAny",
346
+ "description": "Any purpose except `modelTraining` (training, fine-tuning or evaluating a machine-learning model on the content), which `any` never grants (VTI-ACL-105).",
347
+ "type": "object",
348
+ "additionalProperties": false,
349
+ "required": [
350
+ "scope"
351
+ ],
352
+ "properties": {
353
+ "scope": {
354
+ "const": "any"
355
+ }
356
+ }
357
+ }
358
+ }
359
+ } as const;
360
+
361
+ /**
362
+ * SPEC.md §7.2 policy for the request variant, from this specification's
363
+ * front matter. Pass to `consumeInbound` — items 5b, 7 and 8 are
364
+ * per-specification and cannot be derived from the document alone, and
365
+ * item 2 needs the schema this carries.
366
+ */
367
+ export const SPEC = {
368
+ typeUri: TYPE_URI,
369
+ isBearer: false,
370
+ isProofRequired: true,
371
+ isRecipientRequired: true,
372
+ isIssuedAtRequired: true,
373
+ payloadSchema: PAYLOAD_SCHEMA,
374
+ } as const;
375
+
376
+ /**
377
+ * SPEC.md §7.2 policy for the success-response variant. `isRecipientRequired`
378
+ * tracks the *issuer* party's requirement because a response swaps the
379
+ * parties (§7.3 item 5).
380
+ */
381
+ export const RESPONSE_SPEC = {
382
+ typeUri: RESPONSE_TYPE_URI,
383
+ isBearer: false,
384
+ isProofRequired: true,
385
+ isRecipientRequired: true,
386
+ isIssuedAtRequired: true,
387
+ payloadSchema: RESPONSE_PAYLOAD_SCHEMA,
388
+ } as const;
@@ -6,7 +6,7 @@
6
6
  import type { AuthorityPresentation, DataCommitment, DigestMultibase, Ext, HeadVersion, RecordCount, RecordTrace, SealedRecord } from "../../../../_shared/components.js";
7
7
 
8
8
 
9
- /** @deprecated superseded by rooms/records/get/0.3 */
9
+ /** @deprecated superseded by rooms/records/get/0.4 */
10
10
  export interface RoomsRecordsGetPayload {
11
11
  /**
12
12
  * The room's identifier.
@@ -28,7 +28,7 @@ export interface RoomsRecordsGetPayload {
28
28
  /**
29
29
  * Success response to rooms/records/get. Type https://trusttasks.org/spec/rooms/records/get/0.1#response.
30
30
  *
31
- * @deprecated superseded by rooms/records/get/0.3
31
+ * @deprecated superseded by rooms/records/get/0.4
32
32
  */
33
33
  export interface RoomsRecordsGetResponsePayload {
34
34
  key: string;
@@ -104,12 +104,12 @@ export const EXTENDS: string | null = null;
104
104
  * this package in a later scheduled batch (SPEC "Superseded and Withdrawn
105
105
  * Versions").
106
106
  */
107
- export const DEPRECATION: string | null = "superseded by rooms/records/get/0.3";
107
+ export const DEPRECATION: string | null = "superseded by rooms/records/get/0.4";
108
108
 
109
109
  /**
110
110
  * Stable alias for this specification's request payload shape.
111
111
  *
112
- * @deprecated superseded by rooms/records/get/0.3
112
+ * @deprecated superseded by rooms/records/get/0.4
113
113
  */
114
114
  export type Payload = RoomsRecordsGetPayload;
115
115
 
@@ -119,7 +119,7 @@ export const RESPONSE_TYPE_URI = "https://trusttasks.org/spec/rooms/records/get/
119
119
  /**
120
120
  * Stable alias for this specification's success-response payload shape.
121
121
  *
122
- * @deprecated superseded by rooms/records/get/0.3
122
+ * @deprecated superseded by rooms/records/get/0.4
123
123
  */
124
124
  export type Response = RoomsRecordsGetResponsePayload;
125
125
 
@@ -6,7 +6,7 @@
6
6
  import type { AuthorityPresentation, BlobRef, DataCommitment, DigestMultibase, Ext, HeadVersion, RecordCount, RecordTrace, SealedRecord } from "../../../../_shared/components.js";
7
7
 
8
8
 
9
- /** @deprecated superseded by rooms/records/get/0.3 */
9
+ /** @deprecated superseded by rooms/records/get/0.4 */
10
10
  export interface RoomsRecordsGetPayload {
11
11
  /**
12
12
  * The room's identifier.
@@ -28,7 +28,7 @@ export interface RoomsRecordsGetPayload {
28
28
  /**
29
29
  * Success response to rooms/records/get. Type https://trusttasks.org/spec/rooms/records/get/0.2#response.
30
30
  *
31
- * @deprecated superseded by rooms/records/get/0.3
31
+ * @deprecated superseded by rooms/records/get/0.4
32
32
  */
33
33
  export interface RoomsRecordsGetResponsePayload {
34
34
  key: string;
@@ -111,12 +111,12 @@ export const EXTENDS: string | null = null;
111
111
  * this package in a later scheduled batch (SPEC "Superseded and Withdrawn
112
112
  * Versions").
113
113
  */
114
- export const DEPRECATION: string | null = "superseded by rooms/records/get/0.3";
114
+ export const DEPRECATION: string | null = "superseded by rooms/records/get/0.4";
115
115
 
116
116
  /**
117
117
  * Stable alias for this specification's request payload shape.
118
118
  *
119
- * @deprecated superseded by rooms/records/get/0.3
119
+ * @deprecated superseded by rooms/records/get/0.4
120
120
  */
121
121
  export type Payload = RoomsRecordsGetPayload;
122
122
 
@@ -126,7 +126,7 @@ export const RESPONSE_TYPE_URI = "https://trusttasks.org/spec/rooms/records/get/
126
126
  /**
127
127
  * Stable alias for this specification's success-response payload shape.
128
128
  *
129
- * @deprecated superseded by rooms/records/get/0.3
129
+ * @deprecated superseded by rooms/records/get/0.4
130
130
  */
131
131
  export type Response = RoomsRecordsGetResponsePayload;
132
132
 
@@ -6,6 +6,7 @@
6
6
  import type { AuthorityPresentation, BlobRef, DataCommitment, DigestMultibase, Ext, HeadVersion, RecordCount, RecordTrace, SealedRecord } from "../../../../_shared/components.js";
7
7
 
8
8
 
9
+ /** @deprecated superseded by rooms/records/get/0.4 */
9
10
  export interface RoomsRecordsGetPayload {
10
11
  /**
11
12
  * The room's identifier.
@@ -26,6 +27,8 @@ export interface RoomsRecordsGetPayload {
26
27
  }
27
28
  /**
28
29
  * Success response to rooms/records/get. Type https://trusttasks.org/spec/rooms/records/get/0.3#response.
30
+ *
31
+ * @deprecated superseded by rooms/records/get/0.4
29
32
  */
30
33
  export interface RoomsRecordsGetResponsePayload {
31
34
  key: string;
@@ -120,15 +123,23 @@ export const EXTENDS: string | null = "0.2";
120
123
  * this package in a later scheduled batch (SPEC "Superseded and Withdrawn
121
124
  * Versions").
122
125
  */
123
- export const DEPRECATION: string | null = null;
126
+ export const DEPRECATION: string | null = "superseded by rooms/records/get/0.4";
124
127
 
125
- /** Stable alias for this specification's request payload shape. */
128
+ /**
129
+ * Stable alias for this specification's request payload shape.
130
+ *
131
+ * @deprecated superseded by rooms/records/get/0.4
132
+ */
126
133
  export type Payload = RoomsRecordsGetPayload;
127
134
 
128
135
  /** Trust Task response type URI (request type URI + "#response"). */
129
136
  export const RESPONSE_TYPE_URI = "https://trusttasks.org/spec/rooms/records/get/0.3#response" as const;
130
137
 
131
- /** Stable alias for this specification's success-response payload shape. */
138
+ /**
139
+ * Stable alias for this specification's success-response payload shape.
140
+ *
141
+ * @deprecated superseded by rooms/records/get/0.4
142
+ */
132
143
  export type Response = RoomsRecordsGetResponsePayload;
133
144
 
134
145
  /**