@openvtc/trust-tasks 0.28.1 → 0.28.3

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 (310) hide show
  1. package/CHANGELOG.md +284 -0
  2. package/dist/_extends.d.ts.map +1 -1
  3. package/dist/_extends.js +7 -1
  4. package/dist/_extends.js.map +1 -1
  5. package/dist/_runtime/document.d.ts +13 -0
  6. package/dist/_runtime/document.d.ts.map +1 -1
  7. package/dist/_runtime/document.js +17 -2
  8. package/dist/_runtime/document.js.map +1 -1
  9. package/dist/_runtime/index.d.ts +1 -1
  10. package/dist/_runtime/index.d.ts.map +1 -1
  11. package/dist/_runtime/index.js +1 -1
  12. package/dist/_runtime/index.js.map +1 -1
  13. package/dist/_shared/components.d.ts +530 -3
  14. package/dist/_shared/components.d.ts.map +1 -1
  15. package/dist/auth/step-up/approve-request/0.5/payload.d.ts +3 -3
  16. package/dist/auth/step-up/approve-request/0.5/payload.js +1 -1
  17. package/dist/auth/step-up/approve-response/0.1/payload.d.ts +4 -4
  18. package/dist/auth/step-up/approve-response/0.1/payload.js +1 -1
  19. package/dist/auth/step-up/approve-response/0.2/payload.d.ts +4 -4
  20. package/dist/auth/step-up/approve-response/0.2/payload.js +1 -1
  21. package/dist/auth/step-up/approve-response/0.3/payload.d.ts +4 -4
  22. package/dist/auth/step-up/approve-response/0.3/payload.js +1 -1
  23. package/dist/auth/step-up/approve-response/0.4/payload.d.ts +4 -4
  24. package/dist/auth/step-up/approve-response/0.4/payload.js +1 -1
  25. package/dist/auth/step-up/approve-response/0.5/payload.d.ts +4 -4
  26. package/dist/auth/step-up/approve-response/0.5/payload.js +1 -1
  27. package/dist/auth/step-up/approve-response/0.6/payload.d.ts +14 -2
  28. package/dist/auth/step-up/approve-response/0.6/payload.d.ts.map +1 -1
  29. package/dist/auth/step-up/approve-response/0.6/payload.js +1 -1
  30. package/dist/auth/step-up/approve-response/0.6/payload.js.map +1 -1
  31. package/dist/auth/step-up/approve-response/0.7/payload.d.ts +988 -0
  32. package/dist/auth/step-up/approve-response/0.7/payload.d.ts.map +1 -0
  33. package/dist/auth/step-up/approve-response/0.7/payload.js +566 -0
  34. package/dist/auth/step-up/approve-response/0.7/payload.js.map +1 -0
  35. package/dist/auth/step-up/approver/attest/0.1/payload.d.ts +3 -3
  36. package/dist/auth/step-up/approver/attest/0.1/payload.js +1 -1
  37. package/dist/index.d.ts +72 -0
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +72 -0
  40. package/dist/index.js.map +1 -1
  41. package/dist/rooms/owner/group/remove/0.1/payload.d.ts +4 -4
  42. package/dist/rooms/owner/group/remove/0.1/payload.js +1 -1
  43. package/dist/rooms/owner/group/remove/0.2/payload.d.ts +4 -4
  44. package/dist/rooms/owner/group/remove/0.2/payload.js +1 -1
  45. package/dist/rooms/owner/group/remove/0.3/payload.d.ts +14 -2
  46. package/dist/rooms/owner/group/remove/0.3/payload.d.ts.map +1 -1
  47. package/dist/rooms/owner/group/remove/0.3/payload.js +1 -1
  48. package/dist/rooms/owner/group/remove/0.3/payload.js.map +1 -1
  49. package/dist/rooms/owner/group/remove/0.4/payload.d.ts +634 -0
  50. package/dist/rooms/owner/group/remove/0.4/payload.d.ts.map +1 -0
  51. package/dist/rooms/owner/group/remove/0.4/payload.js +331 -0
  52. package/dist/rooms/owner/group/remove/0.4/payload.js.map +1 -0
  53. package/dist/rooms/records/put/0.1/payload.d.ts +4 -4
  54. package/dist/rooms/records/put/0.1/payload.js +1 -1
  55. package/dist/rooms/records/put/0.2/payload.d.ts +4 -4
  56. package/dist/rooms/records/put/0.2/payload.js +1 -1
  57. package/dist/rooms/records/put/0.3/payload.d.ts +14 -2
  58. package/dist/rooms/records/put/0.3/payload.d.ts.map +1 -1
  59. package/dist/rooms/records/put/0.3/payload.js +1 -1
  60. package/dist/rooms/records/put/0.3/payload.js.map +1 -1
  61. package/dist/rooms/records/put/0.4/payload.d.ts +1474 -0
  62. package/dist/rooms/records/put/0.4/payload.d.ts.map +1 -0
  63. package/dist/rooms/records/put/0.4/payload.js +804 -0
  64. package/dist/rooms/records/put/0.4/payload.js.map +1 -0
  65. package/dist/task-consent/decision/0.2/payload.d.ts +5 -5
  66. package/dist/task-consent/decision/0.2/payload.js +2 -2
  67. package/dist/vta/_shared/0.3/did-key-roles.d.ts +1 -1
  68. package/dist/vta/_shared/0.9/did-template.d.ts +16 -0
  69. package/dist/vta/_shared/0.9/did-template.d.ts.map +1 -0
  70. package/dist/vta/_shared/0.9/did-template.js +6 -0
  71. package/dist/vta/_shared/0.9/did-template.js.map +1 -0
  72. package/dist/vta/did-templates/create/2.0/payload.d.ts +3 -3
  73. package/dist/vta/did-templates/create/2.0/payload.js +1 -1
  74. package/dist/vta/did-templates/create/3.0/payload.d.ts +3 -3
  75. package/dist/vta/did-templates/create/3.0/payload.js +1 -1
  76. package/dist/vta/did-templates/create/3.1/payload.d.ts +12 -2
  77. package/dist/vta/did-templates/create/3.1/payload.d.ts.map +1 -1
  78. package/dist/vta/did-templates/create/3.1/payload.js +1 -1
  79. package/dist/vta/did-templates/create/3.1/payload.js.map +1 -1
  80. package/dist/vta/did-templates/create/3.2/payload.d.ts +1310 -0
  81. package/dist/vta/did-templates/create/3.2/payload.d.ts.map +1 -0
  82. package/dist/vta/did-templates/create/3.2/payload.js +832 -0
  83. package/dist/vta/did-templates/create/3.2/payload.js.map +1 -0
  84. package/dist/vta/did-templates/get/2.0/payload.d.ts +3 -3
  85. package/dist/vta/did-templates/get/2.0/payload.js +1 -1
  86. package/dist/vta/did-templates/get/3.0/payload.d.ts +3 -3
  87. package/dist/vta/did-templates/get/3.0/payload.js +1 -1
  88. package/dist/vta/did-templates/get/3.1/payload.d.ts +12 -2
  89. package/dist/vta/did-templates/get/3.1/payload.d.ts.map +1 -1
  90. package/dist/vta/did-templates/get/3.1/payload.js +1 -1
  91. package/dist/vta/did-templates/get/3.1/payload.js.map +1 -1
  92. package/dist/vta/did-templates/get/3.2/payload.d.ts +928 -0
  93. package/dist/vta/did-templates/get/3.2/payload.d.ts.map +1 -0
  94. package/dist/vta/did-templates/get/3.2/payload.js +593 -0
  95. package/dist/vta/did-templates/get/3.2/payload.js.map +1 -0
  96. package/dist/vta/did-templates/list/2.0/payload.d.ts +4 -4
  97. package/dist/vta/did-templates/list/2.0/payload.js +1 -1
  98. package/dist/vta/did-templates/list/3.0/payload.d.ts +4 -4
  99. package/dist/vta/did-templates/list/3.0/payload.js +1 -1
  100. package/dist/vta/did-templates/list/3.1/payload.d.ts +14 -2
  101. package/dist/vta/did-templates/list/3.1/payload.d.ts.map +1 -1
  102. package/dist/vta/did-templates/list/3.1/payload.js +1 -1
  103. package/dist/vta/did-templates/list/3.1/payload.js.map +1 -1
  104. package/dist/vta/did-templates/list/3.2/payload.d.ts +985 -0
  105. package/dist/vta/did-templates/list/3.2/payload.d.ts.map +1 -0
  106. package/dist/vta/did-templates/list/3.2/payload.js +619 -0
  107. package/dist/vta/did-templates/list/3.2/payload.js.map +1 -0
  108. package/dist/vta/did-templates/update/2.0/payload.d.ts +3 -3
  109. package/dist/vta/did-templates/update/2.0/payload.js +1 -1
  110. package/dist/vta/did-templates/update/3.0/payload.d.ts +3 -3
  111. package/dist/vta/did-templates/update/3.0/payload.js +1 -1
  112. package/dist/vta/did-templates/update/3.1/payload.d.ts +12 -2
  113. package/dist/vta/did-templates/update/3.1/payload.d.ts.map +1 -1
  114. package/dist/vta/did-templates/update/3.1/payload.js +1 -1
  115. package/dist/vta/did-templates/update/3.1/payload.js.map +1 -1
  116. package/dist/vta/did-templates/update/3.2/payload.d.ts +1324 -0
  117. package/dist/vta/did-templates/update/3.2/payload.d.ts.map +1 -0
  118. package/dist/vta/did-templates/update/3.2/payload.js +838 -0
  119. package/dist/vta/did-templates/update/3.2/payload.js.map +1 -0
  120. package/dist/vta/dids/_shared/0.1/key-roles.d.ts +16 -0
  121. package/dist/vta/dids/_shared/0.1/key-roles.d.ts.map +1 -0
  122. package/dist/vta/dids/_shared/0.1/key-roles.js +6 -0
  123. package/dist/vta/dids/_shared/0.1/key-roles.js.map +1 -0
  124. package/dist/vta/dids/_shared/0.1/method-profiles/webvh-parameters.d.ts +11 -0
  125. package/dist/vta/dids/_shared/0.1/method-profiles/webvh-parameters.d.ts.map +1 -0
  126. package/dist/vta/dids/_shared/0.1/method-profiles/webvh-parameters.js +6 -0
  127. package/dist/vta/dids/_shared/0.1/method-profiles/webvh-parameters.js.map +1 -0
  128. package/dist/vta/dids/create/1.0/payload.d.ts +2613 -0
  129. package/dist/vta/dids/create/1.0/payload.d.ts.map +1 -0
  130. package/dist/vta/dids/create/1.0/payload.js +1554 -0
  131. package/dist/vta/dids/create/1.0/payload.js.map +1 -0
  132. package/dist/vta/dids/keys/add/1.0/payload.d.ts +2447 -0
  133. package/dist/vta/dids/keys/add/1.0/payload.d.ts.map +1 -0
  134. package/dist/vta/dids/keys/add/1.0/payload.js +1469 -0
  135. package/dist/vta/dids/keys/add/1.0/payload.js.map +1 -0
  136. package/dist/vta/dids/keys/list/1.0/payload.d.ts +1855 -0
  137. package/dist/vta/dids/keys/list/1.0/payload.d.ts.map +1 -0
  138. package/dist/vta/dids/keys/list/1.0/payload.js +1116 -0
  139. package/dist/vta/dids/keys/list/1.0/payload.js.map +1 -0
  140. package/dist/vta/dids/keys/retire/1.0/payload.d.ts +2449 -0
  141. package/dist/vta/dids/keys/retire/1.0/payload.d.ts.map +1 -0
  142. package/dist/vta/dids/keys/retire/1.0/payload.js +1469 -0
  143. package/dist/vta/dids/keys/retire/1.0/payload.js.map +1 -0
  144. package/dist/vta/dids/keys/revoke/1.0/payload.d.ts +2701 -0
  145. package/dist/vta/dids/keys/revoke/1.0/payload.d.ts.map +1 -0
  146. package/dist/vta/dids/keys/revoke/1.0/payload.js +1597 -0
  147. package/dist/vta/dids/keys/revoke/1.0/payload.js.map +1 -0
  148. package/dist/vta/dids/keys/rotate/1.0/payload.d.ts +2628 -0
  149. package/dist/vta/dids/keys/rotate/1.0/payload.d.ts.map +1 -0
  150. package/dist/vta/dids/keys/rotate/1.0/payload.js +1555 -0
  151. package/dist/vta/dids/keys/rotate/1.0/payload.js.map +1 -0
  152. package/dist/vta/dids/recover/1.0/payload.d.ts +2702 -0
  153. package/dist/vta/dids/recover/1.0/payload.d.ts.map +1 -0
  154. package/dist/vta/dids/recover/1.0/payload.js +1597 -0
  155. package/dist/vta/dids/recover/1.0/payload.js.map +1 -0
  156. package/dist/vta/dids/update/1.0/payload.d.ts +1422 -0
  157. package/dist/vta/dids/update/1.0/payload.d.ts.map +1 -0
  158. package/dist/vta/dids/update/1.0/payload.js +861 -0
  159. package/dist/vta/dids/update/1.0/payload.js.map +1 -0
  160. package/dist/vta/webvh/dids/keys/add/1.0/payload.d.ts +14 -2
  161. package/dist/vta/webvh/dids/keys/add/1.0/payload.d.ts.map +1 -1
  162. package/dist/vta/webvh/dids/keys/add/1.0/payload.js +1 -1
  163. package/dist/vta/webvh/dids/keys/add/1.0/payload.js.map +1 -1
  164. package/dist/vta/webvh/dids/keys/list/1.0/payload.d.ts +14 -2
  165. package/dist/vta/webvh/dids/keys/list/1.0/payload.d.ts.map +1 -1
  166. package/dist/vta/webvh/dids/keys/list/1.0/payload.js +1 -1
  167. package/dist/vta/webvh/dids/keys/list/1.0/payload.js.map +1 -1
  168. package/dist/vta/webvh/dids/keys/retire/1.0/payload.d.ts +14 -2
  169. package/dist/vta/webvh/dids/keys/retire/1.0/payload.d.ts.map +1 -1
  170. package/dist/vta/webvh/dids/keys/retire/1.0/payload.js +1 -1
  171. package/dist/vta/webvh/dids/keys/retire/1.0/payload.js.map +1 -1
  172. package/dist/vta/webvh/dids/keys/revoke/1.0/payload.d.ts +14 -2
  173. package/dist/vta/webvh/dids/keys/revoke/1.0/payload.d.ts.map +1 -1
  174. package/dist/vta/webvh/dids/keys/revoke/1.0/payload.js +1 -1
  175. package/dist/vta/webvh/dids/keys/revoke/1.0/payload.js.map +1 -1
  176. package/dist/vta/webvh/dids/rotate-keys/1.0/payload.d.ts +2 -14
  177. package/dist/vta/webvh/dids/rotate-keys/1.0/payload.d.ts.map +1 -1
  178. package/dist/vta/webvh/dids/rotate-keys/1.0/payload.js +1 -1
  179. package/dist/vta/webvh/dids/rotate-keys/1.0/payload.js.map +1 -1
  180. package/dist/vta/webvh/dids/rotate-keys/2.0/payload.d.ts +14 -2
  181. package/dist/vta/webvh/dids/rotate-keys/2.0/payload.d.ts.map +1 -1
  182. package/dist/vta/webvh/dids/rotate-keys/2.0/payload.js +1 -1
  183. package/dist/vta/webvh/dids/rotate-keys/2.0/payload.js.map +1 -1
  184. package/dist/vta/webvh/dids/update/1.0/payload.d.ts +2 -14
  185. package/dist/vta/webvh/dids/update/1.0/payload.d.ts.map +1 -1
  186. package/dist/vta/webvh/dids/update/1.0/payload.js +1 -1
  187. package/dist/vta/webvh/dids/update/1.0/payload.js.map +1 -1
  188. package/dist/vta/webvh/dids/update/2.0/payload.d.ts +4 -4
  189. package/dist/vta/webvh/dids/update/2.0/payload.d.ts.map +1 -1
  190. package/dist/vta/webvh/dids/update/2.0/payload.js +1 -1
  191. package/dist/vta/webvh/dids/update/2.0/payload.js.map +1 -1
  192. package/dist/vta/webvh/dids/update/2.1/payload.d.ts +14 -2
  193. package/dist/vta/webvh/dids/update/2.1/payload.d.ts.map +1 -1
  194. package/dist/vta/webvh/dids/update/2.1/payload.js +1 -1
  195. package/dist/vta/webvh/dids/update/2.1/payload.js.map +1 -1
  196. package/dist/vtc/_shared/0.2/invite.d.ts +16 -0
  197. package/dist/vtc/_shared/0.2/invite.d.ts.map +1 -0
  198. package/dist/vtc/_shared/0.2/invite.js +6 -0
  199. package/dist/vtc/_shared/0.2/invite.js.map +1 -0
  200. package/dist/vtc/admin/invites/create/0.1/payload.d.ts +12 -2
  201. package/dist/vtc/admin/invites/create/0.1/payload.d.ts.map +1 -1
  202. package/dist/vtc/admin/invites/create/0.1/payload.js +1 -1
  203. package/dist/vtc/admin/invites/create/0.1/payload.js.map +1 -1
  204. package/dist/vtc/admin/invites/create/0.2/payload.d.ts +404 -0
  205. package/dist/vtc/admin/invites/create/0.2/payload.d.ts.map +1 -0
  206. package/dist/vtc/admin/invites/create/0.2/payload.js +230 -0
  207. package/dist/vtc/admin/invites/create/0.2/payload.js.map +1 -0
  208. package/dist/vtc/admin/invites/list/0.1/payload.d.ts +12 -2
  209. package/dist/vtc/admin/invites/list/0.1/payload.d.ts.map +1 -1
  210. package/dist/vtc/admin/invites/list/0.1/payload.js +1 -1
  211. package/dist/vtc/admin/invites/list/0.1/payload.js.map +1 -1
  212. package/dist/vtc/admin/invites/list/0.2/payload.d.ts +431 -0
  213. package/dist/vtc/admin/invites/list/0.2/payload.d.ts.map +1 -0
  214. package/dist/vtc/admin/invites/list/0.2/payload.js +264 -0
  215. package/dist/vtc/admin/invites/list/0.2/payload.js.map +1 -0
  216. package/dist/vtc/credentials/reissue/0.1/payload.d.ts +3 -3
  217. package/dist/vtc/credentials/reissue/0.1/payload.js +1 -1
  218. package/dist/vtc/credentials/reissue/0.1/payload.js.map +1 -1
  219. package/dist/vtc/install/claim/finish/0.2/payload.d.ts +4 -4
  220. package/dist/vtc/install/claim/finish/0.2/payload.d.ts.map +1 -1
  221. package/dist/vtc/install/claim/finish/0.2/payload.js +1 -1
  222. package/dist/vtc/install/claim/finish/0.2/payload.js.map +1 -1
  223. package/dist/vtc/install/claim/passkey/finish/0.1/payload.d.ts +306 -0
  224. package/dist/vtc/install/claim/passkey/finish/0.1/payload.d.ts.map +1 -0
  225. package/dist/vtc/install/claim/passkey/finish/0.1/payload.js +175 -0
  226. package/dist/vtc/install/claim/passkey/finish/0.1/payload.js.map +1 -0
  227. package/dist/vtc/install/claim/passkey/start/0.1/payload.d.ts +302 -0
  228. package/dist/vtc/install/claim/passkey/start/0.1/payload.d.ts.map +1 -0
  229. package/dist/vtc/install/claim/passkey/start/0.1/payload.js +172 -0
  230. package/dist/vtc/install/claim/passkey/start/0.1/payload.js.map +1 -0
  231. package/dist/vtc/install/claim/start/0.2/payload.d.ts +4 -4
  232. package/dist/vtc/install/claim/start/0.2/payload.d.ts.map +1 -1
  233. package/dist/vtc/install/claim/start/0.2/payload.js +1 -1
  234. package/dist/vtc/install/claim/start/0.2/payload.js.map +1 -1
  235. package/dist/vtc/members/role/set/0.1/payload.d.ts +1867 -0
  236. package/dist/vtc/members/role/set/0.1/payload.d.ts.map +1 -0
  237. package/dist/vtc/members/role/set/0.1/payload.js +1060 -0
  238. package/dist/vtc/members/role/set/0.1/payload.js.map +1 -0
  239. package/package.json +1 -1
  240. package/src/_extends.ts +5 -0
  241. package/src/_runtime/document.ts +18 -2
  242. package/src/_runtime/index.ts +1 -0
  243. package/src/_shared/components.ts +556 -3
  244. package/src/auth/step-up/approve-request/0.5/payload.ts +2 -2
  245. package/src/auth/step-up/approve-response/0.1/payload.ts +5 -5
  246. package/src/auth/step-up/approve-response/0.2/payload.ts +5 -5
  247. package/src/auth/step-up/approve-response/0.3/payload.ts +5 -5
  248. package/src/auth/step-up/approve-response/0.4/payload.ts +5 -5
  249. package/src/auth/step-up/approve-response/0.5/payload.ts +5 -5
  250. package/src/auth/step-up/approve-response/0.6/payload.ts +15 -3
  251. package/src/auth/step-up/approve-response/0.7/payload.ts +664 -0
  252. package/src/auth/step-up/approver/attest/0.1/payload.ts +2 -2
  253. package/src/index.ts +72 -0
  254. package/src/rooms/owner/group/remove/0.1/payload.ts +5 -5
  255. package/src/rooms/owner/group/remove/0.2/payload.ts +5 -5
  256. package/src/rooms/owner/group/remove/0.3/payload.ts +15 -3
  257. package/src/rooms/owner/group/remove/0.4/payload.ts +442 -0
  258. package/src/rooms/records/put/0.1/payload.ts +5 -5
  259. package/src/rooms/records/put/0.2/payload.ts +5 -5
  260. package/src/rooms/records/put/0.3/payload.ts +15 -3
  261. package/src/rooms/records/put/0.4/payload.ts +905 -0
  262. package/src/task-consent/decision/0.2/payload.ts +3 -3
  263. package/src/vta/_shared/0.3/did-key-roles.ts +1 -1
  264. package/src/vta/_shared/0.9/did-template.ts +17 -0
  265. package/src/vta/did-templates/create/2.0/payload.ts +4 -4
  266. package/src/vta/did-templates/create/3.0/payload.ts +4 -4
  267. package/src/vta/did-templates/create/3.1/payload.ts +13 -3
  268. package/src/vta/did-templates/create/3.2/payload.ts +869 -0
  269. package/src/vta/did-templates/get/2.0/payload.ts +4 -4
  270. package/src/vta/did-templates/get/3.0/payload.ts +4 -4
  271. package/src/vta/did-templates/get/3.1/payload.ts +13 -3
  272. package/src/vta/did-templates/get/3.2/payload.ts +630 -0
  273. package/src/vta/did-templates/list/2.0/payload.ts +5 -5
  274. package/src/vta/did-templates/list/3.0/payload.ts +5 -5
  275. package/src/vta/did-templates/list/3.1/payload.ts +15 -3
  276. package/src/vta/did-templates/list/3.2/payload.ts +665 -0
  277. package/src/vta/did-templates/update/2.0/payload.ts +4 -4
  278. package/src/vta/did-templates/update/3.0/payload.ts +4 -4
  279. package/src/vta/did-templates/update/3.1/payload.ts +13 -3
  280. package/src/vta/did-templates/update/3.2/payload.ts +879 -0
  281. package/src/vta/dids/_shared/0.1/key-roles.ts +17 -0
  282. package/src/vta/dids/_shared/0.1/method-profiles/webvh-parameters.ts +11 -0
  283. package/src/vta/dids/create/1.0/payload.ts +1648 -0
  284. package/src/vta/dids/keys/add/1.0/payload.ts +1553 -0
  285. package/src/vta/dids/keys/list/1.0/payload.ts +1178 -0
  286. package/src/vta/dids/keys/retire/1.0/payload.ts +1553 -0
  287. package/src/vta/dids/keys/revoke/1.0/payload.ts +1697 -0
  288. package/src/vta/dids/keys/rotate/1.0/payload.ts +1658 -0
  289. package/src/vta/dids/recover/1.0/payload.ts +1700 -0
  290. package/src/vta/dids/update/1.0/payload.ts +940 -0
  291. package/src/vta/webvh/dids/keys/add/1.0/payload.ts +15 -3
  292. package/src/vta/webvh/dids/keys/list/1.0/payload.ts +15 -3
  293. package/src/vta/webvh/dids/keys/retire/1.0/payload.ts +15 -3
  294. package/src/vta/webvh/dids/keys/revoke/1.0/payload.ts +15 -3
  295. package/src/vta/webvh/dids/rotate-keys/1.0/payload.ts +3 -15
  296. package/src/vta/webvh/dids/rotate-keys/2.0/payload.ts +15 -3
  297. package/src/vta/webvh/dids/update/1.0/payload.ts +3 -15
  298. package/src/vta/webvh/dids/update/2.0/payload.ts +5 -5
  299. package/src/vta/webvh/dids/update/2.1/payload.ts +15 -3
  300. package/src/vtc/_shared/0.2/invite.ts +17 -0
  301. package/src/vtc/admin/invites/create/0.1/payload.ts +13 -3
  302. package/src/vtc/admin/invites/create/0.2/payload.ts +289 -0
  303. package/src/vtc/admin/invites/list/0.1/payload.ts +13 -3
  304. package/src/vtc/admin/invites/list/0.2/payload.ts +294 -0
  305. package/src/vtc/credentials/reissue/0.1/payload.ts +2 -2
  306. package/src/vtc/install/claim/finish/0.2/payload.ts +5 -5
  307. package/src/vtc/install/claim/passkey/finish/0.1/payload.ts +228 -0
  308. package/src/vtc/install/claim/passkey/start/0.1/payload.ts +225 -0
  309. package/src/vtc/install/claim/start/0.2/payload.ts +5 -5
  310. package/src/vtc/members/role/set/0.1/payload.ts +1142 -0
@@ -0,0 +1,1867 @@
1
+ /**
2
+ * Generated by scripts/build-ts-bindings.mjs — DO NOT EDIT BY HAND.
3
+ * Source: specs/vtc/members/role/set/0.1/payload.schema.json
4
+ */
5
+ import type { AclEntry_AclV0_2 as AclEntry, Approval, ApproveCapabilityScope, ApproveCapabilityScopeListed, AuthorityScope, AuthorityScopeAll, AuthorityScopeContexts, AuthorityScopeNone, Capability_AclV0_2 as Capability, CapabilityGrant, CapabilityRef, CapabilityScope, CapabilityScopeCeiling, CapabilityScopeListed, CapabilityScopeNone, ContextPath, Ext, KeyScope, KeyScopeAll, KeyScopeListed, KeyScopeNone, ResourceQualifier } from "../../../../../_shared/components.js";
6
+ /**
7
+ * An administrator moves a subject's community role from one role to another, with a compare-and-swap on the current role. The administrative authority the entry holds follows the move only where it is the authority the current community role implies. The outer document members are owned by the framework — SPEC §6.3.
8
+ */
9
+ export interface VTCMembersRoleSetPayload {
10
+ /**
11
+ * The DID whose community role moves. It holds an access-control entry at the community, of any community role but `application`.
12
+ */
13
+ subject: string;
14
+ /**
15
+ * The subject's current community role, in the community's wire form (`member`, `moderator`, `issuer`, `admin`, `custom:<name>`). The community refuses the move with `stateMismatch` when it differs from the role the entry holds.
16
+ */
17
+ fromRole: string;
18
+ /**
19
+ * The community role to move the subject to, in the same wire form. Never `application`, which marks a non-member rather than a role a member holds.
20
+ */
21
+ toRole: string;
22
+ /**
23
+ * Why, for the community's audit trail and for the administrators asked to approve the move if it is referred. Never published beyond the community.
24
+ */
25
+ reason?: string;
26
+ /**
27
+ * Ecosystem-defined extension members per SPEC §4.5.1.
28
+ */
29
+ ext?: Ext;
30
+ }
31
+ /**
32
+ * Success response to vtc/members/role/set/0.1: the subject's community role as it now stands, the access-control entry that holds it, and the role credential re-issued for it. Type https://trusttasks.org/spec/vtc/members/role/set/0.1#response — carried directly, or on the request's threadId when a parked move executes after its approval.
33
+ */
34
+ export interface VTCMembersRoleSetResponsePayload {
35
+ /**
36
+ * The DID whose community role was set.
37
+ */
38
+ subject: string;
39
+ /**
40
+ * The community role the subject now holds. Equals the request's `toRole`.
41
+ */
42
+ role: string;
43
+ /**
44
+ * The community role the subject held before. Equals the request's `fromRole`.
45
+ */
46
+ previousRole: string;
47
+ /**
48
+ * False when `fromRole` equalled `toRole`: the subject already held the role, nothing was written and no credential was issued.
49
+ */
50
+ changed: boolean;
51
+ /**
52
+ * The access-control entry as it now stands, every authority axis explicit, so the requester can see what administrative authority the move did or did not carry.
53
+ */
54
+ entry: AclEntry;
55
+ /**
56
+ * The role credential issued at the new role: a Verifiable Authority Credential issued by the community whose `credentialSubject.authority` is `{ scope: <community DID>, actions: ["role:<name>"] }`, the shape vtc/join-requests/decide returns. Present exactly when the subject has a member record and `changed` is true; a subject holding an entry with no member record has no role credential to re-issue.
57
+ */
58
+ roleVac?: {};
59
+ /**
60
+ * How the move came to execute: `policyAllowed` at once, `approved` after a parked move was approved by other administrators, or `waived` by the community's single-administrator mode on the requester's own bound re-authentication. Absent when `changed` is false.
61
+ */
62
+ approval?: Approval;
63
+ /**
64
+ * Ecosystem-defined extension members per SPEC §4.5.1.
65
+ */
66
+ ext?: Ext;
67
+ }
68
+ /** Shared definitions this specification references, re-exported under the names it used to declare them with. */
69
+ export type { AclEntry, Approval, ApproveCapabilityScope, ApproveCapabilityScopeListed, AuthorityScope, AuthorityScopeAll, AuthorityScopeContexts, AuthorityScopeNone, Capability, CapabilityGrant, CapabilityRef, CapabilityScope, CapabilityScopeCeiling, CapabilityScopeListed, CapabilityScopeNone, ContextPath, Ext, KeyScope, KeyScopeAll, KeyScopeListed, KeyScopeNone, ResourceQualifier };
70
+ /** Trust Task type URI. */
71
+ export declare const TYPE_URI: "https://trusttasks.org/spec/vtc/members/role/set/0.1";
72
+ /**
73
+ * The earlier version of this specification that this one declares it
74
+ * extends (front matter `extends`, SPEC §5.2 "Declared extension"), or
75
+ * `null`. Only the direct declaration — follow the chain with
76
+ * `extendsChain` / `readForSpec`.
77
+ */
78
+ export declare const EXTENDS: string | null;
79
+ /**
80
+ * Why this version is deprecated, or `null` while it is current. A
81
+ * superseded or retired version is still supported, and is withdrawn from
82
+ * this package in a later scheduled batch (SPEC "Superseded and Withdrawn
83
+ * Versions").
84
+ */
85
+ export declare const DEPRECATION: string | null;
86
+ /** Stable alias for this specification's request payload shape. */
87
+ export type Payload = VTCMembersRoleSetPayload;
88
+ /** Trust Task response type URI (request type URI + "#response"). */
89
+ export declare const RESPONSE_TYPE_URI: "https://trusttasks.org/spec/vtc/members/role/set/0.1#response";
90
+ /** Stable alias for this specification's success-response payload shape. */
91
+ export type Response = VTCMembersRoleSetResponsePayload;
92
+ /**
93
+ * This specification's payload schema, as a value.
94
+ *
95
+ * SPEC.md §7.2 item 2 is performed against this. It is shipped as data
96
+ * rather than only as a `.json` file because TypeScript types are erased
97
+ * at runtime: without a schema a consumer has nothing to validate, and
98
+ * every REQUIRED payload member is optional in practice. Cross-file
99
+ * `$ref`s are already inlined, so it needs no resolver.
100
+ */
101
+ export declare const PAYLOAD_SCHEMA: {
102
+ readonly $schema: "https://json-schema.org/draft/2020-12/schema";
103
+ readonly $id: "https://trusttasks.org/spec/vtc/members/role/set/0.1";
104
+ readonly title: "VTC Members Role Set — payload";
105
+ readonly description: "An administrator moves a subject's community role from one role to another, with a compare-and-swap on the current role. The administrative authority the entry holds follows the move only where it is the authority the current community role implies. The outer document members are owned by the framework — SPEC §6.3.";
106
+ readonly type: "object";
107
+ readonly additionalProperties: false;
108
+ readonly required: readonly ["subject", "fromRole", "toRole"];
109
+ readonly properties: {
110
+ readonly subject: {
111
+ readonly type: "string";
112
+ readonly pattern: "^did:";
113
+ readonly maxLength: 2048;
114
+ readonly description: "The DID whose community role moves. It holds an access-control entry at the community, of any community role but `application`.";
115
+ };
116
+ readonly fromRole: {
117
+ readonly type: "string";
118
+ readonly minLength: 1;
119
+ readonly maxLength: 128;
120
+ readonly description: "The subject's current community role, in the community's wire form (`member`, `moderator`, `issuer`, `admin`, `custom:<name>`). The community refuses the move with `stateMismatch` when it differs from the role the entry holds.";
121
+ };
122
+ readonly toRole: {
123
+ readonly type: "string";
124
+ readonly minLength: 1;
125
+ readonly maxLength: 128;
126
+ readonly description: "The community role to move the subject to, in the same wire form. Never `application`, which marks a non-member rather than a role a member holds.";
127
+ };
128
+ readonly reason: {
129
+ readonly type: "string";
130
+ readonly maxLength: 1024;
131
+ readonly description: "Why, for the community's audit trail and for the administrators asked to approve the move if it is referred. Never published beyond the community.";
132
+ };
133
+ readonly ext: {
134
+ readonly $ref: "#/$defs/Ext";
135
+ readonly description: "Ecosystem-defined extension members per SPEC §4.5.1.";
136
+ };
137
+ };
138
+ readonly $defs: {
139
+ readonly Response: {
140
+ readonly $anchor: "response";
141
+ readonly title: "VTC Members Role Set — response payload";
142
+ readonly description: "Success response to vtc/members/role/set/0.1: the subject's community role as it now stands, the access-control entry that holds it, and the role credential re-issued for it. Type https://trusttasks.org/spec/vtc/members/role/set/0.1#response — carried directly, or on the request's threadId when a parked move executes after its approval.";
143
+ readonly type: "object";
144
+ readonly additionalProperties: false;
145
+ readonly required: readonly ["subject", "role", "previousRole", "changed", "entry"];
146
+ readonly properties: {
147
+ readonly subject: {
148
+ readonly type: "string";
149
+ readonly pattern: "^did:";
150
+ readonly maxLength: 2048;
151
+ readonly description: "The DID whose community role was set.";
152
+ };
153
+ readonly role: {
154
+ readonly type: "string";
155
+ readonly minLength: 1;
156
+ readonly maxLength: 128;
157
+ readonly description: "The community role the subject now holds. Equals the request's `toRole`.";
158
+ };
159
+ readonly previousRole: {
160
+ readonly type: "string";
161
+ readonly minLength: 1;
162
+ readonly maxLength: 128;
163
+ readonly description: "The community role the subject held before. Equals the request's `fromRole`.";
164
+ };
165
+ readonly changed: {
166
+ readonly type: "boolean";
167
+ readonly description: "False when `fromRole` equalled `toRole`: the subject already held the role, nothing was written and no credential was issued.";
168
+ };
169
+ readonly entry: {
170
+ readonly $ref: "#/$defs/AclEntry";
171
+ readonly description: "The access-control entry as it now stands, every authority axis explicit, so the requester can see what administrative authority the move did or did not carry.";
172
+ };
173
+ readonly roleVac: {
174
+ readonly type: "object";
175
+ readonly description: "The role credential issued at the new role: a Verifiable Authority Credential issued by the community whose `credentialSubject.authority` is `{ scope: <community DID>, actions: [\"role:<name>\"] }`, the shape vtc/join-requests/decide returns. Present exactly when the subject has a member record and `changed` is true; a subject holding an entry with no member record has no role credential to re-issue.";
176
+ };
177
+ readonly approval: {
178
+ readonly $ref: "#/$defs/Approval";
179
+ readonly description: "How the move came to execute: `policyAllowed` at once, `approved` after a parked move was approved by other administrators, or `waived` by the community's single-administrator mode on the requester's own bound re-authentication. Absent when `changed` is false.";
180
+ };
181
+ readonly ext: {
182
+ readonly $ref: "#/$defs/Ext";
183
+ readonly description: "Ecosystem-defined extension members per SPEC §4.5.1.";
184
+ };
185
+ };
186
+ };
187
+ readonly Ext: {
188
+ readonly title: "Ext";
189
+ readonly description: "Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.";
190
+ readonly type: "object";
191
+ readonly minProperties: 1;
192
+ readonly additionalProperties: true;
193
+ readonly propertyNames: {
194
+ readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$";
195
+ };
196
+ };
197
+ readonly Approval: {
198
+ readonly title: "Approval";
199
+ readonly type: "string";
200
+ readonly enum: readonly ["policyAllowed", "approved", "waived"];
201
+ readonly description: "How the admission came to execute. `policyAllowed`: the community's policy admitted it at once. `approved`: the policy referred it, the community parked it, and another administrator approved it. `waived`: the policy referred it, and the community's single-administrator mode waived the approval on the requester's own re-authentication bound to the operation.";
202
+ };
203
+ readonly AclEntry: {
204
+ readonly title: "AclEntry";
205
+ readonly description: "One access-control entry: who the grant is for (`subject`), the ceiling it is held under (`role`), where the subject may act (`act`) and approve (`approve`), and which capabilities it may exercise (`capabilities`) and approve (`approveCapabilities`).\n\nThe act axis and the approve axis are independent and a consumer MUST resolve them separately: `act` + `capabilities` (+ `keys`) answer \"may this subject do X\"; `approve` + `approveCapabilities` answer \"may this subject ratify someone else doing X\". Neither implies the other. An entry with `act: {scope: none}` and an approve scope other than none is a least-privilege approver — able to satisfy an approval and unable to initiate any change.";
206
+ readonly type: "object";
207
+ readonly additionalProperties: false;
208
+ readonly required: readonly ["subject", "role", "act", "keys", "capabilities"];
209
+ readonly properties: {
210
+ readonly subject: {
211
+ readonly type: "string";
212
+ readonly minLength: 1;
213
+ readonly description: "VID of the party in the ACL. Compared by exact string equality (SPEC.md §4.8); producers SHOULD emit canonical form.";
214
+ };
215
+ readonly role: {
216
+ readonly type: "string";
217
+ readonly minLength: 1;
218
+ readonly description: "Opaque role identifier interpreted by the ACL maintainer. A role is a CEILING, never a grant: it bounds the capabilities the entry may hold and never adds to them. A consumer that does not recognise the role MUST treat the entry as conferring no authority and MUST NOT fall back to a default role. Act scope and role are independent members; a consumer MUST NOT compute either from the other.";
219
+ };
220
+ readonly act: {
221
+ readonly $ref: "#/$defs/AuthorityScope";
222
+ readonly description: "REQUIRED explicit act scope: where this subject may make a change itself. Exactly one of `{\"scope\": \"all\"}` (unrestricted — every context the maintainer has), `{\"scope\": \"none\"}` (may act nowhere), or `{\"scope\": \"contexts\", \"contexts\": [...]}` with at least one context path (the named contexts and, where the maintainer's contexts are hierarchical, their descendants). There is no default and no implicit form: an entry without `act`, or with an empty `contexts` list, is malformed and MUST be refused, never read as `all` and never read as `none`. A maintainer that has no contexts (for example a community node that narrows authority with resource qualifiers instead) states `all` or `none` only. Replaces 0.1's `scopes`.";
223
+ };
224
+ readonly approve: {
225
+ readonly $ref: "#/$defs/AuthorityScope";
226
+ readonly description: "OPTIONAL approve scope: where this subject may ratify a change made by someone else (a step-up ratification, a consent decision, an N-of-M approval). Same three shapes as `act`, resolved independently of it. ABSENT MEANS NONE — the subject may ratify nothing — so a consumer that has not implemented the member confers less than the producer intended, never more. A producer SHOULD state `{\"scope\": \"none\"}` explicitly rather than rely on omission. A subject MUST NOT confer approve authority wider than the approve authority it holds itself (see acl/grant `approveWiderThanGranter`). Replaces 0.1's `approve {all, scopes}`.";
227
+ };
228
+ readonly capabilities: {
229
+ readonly $ref: "#/$defs/CapabilityScope";
230
+ readonly description: "REQUIRED explicit capability scope: which capabilities this entry holds. Exactly one of `{\"scope\": \"ceiling\"}` (the role's full ceiling, unnarrowed), `{\"scope\": \"none\"}` (no capabilities), or `{\"scope\": \"listed\", \"grants\": [...]}` with at least one CapabilityGrant. For `listed`, the EFFECTIVE set is (the role's ceiling ∩ the non-additive grants) ∪ the additive grants; it can only narrow the ceiling, except through an explicit additive grant, which only an unrestricted granter may make. There is no implicit form: an entry without `capabilities`, or with an empty `grants` list, is malformed and MUST be refused. A non-additive grant outside the role's ceiling is refused when written, never accepted with the capability silently dropped; a capability the consumer does not recognise is never treated as granted. Producers SHOULD NOT list the same (capability, resource) pair twice; a consumer MAY refuse a list that does.";
231
+ };
232
+ readonly approveCapabilities: {
233
+ readonly $ref: "#/$defs/ApproveCapabilityScope";
234
+ readonly description: "OPTIONAL explicit approvable-capability scope: which capabilities this subject may APPROVE an action needing — independent of what it may do itself, so an approver can ratify a capability it does not hold (the least-privilege approver). One of `{\"scope\": \"ceiling\"}` (the role's full approve ceiling; at a maintainer whose roles define no capability-level approve ceiling, any action within `approve`), `{\"scope\": \"none\"}`, or `{\"scope\": \"listed\", \"grants\": [...]}` with at least one CapabilityRef (intersected with the role's approve ceiling where one is defined). ABSENT MEANS NONE: the subject may approve no capability, because absence derives no authority. Bounded by `approve`: where `approve` is absent or `{\"scope\": \"none\"}` this member confers nothing whatever it states. A subject MUST NOT confer approvable capabilities it cannot itself approve.";
235
+ };
236
+ readonly delegatedBy: {
237
+ readonly type: "string";
238
+ readonly minLength: 1;
239
+ readonly description: "VID of the granter whose authority this entry was delegated from and is bounded by. The entry MUST NOT hold authority the granter did not hold when it was written, and MUST NOT retain authority the granter has since lost, so a maintainer re-evaluates it when the granter's own entry narrows or is removed. Distinct from `createdBy`, which records who wrote the entry: the two differ where an entry is written on a granter's behalf (for example after an N-of-M approval, or by an offline operator). Set by the maintainer from the granter it authorized; absent on an entry that derives from no granter's authority (the first administrator, an operator-written recovery entry).";
240
+ };
241
+ readonly keys: {
242
+ readonly $ref: "#/$defs/KeyScope";
243
+ readonly description: "REQUIRED explicit key scope: which keys this subject may invoke the maintainer's signing oracle on. Exactly one of `{\"scope\": \"all\"}` (every key the entry's act scope reaches), `{\"scope\": \"none\"}` (no keys), or `{\"scope\": \"listed\", \"keys\": [...]}` with at least one key identifier. INTERSECTS WITH `act` — it can only narrow, never widen: a listed key that lies outside the entry's act scope remains unreachable, exactly as if it were not listed. There is no implicit form: an entry without `keys`, or with an empty `keys` list, is malformed and MUST be refused. A maintainer that operates no signing oracle states `{\"scope\": \"none\"}`. Replaces 0.1's `allowedKeys`, whose absence meant every key.";
244
+ };
245
+ readonly label: {
246
+ readonly type: "string";
247
+ readonly maxLength: 256;
248
+ readonly description: "Optional human-readable label. Confers nothing.";
249
+ };
250
+ readonly createdAt: {
251
+ readonly type: "string";
252
+ readonly format: "date-time";
253
+ };
254
+ readonly createdBy: {
255
+ readonly type: "string";
256
+ readonly description: "VID of the party that originally wrote this entry.";
257
+ };
258
+ readonly updatedAt: {
259
+ readonly type: "string";
260
+ readonly format: "date-time";
261
+ };
262
+ readonly updatedBy: {
263
+ readonly type: "string";
264
+ readonly description: "VID of the party that last modified this entry.";
265
+ };
266
+ readonly expiresAt: {
267
+ readonly type: "string";
268
+ readonly format: "date-time";
269
+ readonly description: "Optional time after which the entry confers no authority. Evaluated at every authorization decision, not only when a session is established.";
270
+ };
271
+ readonly stepUp: {
272
+ readonly type: "object";
273
+ readonly additionalProperties: false;
274
+ readonly description: "Per-entry authentication step-up configuration, consumed by the ACL maintainer when it gates an operation behind a step-up (see auth/step-up/policy). ADDITIVE-ONLY: a per-entry setting MAY raise the assurance required of this subject above the maintainer's system-wide floor, but MUST NOT lower it. The maintainer resolves the effective requirement as the strictest of (system floor, this entry). Carried forward from 0.1 unchanged.";
275
+ readonly properties: {
276
+ readonly approver: {
277
+ readonly type: "string";
278
+ readonly description: "VID authorized to ratify step-up for this subject — the `recipient` the maintainer addresses an auth/step-up/approve-request to (e.g. the holder's mobile authenticator or browser companion). Absent → the subject is its own approver (mode `self`) when it holds a usable authenticator; if neither an `approver` nor a self authenticator exists, no step-up method is available for this subject and the maintainer's fail-closed rule applies.";
279
+ };
280
+ readonly require: {
281
+ readonly type: "string";
282
+ readonly enum: readonly ["self", "delegated"];
283
+ readonly description: "Minimum step-up mode this subject MUST satisfy for gated operations, raising the system floor. `self` = the subject re-authenticates its own session; `delegated` = a separate `approver` MUST ratify. Omitted → the system floor applies unchanged. A value weaker than the resolved floor is ignored (additive-only).";
284
+ };
285
+ };
286
+ };
287
+ readonly ext: {
288
+ readonly $ref: "#/$defs/Ext";
289
+ readonly description: "Ecosystem-defined extension members per SPEC.md §4.5.1. Reverse-DNS-namespaced; consumers MUST ignore unrecognized namespaces. An extension member MUST NOT be interpreted as conferring authority.";
290
+ };
291
+ };
292
+ };
293
+ readonly KeyScope: {
294
+ readonly title: "KeyScope";
295
+ readonly description: "An explicit key scope. Exactly one of three shapes, discriminated by `scope`: `all`, `none`, or `listed` with a NON-EMPTY list of key identifiers. The empty list is invalid, not a fourth shape.";
296
+ readonly oneOf: readonly [{
297
+ readonly $ref: "#/$defs/KeyScopeAll";
298
+ }, {
299
+ readonly $ref: "#/$defs/KeyScopeNone";
300
+ }, {
301
+ readonly $ref: "#/$defs/KeyScopeListed";
302
+ }];
303
+ };
304
+ readonly KeyScopeListed: {
305
+ readonly title: "KeyScopeListed";
306
+ readonly description: "Exactly the listed keys, intersected with the entry's act scope.";
307
+ readonly type: "object";
308
+ readonly additionalProperties: false;
309
+ readonly required: readonly ["scope", "keys"];
310
+ readonly properties: {
311
+ readonly scope: {
312
+ readonly const: "listed";
313
+ };
314
+ readonly keys: {
315
+ readonly type: "array";
316
+ readonly minItems: 1;
317
+ readonly uniqueItems: true;
318
+ readonly items: {
319
+ readonly type: "string";
320
+ readonly minLength: 1;
321
+ readonly maxLength: 512;
322
+ };
323
+ readonly description: "Non-empty set of key identifiers. An empty array is invalid (it is neither `all` nor `none`).";
324
+ };
325
+ };
326
+ };
327
+ readonly KeyScopeNone: {
328
+ readonly title: "KeyScopeNone";
329
+ readonly description: "No keys.";
330
+ readonly type: "object";
331
+ readonly additionalProperties: false;
332
+ readonly required: readonly ["scope"];
333
+ readonly properties: {
334
+ readonly scope: {
335
+ readonly const: "none";
336
+ };
337
+ };
338
+ };
339
+ readonly KeyScopeAll: {
340
+ readonly title: "KeyScopeAll";
341
+ readonly description: "Every key the entry's act scope reaches.";
342
+ readonly type: "object";
343
+ readonly additionalProperties: false;
344
+ readonly required: readonly ["scope"];
345
+ readonly properties: {
346
+ readonly scope: {
347
+ readonly const: "all";
348
+ };
349
+ };
350
+ };
351
+ readonly ApproveCapabilityScope: {
352
+ readonly title: "ApproveCapabilityScope";
353
+ readonly description: "An explicit statement of the capabilities a subject may approve. Exactly one of `ceiling` (the role's full approve ceiling), `none`, or `listed` with a NON-EMPTY list of CapabilityRef.";
354
+ readonly oneOf: readonly [{
355
+ readonly $ref: "#/$defs/CapabilityScopeCeiling";
356
+ }, {
357
+ readonly $ref: "#/$defs/CapabilityScopeNone";
358
+ }, {
359
+ readonly $ref: "#/$defs/ApproveCapabilityScopeListed";
360
+ }];
361
+ };
362
+ readonly ApproveCapabilityScopeListed: {
363
+ readonly title: "ApproveCapabilityScopeListed";
364
+ readonly description: "Exactly the listed capabilities, intersected with the role's approve ceiling where the maintainer's roles define one.";
365
+ readonly type: "object";
366
+ readonly additionalProperties: false;
367
+ readonly required: readonly ["scope", "grants"];
368
+ readonly properties: {
369
+ readonly scope: {
370
+ readonly const: "listed";
371
+ };
372
+ readonly grants: {
373
+ readonly type: "array";
374
+ readonly minItems: 1;
375
+ readonly items: {
376
+ readonly $ref: "#/$defs/CapabilityRef";
377
+ };
378
+ readonly description: "Non-empty list of approvable capabilities. An empty array is invalid.";
379
+ };
380
+ };
381
+ };
382
+ readonly CapabilityRef: {
383
+ readonly title: "CapabilityRef";
384
+ readonly description: "A capability, optionally qualified by a resource. Used where a capability is named but not granted — a role's ceiling, a role's approve ceiling, an entry's approvable capabilities. An unqualified reference covers every resource of the capability's kind.";
385
+ readonly type: "object";
386
+ readonly additionalProperties: false;
387
+ readonly required: readonly ["capability"];
388
+ readonly properties: {
389
+ readonly capability: {
390
+ readonly $ref: "#/$defs/Capability";
391
+ };
392
+ readonly resource: {
393
+ readonly $ref: "#/$defs/ResourceQualifier";
394
+ readonly description: "Optional qualifier. Absent covers every resource of the capability's kind.";
395
+ };
396
+ };
397
+ };
398
+ readonly ResourceQualifier: {
399
+ readonly title: "ResourceQualifier";
400
+ readonly description: "Opaque qualifier naming the part of the maintainer's resources a capability applies to (e.g. `git-ns:github.com/acme`, `git-repo:github.com/acme/r#4211`, `policy:join`). Its grammar and containment rule are the maintainer's: a qualified capability covers the named resource and the resources inside it. A qualifier MUST NOT be read as widening the entry's act scope.";
401
+ readonly type: "string";
402
+ readonly minLength: 1;
403
+ readonly maxLength: 512;
404
+ };
405
+ readonly Capability: {
406
+ readonly title: "Capability";
407
+ readonly description: "Opaque identifier of one administrative power in the maintainer's capability registry — lowercase dot-separated segments (e.g. `keys.sign`, `vtc.roles.assign`, `git.repo.manage`). A consumer MUST NOT treat a capability it does not recognise as granted.";
408
+ readonly type: "string";
409
+ readonly minLength: 1;
410
+ readonly maxLength: 128;
411
+ readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)*$";
412
+ };
413
+ readonly CapabilityScopeNone: {
414
+ readonly title: "CapabilityScopeNone";
415
+ readonly description: "No capabilities on this axis.";
416
+ readonly type: "object";
417
+ readonly additionalProperties: false;
418
+ readonly required: readonly ["scope"];
419
+ readonly properties: {
420
+ readonly scope: {
421
+ readonly const: "none";
422
+ };
423
+ };
424
+ };
425
+ readonly CapabilityScopeCeiling: {
426
+ readonly title: "CapabilityScopeCeiling";
427
+ readonly description: "The role's full ceiling on this axis, unnarrowed: what the role admits, the entry holds (or, for approvable capabilities, may approve). Stated, not implied — it is the explicit spelling of \"no narrowing\".";
428
+ readonly type: "object";
429
+ readonly additionalProperties: false;
430
+ readonly required: readonly ["scope"];
431
+ readonly properties: {
432
+ readonly scope: {
433
+ readonly const: "ceiling";
434
+ };
435
+ };
436
+ };
437
+ readonly CapabilityScope: {
438
+ readonly title: "CapabilityScope";
439
+ readonly description: "An explicit statement of the capabilities an entry holds. Exactly one of three shapes, discriminated by `scope`: `ceiling` (the role's full ceiling), `none`, or `listed` with a NON-EMPTY list of CapabilityGrant. The empty list is invalid, not a fourth shape.";
440
+ readonly oneOf: readonly [{
441
+ readonly $ref: "#/$defs/CapabilityScopeCeiling";
442
+ }, {
443
+ readonly $ref: "#/$defs/CapabilityScopeNone";
444
+ }, {
445
+ readonly $ref: "#/$defs/CapabilityScopeListed";
446
+ }];
447
+ };
448
+ readonly CapabilityScopeListed: {
449
+ readonly title: "CapabilityScopeListed";
450
+ readonly description: "Exactly the listed grants: (role ceiling ∩ non-additive grants) ∪ additive grants.";
451
+ readonly type: "object";
452
+ readonly additionalProperties: false;
453
+ readonly required: readonly ["scope", "grants"];
454
+ readonly properties: {
455
+ readonly scope: {
456
+ readonly const: "listed";
457
+ };
458
+ readonly grants: {
459
+ readonly type: "array";
460
+ readonly minItems: 1;
461
+ readonly items: {
462
+ readonly $ref: "#/$defs/CapabilityGrant";
463
+ };
464
+ readonly description: "Non-empty list of capability grants. An empty array is invalid (it is neither `ceiling` nor `none`).";
465
+ };
466
+ };
467
+ };
468
+ readonly CapabilityGrant: {
469
+ readonly title: "CapabilityGrant";
470
+ readonly description: "A capability held by an entry, optionally qualified by a resource, optionally marked additive. A qualified grant confers nothing without a live entry for the same subject, and is bounded as delegated authority is.";
471
+ readonly type: "object";
472
+ readonly additionalProperties: false;
473
+ readonly required: readonly ["capability"];
474
+ readonly properties: {
475
+ readonly capability: {
476
+ readonly $ref: "#/$defs/Capability";
477
+ };
478
+ readonly resource: {
479
+ readonly $ref: "#/$defs/ResourceQualifier";
480
+ readonly description: "Optional qualifier. Absent covers every resource of the capability's kind.";
481
+ };
482
+ readonly additive: {
483
+ readonly type: "boolean";
484
+ readonly description: "`true` declares an ADDITIVE grant: a capability no role implies, granted to this entry beside its role rather than through it, and therefore not intersected with the role's ceiling. Granting one requires unrestricted act authority (`act: {scope: all}`) of the granter, and an entry never acquires one by virtue of its role. Absent or `false` → an ordinary grant, intersected with the role's ceiling, and refused when written if it lies outside it. A consumer MUST refuse `additive: true` on a capability the role's ceiling already includes, so that the flag cannot be used to make an ordinary capability survive a later role change.";
485
+ };
486
+ };
487
+ };
488
+ readonly AuthorityScope: {
489
+ readonly title: "AuthorityScope";
490
+ readonly description: "An explicit authority scope — used for both the act scope and the approve scope of an entry. Exactly one of three shapes, discriminated by `scope`: `all`, `none`, or `contexts` with a NON-EMPTY list. The empty list is not a fourth shape: it is invalid, so a serializer that drops or empties the list produces a document that fails validation rather than one that silently means something else.";
491
+ readonly oneOf: readonly [{
492
+ readonly $ref: "#/$defs/AuthorityScopeAll";
493
+ }, {
494
+ readonly $ref: "#/$defs/AuthorityScopeNone";
495
+ }, {
496
+ readonly $ref: "#/$defs/AuthorityScopeContexts";
497
+ }];
498
+ };
499
+ readonly AuthorityScopeContexts: {
500
+ readonly title: "AuthorityScopeContexts";
501
+ readonly description: "The named contexts and, where the maintainer's contexts are hierarchical, every descendant of them — and nowhere else. `contexts` MUST carry at least one path.";
502
+ readonly type: "object";
503
+ readonly additionalProperties: false;
504
+ readonly required: readonly ["scope", "contexts"];
505
+ readonly properties: {
506
+ readonly scope: {
507
+ readonly const: "contexts";
508
+ };
509
+ readonly contexts: {
510
+ readonly type: "array";
511
+ readonly minItems: 1;
512
+ readonly uniqueItems: true;
513
+ readonly items: {
514
+ readonly $ref: "#/$defs/ContextPath";
515
+ };
516
+ readonly description: "Non-empty set of context paths. An empty array is invalid (it is neither `all` nor `none`).";
517
+ };
518
+ };
519
+ };
520
+ readonly ContextPath: {
521
+ readonly title: "ContextPath";
522
+ readonly description: "Opaque identifier of one of the maintainer's contexts, compared by the maintainer's own ancestry predicate. Its grammar is the maintainer's.";
523
+ readonly type: "string";
524
+ readonly minLength: 1;
525
+ readonly maxLength: 512;
526
+ };
527
+ readonly AuthorityScopeNone: {
528
+ readonly title: "AuthorityScopeNone";
529
+ readonly description: "No authority on this axis. Stated, not implied: `none` is how an entry says it may not act (a least-privilege approver) or may not approve.";
530
+ readonly type: "object";
531
+ readonly additionalProperties: false;
532
+ readonly required: readonly ["scope"];
533
+ readonly properties: {
534
+ readonly scope: {
535
+ readonly const: "none";
536
+ };
537
+ };
538
+ };
539
+ readonly AuthorityScopeAll: {
540
+ readonly title: "AuthorityScopeAll";
541
+ readonly description: "Unrestricted: every context the maintainer holds, present and future. On the act axis this is a super-administrator (or, at a maintainer without contexts, an entry whose authority is not narrowed by location).";
542
+ readonly type: "object";
543
+ readonly additionalProperties: false;
544
+ readonly required: readonly ["scope"];
545
+ readonly properties: {
546
+ readonly scope: {
547
+ readonly const: "all";
548
+ };
549
+ };
550
+ };
551
+ };
552
+ };
553
+ /** As {@link PAYLOAD_SCHEMA}, for the success-response variant. */
554
+ export declare const RESPONSE_PAYLOAD_SCHEMA: {
555
+ readonly $schema: "https://json-schema.org/draft/2020-12/schema";
556
+ readonly $ref: "#/$defs/Response";
557
+ readonly $defs: {
558
+ readonly Response: {
559
+ readonly $anchor: "response";
560
+ readonly title: "VTC Members Role Set — response payload";
561
+ readonly description: "Success response to vtc/members/role/set/0.1: the subject's community role as it now stands, the access-control entry that holds it, and the role credential re-issued for it. Type https://trusttasks.org/spec/vtc/members/role/set/0.1#response — carried directly, or on the request's threadId when a parked move executes after its approval.";
562
+ readonly type: "object";
563
+ readonly additionalProperties: false;
564
+ readonly required: readonly ["subject", "role", "previousRole", "changed", "entry"];
565
+ readonly properties: {
566
+ readonly subject: {
567
+ readonly type: "string";
568
+ readonly pattern: "^did:";
569
+ readonly maxLength: 2048;
570
+ readonly description: "The DID whose community role was set.";
571
+ };
572
+ readonly role: {
573
+ readonly type: "string";
574
+ readonly minLength: 1;
575
+ readonly maxLength: 128;
576
+ readonly description: "The community role the subject now holds. Equals the request's `toRole`.";
577
+ };
578
+ readonly previousRole: {
579
+ readonly type: "string";
580
+ readonly minLength: 1;
581
+ readonly maxLength: 128;
582
+ readonly description: "The community role the subject held before. Equals the request's `fromRole`.";
583
+ };
584
+ readonly changed: {
585
+ readonly type: "boolean";
586
+ readonly description: "False when `fromRole` equalled `toRole`: the subject already held the role, nothing was written and no credential was issued.";
587
+ };
588
+ readonly entry: {
589
+ readonly $ref: "#/$defs/AclEntry";
590
+ readonly description: "The access-control entry as it now stands, every authority axis explicit, so the requester can see what administrative authority the move did or did not carry.";
591
+ };
592
+ readonly roleVac: {
593
+ readonly type: "object";
594
+ readonly description: "The role credential issued at the new role: a Verifiable Authority Credential issued by the community whose `credentialSubject.authority` is `{ scope: <community DID>, actions: [\"role:<name>\"] }`, the shape vtc/join-requests/decide returns. Present exactly when the subject has a member record and `changed` is true; a subject holding an entry with no member record has no role credential to re-issue.";
595
+ };
596
+ readonly approval: {
597
+ readonly $ref: "#/$defs/Approval";
598
+ readonly description: "How the move came to execute: `policyAllowed` at once, `approved` after a parked move was approved by other administrators, or `waived` by the community's single-administrator mode on the requester's own bound re-authentication. Absent when `changed` is false.";
599
+ };
600
+ readonly ext: {
601
+ readonly $ref: "#/$defs/Ext";
602
+ readonly description: "Ecosystem-defined extension members per SPEC §4.5.1.";
603
+ };
604
+ };
605
+ };
606
+ readonly Ext: {
607
+ readonly title: "Ext";
608
+ readonly description: "Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.";
609
+ readonly type: "object";
610
+ readonly minProperties: 1;
611
+ readonly additionalProperties: true;
612
+ readonly propertyNames: {
613
+ readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$";
614
+ };
615
+ };
616
+ readonly Approval: {
617
+ readonly title: "Approval";
618
+ readonly type: "string";
619
+ readonly enum: readonly ["policyAllowed", "approved", "waived"];
620
+ readonly description: "How the admission came to execute. `policyAllowed`: the community's policy admitted it at once. `approved`: the policy referred it, the community parked it, and another administrator approved it. `waived`: the policy referred it, and the community's single-administrator mode waived the approval on the requester's own re-authentication bound to the operation.";
621
+ };
622
+ readonly AclEntry: {
623
+ readonly title: "AclEntry";
624
+ readonly description: "One access-control entry: who the grant is for (`subject`), the ceiling it is held under (`role`), where the subject may act (`act`) and approve (`approve`), and which capabilities it may exercise (`capabilities`) and approve (`approveCapabilities`).\n\nThe act axis and the approve axis are independent and a consumer MUST resolve them separately: `act` + `capabilities` (+ `keys`) answer \"may this subject do X\"; `approve` + `approveCapabilities` answer \"may this subject ratify someone else doing X\". Neither implies the other. An entry with `act: {scope: none}` and an approve scope other than none is a least-privilege approver — able to satisfy an approval and unable to initiate any change.";
625
+ readonly type: "object";
626
+ readonly additionalProperties: false;
627
+ readonly required: readonly ["subject", "role", "act", "keys", "capabilities"];
628
+ readonly properties: {
629
+ readonly subject: {
630
+ readonly type: "string";
631
+ readonly minLength: 1;
632
+ readonly description: "VID of the party in the ACL. Compared by exact string equality (SPEC.md §4.8); producers SHOULD emit canonical form.";
633
+ };
634
+ readonly role: {
635
+ readonly type: "string";
636
+ readonly minLength: 1;
637
+ readonly description: "Opaque role identifier interpreted by the ACL maintainer. A role is a CEILING, never a grant: it bounds the capabilities the entry may hold and never adds to them. A consumer that does not recognise the role MUST treat the entry as conferring no authority and MUST NOT fall back to a default role. Act scope and role are independent members; a consumer MUST NOT compute either from the other.";
638
+ };
639
+ readonly act: {
640
+ readonly $ref: "#/$defs/AuthorityScope";
641
+ readonly description: "REQUIRED explicit act scope: where this subject may make a change itself. Exactly one of `{\"scope\": \"all\"}` (unrestricted — every context the maintainer has), `{\"scope\": \"none\"}` (may act nowhere), or `{\"scope\": \"contexts\", \"contexts\": [...]}` with at least one context path (the named contexts and, where the maintainer's contexts are hierarchical, their descendants). There is no default and no implicit form: an entry without `act`, or with an empty `contexts` list, is malformed and MUST be refused, never read as `all` and never read as `none`. A maintainer that has no contexts (for example a community node that narrows authority with resource qualifiers instead) states `all` or `none` only. Replaces 0.1's `scopes`.";
642
+ };
643
+ readonly approve: {
644
+ readonly $ref: "#/$defs/AuthorityScope";
645
+ readonly description: "OPTIONAL approve scope: where this subject may ratify a change made by someone else (a step-up ratification, a consent decision, an N-of-M approval). Same three shapes as `act`, resolved independently of it. ABSENT MEANS NONE — the subject may ratify nothing — so a consumer that has not implemented the member confers less than the producer intended, never more. A producer SHOULD state `{\"scope\": \"none\"}` explicitly rather than rely on omission. A subject MUST NOT confer approve authority wider than the approve authority it holds itself (see acl/grant `approveWiderThanGranter`). Replaces 0.1's `approve {all, scopes}`.";
646
+ };
647
+ readonly capabilities: {
648
+ readonly $ref: "#/$defs/CapabilityScope";
649
+ readonly description: "REQUIRED explicit capability scope: which capabilities this entry holds. Exactly one of `{\"scope\": \"ceiling\"}` (the role's full ceiling, unnarrowed), `{\"scope\": \"none\"}` (no capabilities), or `{\"scope\": \"listed\", \"grants\": [...]}` with at least one CapabilityGrant. For `listed`, the EFFECTIVE set is (the role's ceiling ∩ the non-additive grants) ∪ the additive grants; it can only narrow the ceiling, except through an explicit additive grant, which only an unrestricted granter may make. There is no implicit form: an entry without `capabilities`, or with an empty `grants` list, is malformed and MUST be refused. A non-additive grant outside the role's ceiling is refused when written, never accepted with the capability silently dropped; a capability the consumer does not recognise is never treated as granted. Producers SHOULD NOT list the same (capability, resource) pair twice; a consumer MAY refuse a list that does.";
650
+ };
651
+ readonly approveCapabilities: {
652
+ readonly $ref: "#/$defs/ApproveCapabilityScope";
653
+ readonly description: "OPTIONAL explicit approvable-capability scope: which capabilities this subject may APPROVE an action needing — independent of what it may do itself, so an approver can ratify a capability it does not hold (the least-privilege approver). One of `{\"scope\": \"ceiling\"}` (the role's full approve ceiling; at a maintainer whose roles define no capability-level approve ceiling, any action within `approve`), `{\"scope\": \"none\"}`, or `{\"scope\": \"listed\", \"grants\": [...]}` with at least one CapabilityRef (intersected with the role's approve ceiling where one is defined). ABSENT MEANS NONE: the subject may approve no capability, because absence derives no authority. Bounded by `approve`: where `approve` is absent or `{\"scope\": \"none\"}` this member confers nothing whatever it states. A subject MUST NOT confer approvable capabilities it cannot itself approve.";
654
+ };
655
+ readonly delegatedBy: {
656
+ readonly type: "string";
657
+ readonly minLength: 1;
658
+ readonly description: "VID of the granter whose authority this entry was delegated from and is bounded by. The entry MUST NOT hold authority the granter did not hold when it was written, and MUST NOT retain authority the granter has since lost, so a maintainer re-evaluates it when the granter's own entry narrows or is removed. Distinct from `createdBy`, which records who wrote the entry: the two differ where an entry is written on a granter's behalf (for example after an N-of-M approval, or by an offline operator). Set by the maintainer from the granter it authorized; absent on an entry that derives from no granter's authority (the first administrator, an operator-written recovery entry).";
659
+ };
660
+ readonly keys: {
661
+ readonly $ref: "#/$defs/KeyScope";
662
+ readonly description: "REQUIRED explicit key scope: which keys this subject may invoke the maintainer's signing oracle on. Exactly one of `{\"scope\": \"all\"}` (every key the entry's act scope reaches), `{\"scope\": \"none\"}` (no keys), or `{\"scope\": \"listed\", \"keys\": [...]}` with at least one key identifier. INTERSECTS WITH `act` — it can only narrow, never widen: a listed key that lies outside the entry's act scope remains unreachable, exactly as if it were not listed. There is no implicit form: an entry without `keys`, or with an empty `keys` list, is malformed and MUST be refused. A maintainer that operates no signing oracle states `{\"scope\": \"none\"}`. Replaces 0.1's `allowedKeys`, whose absence meant every key.";
663
+ };
664
+ readonly label: {
665
+ readonly type: "string";
666
+ readonly maxLength: 256;
667
+ readonly description: "Optional human-readable label. Confers nothing.";
668
+ };
669
+ readonly createdAt: {
670
+ readonly type: "string";
671
+ readonly format: "date-time";
672
+ };
673
+ readonly createdBy: {
674
+ readonly type: "string";
675
+ readonly description: "VID of the party that originally wrote this entry.";
676
+ };
677
+ readonly updatedAt: {
678
+ readonly type: "string";
679
+ readonly format: "date-time";
680
+ };
681
+ readonly updatedBy: {
682
+ readonly type: "string";
683
+ readonly description: "VID of the party that last modified this entry.";
684
+ };
685
+ readonly expiresAt: {
686
+ readonly type: "string";
687
+ readonly format: "date-time";
688
+ readonly description: "Optional time after which the entry confers no authority. Evaluated at every authorization decision, not only when a session is established.";
689
+ };
690
+ readonly stepUp: {
691
+ readonly type: "object";
692
+ readonly additionalProperties: false;
693
+ readonly description: "Per-entry authentication step-up configuration, consumed by the ACL maintainer when it gates an operation behind a step-up (see auth/step-up/policy). ADDITIVE-ONLY: a per-entry setting MAY raise the assurance required of this subject above the maintainer's system-wide floor, but MUST NOT lower it. The maintainer resolves the effective requirement as the strictest of (system floor, this entry). Carried forward from 0.1 unchanged.";
694
+ readonly properties: {
695
+ readonly approver: {
696
+ readonly type: "string";
697
+ readonly description: "VID authorized to ratify step-up for this subject — the `recipient` the maintainer addresses an auth/step-up/approve-request to (e.g. the holder's mobile authenticator or browser companion). Absent → the subject is its own approver (mode `self`) when it holds a usable authenticator; if neither an `approver` nor a self authenticator exists, no step-up method is available for this subject and the maintainer's fail-closed rule applies.";
698
+ };
699
+ readonly require: {
700
+ readonly type: "string";
701
+ readonly enum: readonly ["self", "delegated"];
702
+ readonly description: "Minimum step-up mode this subject MUST satisfy for gated operations, raising the system floor. `self` = the subject re-authenticates its own session; `delegated` = a separate `approver` MUST ratify. Omitted → the system floor applies unchanged. A value weaker than the resolved floor is ignored (additive-only).";
703
+ };
704
+ };
705
+ };
706
+ readonly ext: {
707
+ readonly $ref: "#/$defs/Ext";
708
+ readonly description: "Ecosystem-defined extension members per SPEC.md §4.5.1. Reverse-DNS-namespaced; consumers MUST ignore unrecognized namespaces. An extension member MUST NOT be interpreted as conferring authority.";
709
+ };
710
+ };
711
+ };
712
+ readonly KeyScope: {
713
+ readonly title: "KeyScope";
714
+ readonly description: "An explicit key scope. Exactly one of three shapes, discriminated by `scope`: `all`, `none`, or `listed` with a NON-EMPTY list of key identifiers. The empty list is invalid, not a fourth shape.";
715
+ readonly oneOf: readonly [{
716
+ readonly $ref: "#/$defs/KeyScopeAll";
717
+ }, {
718
+ readonly $ref: "#/$defs/KeyScopeNone";
719
+ }, {
720
+ readonly $ref: "#/$defs/KeyScopeListed";
721
+ }];
722
+ };
723
+ readonly KeyScopeListed: {
724
+ readonly title: "KeyScopeListed";
725
+ readonly description: "Exactly the listed keys, intersected with the entry's act scope.";
726
+ readonly type: "object";
727
+ readonly additionalProperties: false;
728
+ readonly required: readonly ["scope", "keys"];
729
+ readonly properties: {
730
+ readonly scope: {
731
+ readonly const: "listed";
732
+ };
733
+ readonly keys: {
734
+ readonly type: "array";
735
+ readonly minItems: 1;
736
+ readonly uniqueItems: true;
737
+ readonly items: {
738
+ readonly type: "string";
739
+ readonly minLength: 1;
740
+ readonly maxLength: 512;
741
+ };
742
+ readonly description: "Non-empty set of key identifiers. An empty array is invalid (it is neither `all` nor `none`).";
743
+ };
744
+ };
745
+ };
746
+ readonly KeyScopeNone: {
747
+ readonly title: "KeyScopeNone";
748
+ readonly description: "No keys.";
749
+ readonly type: "object";
750
+ readonly additionalProperties: false;
751
+ readonly required: readonly ["scope"];
752
+ readonly properties: {
753
+ readonly scope: {
754
+ readonly const: "none";
755
+ };
756
+ };
757
+ };
758
+ readonly KeyScopeAll: {
759
+ readonly title: "KeyScopeAll";
760
+ readonly description: "Every key the entry's act scope reaches.";
761
+ readonly type: "object";
762
+ readonly additionalProperties: false;
763
+ readonly required: readonly ["scope"];
764
+ readonly properties: {
765
+ readonly scope: {
766
+ readonly const: "all";
767
+ };
768
+ };
769
+ };
770
+ readonly ApproveCapabilityScope: {
771
+ readonly title: "ApproveCapabilityScope";
772
+ readonly description: "An explicit statement of the capabilities a subject may approve. Exactly one of `ceiling` (the role's full approve ceiling), `none`, or `listed` with a NON-EMPTY list of CapabilityRef.";
773
+ readonly oneOf: readonly [{
774
+ readonly $ref: "#/$defs/CapabilityScopeCeiling";
775
+ }, {
776
+ readonly $ref: "#/$defs/CapabilityScopeNone";
777
+ }, {
778
+ readonly $ref: "#/$defs/ApproveCapabilityScopeListed";
779
+ }];
780
+ };
781
+ readonly ApproveCapabilityScopeListed: {
782
+ readonly title: "ApproveCapabilityScopeListed";
783
+ readonly description: "Exactly the listed capabilities, intersected with the role's approve ceiling where the maintainer's roles define one.";
784
+ readonly type: "object";
785
+ readonly additionalProperties: false;
786
+ readonly required: readonly ["scope", "grants"];
787
+ readonly properties: {
788
+ readonly scope: {
789
+ readonly const: "listed";
790
+ };
791
+ readonly grants: {
792
+ readonly type: "array";
793
+ readonly minItems: 1;
794
+ readonly items: {
795
+ readonly $ref: "#/$defs/CapabilityRef";
796
+ };
797
+ readonly description: "Non-empty list of approvable capabilities. An empty array is invalid.";
798
+ };
799
+ };
800
+ };
801
+ readonly CapabilityRef: {
802
+ readonly title: "CapabilityRef";
803
+ readonly description: "A capability, optionally qualified by a resource. Used where a capability is named but not granted — a role's ceiling, a role's approve ceiling, an entry's approvable capabilities. An unqualified reference covers every resource of the capability's kind.";
804
+ readonly type: "object";
805
+ readonly additionalProperties: false;
806
+ readonly required: readonly ["capability"];
807
+ readonly properties: {
808
+ readonly capability: {
809
+ readonly $ref: "#/$defs/Capability";
810
+ };
811
+ readonly resource: {
812
+ readonly $ref: "#/$defs/ResourceQualifier";
813
+ readonly description: "Optional qualifier. Absent covers every resource of the capability's kind.";
814
+ };
815
+ };
816
+ };
817
+ readonly ResourceQualifier: {
818
+ readonly title: "ResourceQualifier";
819
+ readonly description: "Opaque qualifier naming the part of the maintainer's resources a capability applies to (e.g. `git-ns:github.com/acme`, `git-repo:github.com/acme/r#4211`, `policy:join`). Its grammar and containment rule are the maintainer's: a qualified capability covers the named resource and the resources inside it. A qualifier MUST NOT be read as widening the entry's act scope.";
820
+ readonly type: "string";
821
+ readonly minLength: 1;
822
+ readonly maxLength: 512;
823
+ };
824
+ readonly Capability: {
825
+ readonly title: "Capability";
826
+ readonly description: "Opaque identifier of one administrative power in the maintainer's capability registry — lowercase dot-separated segments (e.g. `keys.sign`, `vtc.roles.assign`, `git.repo.manage`). A consumer MUST NOT treat a capability it does not recognise as granted.";
827
+ readonly type: "string";
828
+ readonly minLength: 1;
829
+ readonly maxLength: 128;
830
+ readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)*$";
831
+ };
832
+ readonly CapabilityScopeNone: {
833
+ readonly title: "CapabilityScopeNone";
834
+ readonly description: "No capabilities on this axis.";
835
+ readonly type: "object";
836
+ readonly additionalProperties: false;
837
+ readonly required: readonly ["scope"];
838
+ readonly properties: {
839
+ readonly scope: {
840
+ readonly const: "none";
841
+ };
842
+ };
843
+ };
844
+ readonly CapabilityScopeCeiling: {
845
+ readonly title: "CapabilityScopeCeiling";
846
+ readonly description: "The role's full ceiling on this axis, unnarrowed: what the role admits, the entry holds (or, for approvable capabilities, may approve). Stated, not implied — it is the explicit spelling of \"no narrowing\".";
847
+ readonly type: "object";
848
+ readonly additionalProperties: false;
849
+ readonly required: readonly ["scope"];
850
+ readonly properties: {
851
+ readonly scope: {
852
+ readonly const: "ceiling";
853
+ };
854
+ };
855
+ };
856
+ readonly CapabilityScope: {
857
+ readonly title: "CapabilityScope";
858
+ readonly description: "An explicit statement of the capabilities an entry holds. Exactly one of three shapes, discriminated by `scope`: `ceiling` (the role's full ceiling), `none`, or `listed` with a NON-EMPTY list of CapabilityGrant. The empty list is invalid, not a fourth shape.";
859
+ readonly oneOf: readonly [{
860
+ readonly $ref: "#/$defs/CapabilityScopeCeiling";
861
+ }, {
862
+ readonly $ref: "#/$defs/CapabilityScopeNone";
863
+ }, {
864
+ readonly $ref: "#/$defs/CapabilityScopeListed";
865
+ }];
866
+ };
867
+ readonly CapabilityScopeListed: {
868
+ readonly title: "CapabilityScopeListed";
869
+ readonly description: "Exactly the listed grants: (role ceiling ∩ non-additive grants) ∪ additive grants.";
870
+ readonly type: "object";
871
+ readonly additionalProperties: false;
872
+ readonly required: readonly ["scope", "grants"];
873
+ readonly properties: {
874
+ readonly scope: {
875
+ readonly const: "listed";
876
+ };
877
+ readonly grants: {
878
+ readonly type: "array";
879
+ readonly minItems: 1;
880
+ readonly items: {
881
+ readonly $ref: "#/$defs/CapabilityGrant";
882
+ };
883
+ readonly description: "Non-empty list of capability grants. An empty array is invalid (it is neither `ceiling` nor `none`).";
884
+ };
885
+ };
886
+ };
887
+ readonly CapabilityGrant: {
888
+ readonly title: "CapabilityGrant";
889
+ readonly description: "A capability held by an entry, optionally qualified by a resource, optionally marked additive. A qualified grant confers nothing without a live entry for the same subject, and is bounded as delegated authority is.";
890
+ readonly type: "object";
891
+ readonly additionalProperties: false;
892
+ readonly required: readonly ["capability"];
893
+ readonly properties: {
894
+ readonly capability: {
895
+ readonly $ref: "#/$defs/Capability";
896
+ };
897
+ readonly resource: {
898
+ readonly $ref: "#/$defs/ResourceQualifier";
899
+ readonly description: "Optional qualifier. Absent covers every resource of the capability's kind.";
900
+ };
901
+ readonly additive: {
902
+ readonly type: "boolean";
903
+ readonly description: "`true` declares an ADDITIVE grant: a capability no role implies, granted to this entry beside its role rather than through it, and therefore not intersected with the role's ceiling. Granting one requires unrestricted act authority (`act: {scope: all}`) of the granter, and an entry never acquires one by virtue of its role. Absent or `false` → an ordinary grant, intersected with the role's ceiling, and refused when written if it lies outside it. A consumer MUST refuse `additive: true` on a capability the role's ceiling already includes, so that the flag cannot be used to make an ordinary capability survive a later role change.";
904
+ };
905
+ };
906
+ };
907
+ readonly AuthorityScope: {
908
+ readonly title: "AuthorityScope";
909
+ readonly description: "An explicit authority scope — used for both the act scope and the approve scope of an entry. Exactly one of three shapes, discriminated by `scope`: `all`, `none`, or `contexts` with a NON-EMPTY list. The empty list is not a fourth shape: it is invalid, so a serializer that drops or empties the list produces a document that fails validation rather than one that silently means something else.";
910
+ readonly oneOf: readonly [{
911
+ readonly $ref: "#/$defs/AuthorityScopeAll";
912
+ }, {
913
+ readonly $ref: "#/$defs/AuthorityScopeNone";
914
+ }, {
915
+ readonly $ref: "#/$defs/AuthorityScopeContexts";
916
+ }];
917
+ };
918
+ readonly AuthorityScopeContexts: {
919
+ readonly title: "AuthorityScopeContexts";
920
+ readonly description: "The named contexts and, where the maintainer's contexts are hierarchical, every descendant of them — and nowhere else. `contexts` MUST carry at least one path.";
921
+ readonly type: "object";
922
+ readonly additionalProperties: false;
923
+ readonly required: readonly ["scope", "contexts"];
924
+ readonly properties: {
925
+ readonly scope: {
926
+ readonly const: "contexts";
927
+ };
928
+ readonly contexts: {
929
+ readonly type: "array";
930
+ readonly minItems: 1;
931
+ readonly uniqueItems: true;
932
+ readonly items: {
933
+ readonly $ref: "#/$defs/ContextPath";
934
+ };
935
+ readonly description: "Non-empty set of context paths. An empty array is invalid (it is neither `all` nor `none`).";
936
+ };
937
+ };
938
+ };
939
+ readonly ContextPath: {
940
+ readonly title: "ContextPath";
941
+ readonly description: "Opaque identifier of one of the maintainer's contexts, compared by the maintainer's own ancestry predicate. Its grammar is the maintainer's.";
942
+ readonly type: "string";
943
+ readonly minLength: 1;
944
+ readonly maxLength: 512;
945
+ };
946
+ readonly AuthorityScopeNone: {
947
+ readonly title: "AuthorityScopeNone";
948
+ readonly description: "No authority on this axis. Stated, not implied: `none` is how an entry says it may not act (a least-privilege approver) or may not approve.";
949
+ readonly type: "object";
950
+ readonly additionalProperties: false;
951
+ readonly required: readonly ["scope"];
952
+ readonly properties: {
953
+ readonly scope: {
954
+ readonly const: "none";
955
+ };
956
+ };
957
+ };
958
+ readonly AuthorityScopeAll: {
959
+ readonly title: "AuthorityScopeAll";
960
+ readonly description: "Unrestricted: every context the maintainer holds, present and future. On the act axis this is a super-administrator (or, at a maintainer without contexts, an entry whose authority is not narrowed by location).";
961
+ readonly type: "object";
962
+ readonly additionalProperties: false;
963
+ readonly required: readonly ["scope"];
964
+ readonly properties: {
965
+ readonly scope: {
966
+ readonly const: "all";
967
+ };
968
+ };
969
+ };
970
+ };
971
+ };
972
+ /**
973
+ * SPEC.md §7.2 policy for the request variant, from this specification's
974
+ * front matter. Pass to `consumeInbound` — items 5b, 7 and 8 are
975
+ * per-specification and cannot be derived from the document alone, and
976
+ * item 2 needs the schema this carries.
977
+ */
978
+ export declare const SPEC: {
979
+ readonly typeUri: "https://trusttasks.org/spec/vtc/members/role/set/0.1";
980
+ readonly isBearer: false;
981
+ readonly isProofRequired: true;
982
+ readonly isRecipientRequired: true;
983
+ readonly isIssuedAtRequired: true;
984
+ readonly payloadSchema: {
985
+ readonly $schema: "https://json-schema.org/draft/2020-12/schema";
986
+ readonly $id: "https://trusttasks.org/spec/vtc/members/role/set/0.1";
987
+ readonly title: "VTC Members Role Set — payload";
988
+ readonly description: "An administrator moves a subject's community role from one role to another, with a compare-and-swap on the current role. The administrative authority the entry holds follows the move only where it is the authority the current community role implies. The outer document members are owned by the framework — SPEC §6.3.";
989
+ readonly type: "object";
990
+ readonly additionalProperties: false;
991
+ readonly required: readonly ["subject", "fromRole", "toRole"];
992
+ readonly properties: {
993
+ readonly subject: {
994
+ readonly type: "string";
995
+ readonly pattern: "^did:";
996
+ readonly maxLength: 2048;
997
+ readonly description: "The DID whose community role moves. It holds an access-control entry at the community, of any community role but `application`.";
998
+ };
999
+ readonly fromRole: {
1000
+ readonly type: "string";
1001
+ readonly minLength: 1;
1002
+ readonly maxLength: 128;
1003
+ readonly description: "The subject's current community role, in the community's wire form (`member`, `moderator`, `issuer`, `admin`, `custom:<name>`). The community refuses the move with `stateMismatch` when it differs from the role the entry holds.";
1004
+ };
1005
+ readonly toRole: {
1006
+ readonly type: "string";
1007
+ readonly minLength: 1;
1008
+ readonly maxLength: 128;
1009
+ readonly description: "The community role to move the subject to, in the same wire form. Never `application`, which marks a non-member rather than a role a member holds.";
1010
+ };
1011
+ readonly reason: {
1012
+ readonly type: "string";
1013
+ readonly maxLength: 1024;
1014
+ readonly description: "Why, for the community's audit trail and for the administrators asked to approve the move if it is referred. Never published beyond the community.";
1015
+ };
1016
+ readonly ext: {
1017
+ readonly $ref: "#/$defs/Ext";
1018
+ readonly description: "Ecosystem-defined extension members per SPEC §4.5.1.";
1019
+ };
1020
+ };
1021
+ readonly $defs: {
1022
+ readonly Response: {
1023
+ readonly $anchor: "response";
1024
+ readonly title: "VTC Members Role Set — response payload";
1025
+ readonly description: "Success response to vtc/members/role/set/0.1: the subject's community role as it now stands, the access-control entry that holds it, and the role credential re-issued for it. Type https://trusttasks.org/spec/vtc/members/role/set/0.1#response — carried directly, or on the request's threadId when a parked move executes after its approval.";
1026
+ readonly type: "object";
1027
+ readonly additionalProperties: false;
1028
+ readonly required: readonly ["subject", "role", "previousRole", "changed", "entry"];
1029
+ readonly properties: {
1030
+ readonly subject: {
1031
+ readonly type: "string";
1032
+ readonly pattern: "^did:";
1033
+ readonly maxLength: 2048;
1034
+ readonly description: "The DID whose community role was set.";
1035
+ };
1036
+ readonly role: {
1037
+ readonly type: "string";
1038
+ readonly minLength: 1;
1039
+ readonly maxLength: 128;
1040
+ readonly description: "The community role the subject now holds. Equals the request's `toRole`.";
1041
+ };
1042
+ readonly previousRole: {
1043
+ readonly type: "string";
1044
+ readonly minLength: 1;
1045
+ readonly maxLength: 128;
1046
+ readonly description: "The community role the subject held before. Equals the request's `fromRole`.";
1047
+ };
1048
+ readonly changed: {
1049
+ readonly type: "boolean";
1050
+ readonly description: "False when `fromRole` equalled `toRole`: the subject already held the role, nothing was written and no credential was issued.";
1051
+ };
1052
+ readonly entry: {
1053
+ readonly $ref: "#/$defs/AclEntry";
1054
+ readonly description: "The access-control entry as it now stands, every authority axis explicit, so the requester can see what administrative authority the move did or did not carry.";
1055
+ };
1056
+ readonly roleVac: {
1057
+ readonly type: "object";
1058
+ readonly description: "The role credential issued at the new role: a Verifiable Authority Credential issued by the community whose `credentialSubject.authority` is `{ scope: <community DID>, actions: [\"role:<name>\"] }`, the shape vtc/join-requests/decide returns. Present exactly when the subject has a member record and `changed` is true; a subject holding an entry with no member record has no role credential to re-issue.";
1059
+ };
1060
+ readonly approval: {
1061
+ readonly $ref: "#/$defs/Approval";
1062
+ readonly description: "How the move came to execute: `policyAllowed` at once, `approved` after a parked move was approved by other administrators, or `waived` by the community's single-administrator mode on the requester's own bound re-authentication. Absent when `changed` is false.";
1063
+ };
1064
+ readonly ext: {
1065
+ readonly $ref: "#/$defs/Ext";
1066
+ readonly description: "Ecosystem-defined extension members per SPEC §4.5.1.";
1067
+ };
1068
+ };
1069
+ };
1070
+ readonly Ext: {
1071
+ readonly title: "Ext";
1072
+ readonly description: "Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.";
1073
+ readonly type: "object";
1074
+ readonly minProperties: 1;
1075
+ readonly additionalProperties: true;
1076
+ readonly propertyNames: {
1077
+ readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$";
1078
+ };
1079
+ };
1080
+ readonly Approval: {
1081
+ readonly title: "Approval";
1082
+ readonly type: "string";
1083
+ readonly enum: readonly ["policyAllowed", "approved", "waived"];
1084
+ readonly description: "How the admission came to execute. `policyAllowed`: the community's policy admitted it at once. `approved`: the policy referred it, the community parked it, and another administrator approved it. `waived`: the policy referred it, and the community's single-administrator mode waived the approval on the requester's own re-authentication bound to the operation.";
1085
+ };
1086
+ readonly AclEntry: {
1087
+ readonly title: "AclEntry";
1088
+ readonly description: "One access-control entry: who the grant is for (`subject`), the ceiling it is held under (`role`), where the subject may act (`act`) and approve (`approve`), and which capabilities it may exercise (`capabilities`) and approve (`approveCapabilities`).\n\nThe act axis and the approve axis are independent and a consumer MUST resolve them separately: `act` + `capabilities` (+ `keys`) answer \"may this subject do X\"; `approve` + `approveCapabilities` answer \"may this subject ratify someone else doing X\". Neither implies the other. An entry with `act: {scope: none}` and an approve scope other than none is a least-privilege approver — able to satisfy an approval and unable to initiate any change.";
1089
+ readonly type: "object";
1090
+ readonly additionalProperties: false;
1091
+ readonly required: readonly ["subject", "role", "act", "keys", "capabilities"];
1092
+ readonly properties: {
1093
+ readonly subject: {
1094
+ readonly type: "string";
1095
+ readonly minLength: 1;
1096
+ readonly description: "VID of the party in the ACL. Compared by exact string equality (SPEC.md §4.8); producers SHOULD emit canonical form.";
1097
+ };
1098
+ readonly role: {
1099
+ readonly type: "string";
1100
+ readonly minLength: 1;
1101
+ readonly description: "Opaque role identifier interpreted by the ACL maintainer. A role is a CEILING, never a grant: it bounds the capabilities the entry may hold and never adds to them. A consumer that does not recognise the role MUST treat the entry as conferring no authority and MUST NOT fall back to a default role. Act scope and role are independent members; a consumer MUST NOT compute either from the other.";
1102
+ };
1103
+ readonly act: {
1104
+ readonly $ref: "#/$defs/AuthorityScope";
1105
+ readonly description: "REQUIRED explicit act scope: where this subject may make a change itself. Exactly one of `{\"scope\": \"all\"}` (unrestricted — every context the maintainer has), `{\"scope\": \"none\"}` (may act nowhere), or `{\"scope\": \"contexts\", \"contexts\": [...]}` with at least one context path (the named contexts and, where the maintainer's contexts are hierarchical, their descendants). There is no default and no implicit form: an entry without `act`, or with an empty `contexts` list, is malformed and MUST be refused, never read as `all` and never read as `none`. A maintainer that has no contexts (for example a community node that narrows authority with resource qualifiers instead) states `all` or `none` only. Replaces 0.1's `scopes`.";
1106
+ };
1107
+ readonly approve: {
1108
+ readonly $ref: "#/$defs/AuthorityScope";
1109
+ readonly description: "OPTIONAL approve scope: where this subject may ratify a change made by someone else (a step-up ratification, a consent decision, an N-of-M approval). Same three shapes as `act`, resolved independently of it. ABSENT MEANS NONE — the subject may ratify nothing — so a consumer that has not implemented the member confers less than the producer intended, never more. A producer SHOULD state `{\"scope\": \"none\"}` explicitly rather than rely on omission. A subject MUST NOT confer approve authority wider than the approve authority it holds itself (see acl/grant `approveWiderThanGranter`). Replaces 0.1's `approve {all, scopes}`.";
1110
+ };
1111
+ readonly capabilities: {
1112
+ readonly $ref: "#/$defs/CapabilityScope";
1113
+ readonly description: "REQUIRED explicit capability scope: which capabilities this entry holds. Exactly one of `{\"scope\": \"ceiling\"}` (the role's full ceiling, unnarrowed), `{\"scope\": \"none\"}` (no capabilities), or `{\"scope\": \"listed\", \"grants\": [...]}` with at least one CapabilityGrant. For `listed`, the EFFECTIVE set is (the role's ceiling ∩ the non-additive grants) ∪ the additive grants; it can only narrow the ceiling, except through an explicit additive grant, which only an unrestricted granter may make. There is no implicit form: an entry without `capabilities`, or with an empty `grants` list, is malformed and MUST be refused. A non-additive grant outside the role's ceiling is refused when written, never accepted with the capability silently dropped; a capability the consumer does not recognise is never treated as granted. Producers SHOULD NOT list the same (capability, resource) pair twice; a consumer MAY refuse a list that does.";
1114
+ };
1115
+ readonly approveCapabilities: {
1116
+ readonly $ref: "#/$defs/ApproveCapabilityScope";
1117
+ readonly description: "OPTIONAL explicit approvable-capability scope: which capabilities this subject may APPROVE an action needing — independent of what it may do itself, so an approver can ratify a capability it does not hold (the least-privilege approver). One of `{\"scope\": \"ceiling\"}` (the role's full approve ceiling; at a maintainer whose roles define no capability-level approve ceiling, any action within `approve`), `{\"scope\": \"none\"}`, or `{\"scope\": \"listed\", \"grants\": [...]}` with at least one CapabilityRef (intersected with the role's approve ceiling where one is defined). ABSENT MEANS NONE: the subject may approve no capability, because absence derives no authority. Bounded by `approve`: where `approve` is absent or `{\"scope\": \"none\"}` this member confers nothing whatever it states. A subject MUST NOT confer approvable capabilities it cannot itself approve.";
1118
+ };
1119
+ readonly delegatedBy: {
1120
+ readonly type: "string";
1121
+ readonly minLength: 1;
1122
+ readonly description: "VID of the granter whose authority this entry was delegated from and is bounded by. The entry MUST NOT hold authority the granter did not hold when it was written, and MUST NOT retain authority the granter has since lost, so a maintainer re-evaluates it when the granter's own entry narrows or is removed. Distinct from `createdBy`, which records who wrote the entry: the two differ where an entry is written on a granter's behalf (for example after an N-of-M approval, or by an offline operator). Set by the maintainer from the granter it authorized; absent on an entry that derives from no granter's authority (the first administrator, an operator-written recovery entry).";
1123
+ };
1124
+ readonly keys: {
1125
+ readonly $ref: "#/$defs/KeyScope";
1126
+ readonly description: "REQUIRED explicit key scope: which keys this subject may invoke the maintainer's signing oracle on. Exactly one of `{\"scope\": \"all\"}` (every key the entry's act scope reaches), `{\"scope\": \"none\"}` (no keys), or `{\"scope\": \"listed\", \"keys\": [...]}` with at least one key identifier. INTERSECTS WITH `act` — it can only narrow, never widen: a listed key that lies outside the entry's act scope remains unreachable, exactly as if it were not listed. There is no implicit form: an entry without `keys`, or with an empty `keys` list, is malformed and MUST be refused. A maintainer that operates no signing oracle states `{\"scope\": \"none\"}`. Replaces 0.1's `allowedKeys`, whose absence meant every key.";
1127
+ };
1128
+ readonly label: {
1129
+ readonly type: "string";
1130
+ readonly maxLength: 256;
1131
+ readonly description: "Optional human-readable label. Confers nothing.";
1132
+ };
1133
+ readonly createdAt: {
1134
+ readonly type: "string";
1135
+ readonly format: "date-time";
1136
+ };
1137
+ readonly createdBy: {
1138
+ readonly type: "string";
1139
+ readonly description: "VID of the party that originally wrote this entry.";
1140
+ };
1141
+ readonly updatedAt: {
1142
+ readonly type: "string";
1143
+ readonly format: "date-time";
1144
+ };
1145
+ readonly updatedBy: {
1146
+ readonly type: "string";
1147
+ readonly description: "VID of the party that last modified this entry.";
1148
+ };
1149
+ readonly expiresAt: {
1150
+ readonly type: "string";
1151
+ readonly format: "date-time";
1152
+ readonly description: "Optional time after which the entry confers no authority. Evaluated at every authorization decision, not only when a session is established.";
1153
+ };
1154
+ readonly stepUp: {
1155
+ readonly type: "object";
1156
+ readonly additionalProperties: false;
1157
+ readonly description: "Per-entry authentication step-up configuration, consumed by the ACL maintainer when it gates an operation behind a step-up (see auth/step-up/policy). ADDITIVE-ONLY: a per-entry setting MAY raise the assurance required of this subject above the maintainer's system-wide floor, but MUST NOT lower it. The maintainer resolves the effective requirement as the strictest of (system floor, this entry). Carried forward from 0.1 unchanged.";
1158
+ readonly properties: {
1159
+ readonly approver: {
1160
+ readonly type: "string";
1161
+ readonly description: "VID authorized to ratify step-up for this subject — the `recipient` the maintainer addresses an auth/step-up/approve-request to (e.g. the holder's mobile authenticator or browser companion). Absent → the subject is its own approver (mode `self`) when it holds a usable authenticator; if neither an `approver` nor a self authenticator exists, no step-up method is available for this subject and the maintainer's fail-closed rule applies.";
1162
+ };
1163
+ readonly require: {
1164
+ readonly type: "string";
1165
+ readonly enum: readonly ["self", "delegated"];
1166
+ readonly description: "Minimum step-up mode this subject MUST satisfy for gated operations, raising the system floor. `self` = the subject re-authenticates its own session; `delegated` = a separate `approver` MUST ratify. Omitted → the system floor applies unchanged. A value weaker than the resolved floor is ignored (additive-only).";
1167
+ };
1168
+ };
1169
+ };
1170
+ readonly ext: {
1171
+ readonly $ref: "#/$defs/Ext";
1172
+ readonly description: "Ecosystem-defined extension members per SPEC.md §4.5.1. Reverse-DNS-namespaced; consumers MUST ignore unrecognized namespaces. An extension member MUST NOT be interpreted as conferring authority.";
1173
+ };
1174
+ };
1175
+ };
1176
+ readonly KeyScope: {
1177
+ readonly title: "KeyScope";
1178
+ readonly description: "An explicit key scope. Exactly one of three shapes, discriminated by `scope`: `all`, `none`, or `listed` with a NON-EMPTY list of key identifiers. The empty list is invalid, not a fourth shape.";
1179
+ readonly oneOf: readonly [{
1180
+ readonly $ref: "#/$defs/KeyScopeAll";
1181
+ }, {
1182
+ readonly $ref: "#/$defs/KeyScopeNone";
1183
+ }, {
1184
+ readonly $ref: "#/$defs/KeyScopeListed";
1185
+ }];
1186
+ };
1187
+ readonly KeyScopeListed: {
1188
+ readonly title: "KeyScopeListed";
1189
+ readonly description: "Exactly the listed keys, intersected with the entry's act scope.";
1190
+ readonly type: "object";
1191
+ readonly additionalProperties: false;
1192
+ readonly required: readonly ["scope", "keys"];
1193
+ readonly properties: {
1194
+ readonly scope: {
1195
+ readonly const: "listed";
1196
+ };
1197
+ readonly keys: {
1198
+ readonly type: "array";
1199
+ readonly minItems: 1;
1200
+ readonly uniqueItems: true;
1201
+ readonly items: {
1202
+ readonly type: "string";
1203
+ readonly minLength: 1;
1204
+ readonly maxLength: 512;
1205
+ };
1206
+ readonly description: "Non-empty set of key identifiers. An empty array is invalid (it is neither `all` nor `none`).";
1207
+ };
1208
+ };
1209
+ };
1210
+ readonly KeyScopeNone: {
1211
+ readonly title: "KeyScopeNone";
1212
+ readonly description: "No keys.";
1213
+ readonly type: "object";
1214
+ readonly additionalProperties: false;
1215
+ readonly required: readonly ["scope"];
1216
+ readonly properties: {
1217
+ readonly scope: {
1218
+ readonly const: "none";
1219
+ };
1220
+ };
1221
+ };
1222
+ readonly KeyScopeAll: {
1223
+ readonly title: "KeyScopeAll";
1224
+ readonly description: "Every key the entry's act scope reaches.";
1225
+ readonly type: "object";
1226
+ readonly additionalProperties: false;
1227
+ readonly required: readonly ["scope"];
1228
+ readonly properties: {
1229
+ readonly scope: {
1230
+ readonly const: "all";
1231
+ };
1232
+ };
1233
+ };
1234
+ readonly ApproveCapabilityScope: {
1235
+ readonly title: "ApproveCapabilityScope";
1236
+ readonly description: "An explicit statement of the capabilities a subject may approve. Exactly one of `ceiling` (the role's full approve ceiling), `none`, or `listed` with a NON-EMPTY list of CapabilityRef.";
1237
+ readonly oneOf: readonly [{
1238
+ readonly $ref: "#/$defs/CapabilityScopeCeiling";
1239
+ }, {
1240
+ readonly $ref: "#/$defs/CapabilityScopeNone";
1241
+ }, {
1242
+ readonly $ref: "#/$defs/ApproveCapabilityScopeListed";
1243
+ }];
1244
+ };
1245
+ readonly ApproveCapabilityScopeListed: {
1246
+ readonly title: "ApproveCapabilityScopeListed";
1247
+ readonly description: "Exactly the listed capabilities, intersected with the role's approve ceiling where the maintainer's roles define one.";
1248
+ readonly type: "object";
1249
+ readonly additionalProperties: false;
1250
+ readonly required: readonly ["scope", "grants"];
1251
+ readonly properties: {
1252
+ readonly scope: {
1253
+ readonly const: "listed";
1254
+ };
1255
+ readonly grants: {
1256
+ readonly type: "array";
1257
+ readonly minItems: 1;
1258
+ readonly items: {
1259
+ readonly $ref: "#/$defs/CapabilityRef";
1260
+ };
1261
+ readonly description: "Non-empty list of approvable capabilities. An empty array is invalid.";
1262
+ };
1263
+ };
1264
+ };
1265
+ readonly CapabilityRef: {
1266
+ readonly title: "CapabilityRef";
1267
+ readonly description: "A capability, optionally qualified by a resource. Used where a capability is named but not granted — a role's ceiling, a role's approve ceiling, an entry's approvable capabilities. An unqualified reference covers every resource of the capability's kind.";
1268
+ readonly type: "object";
1269
+ readonly additionalProperties: false;
1270
+ readonly required: readonly ["capability"];
1271
+ readonly properties: {
1272
+ readonly capability: {
1273
+ readonly $ref: "#/$defs/Capability";
1274
+ };
1275
+ readonly resource: {
1276
+ readonly $ref: "#/$defs/ResourceQualifier";
1277
+ readonly description: "Optional qualifier. Absent covers every resource of the capability's kind.";
1278
+ };
1279
+ };
1280
+ };
1281
+ readonly ResourceQualifier: {
1282
+ readonly title: "ResourceQualifier";
1283
+ readonly description: "Opaque qualifier naming the part of the maintainer's resources a capability applies to (e.g. `git-ns:github.com/acme`, `git-repo:github.com/acme/r#4211`, `policy:join`). Its grammar and containment rule are the maintainer's: a qualified capability covers the named resource and the resources inside it. A qualifier MUST NOT be read as widening the entry's act scope.";
1284
+ readonly type: "string";
1285
+ readonly minLength: 1;
1286
+ readonly maxLength: 512;
1287
+ };
1288
+ readonly Capability: {
1289
+ readonly title: "Capability";
1290
+ readonly description: "Opaque identifier of one administrative power in the maintainer's capability registry — lowercase dot-separated segments (e.g. `keys.sign`, `vtc.roles.assign`, `git.repo.manage`). A consumer MUST NOT treat a capability it does not recognise as granted.";
1291
+ readonly type: "string";
1292
+ readonly minLength: 1;
1293
+ readonly maxLength: 128;
1294
+ readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)*$";
1295
+ };
1296
+ readonly CapabilityScopeNone: {
1297
+ readonly title: "CapabilityScopeNone";
1298
+ readonly description: "No capabilities on this axis.";
1299
+ readonly type: "object";
1300
+ readonly additionalProperties: false;
1301
+ readonly required: readonly ["scope"];
1302
+ readonly properties: {
1303
+ readonly scope: {
1304
+ readonly const: "none";
1305
+ };
1306
+ };
1307
+ };
1308
+ readonly CapabilityScopeCeiling: {
1309
+ readonly title: "CapabilityScopeCeiling";
1310
+ readonly description: "The role's full ceiling on this axis, unnarrowed: what the role admits, the entry holds (or, for approvable capabilities, may approve). Stated, not implied — it is the explicit spelling of \"no narrowing\".";
1311
+ readonly type: "object";
1312
+ readonly additionalProperties: false;
1313
+ readonly required: readonly ["scope"];
1314
+ readonly properties: {
1315
+ readonly scope: {
1316
+ readonly const: "ceiling";
1317
+ };
1318
+ };
1319
+ };
1320
+ readonly CapabilityScope: {
1321
+ readonly title: "CapabilityScope";
1322
+ readonly description: "An explicit statement of the capabilities an entry holds. Exactly one of three shapes, discriminated by `scope`: `ceiling` (the role's full ceiling), `none`, or `listed` with a NON-EMPTY list of CapabilityGrant. The empty list is invalid, not a fourth shape.";
1323
+ readonly oneOf: readonly [{
1324
+ readonly $ref: "#/$defs/CapabilityScopeCeiling";
1325
+ }, {
1326
+ readonly $ref: "#/$defs/CapabilityScopeNone";
1327
+ }, {
1328
+ readonly $ref: "#/$defs/CapabilityScopeListed";
1329
+ }];
1330
+ };
1331
+ readonly CapabilityScopeListed: {
1332
+ readonly title: "CapabilityScopeListed";
1333
+ readonly description: "Exactly the listed grants: (role ceiling ∩ non-additive grants) ∪ additive grants.";
1334
+ readonly type: "object";
1335
+ readonly additionalProperties: false;
1336
+ readonly required: readonly ["scope", "grants"];
1337
+ readonly properties: {
1338
+ readonly scope: {
1339
+ readonly const: "listed";
1340
+ };
1341
+ readonly grants: {
1342
+ readonly type: "array";
1343
+ readonly minItems: 1;
1344
+ readonly items: {
1345
+ readonly $ref: "#/$defs/CapabilityGrant";
1346
+ };
1347
+ readonly description: "Non-empty list of capability grants. An empty array is invalid (it is neither `ceiling` nor `none`).";
1348
+ };
1349
+ };
1350
+ };
1351
+ readonly CapabilityGrant: {
1352
+ readonly title: "CapabilityGrant";
1353
+ readonly description: "A capability held by an entry, optionally qualified by a resource, optionally marked additive. A qualified grant confers nothing without a live entry for the same subject, and is bounded as delegated authority is.";
1354
+ readonly type: "object";
1355
+ readonly additionalProperties: false;
1356
+ readonly required: readonly ["capability"];
1357
+ readonly properties: {
1358
+ readonly capability: {
1359
+ readonly $ref: "#/$defs/Capability";
1360
+ };
1361
+ readonly resource: {
1362
+ readonly $ref: "#/$defs/ResourceQualifier";
1363
+ readonly description: "Optional qualifier. Absent covers every resource of the capability's kind.";
1364
+ };
1365
+ readonly additive: {
1366
+ readonly type: "boolean";
1367
+ readonly description: "`true` declares an ADDITIVE grant: a capability no role implies, granted to this entry beside its role rather than through it, and therefore not intersected with the role's ceiling. Granting one requires unrestricted act authority (`act: {scope: all}`) of the granter, and an entry never acquires one by virtue of its role. Absent or `false` → an ordinary grant, intersected with the role's ceiling, and refused when written if it lies outside it. A consumer MUST refuse `additive: true` on a capability the role's ceiling already includes, so that the flag cannot be used to make an ordinary capability survive a later role change.";
1368
+ };
1369
+ };
1370
+ };
1371
+ readonly AuthorityScope: {
1372
+ readonly title: "AuthorityScope";
1373
+ readonly description: "An explicit authority scope — used for both the act scope and the approve scope of an entry. Exactly one of three shapes, discriminated by `scope`: `all`, `none`, or `contexts` with a NON-EMPTY list. The empty list is not a fourth shape: it is invalid, so a serializer that drops or empties the list produces a document that fails validation rather than one that silently means something else.";
1374
+ readonly oneOf: readonly [{
1375
+ readonly $ref: "#/$defs/AuthorityScopeAll";
1376
+ }, {
1377
+ readonly $ref: "#/$defs/AuthorityScopeNone";
1378
+ }, {
1379
+ readonly $ref: "#/$defs/AuthorityScopeContexts";
1380
+ }];
1381
+ };
1382
+ readonly AuthorityScopeContexts: {
1383
+ readonly title: "AuthorityScopeContexts";
1384
+ readonly description: "The named contexts and, where the maintainer's contexts are hierarchical, every descendant of them — and nowhere else. `contexts` MUST carry at least one path.";
1385
+ readonly type: "object";
1386
+ readonly additionalProperties: false;
1387
+ readonly required: readonly ["scope", "contexts"];
1388
+ readonly properties: {
1389
+ readonly scope: {
1390
+ readonly const: "contexts";
1391
+ };
1392
+ readonly contexts: {
1393
+ readonly type: "array";
1394
+ readonly minItems: 1;
1395
+ readonly uniqueItems: true;
1396
+ readonly items: {
1397
+ readonly $ref: "#/$defs/ContextPath";
1398
+ };
1399
+ readonly description: "Non-empty set of context paths. An empty array is invalid (it is neither `all` nor `none`).";
1400
+ };
1401
+ };
1402
+ };
1403
+ readonly ContextPath: {
1404
+ readonly title: "ContextPath";
1405
+ readonly description: "Opaque identifier of one of the maintainer's contexts, compared by the maintainer's own ancestry predicate. Its grammar is the maintainer's.";
1406
+ readonly type: "string";
1407
+ readonly minLength: 1;
1408
+ readonly maxLength: 512;
1409
+ };
1410
+ readonly AuthorityScopeNone: {
1411
+ readonly title: "AuthorityScopeNone";
1412
+ readonly description: "No authority on this axis. Stated, not implied: `none` is how an entry says it may not act (a least-privilege approver) or may not approve.";
1413
+ readonly type: "object";
1414
+ readonly additionalProperties: false;
1415
+ readonly required: readonly ["scope"];
1416
+ readonly properties: {
1417
+ readonly scope: {
1418
+ readonly const: "none";
1419
+ };
1420
+ };
1421
+ };
1422
+ readonly AuthorityScopeAll: {
1423
+ readonly title: "AuthorityScopeAll";
1424
+ readonly description: "Unrestricted: every context the maintainer holds, present and future. On the act axis this is a super-administrator (or, at a maintainer without contexts, an entry whose authority is not narrowed by location).";
1425
+ readonly type: "object";
1426
+ readonly additionalProperties: false;
1427
+ readonly required: readonly ["scope"];
1428
+ readonly properties: {
1429
+ readonly scope: {
1430
+ readonly const: "all";
1431
+ };
1432
+ };
1433
+ };
1434
+ };
1435
+ };
1436
+ };
1437
+ /**
1438
+ * SPEC.md §7.2 policy for the success-response variant. `isRecipientRequired`
1439
+ * tracks the *issuer* party's requirement because a response swaps the
1440
+ * parties (§7.3 item 5).
1441
+ */
1442
+ export declare const RESPONSE_SPEC: {
1443
+ readonly typeUri: "https://trusttasks.org/spec/vtc/members/role/set/0.1#response";
1444
+ readonly isBearer: false;
1445
+ readonly isProofRequired: true;
1446
+ readonly isRecipientRequired: true;
1447
+ readonly isIssuedAtRequired: true;
1448
+ readonly payloadSchema: {
1449
+ readonly $schema: "https://json-schema.org/draft/2020-12/schema";
1450
+ readonly $ref: "#/$defs/Response";
1451
+ readonly $defs: {
1452
+ readonly Response: {
1453
+ readonly $anchor: "response";
1454
+ readonly title: "VTC Members Role Set — response payload";
1455
+ readonly description: "Success response to vtc/members/role/set/0.1: the subject's community role as it now stands, the access-control entry that holds it, and the role credential re-issued for it. Type https://trusttasks.org/spec/vtc/members/role/set/0.1#response — carried directly, or on the request's threadId when a parked move executes after its approval.";
1456
+ readonly type: "object";
1457
+ readonly additionalProperties: false;
1458
+ readonly required: readonly ["subject", "role", "previousRole", "changed", "entry"];
1459
+ readonly properties: {
1460
+ readonly subject: {
1461
+ readonly type: "string";
1462
+ readonly pattern: "^did:";
1463
+ readonly maxLength: 2048;
1464
+ readonly description: "The DID whose community role was set.";
1465
+ };
1466
+ readonly role: {
1467
+ readonly type: "string";
1468
+ readonly minLength: 1;
1469
+ readonly maxLength: 128;
1470
+ readonly description: "The community role the subject now holds. Equals the request's `toRole`.";
1471
+ };
1472
+ readonly previousRole: {
1473
+ readonly type: "string";
1474
+ readonly minLength: 1;
1475
+ readonly maxLength: 128;
1476
+ readonly description: "The community role the subject held before. Equals the request's `fromRole`.";
1477
+ };
1478
+ readonly changed: {
1479
+ readonly type: "boolean";
1480
+ readonly description: "False when `fromRole` equalled `toRole`: the subject already held the role, nothing was written and no credential was issued.";
1481
+ };
1482
+ readonly entry: {
1483
+ readonly $ref: "#/$defs/AclEntry";
1484
+ readonly description: "The access-control entry as it now stands, every authority axis explicit, so the requester can see what administrative authority the move did or did not carry.";
1485
+ };
1486
+ readonly roleVac: {
1487
+ readonly type: "object";
1488
+ readonly description: "The role credential issued at the new role: a Verifiable Authority Credential issued by the community whose `credentialSubject.authority` is `{ scope: <community DID>, actions: [\"role:<name>\"] }`, the shape vtc/join-requests/decide returns. Present exactly when the subject has a member record and `changed` is true; a subject holding an entry with no member record has no role credential to re-issue.";
1489
+ };
1490
+ readonly approval: {
1491
+ readonly $ref: "#/$defs/Approval";
1492
+ readonly description: "How the move came to execute: `policyAllowed` at once, `approved` after a parked move was approved by other administrators, or `waived` by the community's single-administrator mode on the requester's own bound re-authentication. Absent when `changed` is false.";
1493
+ };
1494
+ readonly ext: {
1495
+ readonly $ref: "#/$defs/Ext";
1496
+ readonly description: "Ecosystem-defined extension members per SPEC §4.5.1.";
1497
+ };
1498
+ };
1499
+ };
1500
+ readonly Ext: {
1501
+ readonly title: "Ext";
1502
+ readonly description: "Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.";
1503
+ readonly type: "object";
1504
+ readonly minProperties: 1;
1505
+ readonly additionalProperties: true;
1506
+ readonly propertyNames: {
1507
+ readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$";
1508
+ };
1509
+ };
1510
+ readonly Approval: {
1511
+ readonly title: "Approval";
1512
+ readonly type: "string";
1513
+ readonly enum: readonly ["policyAllowed", "approved", "waived"];
1514
+ readonly description: "How the admission came to execute. `policyAllowed`: the community's policy admitted it at once. `approved`: the policy referred it, the community parked it, and another administrator approved it. `waived`: the policy referred it, and the community's single-administrator mode waived the approval on the requester's own re-authentication bound to the operation.";
1515
+ };
1516
+ readonly AclEntry: {
1517
+ readonly title: "AclEntry";
1518
+ readonly description: "One access-control entry: who the grant is for (`subject`), the ceiling it is held under (`role`), where the subject may act (`act`) and approve (`approve`), and which capabilities it may exercise (`capabilities`) and approve (`approveCapabilities`).\n\nThe act axis and the approve axis are independent and a consumer MUST resolve them separately: `act` + `capabilities` (+ `keys`) answer \"may this subject do X\"; `approve` + `approveCapabilities` answer \"may this subject ratify someone else doing X\". Neither implies the other. An entry with `act: {scope: none}` and an approve scope other than none is a least-privilege approver — able to satisfy an approval and unable to initiate any change.";
1519
+ readonly type: "object";
1520
+ readonly additionalProperties: false;
1521
+ readonly required: readonly ["subject", "role", "act", "keys", "capabilities"];
1522
+ readonly properties: {
1523
+ readonly subject: {
1524
+ readonly type: "string";
1525
+ readonly minLength: 1;
1526
+ readonly description: "VID of the party in the ACL. Compared by exact string equality (SPEC.md §4.8); producers SHOULD emit canonical form.";
1527
+ };
1528
+ readonly role: {
1529
+ readonly type: "string";
1530
+ readonly minLength: 1;
1531
+ readonly description: "Opaque role identifier interpreted by the ACL maintainer. A role is a CEILING, never a grant: it bounds the capabilities the entry may hold and never adds to them. A consumer that does not recognise the role MUST treat the entry as conferring no authority and MUST NOT fall back to a default role. Act scope and role are independent members; a consumer MUST NOT compute either from the other.";
1532
+ };
1533
+ readonly act: {
1534
+ readonly $ref: "#/$defs/AuthorityScope";
1535
+ readonly description: "REQUIRED explicit act scope: where this subject may make a change itself. Exactly one of `{\"scope\": \"all\"}` (unrestricted — every context the maintainer has), `{\"scope\": \"none\"}` (may act nowhere), or `{\"scope\": \"contexts\", \"contexts\": [...]}` with at least one context path (the named contexts and, where the maintainer's contexts are hierarchical, their descendants). There is no default and no implicit form: an entry without `act`, or with an empty `contexts` list, is malformed and MUST be refused, never read as `all` and never read as `none`. A maintainer that has no contexts (for example a community node that narrows authority with resource qualifiers instead) states `all` or `none` only. Replaces 0.1's `scopes`.";
1536
+ };
1537
+ readonly approve: {
1538
+ readonly $ref: "#/$defs/AuthorityScope";
1539
+ readonly description: "OPTIONAL approve scope: where this subject may ratify a change made by someone else (a step-up ratification, a consent decision, an N-of-M approval). Same three shapes as `act`, resolved independently of it. ABSENT MEANS NONE — the subject may ratify nothing — so a consumer that has not implemented the member confers less than the producer intended, never more. A producer SHOULD state `{\"scope\": \"none\"}` explicitly rather than rely on omission. A subject MUST NOT confer approve authority wider than the approve authority it holds itself (see acl/grant `approveWiderThanGranter`). Replaces 0.1's `approve {all, scopes}`.";
1540
+ };
1541
+ readonly capabilities: {
1542
+ readonly $ref: "#/$defs/CapabilityScope";
1543
+ readonly description: "REQUIRED explicit capability scope: which capabilities this entry holds. Exactly one of `{\"scope\": \"ceiling\"}` (the role's full ceiling, unnarrowed), `{\"scope\": \"none\"}` (no capabilities), or `{\"scope\": \"listed\", \"grants\": [...]}` with at least one CapabilityGrant. For `listed`, the EFFECTIVE set is (the role's ceiling ∩ the non-additive grants) ∪ the additive grants; it can only narrow the ceiling, except through an explicit additive grant, which only an unrestricted granter may make. There is no implicit form: an entry without `capabilities`, or with an empty `grants` list, is malformed and MUST be refused. A non-additive grant outside the role's ceiling is refused when written, never accepted with the capability silently dropped; a capability the consumer does not recognise is never treated as granted. Producers SHOULD NOT list the same (capability, resource) pair twice; a consumer MAY refuse a list that does.";
1544
+ };
1545
+ readonly approveCapabilities: {
1546
+ readonly $ref: "#/$defs/ApproveCapabilityScope";
1547
+ readonly description: "OPTIONAL explicit approvable-capability scope: which capabilities this subject may APPROVE an action needing — independent of what it may do itself, so an approver can ratify a capability it does not hold (the least-privilege approver). One of `{\"scope\": \"ceiling\"}` (the role's full approve ceiling; at a maintainer whose roles define no capability-level approve ceiling, any action within `approve`), `{\"scope\": \"none\"}`, or `{\"scope\": \"listed\", \"grants\": [...]}` with at least one CapabilityRef (intersected with the role's approve ceiling where one is defined). ABSENT MEANS NONE: the subject may approve no capability, because absence derives no authority. Bounded by `approve`: where `approve` is absent or `{\"scope\": \"none\"}` this member confers nothing whatever it states. A subject MUST NOT confer approvable capabilities it cannot itself approve.";
1548
+ };
1549
+ readonly delegatedBy: {
1550
+ readonly type: "string";
1551
+ readonly minLength: 1;
1552
+ readonly description: "VID of the granter whose authority this entry was delegated from and is bounded by. The entry MUST NOT hold authority the granter did not hold when it was written, and MUST NOT retain authority the granter has since lost, so a maintainer re-evaluates it when the granter's own entry narrows or is removed. Distinct from `createdBy`, which records who wrote the entry: the two differ where an entry is written on a granter's behalf (for example after an N-of-M approval, or by an offline operator). Set by the maintainer from the granter it authorized; absent on an entry that derives from no granter's authority (the first administrator, an operator-written recovery entry).";
1553
+ };
1554
+ readonly keys: {
1555
+ readonly $ref: "#/$defs/KeyScope";
1556
+ readonly description: "REQUIRED explicit key scope: which keys this subject may invoke the maintainer's signing oracle on. Exactly one of `{\"scope\": \"all\"}` (every key the entry's act scope reaches), `{\"scope\": \"none\"}` (no keys), or `{\"scope\": \"listed\", \"keys\": [...]}` with at least one key identifier. INTERSECTS WITH `act` — it can only narrow, never widen: a listed key that lies outside the entry's act scope remains unreachable, exactly as if it were not listed. There is no implicit form: an entry without `keys`, or with an empty `keys` list, is malformed and MUST be refused. A maintainer that operates no signing oracle states `{\"scope\": \"none\"}`. Replaces 0.1's `allowedKeys`, whose absence meant every key.";
1557
+ };
1558
+ readonly label: {
1559
+ readonly type: "string";
1560
+ readonly maxLength: 256;
1561
+ readonly description: "Optional human-readable label. Confers nothing.";
1562
+ };
1563
+ readonly createdAt: {
1564
+ readonly type: "string";
1565
+ readonly format: "date-time";
1566
+ };
1567
+ readonly createdBy: {
1568
+ readonly type: "string";
1569
+ readonly description: "VID of the party that originally wrote this entry.";
1570
+ };
1571
+ readonly updatedAt: {
1572
+ readonly type: "string";
1573
+ readonly format: "date-time";
1574
+ };
1575
+ readonly updatedBy: {
1576
+ readonly type: "string";
1577
+ readonly description: "VID of the party that last modified this entry.";
1578
+ };
1579
+ readonly expiresAt: {
1580
+ readonly type: "string";
1581
+ readonly format: "date-time";
1582
+ readonly description: "Optional time after which the entry confers no authority. Evaluated at every authorization decision, not only when a session is established.";
1583
+ };
1584
+ readonly stepUp: {
1585
+ readonly type: "object";
1586
+ readonly additionalProperties: false;
1587
+ readonly description: "Per-entry authentication step-up configuration, consumed by the ACL maintainer when it gates an operation behind a step-up (see auth/step-up/policy). ADDITIVE-ONLY: a per-entry setting MAY raise the assurance required of this subject above the maintainer's system-wide floor, but MUST NOT lower it. The maintainer resolves the effective requirement as the strictest of (system floor, this entry). Carried forward from 0.1 unchanged.";
1588
+ readonly properties: {
1589
+ readonly approver: {
1590
+ readonly type: "string";
1591
+ readonly description: "VID authorized to ratify step-up for this subject — the `recipient` the maintainer addresses an auth/step-up/approve-request to (e.g. the holder's mobile authenticator or browser companion). Absent → the subject is its own approver (mode `self`) when it holds a usable authenticator; if neither an `approver` nor a self authenticator exists, no step-up method is available for this subject and the maintainer's fail-closed rule applies.";
1592
+ };
1593
+ readonly require: {
1594
+ readonly type: "string";
1595
+ readonly enum: readonly ["self", "delegated"];
1596
+ readonly description: "Minimum step-up mode this subject MUST satisfy for gated operations, raising the system floor. `self` = the subject re-authenticates its own session; `delegated` = a separate `approver` MUST ratify. Omitted → the system floor applies unchanged. A value weaker than the resolved floor is ignored (additive-only).";
1597
+ };
1598
+ };
1599
+ };
1600
+ readonly ext: {
1601
+ readonly $ref: "#/$defs/Ext";
1602
+ readonly description: "Ecosystem-defined extension members per SPEC.md §4.5.1. Reverse-DNS-namespaced; consumers MUST ignore unrecognized namespaces. An extension member MUST NOT be interpreted as conferring authority.";
1603
+ };
1604
+ };
1605
+ };
1606
+ readonly KeyScope: {
1607
+ readonly title: "KeyScope";
1608
+ readonly description: "An explicit key scope. Exactly one of three shapes, discriminated by `scope`: `all`, `none`, or `listed` with a NON-EMPTY list of key identifiers. The empty list is invalid, not a fourth shape.";
1609
+ readonly oneOf: readonly [{
1610
+ readonly $ref: "#/$defs/KeyScopeAll";
1611
+ }, {
1612
+ readonly $ref: "#/$defs/KeyScopeNone";
1613
+ }, {
1614
+ readonly $ref: "#/$defs/KeyScopeListed";
1615
+ }];
1616
+ };
1617
+ readonly KeyScopeListed: {
1618
+ readonly title: "KeyScopeListed";
1619
+ readonly description: "Exactly the listed keys, intersected with the entry's act scope.";
1620
+ readonly type: "object";
1621
+ readonly additionalProperties: false;
1622
+ readonly required: readonly ["scope", "keys"];
1623
+ readonly properties: {
1624
+ readonly scope: {
1625
+ readonly const: "listed";
1626
+ };
1627
+ readonly keys: {
1628
+ readonly type: "array";
1629
+ readonly minItems: 1;
1630
+ readonly uniqueItems: true;
1631
+ readonly items: {
1632
+ readonly type: "string";
1633
+ readonly minLength: 1;
1634
+ readonly maxLength: 512;
1635
+ };
1636
+ readonly description: "Non-empty set of key identifiers. An empty array is invalid (it is neither `all` nor `none`).";
1637
+ };
1638
+ };
1639
+ };
1640
+ readonly KeyScopeNone: {
1641
+ readonly title: "KeyScopeNone";
1642
+ readonly description: "No keys.";
1643
+ readonly type: "object";
1644
+ readonly additionalProperties: false;
1645
+ readonly required: readonly ["scope"];
1646
+ readonly properties: {
1647
+ readonly scope: {
1648
+ readonly const: "none";
1649
+ };
1650
+ };
1651
+ };
1652
+ readonly KeyScopeAll: {
1653
+ readonly title: "KeyScopeAll";
1654
+ readonly description: "Every key the entry's act scope reaches.";
1655
+ readonly type: "object";
1656
+ readonly additionalProperties: false;
1657
+ readonly required: readonly ["scope"];
1658
+ readonly properties: {
1659
+ readonly scope: {
1660
+ readonly const: "all";
1661
+ };
1662
+ };
1663
+ };
1664
+ readonly ApproveCapabilityScope: {
1665
+ readonly title: "ApproveCapabilityScope";
1666
+ readonly description: "An explicit statement of the capabilities a subject may approve. Exactly one of `ceiling` (the role's full approve ceiling), `none`, or `listed` with a NON-EMPTY list of CapabilityRef.";
1667
+ readonly oneOf: readonly [{
1668
+ readonly $ref: "#/$defs/CapabilityScopeCeiling";
1669
+ }, {
1670
+ readonly $ref: "#/$defs/CapabilityScopeNone";
1671
+ }, {
1672
+ readonly $ref: "#/$defs/ApproveCapabilityScopeListed";
1673
+ }];
1674
+ };
1675
+ readonly ApproveCapabilityScopeListed: {
1676
+ readonly title: "ApproveCapabilityScopeListed";
1677
+ readonly description: "Exactly the listed capabilities, intersected with the role's approve ceiling where the maintainer's roles define one.";
1678
+ readonly type: "object";
1679
+ readonly additionalProperties: false;
1680
+ readonly required: readonly ["scope", "grants"];
1681
+ readonly properties: {
1682
+ readonly scope: {
1683
+ readonly const: "listed";
1684
+ };
1685
+ readonly grants: {
1686
+ readonly type: "array";
1687
+ readonly minItems: 1;
1688
+ readonly items: {
1689
+ readonly $ref: "#/$defs/CapabilityRef";
1690
+ };
1691
+ readonly description: "Non-empty list of approvable capabilities. An empty array is invalid.";
1692
+ };
1693
+ };
1694
+ };
1695
+ readonly CapabilityRef: {
1696
+ readonly title: "CapabilityRef";
1697
+ readonly description: "A capability, optionally qualified by a resource. Used where a capability is named but not granted — a role's ceiling, a role's approve ceiling, an entry's approvable capabilities. An unqualified reference covers every resource of the capability's kind.";
1698
+ readonly type: "object";
1699
+ readonly additionalProperties: false;
1700
+ readonly required: readonly ["capability"];
1701
+ readonly properties: {
1702
+ readonly capability: {
1703
+ readonly $ref: "#/$defs/Capability";
1704
+ };
1705
+ readonly resource: {
1706
+ readonly $ref: "#/$defs/ResourceQualifier";
1707
+ readonly description: "Optional qualifier. Absent covers every resource of the capability's kind.";
1708
+ };
1709
+ };
1710
+ };
1711
+ readonly ResourceQualifier: {
1712
+ readonly title: "ResourceQualifier";
1713
+ readonly description: "Opaque qualifier naming the part of the maintainer's resources a capability applies to (e.g. `git-ns:github.com/acme`, `git-repo:github.com/acme/r#4211`, `policy:join`). Its grammar and containment rule are the maintainer's: a qualified capability covers the named resource and the resources inside it. A qualifier MUST NOT be read as widening the entry's act scope.";
1714
+ readonly type: "string";
1715
+ readonly minLength: 1;
1716
+ readonly maxLength: 512;
1717
+ };
1718
+ readonly Capability: {
1719
+ readonly title: "Capability";
1720
+ readonly description: "Opaque identifier of one administrative power in the maintainer's capability registry — lowercase dot-separated segments (e.g. `keys.sign`, `vtc.roles.assign`, `git.repo.manage`). A consumer MUST NOT treat a capability it does not recognise as granted.";
1721
+ readonly type: "string";
1722
+ readonly minLength: 1;
1723
+ readonly maxLength: 128;
1724
+ readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)*$";
1725
+ };
1726
+ readonly CapabilityScopeNone: {
1727
+ readonly title: "CapabilityScopeNone";
1728
+ readonly description: "No capabilities on this axis.";
1729
+ readonly type: "object";
1730
+ readonly additionalProperties: false;
1731
+ readonly required: readonly ["scope"];
1732
+ readonly properties: {
1733
+ readonly scope: {
1734
+ readonly const: "none";
1735
+ };
1736
+ };
1737
+ };
1738
+ readonly CapabilityScopeCeiling: {
1739
+ readonly title: "CapabilityScopeCeiling";
1740
+ readonly description: "The role's full ceiling on this axis, unnarrowed: what the role admits, the entry holds (or, for approvable capabilities, may approve). Stated, not implied — it is the explicit spelling of \"no narrowing\".";
1741
+ readonly type: "object";
1742
+ readonly additionalProperties: false;
1743
+ readonly required: readonly ["scope"];
1744
+ readonly properties: {
1745
+ readonly scope: {
1746
+ readonly const: "ceiling";
1747
+ };
1748
+ };
1749
+ };
1750
+ readonly CapabilityScope: {
1751
+ readonly title: "CapabilityScope";
1752
+ readonly description: "An explicit statement of the capabilities an entry holds. Exactly one of three shapes, discriminated by `scope`: `ceiling` (the role's full ceiling), `none`, or `listed` with a NON-EMPTY list of CapabilityGrant. The empty list is invalid, not a fourth shape.";
1753
+ readonly oneOf: readonly [{
1754
+ readonly $ref: "#/$defs/CapabilityScopeCeiling";
1755
+ }, {
1756
+ readonly $ref: "#/$defs/CapabilityScopeNone";
1757
+ }, {
1758
+ readonly $ref: "#/$defs/CapabilityScopeListed";
1759
+ }];
1760
+ };
1761
+ readonly CapabilityScopeListed: {
1762
+ readonly title: "CapabilityScopeListed";
1763
+ readonly description: "Exactly the listed grants: (role ceiling ∩ non-additive grants) ∪ additive grants.";
1764
+ readonly type: "object";
1765
+ readonly additionalProperties: false;
1766
+ readonly required: readonly ["scope", "grants"];
1767
+ readonly properties: {
1768
+ readonly scope: {
1769
+ readonly const: "listed";
1770
+ };
1771
+ readonly grants: {
1772
+ readonly type: "array";
1773
+ readonly minItems: 1;
1774
+ readonly items: {
1775
+ readonly $ref: "#/$defs/CapabilityGrant";
1776
+ };
1777
+ readonly description: "Non-empty list of capability grants. An empty array is invalid (it is neither `ceiling` nor `none`).";
1778
+ };
1779
+ };
1780
+ };
1781
+ readonly CapabilityGrant: {
1782
+ readonly title: "CapabilityGrant";
1783
+ readonly description: "A capability held by an entry, optionally qualified by a resource, optionally marked additive. A qualified grant confers nothing without a live entry for the same subject, and is bounded as delegated authority is.";
1784
+ readonly type: "object";
1785
+ readonly additionalProperties: false;
1786
+ readonly required: readonly ["capability"];
1787
+ readonly properties: {
1788
+ readonly capability: {
1789
+ readonly $ref: "#/$defs/Capability";
1790
+ };
1791
+ readonly resource: {
1792
+ readonly $ref: "#/$defs/ResourceQualifier";
1793
+ readonly description: "Optional qualifier. Absent covers every resource of the capability's kind.";
1794
+ };
1795
+ readonly additive: {
1796
+ readonly type: "boolean";
1797
+ readonly description: "`true` declares an ADDITIVE grant: a capability no role implies, granted to this entry beside its role rather than through it, and therefore not intersected with the role's ceiling. Granting one requires unrestricted act authority (`act: {scope: all}`) of the granter, and an entry never acquires one by virtue of its role. Absent or `false` → an ordinary grant, intersected with the role's ceiling, and refused when written if it lies outside it. A consumer MUST refuse `additive: true` on a capability the role's ceiling already includes, so that the flag cannot be used to make an ordinary capability survive a later role change.";
1798
+ };
1799
+ };
1800
+ };
1801
+ readonly AuthorityScope: {
1802
+ readonly title: "AuthorityScope";
1803
+ readonly description: "An explicit authority scope — used for both the act scope and the approve scope of an entry. Exactly one of three shapes, discriminated by `scope`: `all`, `none`, or `contexts` with a NON-EMPTY list. The empty list is not a fourth shape: it is invalid, so a serializer that drops or empties the list produces a document that fails validation rather than one that silently means something else.";
1804
+ readonly oneOf: readonly [{
1805
+ readonly $ref: "#/$defs/AuthorityScopeAll";
1806
+ }, {
1807
+ readonly $ref: "#/$defs/AuthorityScopeNone";
1808
+ }, {
1809
+ readonly $ref: "#/$defs/AuthorityScopeContexts";
1810
+ }];
1811
+ };
1812
+ readonly AuthorityScopeContexts: {
1813
+ readonly title: "AuthorityScopeContexts";
1814
+ readonly description: "The named contexts and, where the maintainer's contexts are hierarchical, every descendant of them — and nowhere else. `contexts` MUST carry at least one path.";
1815
+ readonly type: "object";
1816
+ readonly additionalProperties: false;
1817
+ readonly required: readonly ["scope", "contexts"];
1818
+ readonly properties: {
1819
+ readonly scope: {
1820
+ readonly const: "contexts";
1821
+ };
1822
+ readonly contexts: {
1823
+ readonly type: "array";
1824
+ readonly minItems: 1;
1825
+ readonly uniqueItems: true;
1826
+ readonly items: {
1827
+ readonly $ref: "#/$defs/ContextPath";
1828
+ };
1829
+ readonly description: "Non-empty set of context paths. An empty array is invalid (it is neither `all` nor `none`).";
1830
+ };
1831
+ };
1832
+ };
1833
+ readonly ContextPath: {
1834
+ readonly title: "ContextPath";
1835
+ readonly description: "Opaque identifier of one of the maintainer's contexts, compared by the maintainer's own ancestry predicate. Its grammar is the maintainer's.";
1836
+ readonly type: "string";
1837
+ readonly minLength: 1;
1838
+ readonly maxLength: 512;
1839
+ };
1840
+ readonly AuthorityScopeNone: {
1841
+ readonly title: "AuthorityScopeNone";
1842
+ readonly description: "No authority on this axis. Stated, not implied: `none` is how an entry says it may not act (a least-privilege approver) or may not approve.";
1843
+ readonly type: "object";
1844
+ readonly additionalProperties: false;
1845
+ readonly required: readonly ["scope"];
1846
+ readonly properties: {
1847
+ readonly scope: {
1848
+ readonly const: "none";
1849
+ };
1850
+ };
1851
+ };
1852
+ readonly AuthorityScopeAll: {
1853
+ readonly title: "AuthorityScopeAll";
1854
+ readonly description: "Unrestricted: every context the maintainer holds, present and future. On the act axis this is a super-administrator (or, at a maintainer without contexts, an entry whose authority is not narrowed by location).";
1855
+ readonly type: "object";
1856
+ readonly additionalProperties: false;
1857
+ readonly required: readonly ["scope"];
1858
+ readonly properties: {
1859
+ readonly scope: {
1860
+ readonly const: "all";
1861
+ };
1862
+ };
1863
+ };
1864
+ };
1865
+ };
1866
+ };
1867
+ //# sourceMappingURL=payload.d.ts.map