@openvtc/trust-tasks 0.28.13 → 0.28.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/CHANGELOG.md +122 -0
  2. package/dist/_extends.d.ts.map +1 -1
  3. package/dist/_extends.js +5 -0
  4. package/dist/_extends.js.map +1 -1
  5. package/dist/_shared/components.d.ts +344 -1
  6. package/dist/_shared/components.d.ts.map +1 -1
  7. package/dist/did-management/stats/set-resolution/0.1/payload.d.ts +398 -0
  8. package/dist/did-management/stats/set-resolution/0.1/payload.d.ts.map +1 -0
  9. package/dist/did-management/stats/set-resolution/0.1/payload.js +247 -0
  10. package/dist/did-management/stats/set-resolution/0.1/payload.js.map +1 -0
  11. package/dist/index.d.ts +76 -0
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +76 -0
  14. package/dist/index.js.map +1 -1
  15. package/dist/process-attestation/0.1/payload.d.ts +73 -7
  16. package/dist/process-attestation/0.1/payload.d.ts.map +1 -1
  17. package/dist/process-attestation/0.1/payload.js +40 -6
  18. package/dist/process-attestation/0.1/payload.js.map +1 -1
  19. package/dist/rooms/_shared/0.1/room.d.ts +1 -1
  20. package/dist/rooms/_shared/0.1/room.d.ts.map +1 -1
  21. package/dist/rooms/_shared/0.2/room.d.ts +1 -1
  22. package/dist/rooms/_shared/0.2/room.d.ts.map +1 -1
  23. package/dist/rooms/_shared/0.3/member-profile.d.ts +11 -0
  24. package/dist/rooms/_shared/0.3/member-profile.d.ts.map +1 -0
  25. package/dist/rooms/_shared/0.3/member-profile.js +6 -0
  26. package/dist/rooms/_shared/0.3/member-profile.js.map +1 -0
  27. package/dist/rooms/changed/0.1/payload.d.ts +139 -0
  28. package/dist/rooms/changed/0.1/payload.d.ts.map +1 -0
  29. package/dist/rooms/changed/0.1/payload.js +84 -0
  30. package/dist/rooms/changed/0.1/payload.js.map +1 -0
  31. package/dist/rooms/keys/act/0.1/payload.d.ts +4 -4
  32. package/dist/rooms/keys/act/0.1/payload.js +1 -1
  33. package/dist/rooms/keys/act/0.10/payload.d.ts +14 -2
  34. package/dist/rooms/keys/act/0.10/payload.d.ts.map +1 -1
  35. package/dist/rooms/keys/act/0.10/payload.js +1 -1
  36. package/dist/rooms/keys/act/0.10/payload.js.map +1 -1
  37. package/dist/rooms/keys/act/0.11/payload.d.ts +572 -0
  38. package/dist/rooms/keys/act/0.11/payload.d.ts.map +1 -0
  39. package/dist/rooms/keys/act/0.11/payload.js +319 -0
  40. package/dist/rooms/keys/act/0.11/payload.js.map +1 -0
  41. package/dist/rooms/keys/act/0.12/payload.d.ts +560 -0
  42. package/dist/rooms/keys/act/0.12/payload.d.ts.map +1 -0
  43. package/dist/rooms/keys/act/0.12/payload.js +319 -0
  44. package/dist/rooms/keys/act/0.12/payload.js.map +1 -0
  45. package/dist/rooms/keys/act/0.2/payload.d.ts +4 -4
  46. package/dist/rooms/keys/act/0.2/payload.js +1 -1
  47. package/dist/rooms/keys/act/0.3/payload.d.ts +4 -4
  48. package/dist/rooms/keys/act/0.3/payload.js +1 -1
  49. package/dist/rooms/keys/act/0.4/payload.d.ts +4 -4
  50. package/dist/rooms/keys/act/0.4/payload.js +1 -1
  51. package/dist/rooms/keys/act/0.5/payload.d.ts +4 -4
  52. package/dist/rooms/keys/act/0.5/payload.js +1 -1
  53. package/dist/rooms/keys/act/0.6/payload.d.ts +4 -4
  54. package/dist/rooms/keys/act/0.6/payload.js +1 -1
  55. package/dist/rooms/keys/act/0.7/payload.d.ts +4 -4
  56. package/dist/rooms/keys/act/0.7/payload.js +1 -1
  57. package/dist/rooms/keys/act/0.8/payload.d.ts +4 -4
  58. package/dist/rooms/keys/act/0.8/payload.js +1 -1
  59. package/dist/rooms/keys/act/0.9/payload.d.ts +4 -4
  60. package/dist/rooms/keys/act/0.9/payload.js +1 -1
  61. package/dist/rooms/keys/browse/0.1/payload.d.ts +4 -4
  62. package/dist/rooms/keys/browse/0.1/payload.js +1 -1
  63. package/dist/rooms/keys/browse/0.2/payload.d.ts +4 -4
  64. package/dist/rooms/keys/browse/0.2/payload.js +1 -1
  65. package/dist/rooms/keys/browse/0.3/payload.d.ts +14 -2
  66. package/dist/rooms/keys/browse/0.3/payload.d.ts.map +1 -1
  67. package/dist/rooms/keys/browse/0.3/payload.js +1 -1
  68. package/dist/rooms/keys/browse/0.3/payload.js.map +1 -1
  69. package/dist/rooms/keys/browse/0.4/payload.d.ts +1127 -0
  70. package/dist/rooms/keys/browse/0.4/payload.d.ts.map +1 -0
  71. package/dist/rooms/keys/browse/0.4/payload.js +658 -0
  72. package/dist/rooms/keys/browse/0.4/payload.js.map +1 -0
  73. package/dist/rooms/keys/changed/0.1/payload.d.ts +173 -0
  74. package/dist/rooms/keys/changed/0.1/payload.d.ts.map +1 -0
  75. package/dist/rooms/keys/changed/0.1/payload.js +99 -0
  76. package/dist/rooms/keys/changed/0.1/payload.js.map +1 -0
  77. package/dist/rooms/keys/profile/read/0.1/payload.d.ts +56 -4
  78. package/dist/rooms/keys/profile/read/0.1/payload.d.ts.map +1 -1
  79. package/dist/rooms/keys/profile/read/0.1/payload.js +28 -2
  80. package/dist/rooms/keys/profile/read/0.1/payload.js.map +1 -1
  81. package/dist/rooms/keys/profile/write/0.1/payload.d.ts +56 -4
  82. package/dist/rooms/keys/profile/write/0.1/payload.d.ts.map +1 -1
  83. package/dist/rooms/keys/profile/write/0.1/payload.js +28 -2
  84. package/dist/rooms/keys/profile/write/0.1/payload.js.map +1 -1
  85. package/dist/rooms/keys/read/0.1/payload.d.ts +14 -2
  86. package/dist/rooms/keys/read/0.1/payload.d.ts.map +1 -1
  87. package/dist/rooms/keys/read/0.1/payload.js +1 -1
  88. package/dist/rooms/keys/read/0.1/payload.js.map +1 -1
  89. package/dist/rooms/keys/read/0.2/payload.d.ts +1287 -0
  90. package/dist/rooms/keys/read/0.2/payload.d.ts.map +1 -0
  91. package/dist/rooms/keys/read/0.2/payload.js +689 -0
  92. package/dist/rooms/keys/read/0.2/payload.js.map +1 -0
  93. package/dist/rooms/keys/seal/0.1/payload.d.ts +4 -4
  94. package/dist/rooms/keys/seal/0.1/payload.js +1 -1
  95. package/dist/rooms/keys/seal/0.2/payload.d.ts +13 -2
  96. package/dist/rooms/keys/seal/0.2/payload.d.ts.map +1 -1
  97. package/dist/rooms/keys/seal/0.2/payload.js +1 -1
  98. package/dist/rooms/keys/seal/0.2/payload.js.map +1 -1
  99. package/dist/rooms/keys/seal/0.3/payload.d.ts +402 -0
  100. package/dist/rooms/keys/seal/0.3/payload.d.ts.map +1 -0
  101. package/dist/rooms/keys/seal/0.3/payload.js +229 -0
  102. package/dist/rooms/keys/seal/0.3/payload.js.map +1 -0
  103. package/dist/rooms/keys/watch/0.1/payload.d.ts +652 -0
  104. package/dist/rooms/keys/watch/0.1/payload.d.ts.map +1 -0
  105. package/dist/rooms/keys/watch/0.1/payload.js +343 -0
  106. package/dist/rooms/keys/watch/0.1/payload.js.map +1 -0
  107. package/dist/rooms/records/get/0.1/payload.d.ts +4 -4
  108. package/dist/rooms/records/get/0.1/payload.js +1 -1
  109. package/dist/rooms/records/get/0.2/payload.d.ts +13 -2
  110. package/dist/rooms/records/get/0.2/payload.d.ts.map +1 -1
  111. package/dist/rooms/records/get/0.2/payload.js +1 -1
  112. package/dist/rooms/records/get/0.2/payload.js.map +1 -1
  113. package/dist/rooms/records/get/0.3/payload.d.ts +1064 -0
  114. package/dist/rooms/records/get/0.3/payload.d.ts.map +1 -0
  115. package/dist/rooms/records/get/0.3/payload.js +571 -0
  116. package/dist/rooms/records/get/0.3/payload.js.map +1 -0
  117. package/dist/rooms/records/list/0.1/payload.d.ts +4 -4
  118. package/dist/rooms/records/list/0.1/payload.js +1 -1
  119. package/dist/rooms/records/list/0.2/payload.d.ts +4 -4
  120. package/dist/rooms/records/list/0.2/payload.js +1 -1
  121. package/dist/rooms/records/list/0.3/payload.d.ts +4 -4
  122. package/dist/rooms/records/list/0.3/payload.js +1 -1
  123. package/dist/rooms/records/list/0.4/payload.d.ts +4 -4
  124. package/dist/rooms/records/list/0.4/payload.js +1 -1
  125. package/dist/rooms/records/list/0.5/payload.d.ts +13 -2
  126. package/dist/rooms/records/list/0.5/payload.d.ts.map +1 -1
  127. package/dist/rooms/records/list/0.5/payload.js +1 -1
  128. package/dist/rooms/records/list/0.5/payload.js.map +1 -1
  129. package/dist/rooms/records/list/0.6/payload.d.ts +1096 -0
  130. package/dist/rooms/records/list/0.6/payload.d.ts.map +1 -0
  131. package/dist/rooms/records/list/0.6/payload.js +596 -0
  132. package/dist/rooms/records/list/0.6/payload.js.map +1 -0
  133. package/dist/rooms/records/put/0.1/payload.d.ts +4 -4
  134. package/dist/rooms/records/put/0.1/payload.js +1 -1
  135. package/dist/rooms/records/put/0.2/payload.d.ts +4 -4
  136. package/dist/rooms/records/put/0.2/payload.js +1 -1
  137. package/dist/rooms/records/put/0.3/payload.d.ts +4 -4
  138. package/dist/rooms/records/put/0.3/payload.js +1 -1
  139. package/dist/rooms/records/put/0.4/payload.d.ts +146 -6
  140. package/dist/rooms/records/put/0.4/payload.d.ts.map +1 -1
  141. package/dist/rooms/records/put/0.4/payload.js +81 -3
  142. package/dist/rooms/records/put/0.4/payload.js.map +1 -1
  143. package/dist/rooms/records/put/0.5/payload.d.ts +1808 -0
  144. package/dist/rooms/records/put/0.5/payload.d.ts.map +1 -0
  145. package/dist/rooms/records/put/0.5/payload.js +984 -0
  146. package/dist/rooms/records/put/0.5/payload.js.map +1 -0
  147. package/dist/rooms/watch/0.1/payload.d.ts +497 -0
  148. package/dist/rooms/watch/0.1/payload.d.ts.map +1 -0
  149. package/dist/rooms/watch/0.1/payload.js +268 -0
  150. package/dist/rooms/watch/0.1/payload.js.map +1 -0
  151. package/dist/trust-task-discovery/0.1/payload.d.ts +4 -4
  152. package/dist/trust-task-discovery/0.1/payload.js +1 -1
  153. package/dist/trust-task-discovery/0.2/payload.d.ts +4 -4
  154. package/dist/trust-task-discovery/0.2/payload.js +1 -1
  155. package/dist/trust-task-discovery/0.3/payload.d.ts +14 -2
  156. package/dist/trust-task-discovery/0.3/payload.d.ts.map +1 -1
  157. package/dist/trust-task-discovery/0.3/payload.js +1 -1
  158. package/dist/trust-task-discovery/0.3/payload.js.map +1 -1
  159. package/dist/trust-task-discovery/0.4/payload.d.ts +521 -0
  160. package/dist/trust-task-discovery/0.4/payload.d.ts.map +1 -0
  161. package/dist/trust-task-discovery/0.4/payload.js +266 -0
  162. package/dist/trust-task-discovery/0.4/payload.js.map +1 -0
  163. package/dist/vtc/_shared/0.7/network-membership.d.ts +16 -0
  164. package/dist/vtc/_shared/0.7/network-membership.d.ts.map +1 -0
  165. package/dist/vtc/_shared/0.7/network-membership.js +6 -0
  166. package/dist/vtc/_shared/0.7/network-membership.js.map +1 -0
  167. package/dist/vtc/boards/delete/0.1/payload.d.ts +416 -0
  168. package/dist/vtc/boards/delete/0.1/payload.d.ts.map +1 -0
  169. package/dist/vtc/boards/delete/0.1/payload.js +236 -0
  170. package/dist/vtc/boards/delete/0.1/payload.js.map +1 -0
  171. package/dist/vtc/boards/update/0.1/payload.d.ts +147 -2
  172. package/dist/vtc/boards/update/0.1/payload.d.ts.map +1 -1
  173. package/dist/vtc/boards/update/0.1/payload.js +72 -0
  174. package/dist/vtc/boards/update/0.1/payload.js.map +1 -1
  175. package/dist/vtc/elections/list/0.5/payload.d.ts +3 -3
  176. package/dist/vtc/elections/list/0.5/payload.js +1 -1
  177. package/dist/vtc/elections/list/0.5/payload.js.map +1 -1
  178. package/dist/vtc/elections/show/0.6/payload.d.ts +3 -3
  179. package/dist/vtc/elections/show/0.6/payload.js +1 -1
  180. package/dist/vtc/elections/show/0.6/payload.js.map +1 -1
  181. package/dist/vtc/elections/tombstones/show/0.1/payload.d.ts +593 -0
  182. package/dist/vtc/elections/tombstones/show/0.1/payload.d.ts.map +1 -0
  183. package/dist/vtc/elections/tombstones/show/0.1/payload.js +335 -0
  184. package/dist/vtc/elections/tombstones/show/0.1/payload.js.map +1 -0
  185. package/dist/vtc/networks/deliver/0.1/payload.d.ts +354 -0
  186. package/dist/vtc/networks/deliver/0.1/payload.d.ts.map +1 -0
  187. package/dist/vtc/networks/deliver/0.1/payload.js +213 -0
  188. package/dist/vtc/networks/deliver/0.1/payload.js.map +1 -0
  189. package/dist/vtc/networks/evidence/0.1/payload.d.ts +14 -2
  190. package/dist/vtc/networks/evidence/0.1/payload.d.ts.map +1 -1
  191. package/dist/vtc/networks/evidence/0.1/payload.js +1 -1
  192. package/dist/vtc/networks/evidence/0.1/payload.js.map +1 -1
  193. package/dist/vtc/networks/evidence/0.2/payload.d.ts +412 -0
  194. package/dist/vtc/networks/evidence/0.2/payload.d.ts.map +1 -0
  195. package/dist/vtc/networks/evidence/0.2/payload.js +233 -0
  196. package/dist/vtc/networks/evidence/0.2/payload.js.map +1 -0
  197. package/dist/vtc/networks/groups/register/0.1/payload.d.ts +14 -2
  198. package/dist/vtc/networks/groups/register/0.1/payload.d.ts.map +1 -1
  199. package/dist/vtc/networks/groups/register/0.1/payload.js +1 -1
  200. package/dist/vtc/networks/groups/register/0.1/payload.js.map +1 -1
  201. package/dist/vtc/networks/groups/register/0.2/payload.d.ts +680 -0
  202. package/dist/vtc/networks/groups/register/0.2/payload.d.ts.map +1 -0
  203. package/dist/vtc/networks/groups/register/0.2/payload.js +401 -0
  204. package/dist/vtc/networks/groups/register/0.2/payload.js.map +1 -0
  205. package/dist/vtc/networks/join/0.1/payload.d.ts +14 -2
  206. package/dist/vtc/networks/join/0.1/payload.d.ts.map +1 -1
  207. package/dist/vtc/networks/join/0.1/payload.js +1 -1
  208. package/dist/vtc/networks/join/0.1/payload.js.map +1 -1
  209. package/dist/vtc/networks/join/0.2/payload.d.ts +760 -0
  210. package/dist/vtc/networks/join/0.2/payload.d.ts.map +1 -0
  211. package/dist/vtc/networks/join/0.2/payload.js +445 -0
  212. package/dist/vtc/networks/join/0.2/payload.js.map +1 -0
  213. package/dist/vtc/networks/leave/0.1/payload.d.ts +14 -2
  214. package/dist/vtc/networks/leave/0.1/payload.d.ts.map +1 -1
  215. package/dist/vtc/networks/leave/0.1/payload.js +1 -1
  216. package/dist/vtc/networks/leave/0.1/payload.js.map +1 -1
  217. package/dist/vtc/networks/leave/0.2/payload.d.ts +664 -0
  218. package/dist/vtc/networks/leave/0.2/payload.d.ts.map +1 -0
  219. package/dist/vtc/networks/leave/0.2/payload.js +393 -0
  220. package/dist/vtc/networks/leave/0.2/payload.js.map +1 -0
  221. package/dist/vtc/networks/list/0.1/payload.d.ts +14 -2
  222. package/dist/vtc/networks/list/0.1/payload.d.ts.map +1 -1
  223. package/dist/vtc/networks/list/0.1/payload.js +1 -1
  224. package/dist/vtc/networks/list/0.1/payload.js.map +1 -1
  225. package/dist/vtc/networks/list/0.2/payload.d.ts +713 -0
  226. package/dist/vtc/networks/list/0.2/payload.d.ts.map +1 -0
  227. package/dist/vtc/networks/list/0.2/payload.js +417 -0
  228. package/dist/vtc/networks/list/0.2/payload.js.map +1 -0
  229. package/dist/vtc/networks/repudiate/0.1/payload.d.ts +14 -2
  230. package/dist/vtc/networks/repudiate/0.1/payload.d.ts.map +1 -1
  231. package/dist/vtc/networks/repudiate/0.1/payload.js +1 -1
  232. package/dist/vtc/networks/repudiate/0.1/payload.js.map +1 -1
  233. package/dist/vtc/networks/repudiate/0.2/payload.d.ts +680 -0
  234. package/dist/vtc/networks/repudiate/0.2/payload.d.ts.map +1 -0
  235. package/dist/vtc/networks/repudiate/0.2/payload.js +400 -0
  236. package/dist/vtc/networks/repudiate/0.2/payload.js.map +1 -0
  237. package/dist/vtc/networks/show/0.1/payload.d.ts +14 -2
  238. package/dist/vtc/networks/show/0.1/payload.d.ts.map +1 -1
  239. package/dist/vtc/networks/show/0.1/payload.js +1 -1
  240. package/dist/vtc/networks/show/0.1/payload.js.map +1 -1
  241. package/dist/vtc/networks/show/0.2/payload.d.ts +650 -0
  242. package/dist/vtc/networks/show/0.2/payload.d.ts.map +1 -0
  243. package/dist/vtc/networks/show/0.2/payload.js +388 -0
  244. package/dist/vtc/networks/show/0.2/payload.js.map +1 -0
  245. package/package.json +1 -1
  246. package/src/_extends.ts +5 -0
  247. package/src/_shared/components.ts +352 -1
  248. package/src/did-management/stats/set-resolution/0.1/payload.ts +312 -0
  249. package/src/index.ts +76 -0
  250. package/src/process-attestation/0.1/payload.ts +53 -9
  251. package/src/rooms/_shared/0.1/room.ts +1 -1
  252. package/src/rooms/_shared/0.2/room.ts +1 -1
  253. package/src/rooms/_shared/0.3/member-profile.ts +11 -0
  254. package/src/rooms/changed/0.1/payload.ts +115 -0
  255. package/src/rooms/keys/act/0.1/payload.ts +5 -5
  256. package/src/rooms/keys/act/0.10/payload.ts +15 -3
  257. package/src/rooms/keys/act/0.11/payload.ts +408 -0
  258. package/src/rooms/keys/act/0.12/payload.ts +396 -0
  259. package/src/rooms/keys/act/0.2/payload.ts +5 -5
  260. package/src/rooms/keys/act/0.3/payload.ts +5 -5
  261. package/src/rooms/keys/act/0.4/payload.ts +5 -5
  262. package/src/rooms/keys/act/0.5/payload.ts +5 -5
  263. package/src/rooms/keys/act/0.6/payload.ts +5 -5
  264. package/src/rooms/keys/act/0.7/payload.ts +5 -5
  265. package/src/rooms/keys/act/0.8/payload.ts +5 -5
  266. package/src/rooms/keys/act/0.9/payload.ts +5 -5
  267. package/src/rooms/keys/browse/0.1/payload.ts +5 -5
  268. package/src/rooms/keys/browse/0.2/payload.ts +5 -5
  269. package/src/rooms/keys/browse/0.3/payload.ts +15 -3
  270. package/src/rooms/keys/browse/0.4/payload.ts +730 -0
  271. package/src/rooms/keys/changed/0.1/payload.ts +138 -0
  272. package/src/rooms/keys/profile/read/0.1/payload.ts +28 -2
  273. package/src/rooms/keys/profile/write/0.1/payload.ts +28 -2
  274. package/src/rooms/keys/read/0.1/payload.ts +15 -3
  275. package/src/rooms/keys/read/0.2/payload.ts +855 -0
  276. package/src/rooms/keys/seal/0.1/payload.ts +5 -5
  277. package/src/rooms/keys/seal/0.2/payload.ts +14 -3
  278. package/src/rooms/keys/seal/0.3/payload.ts +282 -0
  279. package/src/rooms/keys/watch/0.1/payload.ts +452 -0
  280. package/src/rooms/records/get/0.1/payload.ts +5 -5
  281. package/src/rooms/records/get/0.2/payload.ts +14 -3
  282. package/src/rooms/records/get/0.3/payload.ts +684 -0
  283. package/src/rooms/records/list/0.1/payload.ts +5 -5
  284. package/src/rooms/records/list/0.2/payload.ts +5 -5
  285. package/src/rooms/records/list/0.3/payload.ts +5 -5
  286. package/src/rooms/records/list/0.4/payload.ts +5 -5
  287. package/src/rooms/records/list/0.5/payload.ts +14 -3
  288. package/src/rooms/records/list/0.6/payload.ts +673 -0
  289. package/src/rooms/records/put/0.1/payload.ts +5 -5
  290. package/src/rooms/records/put/0.2/payload.ts +5 -5
  291. package/src/rooms/records/put/0.3/payload.ts +5 -5
  292. package/src/rooms/records/put/0.4/payload.ts +95 -5
  293. package/src/rooms/records/put/0.5/payload.ts +1095 -0
  294. package/src/rooms/watch/0.1/payload.ts +340 -0
  295. package/src/trust-task-discovery/0.1/payload.ts +5 -5
  296. package/src/trust-task-discovery/0.2/payload.ts +5 -5
  297. package/src/trust-task-discovery/0.3/payload.ts +15 -3
  298. package/src/trust-task-discovery/0.4/payload.ts +387 -0
  299. package/src/vtc/_shared/0.7/network-membership.ts +17 -0
  300. package/src/vtc/boards/delete/0.1/payload.ts +293 -0
  301. package/src/vtc/boards/update/0.1/payload.ts +91 -2
  302. package/src/vtc/elections/list/0.5/payload.ts +2 -2
  303. package/src/vtc/elections/show/0.6/payload.ts +2 -2
  304. package/src/vtc/elections/tombstones/show/0.1/payload.ts +401 -0
  305. package/src/vtc/networks/deliver/0.1/payload.ts +254 -0
  306. package/src/vtc/networks/evidence/0.1/payload.ts +15 -3
  307. package/src/vtc/networks/evidence/0.2/payload.ts +290 -0
  308. package/src/vtc/networks/groups/register/0.1/payload.ts +15 -3
  309. package/src/vtc/networks/groups/register/0.2/payload.ts +446 -0
  310. package/src/vtc/networks/join/0.1/payload.ts +15 -3
  311. package/src/vtc/networks/join/0.2/payload.ts +492 -0
  312. package/src/vtc/networks/leave/0.1/payload.ts +15 -3
  313. package/src/vtc/networks/leave/0.2/payload.ts +434 -0
  314. package/src/vtc/networks/list/0.1/payload.ts +15 -3
  315. package/src/vtc/networks/list/0.2/payload.ts +463 -0
  316. package/src/vtc/networks/repudiate/0.1/payload.ts +15 -3
  317. package/src/vtc/networks/repudiate/0.2/payload.ts +445 -0
  318. package/src/vtc/networks/show/0.1/payload.ts +15 -3
  319. package/src/vtc/networks/show/0.2/payload.ts +425 -0
@@ -1678,6 +1678,10 @@ export type RecordConfidence = number;
1678
1678
  * **It counts the room, never the page.** The same rule `DataCommitment` states, and the same trap: a count scoped to what was returned is one a host satisfies by construction. So this is only comparable against a listing read to the end with **no** `prefix` and **no** `sinceVersion` — a filtered listing legitimately holds fewer, and a reader that compares one against this has found a discrepancy it created itself.
1679
1679
  */
1680
1680
  export type RecordCount = number;
1681
+ /**
1682
+ * The instant the author made the edit that produced this version, RFC 3339 in UTC (`Z`). Set by the writer of every version after the first, and absent on the first, so that a reader seeing a record for the first time can tell whether it was ever edited — which `version` cannot say, since curation moves it too. Signed with the body on the sealed tiers. A reader shows a record carrying it as edited, and treats an implausible one as `SealedRecordBody` (*Edits*) says. Governed by `RoomProfile.recordMembers` like `writtenAt`. No host enforces or reads it.
1683
+ */
1684
+ export type RecordEditedAt = string;
1681
1685
  /**
1682
1686
  * One thing a record cites in its support, discriminated by `kind`.
1683
1687
  *
@@ -1702,6 +1706,10 @@ export type RecordId = string;
1702
1706
  * The community's own identifier for one received notification, stable across the revisions that replace it. Opaque and compared for equality only; unguessable, because a read by a caller without the capability is refused and an enumerable identifier would turn the refusal into an oracle.
1703
1707
  */
1704
1708
  export type RecordId_VtcNotificationsV0_1 = string;
1709
+ /**
1710
+ * What a reader shows a record as. Defined values: `note` — something kept in the room's library, titled or not, its `body` markdown; `message` — a turn in the room's conversation, its words in `body` as plain text; `reaction` — a short response to another record, its value in `body` (`SealedRecordBody`, *Reactions*). An open set, not an enumeration, so a new kind needs no new version of any schema: a reader MUST present a record whose kind it does not know as a note, and MUST NOT refuse a record for its kind. Absent means `note`, though a reader that keeps a conversation apart MAY show an untitled record without a kind as a message (*Untitled records*). A new version of a record MUST keep its kind. lowerCamelCase, at most 64 characters.
1711
+ */
1712
+ export type RecordKind = string;
1705
1713
  /**
1706
1714
  * The path from one record's leaf to the room's `DataCommitment` — a Merkle inclusion proof, in the vocabulary this work already uses for it.
1707
1715
  *
@@ -1740,6 +1748,10 @@ export type RecordType = "authorization" | "recognition";
1740
1748
  * The instant after which the record's author no longer stands behind it as current. OPTIONAL; absent means the record does not expire. A reader hides a record whose `validUntil` has passed from default listings, search and recall, and shows it only on explicit request (`SealedRecordBody`, **Expiry**). No host enforces it.
1741
1749
  */
1742
1750
  export type RecordValidUntil = string;
1751
+ /**
1752
+ * The instant the author wrote the record, RFC 3339 in UTC (`Z`). Set by the author and kept unchanged when the record is rewritten; an edit is marked by `editedAt`. OPTIONAL on a note; a `message` or `reaction` SHOULD carry it. The author's claim, not an attested time: a reader orders messages by it, compares it with the host's `createdAt`, and treats an implausible or backdated one as `SealedRecordBody` (*When it was written*) says. No host enforces or reads it.
1753
+ */
1754
+ export type RecordWrittenAt = string;
1743
1755
  /**
1744
1756
  * What it takes to let a value LEAVE. Distinct from `Sensitivity`, which governs showing it to the holder.
1745
1757
  *
@@ -9587,6 +9599,8 @@ export interface FieldVisibility {
9587
9599
  * - check that the decrypted length equals the padded length, that every padding byte is zero, and, after removing the padding, that the plaintext matches `digest`.
9588
9600
  *
9589
9601
  * A reader **MUST** refuse a file that fails any check, and **MUST NOT** present it with a warning instead. A reader that streams **MUST NOT** treat the plaintext as received — save it under its final name, render it, or hand it to another component — until the digest has verified; it writes to a temporary destination and discards that destination on a mismatch.
9602
+ *
9603
+ * **An image's size and preview.** `width`, `height` and `preview` are OPTIONAL and advisory: they let a reader lay out an image, and show something, before it fetches and decrypts the blob. A reader that fetches the file checks them against the bytes — the decoded image's dimensions, and that the file is an image at all — and on a mismatch uses the bytes and discards them; it MUST NOT treat any of them as evidence about the file. On `attributed` and `private` rooms they are inside the sealed, signed body like the rest of the manifest, so the host learns nothing from them; on an `open` room they are in the clear, as everything there is, and a writer carries them only with `rooms/records/put/0.5` or later. A writer uses them only once the room's profile lists them in `recordMembers` (`RoomProfile`), as with the other members a reader that predates them refuses.
9590
9604
  */
9591
9605
  export interface FileManifest {
9592
9606
  /**
@@ -9626,6 +9640,27 @@ export interface FileManifest {
9626
9640
  * The file key itself, 32 bytes base64url without padding: present on an `open` room only, where there is no storage key to derive it from. Minted by the uploader from a cryptographically secure random source for this one file and never reused. MUST be absent on `attributed` and `private` rooms, where the key is derived and never stored.
9627
9641
  */
9628
9642
  fileKey?: string;
9643
+ /**
9644
+ * The image's width in pixels, as the uploader read it. Advisory. A writer sets `width` and `height` together or neither; a reader ignores one without the other. A reader checks it against the decoded image.
9645
+ */
9646
+ width?: number;
9647
+ /**
9648
+ * The image's height in pixels, as the uploader read it. Advisory. A writer sets `width` and `height` together or neither; a reader ignores one without the other. A reader checks it against the decoded image.
9649
+ */
9650
+ height?: number;
9651
+ /**
9652
+ * A small image standing in for the file until it is fetched: at most 8192 bytes before encoding, enough for a blurred thumbnail and small enough not to swell the record every listing reader opens. A reader renders it only as a raster image it decodes itself — never as SVG or any other type that can carry active content, never as a link, never fetching anything — and replaces it with the file once fetched. It is the uploader's rendering of the file, not a digest of it: a reader MUST NOT present it as the file's contents.
9653
+ */
9654
+ preview?: {
9655
+ /**
9656
+ * The preview's own media type. Raster types only.
9657
+ */
9658
+ mediaType: "image/jpeg" | "image/png" | "image/webp";
9659
+ /**
9660
+ * The preview's bytes, base64url without padding: at most 8192 bytes decoded.
9661
+ */
9662
+ data: string;
9663
+ };
9629
9664
  }
9630
9665
  /**
9631
9666
  * A person's account on one forge. `id` is authoritative; `login` is for display only, because logins can be renamed and re-registered.
@@ -11478,6 +11513,46 @@ export interface NetworkMembership {
11478
11513
  joinedAt?: string;
11479
11514
  updatedAt: string;
11480
11515
  }
11516
+ export interface NetworkMembership_VtcV0_7 {
11517
+ /**
11518
+ * The network's DID.
11519
+ */
11520
+ network: string;
11521
+ /**
11522
+ * Where the network's API is reached: the base its `/.well-known/vtn` profile is served under.
11523
+ */
11524
+ url: string;
11525
+ /**
11526
+ * The network's name, as its profile gives it.
11527
+ */
11528
+ name?: string;
11529
+ /**
11530
+ * `acknowledged`: the community is a member — it signed the acknowledgement of the network's grant. `repudiated`: the community rejected the network's listing of it. `departed`: the community left, by repudiating the grant.
11531
+ */
11532
+ state: "acknowledged" | "repudiated" | "departed";
11533
+ /**
11534
+ * The network's listing credential naming the community, as the community verified it.
11535
+ */
11536
+ listing: {};
11537
+ /**
11538
+ * The network's membership grant (VMC), once the community acknowledged.
11539
+ */
11540
+ grant?: {};
11541
+ /**
11542
+ * The community's acknowledgement (VMC carrying the grant's digest).
11543
+ */
11544
+ acknowledgement?: {};
11545
+ /**
11546
+ * The community's repudiation (VSC) of the listing, or — on departure — of the grant.
11547
+ */
11548
+ repudiation?: {};
11549
+ /**
11550
+ * @maxItems 64
11551
+ */
11552
+ groups: RegisteredGroup_VtcV0_7[];
11553
+ joinedAt?: string;
11554
+ updatedAt: string;
11555
+ }
11481
11556
  /**
11482
11557
  * The discoverability a card has when the community creates it, before its member chooses. A new card is never published beyond the community (VTI-DIR-042), so there is no member for that here: `externalCards` says whether the member may turn it on.
11483
11558
  */
@@ -12757,6 +12832,63 @@ export interface RecordMetadataV2 {
12757
12832
  */
12758
12833
  blobs?: [BlobRef];
12759
12834
  }
12835
+ /**
12836
+ * What `rooms/records/list/0.6` returns, and `rooms/keys/browse/0.4` passes through: `RecordMetadataV2` plus `kind` on an `open` room, `createdAt` and `bodyStoredAt` on every tier and `createdBy` on `open` and `attributed`. A separate definition, not a change to `RecordMetadataV2`, so that `rooms/records/list/0.2` to `0.5` keep the exact shape they published. Never the body.
12837
+ */
12838
+ export interface RecordMetadataV3 {
12839
+ /**
12840
+ * The record's key within the room. On `attributed` and `private` rooms this MUST be opaque — a random identifier, never a descriptive slug. A key reading `decision/acquire-northwind` defeats the encryption sitting beside it; structured naming belongs inside the sealed body.
12841
+ */
12842
+ key: string;
12843
+ /**
12844
+ * Server-assigned, monotonic per room.
12845
+ */
12846
+ version: number;
12847
+ /**
12848
+ * The epoch the record was sealed under. Absent on an `open` room.
12849
+ */
12850
+ epoch?: number;
12851
+ /**
12852
+ * Curation state. `retracted` is a tombstone: the body is gone, the key and version remain so incremental sync converges and the audit chain stays intact.
12853
+ */
12854
+ status?: "active" | "deprecated" | "retracted";
12855
+ updatedAt: string;
12856
+ /**
12857
+ * When the host stored the record's first version: RFC 3339, set by the host, never by a writer. Host metadata, not body, so it is served on every tier. A host MUST set it when it stores a record's first version and MUST keep it unchanged for as long as it holds the record — across every later version, every curation, retraction included, and a member's withdrawal — so that it says when the room received the record, which `updatedAt` cannot once the record has been edited or curated. A host that stored a record before it kept `createdAt` MUST omit it for that record rather than supply a guess such as the earliest `updatedAt` it still holds; a reader then falls back to `updatedAt` (`SealedRecordBody`, *When it was written*). Readers order messages and judge `writtenAt` by it.
12858
+ */
12859
+ createdAt?: string;
12860
+ /**
12861
+ * The author of the record's first version, as the host recorded it when it stored that version: the DID it authenticated for the write on an `open` room, and on an `attributed` one the author it records for every write. Set by the host, never by a writer, and kept unchanged for as long as it holds the record — across every later version, every curation and a retraction — like `createdAt`. Served on `open` and `attributed` rooms only: a `private` room's host records no author, and MUST NOT serve this. Omitted for a record stored before the host kept it, rather than guessed. Readers use it to apply the rules about a rewrite by another member to a record they see for the first time (`SealedRecordBody`, *The record's original author*).
12862
+ */
12863
+ createdBy?: string;
12864
+ /**
12865
+ * When the host stored the body the record's current version carries: the time of the `rooms/records/put` that wrote that body. Set by the host, never by a writer. A curation (`rooms/records/curate`), and anything else that moves the version without writing a new author-signed body, leaves it unchanged; for the first version it equals `createdAt`. The host knows which task wrote each version, so it is served on every tier, `private` included, and says nothing about the body. Readers verify the current version's proof against the author's DID document as it stood at this time (`SealedRecordBody`, *Which DID document*). Omitted for a version stored before the host kept it, rather than guessed.
12866
+ */
12867
+ bodyStoredAt?: string;
12868
+ /**
12869
+ * Present only on an `open` room; sealed with the body otherwise.
12870
+ */
12871
+ title?: string;
12872
+ /**
12873
+ * Present only on an `open` room; sealed with the body otherwise.
12874
+ */
12875
+ description?: string;
12876
+ /**
12877
+ * The member who wrote it. Present on `open` and `attributed`; on `private` the author is inside the sealed body, where only members can read it.
12878
+ */
12879
+ author?: string;
12880
+ /**
12881
+ * The stored blobs this record names, as rooms/records/put/0.2 wrote them. Absent when it names none, when it is retracted, and on records written by put 0.1. Cleartext on every tier, as on the write, so a listing discloses which records carry files, never anything about the files beyond the blobs' sizes.
12882
+ *
12883
+ * @minItems 1
12884
+ * @maxItems 1
12885
+ */
12886
+ blobs?: [BlobRef];
12887
+ /**
12888
+ * The record's `kind` as its current version's `cleartext` carries it. Present only on an `open` room, where the host reads the body anyway; on `attributed` and `private` rooms `kind` is sealed with the body and a host MUST NOT serve it, nor anything from which it could be inferred. Absent on a record that carries none — which a reader reads as `note` — and on a tombstone, which keeps nothing of its body.
12889
+ */
12890
+ kind?: RecordKind;
12891
+ }
12760
12892
  /**
12761
12893
  * The mark a prune leaves: **that** records were removed, when, and how many — never which, and never anything they said.
12762
12894
  *
@@ -12799,6 +12931,19 @@ export interface RecordPrune_RoomsV0_2 {
12799
12931
  */
12800
12932
  removed: number;
12801
12933
  }
12934
+ /**
12935
+ * Names another record of the same room: the record a reply answers or a reaction responds to. Never a record of another room — a citation that crosses rooms is `RecordEvidenceRecord`. A reader resolves it only against records it can already list or read in this room, and MUST NOT fetch anything else because of it. It MUST NOT name a record of kind `reaction`.
12936
+ */
12937
+ export interface RecordReference {
12938
+ /**
12939
+ * The record's key, as in `rooms/records/put`. Opaque on the sealed tiers, like every key there.
12940
+ */
12941
+ key: string;
12942
+ /**
12943
+ * The version of the record the author was answering. OPTIONAL. A reader SHOULD say that the target has changed since only when its content has, never because its version moved: curation moves a record's version without touching its content (`SealedRecordBody`, *Whether the target has changed*).
12944
+ */
12945
+ version?: number;
12946
+ }
12802
12947
  /**
12803
12948
  * How long a room keeps its records, by age: the room's **record retention**. Records older than it states become **eligible** to be removed by `rooms/records/prune`; nothing is removed until a holder of `admin` asks for a prune, and nothing a prune removes can be brought back.
12804
12949
  *
@@ -12919,6 +13064,33 @@ export interface RegisteredGroup {
12919
13064
  acceptance: {};
12920
13065
  registeredAt: string;
12921
13066
  }
13067
+ export interface RegisteredGroup_VtcV0_7 {
13068
+ /**
13069
+ * A role the network defines, e.g. `admins`: lowercase letters, digits, `-` and `_`.
13070
+ */
13071
+ role: string;
13072
+ /**
13073
+ * The community's identifier for the group.
13074
+ */
13075
+ groupId: string;
13076
+ /**
13077
+ * The group's own DID, which the registration names as its `group`.
13078
+ */
13079
+ groupDid: string;
13080
+ /**
13081
+ * Where the network delivers broadcasts for the group: the community's Trust Task endpoint, at which the network sends them as `vtc/networks/deliver`.
13082
+ */
13083
+ endpoint: string;
13084
+ /**
13085
+ * The registration: the community's signed `vtn/groups/register` request as the network accepted it — a complete Trust Task document, with its proof, naming the network as `recipient` and the group, `role` and `endpoint` in its payload.
13086
+ */
13087
+ registration: {};
13088
+ /**
13089
+ * The network's `groupRegistered/1` statement (VSC) accepting the registration: subject the group, `object.digestMultibase` the registration's digest — SHA-256 over the RFC 8785 (JCS) form of the signed request including its proof.
13090
+ */
13091
+ acceptance: {};
13092
+ registeredAt: string;
13093
+ }
12922
13094
  /**
12923
13095
  * A group serving a role: the member's signed registration and the network's groupRegistered credential accepting it.
12924
13096
  */
@@ -13917,7 +14089,7 @@ export interface RoomPass {
13917
14089
  *
13918
14090
  * **Plain text, never instructions.** Every member is free text chosen by whoever wrote the profile and shown to every member of the room. A reader renders `name`, `description` and `tags` as text — never as markup, never as a link it follows — removes or replaces control characters before showing them, and MUST NOT treat any of it as instructions, which matters most for an agent acting for a member. A writer MUST NOT put personal data or a credential in any member.
13919
14091
  *
13920
- * **Growth.** A new optional member arrives in a later version of this component. A reader refuses a member it does not know (the `SealedRecordBody` rules), so a profile carrying one is not shown by a reader that predates it, and a writer SHOULD NOT use a member it cannot expect the room's readers to know. An ecosystem extension goes in `ext`, which a reader that does not understand it ignores. A change no earlier reader could survive is a new statement under a new derivation label (`openvtc/room/profile/v2`), written beside this one until the room's readers have moved.
14092
+ * **Growth.** A new optional member arrives in place, additively, as `recordMembers` did, or in a later version of this component. A reader refuses a member it does not know (the `SealedRecordBody` rules), so a profile carrying one is not shown by a reader that predates it, and a writer SHOULD NOT use a member it cannot expect the room's readers to know. An ecosystem extension goes in `ext`, which a reader that does not understand it ignores. A change no earlier reader could survive is a new statement under a new derivation label (`openvtc/room/profile/v2`), written beside this one until the room's readers have moved.
13921
14093
  */
13922
14094
  export interface RoomProfile {
13923
14095
  /**
@@ -13947,11 +14119,77 @@ export interface RoomProfile {
13947
14119
  * One emoji — a single extended grapheme cluster, such as `📋` — that a surface MAY show beside the name. Text, rendered as text: never an image, never a URL, never anything a reader fetches, since a fetched icon would tell whoever serves it which member opened which room, and when. A reader that cannot render it shows nothing in its place.
13948
14120
  */
13949
14121
  emoji?: string;
14122
+ /**
14123
+ * The optional `SealedRecordBody` members — and on an `open` room the `cleartext` members of `rooms/records/put` — that the room's writers may use beyond the base set, as a set: order carries no meaning. Defined values: `kind`, `inReplyTo`, `writtenAt`, `editedAt`, and `width`, `height` and `preview`, which name the `FileManifest` members of those names inside a record's `file`. A writer MUST NOT write a member this governs unless the room's current profile lists it; absent means none (`SealedRecordBody`, *When a writer may use these members*). A writer MAY rely on a profile it resolved within the room's current epoch. The base set is every other member of `SealedRecordBody`, which a writer may always use. A value a writer does not know grants it nothing. Set by a member whose authority confers `curate` or `admin` (who may write the profile at all) — with `rooms/keys/profile/write` on a sealed tier, or `rooms/records/put` at `room-profile` on an `open` room — and never by default. Whether the room's readers are ready is the owner's or a curator's decision, made out of band; the order is readers (profile readers included, since a reader that predates this member refuses the profile carrying it), then the owner's key holder, which re-writes the profile after a removal and so MUST accept this member before any profile carries it, then on the sealed tiers the key holders that seal for writers, then the profile (`SealedRecordBody`, *Turning them on*). Listing a member never obliges a writer to use it, and removing one stops writers using it by the room's next epoch at the latest; records already written keep it.
14124
+ *
14125
+ * @minItems 1
14126
+ * @maxItems 32
14127
+ */
14128
+ recordMembers?: [string, ...string[]];
13950
14129
  /**
13951
14130
  * Ecosystem-defined extension members per SPEC.md §4.5.1. A reader ignores what it does not understand.
13952
14131
  */
13953
14132
  ext?: Ext;
13954
14133
  }
14134
+ /**
14135
+ * The room's profile as a record carries it: the `roomProfile` member of a `SealedRecordBody`, signed by its author like every record body, with the evidence a reader needs to decide whether the author was entitled to say it.
14136
+ *
14137
+ * **Where it is: one record per epoch, at a key only members can compute.** On an `attributed` or `private` room the profile written under epoch `E` is stored at the record key
14138
+ *
14139
+ * profile_key(E) = base64url-nopad(HKDF-SHA256(ikm = storage_key(E), salt = "", info = "openvtc/room/profile/v1" || roomId || u64be(E), L = 16))
14140
+ *
14141
+ * where `storage_key(E)` is the room's storage key for epoch `E` — the one records sealed under `E` are sealed with, as for a file key (`blobs.schema.json`) — `roomId` is its UTF-8 bytes exactly as on the wire, `u64be` is as `blobs.schema.json` defines it, and `salt` is the empty string. The result is 22 characters, the shape of any random record key, so to the host it is one more opaque record and the family's rule that a sealed room's keys are opaque (`RecordMetadata.key`) holds for it as for any other. A member finds it knowing nothing but the room and the epoch, which is all a member who has just joined has. Since `storage_key(E)` never leaves a member's key holder, it is the key holder that computes it (`rooms/keys/profile/read`, `rooms/keys/profile/write`).
14142
+ *
14143
+ * On an `open` room, which has no storage key and hides nothing from its host, the profile is the record at the fixed key `room-profile`, and its `cleartext.body` is the UTF-8 JSON of the signed `SealedRecordBody` — the object the sealed tiers seal — so that a reader verifies one thing on every tier. A writer SHOULD also set `cleartext.title` to the profile's `name`.
14144
+ *
14145
+ * The record is written with `rooms/records/put` like any other, so a host enforces only `write` on it and cannot tell it from any other record. Whether its author could say what the room is called is therefore decided by readers, from what the statement carries.
14146
+ *
14147
+ * **Who may write it.** The author's `authority` must confer `curate` or `admin` at the room's scope: `admin` because naming the room is part of governing it, `curate` because it is the standing to judge what the room's shared knowledge is, and a room's name and purpose are the first thing a member reads of it. `write` alone never suffices: every member able to add a record could otherwise rename the room for everyone.
14148
+ *
14149
+ * **Accepting one.** A reader resolving a room's profile MUST apply to the record at the profile's location the `SealedRecordBody` reading rules (1)–(4) — on an `open` room to the body parsed from `cleartext.body`, with rule (4) against the author the host recorded — and MUST also refuse it unless:
14150
+ * 1. it carries `roomProfile` and none of `title`, `description`, `body`, `tags` and `file`;
14151
+ * 2. on a sealed tier, the epoch it was sealed under is `E`, the epoch whose key located it;
14152
+ * 3. `authority` verifies as a host verifies a chain (`AuthorityPresentation`): at most 8 links, leaf first; every link's `proof` made with a key its own `issuer` lists for `assertionMethod`; the last link issued by `roomId`; no link widening what its parent conferred, in actions, scope or validity; the whole conferring `curate` or `admin` at this room's scope; the leaf's subject equal to the body's `author`, which stands in for a host's presenter binding; and every link valid at `issuedAt` rather than at the moment of reading. The reader MUST NOT dereference a link it was not given;
14153
+ * 4. `issuedAt` is no later than five minutes after, and no earlier than one hour before, the `updatedAt` the host reports for the record;
14154
+ * 5. where the reader holds a `RevocationList` for the room, verified as a host verifies one, no link of `authority` is revoked by an entry whose `revokedAt` is at or before `issuedAt`.
14155
+ * A reader MUST ignore a profile that fails any of these, as though it were absent — and, unlike an ordinary record, SHOULD say that it did, naming the author where the tier discloses one: a profile written by somebody without the standing to write it is somebody trying to rename the room.
14156
+ *
14157
+ * **Revocation is not retroactive.** A profile written while its author held the standing to write it stays valid after that author is removed, their grant lapses, or a `room` entry resets every credential. The statement was made with authority; withdrawing the authority withdraws what the author may do next, not what they already did, and the alternative — every member's view of the room's name going blank when whoever named it is removed — is something nobody asked for. It is not a back door. A removed party cannot write afterwards, because a host refuses every presentation a list it holds revokes; a statement back-dated into a grant its author no longer holds fails item 4 unless the host colludes; and removal advances the room's epoch, after which the owner's key holder re-writes the profile under the new epoch as the owner (`rooms/keys/profile/write`), so on the ordinary path the removed author's statement is superseded by the same act that removes them.
14158
+ *
14159
+ * **Choosing among several.** There is at most one profile per epoch, because there is one record per key. A reader at epoch `C` takes the profile at `profile_key(C)`; if there is none, or it fails the checks above, it tries `C - 1`, and so on down to the earliest epoch it can derive a storage key for, and takes the first one it accepts — the newest. It MUST NOT prefer an older profile to a newer one it accepts. A record at a profile location that is `retracted` is a profile deliberately cleared — retraction is `rooms/records/curate`, for which a host requires `curate` — and the walk stops there: the room has no profile. A profile accepted below `C` is **stale**: written before the room's latest epoch advance and not re-written since. A member of a `fromJoin` room cannot walk back at all, which is why the profile is re-written at every advance.
14160
+ *
14161
+ * **Size.** A writer SHOULD set `padding` so that the UTF-8 JSON of the signed body is a multiple of 1024 bytes, so that a host comparing ciphertext lengths learns nothing about how long the name or the description is. A reader ignores `padding`.
14162
+ */
14163
+ export interface RoomProfileStatement {
14164
+ profile: RoomProfile;
14165
+ /**
14166
+ * When the author made this statement: signed with it, the instant `authority` is evaluated at, and bounded against the host's `updatedAt` for the record so that it cannot be back-dated into a grant the author no longer holds.
14167
+ */
14168
+ issuedAt: string;
14169
+ /**
14170
+ * The author's authority chain, LEAF FIRST, ending with a credential the room issued, conferring `curate` or `admin` on `author` at this room's scope. The credentials themselves, never a zero-knowledge presentation: a reader is a member, who already sees `author`. Carried in the statement because readers, not the host, decide whether its author could say it, and a reader fetches no link it was not given. Capped at 8, as a presentation is.
14171
+ *
14172
+ * @minItems 1
14173
+ * @maxItems 8
14174
+ */
14175
+ authority:
14176
+ | [string]
14177
+ | [string, string]
14178
+ | [string, string, string]
14179
+ | [string, string, string, string]
14180
+ | [string, string, string, string, string]
14181
+ | [string, string, string, string, string, string]
14182
+ | [string, string, string, string, string, string, string]
14183
+ | [string, string, string, string, string, string, string, string];
14184
+ /**
14185
+ * Ignored by readers; see **Size**. A writer SHOULD use spaces.
14186
+ */
14187
+ padding?: string;
14188
+ /**
14189
+ * Ecosystem-defined extension members per SPEC.md §4.5.1.
14190
+ */
14191
+ ext?: Ext;
14192
+ }
13955
14193
  /**
13956
14194
  * Withdraws every credential whose `validFrom` is earlier than `revokedAt`, whoever holds it.
13957
14195
  */
@@ -14192,6 +14430,119 @@ export interface SealedRecord {
14192
14430
  */
14193
14431
  version?: number;
14194
14432
  }
14433
+ /**
14434
+ * The plaintext inside `SealedRecord.ciphertext` on an `attributed` or `private` room, as JSON, signed by its author. Client to client: no host task carries it, because a host receives only ciphertext. Defined so that every member's client writes and reads the same thing.
14435
+ *
14436
+ * **Producing.** A writer builds the object without `proof`, signs it with a W3C Data Integrity proof whose `verificationMethod` is a key of `author` and whose `proofPurpose` is `assertionMethod`, and seals the result (its UTF-8 JSON bytes) under the AEAD that binds the same `roomId`, `key`, `version` and epoch. A writer MUST support `eddsa-jcs-2022`; `ecdsa-jcs-2019` MAY be used for a hardware-backed signer.
14437
+ *
14438
+ * **Reading.** After opening a record a reader MUST, before showing any member of it or trusting its `file`: (1) parse it as this object and refuse an unknown member; (2) verify `proof` against `author`'s DID document, for `assertionMethod`, as that document stood when the host stored this version's body (*Which DID document*); (3) check that `roomId`, `key` and `version` equal the location the record was sealed at — the record's `roomId` and `key`, and `sealed.version` where present, else the record's `version` (`SealedRecord`); (4) on an `attributed` room, check that `author` equals the `author` the host recorded for the record. A reader MUST refuse a record that fails any of these, and MUST NOT show it with a warning instead; the exceptions, *Which DID document* and *An author whose DID does not resolve*, show a placeholder and none of the record.
14439
+ *
14440
+ * **Which DID document.** Rule (2) verifies the proof of the version the reader reads against `author`'s DID document **as it stood at the host's `bodyStoredAt`** for that version (`RecordMetadataV3`) — when the host stored the body that version carries, which an edit moves and a curation does not. Not at the proof's own `created`, which the author chose, and not only against the document as it is now. A key the author rotated away after `bodyStoredAt` still verifies the version; a key rotated away before it does not. Where the author's DID method keeps its history — `did:webvh`, resolved with `versionTime` — a reader resolves the document as of `bodyStoredAt`, and a proof that fails against it is refused like any other. Where the method keeps no history, a reader can only use the current document, and a proof that fails against it may be a forgery or may be a key rotated away since the version was written, which the reader cannot tell apart: it MUST show such a record as the placeholder below — its author cannot be verified, nothing of it shown — and MUST NOT drop it silently. Where the reader has no `bodyStoredAt` — a host that predates it, or a read that does not carry it — it uses the current document, and treats a proof that fails there the same way.
14441
+ *
14442
+ * **A record curated before `sealed.version` existed.** A host that predates `SealedRecord.version` moved such a record's version without recording the one it was sealed at, so it opens at neither. Where a record carries no `sealed.version` and does not open at its own `version`, a reader MAY try each earlier version in turn, newest first, and use the first at which it opens; rule (3) then checks the body against that version. It MUST NOT try a version greater than the record's own. The AEAD makes a wrong guess fail rather than mislead, and the author's signature over the location makes the version that opened the one the author wrote — so the search recovers the record without trusting the host for the answer.
14443
+ *
14444
+ * **Why the location is signed as well as sealed.** The AEAD stops the host relocating ciphertext, but every member can open and re-seal a record. Without `roomId`, `key` and `version` under the author's signature, a member could copy another member's signed body to a new key or a later version, and on a `private` room, where the host records no author, readers would attribute it to the original author.
14445
+ *
14446
+ * **A profile record.** A body carrying `roomProfile` is the room's own profile (`RoomProfileStatement`) and not one of its records: it MUST carry none of `title`, `description`, `body`, `tags`, `kind`, `inReplyTo`, `writtenAt`, `editedAt`, `file`, `basis`, `confidence`, `evidence`, `validFor` and `validUntil`, and the rules for locating, accepting and choosing it are `RoomProfileStatement`'s, applied on top of the four above. A reader that opens one in the course of reading or listing the room's records SHOULD NOT present it as a record — it is how the room describes itself, not something a member wrote into it. A reader that predates `roomProfile` refuses it by rule (1), which shows nothing rather than something wrong.
14447
+ *
14448
+ * **Provenance: what kind of claim a record is.** `basis`, `confidence`, `evidence` and `validFor` say what the author is asserting and on what footing — an observed fact, a statement of the author's own, something checked against a credential, or an agent's inference. They are inside the signature like every other member, so a reader can attribute them to `author` exactly as it attributes the body, and a change to any of them after signing fails rule (2). All four are OPTIONAL, and a record that carries none of them — every record written before they existed — verifies and reads exactly as before: absent means the author did not say, never a default value. A writer SHOULD set `basis`; an agent writing on its own account that does not know which value applies SHOULD write `inferred`, and a client relaying what its member typed SHOULD write `declared`. **They are provenance for display and weighting, never authority.** A reader MUST NOT treat any of them as granting, widening or evidencing a permission, MUST NOT let `basis: verified` stand in for verifying what `evidence` names, and MUST NOT fetch anything because `evidence` names it (see `RecordEvidence`). A reader that shows a record SHOULD show its `basis` beside its `author` — or say that none was stated — and an agent recalling records MAY weight by `basis` and `confidence`, but MUST treat `validFor.note` like `body`: as plain text, never as instructions.
14449
+ *
14450
+ * **Expiry.** `validUntil` is the instant after which the author no longer stands behind the record as current — a meeting note good for a month, a decision good for years. It is signed and sealed with the body, and nothing about it is in the clear: a host never sees it on the sealed tiers, so it cannot and MUST NOT be relied on to enforce it, and a writer MUST NOT copy it into any cleartext member of the write. A reader MUST NOT present a record whose `validUntil` is at or before the reader's current time in a default listing, search, browse or agent recall, and MAY present it on an explicit request for expired records, marked as expired. Expiry hides; it does not delete. The record, its ciphertext and any file it carries stay in the room until a member with `curate` retracts it (`rooms/records/curate`) or the room's records are pruned; a curator's agent MAY retract records it finds expired, which is how a sealed room reclaims their storage without telling its host anything about expiry.
14451
+ *
14452
+ * **Readers that predate these members.** A reader written before `basis`, `confidence`, `evidence`, `validFor` and `validUntil` refuses a body carrying any of them by rule (1), which shows nothing rather than something wrong — in particular it can never show an expired record as current. The same holds for a key holder sealing on a writer's behalf (`rooms/keys/seal`, `bodyInvalid`). A writer that meets such a refusal MAY write the record again without the provenance members, but MUST NOT drop `validUntil` to get a record accepted: a record that silently outlives its author's own expiry is the failure this member exists to prevent.
14453
+ *
14454
+ * **Kind: what a reader shows a record as.** `kind` says whether a record is a note — something kept in the room's library, titled or not — a message — a turn in the room's conversation — or a reaction to another record (`RecordKind`). It is inside the signature like every other member. Absent means `note`, so every record written before `kind` existed reads as the note it always was. The set is open: a reader MUST present a record whose `kind` it does not know as a note, and MUST NOT refuse it for its `kind`. A `message` carries its words in `body` and SHOULD carry no `title`. A reader that keeps a conversation apart from a library SHOULD show messages in the first and notes in the second, and MAY show both together. A reader MUST NOT treat `kind` as authority: it describes the record and confers nothing.
14455
+ *
14456
+ * **Untitled records.** A reader that keeps a conversation apart from a library MAY treat a record with no `kind` and no `title` as a message — it is how a writer that may not yet use `kind` writes one (*When a writer may use these members*) — and a reader that does so shows such records and records of `kind: message` in the same conversation, ordered together. Where it shows such a record as a message, it renders its `body` as plain text, as it renders a `message`'s; where it shows it as a note, it renders markdown (*What `body` is*).
14457
+ *
14458
+ * **What `body` is.** On a `message`, `body` is plain text: a reader MUST NOT render it as markup — not as markdown, not as HTML, not as a link it follows — and shows its characters as written. A reader never follows a URL in a record by itself; it MAY offer to open one only after the member explicitly asks to and confirms. On a `reaction` it is the reaction's value (*A reaction's value*), plain text likewise. On a `note`, and on a record of a kind the reader does not know, which it shows as a note, it is markdown, rendered inert. On a record with no `kind` and no `title` it follows how the reader shows it: plain text where it is shown as a message (*Untitled records*), markdown where it is shown as a note. On a record carrying `file` it is also the file's caption (*A file's caption*), plain text or markdown by the same rule; a `message` carrying `file` with an empty `body` is a photo or a file sent with no caption.
14459
+ *
14460
+ * **When it was written.** `writtenAt` is the instant the author wrote the record (`RecordWrittenAt`), in UTC, signed with the body. It is OPTIONAL on a note; a `message` or a `reaction` SHOULD carry it. **It does not move when the record is edited:** a writer rewriting a record MUST carry the `writtenAt` of the version it rewrites, unchanged; what marks an edit is `editedAt` (*Edits*). A reader orders a room's messages by `writtenAt`, then by `key` where two are equal; a message without one is ordered by the host's `createdAt` for it (`RecordMetadataV3`), which stands in for it, else by its `updatedAt`. A reader MAY instead order a conversation by `createdAt` throughout — the order in which the room received its records — rather than by `writtenAt`; the rules below about an implausible or backdated `writtenAt` still say what it shows. **The host's times.** `createdAt` is when the host stored the record's first version, and neither an edit nor a curation moves it; `updatedAt` is when the version the reader reads was stored, and both move it. So `writtenAt`, which is also kept across edits and curation, is compared with `createdAt`: against `updatedAt` an edit made a day later, or a pin, would read as a record claiming to be older than it is. Where the reader has no `createdAt` — a host that predates it, or a listing that does not carry it — it falls back to `updatedAt` as stated below. **It is the author's claim, not a time anyone attests.** A reader MUST treat as implausible a `writtenAt` later than the host's `createdAt` for the record, or, where it has none, later than the `updatedAt` for the version it reads, or, where it has neither, later than the instant it read the record — in each case by more than five minutes, for clock skew — and a rewrite whose `writtenAt` differs from the version it rewrote, where the reader holds that version. A reader orders an implausible record by `createdAt` (else by `updatedAt`, else by the instant it read it), and MUST NOT show the claimed time as when it was written. **Backdating.** A `writtenAt` more than 24 hours before the host's `createdAt` for the record claims to have been written well before the room received it. A reader MUST order such a record by `createdAt`, not by `writtenAt`, and MUST show that it arrived later than it claims — a record may be written offline and sent later, but a member must not be able to place a message silently in the room's past. Within 24 hours a reader MAY say how long after writing the room received it. Where the reader has no `createdAt`, a `writtenAt` long before `updatedAt` is not by itself implausible, since an edit or a curation moves `updatedAt`, and a reader MAY say how long after writing the room received it. Like every member, it confers nothing.
14461
+ *
14462
+ * **Replies.** `inReplyTo` names the record this one answers — another record of the same room, by `key`, and OPTIONALLY the `version` the author was answering (`RecordReference`). Any kind may carry it: a message may answer a note, and a note a message. It is signed, so a reader attributes the reply's target to `author` as it attributes the body. A reader resolves it only against records it can already list or read in this room with the authority it holds, and MUST NOT fetch anything else because of it. Where the target cannot be read — never written, withdrawn (*Withdrawing a message*), retracted, pruned, expired, sealed under an epoch the reader cannot open, or failing the reading rules above — the reader MUST still show the reply, marked as answering a record that is not available, and MUST NOT show anything of a target it could not verify.
14463
+ *
14464
+ * **Whether the target has changed.** Where `version` is present, a reader that shows the target SHOULD say that it has changed since only when the target's **content** differs from its content at that version — never because its `version` moved, which curation also does (`rooms/records/curate`). A record's content is every member of its body except `proof`, its location (`roomId`, `key` and `version`) and `editedAt`: on the sealed tiers the signed `SealedRecordBody`, on an `open` room the `cleartext` of `rooms/records/put`. Curation sets only a record's standing — its `status` and pinning, which are outside the body on every tier — so it never changes content. On a sealed tier a target whose body was written at the version the reply names — the body's own `version`, served as `sealed.version` once the record is curated — is unchanged, however far the record's own version has moved. Where the body was written at a later version, the reader compares the two contents if it holds the named version; if it does not, it MAY say the target was edited when the target carries an `editedAt` later than the reply's `writtenAt`, and otherwise says nothing.
14465
+ *
14466
+ * **Nothing answers a reaction.** A writer MUST NOT name a record of kind `reaction` in `inReplyTo`, whatever the kind of the record it writes: a reaction is not answered or reacted to. A reader that reads the target of an `inReplyTo` and finds a `reaction` MUST ignore the record naming it — show it nowhere, count it as no reaction — and refuses that record alone, never the room's others. This is a reader's rule. No host enforces it, and on the sealed tiers none could: a host never sees `kind`.
14467
+ *
14468
+ * **Reactions.** A record of kind `reaction` is a short response to another record: its target in `inReplyTo`, which it MUST carry, and its value in `body` — an emoji or a few words (*A reaction's value*). It SHOULD carry no `title`, `description`, `tags` or `file`. A reader MUST NOT show a reaction as a note or a message; it SHOULD show the values beside the target. A reader shows no reaction whose target is not available, and MUST NOT show a reaction that lacks `inReplyTo` or whose value is longer than 64 code points or holds a line terminator; it refuses that record alone, never the room's others. Like every record on a sealed tier, a reaction's key is opaque: a writer MUST NOT encode its target, its value or its `kind` in the key.
14469
+ *
14470
+ * **A reaction's value.** A reaction's value is its `body` normalised to Unicode Normalization Form C (NFC) with every U+FE0E and U+FE0F (variation selectors 15 and 16) then removed, so that `❤` and `❤️` are one value. A reader and a writer apply that normalisation before both the length check and any comparison. The value is at most 64 Unicode code points, counted after normalisation, and is one line: it holds no line terminator (U+000A, U+000B, U+000C, U+000D, U+0085, U+2028 or U+2029). A value that is empty, or holds only White_Space characters, is empty, and a version whose value is empty withdraws the reaction. Two values are the same when their normalised forms are equal code point for code point. The normal form is for measuring and comparing only: a reader MAY show a value in its fully qualified form, with U+FE0F where an emoji takes it.
14471
+ *
14472
+ * **Counting reactions.** One reaction per author, value and target: of the reactions whose `inReplyTo.key` names the same record, those with the same `author` and the same value count once, however many records carry them; one author's different values are different reactions. A new version of a reaction record with a different non-empty value changes that author's reaction: the earlier value no longer counts for the record, and the new one does. A writer reacting with a value it already holds a reaction record for, on the same target, SHOULD write a new version of that record — the same key — rather than a new one, so that a retry after a lost response leaves one record and not two. A reaction is withdrawn by its author writing a new version of the same reaction record with an empty value, and a reader counts nothing for a current version whose value is empty. **Only the reaction's author withdraws it:** an empty version counts as a withdrawal only when its `author` is the `author` of the version it replaces; a reader that holds an earlier version by another author MUST NOT count the empty one as withdrawing that author's reaction, and goes on counting the earlier version. Since every record carrying the same author, value and target counts, a writer withdrawing a reaction MUST withdraw every reaction record its author holds with that value and target.
14473
+ *
14474
+ * **Removed members.** A reaction counts for as long as its record is current, whether or not its author is still a member: a removed member's reactions keep counting until a member with `curate` retracts them (`rooms/records/curate`). A member who returns under a new DID is a different author, and their reactions count beside the ones their earlier DID left, not as the same person's.
14475
+ *
14476
+ * **Edits.** A record is rewritten by writing a new version under the same key (`rooms/records/put`), and that is how a message or a note is edited. The writer keeps `writtenAt` (*When it was written*) and, where the room's profile lists it, sets `editedAt` (`RecordEditedAt`) to the instant it made the edit; the first version of a record MUST NOT carry `editedAt`. A reader shows a record as edited when the version it shows carries `editedAt`, and MUST NOT infer an edit from `version`, which curation also moves. `editedAt` is the author's claim, as `writtenAt` is: a reader treats one earlier than the record's `writtenAt`, or later than the host's `updatedAt` for the version by more than five minutes, as implausible, and then shows that the record was edited but not when. The new version is a whole body, signed by whoever wrote it. A reader showing a version whose `author` differs from the version it last showed for that key MUST show the new author, and MUST NOT present it as an edit by the earlier one.
14477
+ *
14478
+ * **What a new version keeps.** A new version MUST keep the `kind` of the version it rewrites, absent included, and a new version of a reaction MUST keep its `inReplyTo`. A reader that holds an earlier version of a record and reads a later one that changes either MUST refuse that version: it MUST NOT show it as the record, nor count it as a reaction, and it refuses that version alone, never the room's others. Without this a member with `write` could rewrite another member's message as a reaction, and every reply to it would disappear (*Nothing answers a reaction*), or move another member's reaction to a record they never reacted to. A reader that has never read an earlier version has nothing to compare. On an `open` room a host MAY refuse a new version of a message or a reaction by anyone but its original author (`rooms/records/put`, Host item 15); on the sealed tiers no host can, since it never sees `kind`, and these reader rules are the only defence (`rooms/records/put`, *Security & Privacy*).
14479
+ *
14480
+ * **The record's original author.** Several rules turn on whether a new version comes from the record's own author. A reader that holds an earlier version compares with it. Where a listing or a read gives the host's `createdBy` (`RecordMetadataV3`) — the author of the record's first version, recorded by the host on `open` and `attributed` rooms — a reader that sees the record for the first time uses it as the record's author for those rules: a current version whose `author` is not `createdBy` is shown as a rewrite by that author and never as the original author's edit (*Edits*); an empty version of a message or a reaction by anyone but `createdBy` is not a withdrawal (*Withdrawing a message*, *Counting reactions*), and such a reaction is counted for its own author, not for `createdBy`. `createdBy` is the host's word: on `attributed` the host already attributes every version, so it tells a reader nothing the host could not have lied about before; it cannot tell a reader whether a rewrite kept `kind` or `inReplyTo`, which only an earlier version can. On `private` there is no `createdBy`, and a first-time reader has only the version in front of it.
14481
+ *
14482
+ * **Withdrawing a message.** The author of a `message` withdraws it by writing a new version of it — the same key, keeping its `kind` and any `inReplyTo` — with an empty `body` and no `file`. A reader shows a current version of a message with an empty `body` and no `file` as withdrawn, or not at all, and MUST NOT show any earlier version's content in its place; replies to it stay, as answering a record that is not available (*Replies*). It counts as a withdrawal only when its `author` is the `author` of the version it replaces; one by another member is that member's rewrite (*Edits*), never the author withdrawing their own message. Withdrawing needs only `write`. It is a rewrite, not a retraction: the record keeps its key and its place, and only a member with `curate` retracts it (`rooms/records/curate`).
14483
+ *
14484
+ * **Tombstones.** A retracted record keeps its key and version and nothing of its body (`rooms/records/curate`). On the sealed tiers `kind`, `inReplyTo`, `writtenAt` and `editedAt` were inside the sealed body and go with it. On an `open` room they were in `cleartext`, which is the body there, so an open room's tombstone keeps none of them either (`rooms/records/put`, *Retention*). A reader that held an earlier version of a retracted record uses the `kind` and the place in the conversation that version gave it — a retracted message shown as retracted where the message was, a retracted reaction counted as no reaction. A reader that held none shows the tombstone in no conversation and in no reaction count. Replies to a retracted record stay, as answering a record that is not available (*Replies*).
14485
+ *
14486
+ * **An author whose DID does not resolve.** Rule (2) fails in two ways, which a reader MUST tell apart: `author`'s DID does not resolve to a DID document — it no longer resolves, or its method reports it deactivated — or the proof does not verify against the document it resolves to. A record whose proof does not verify is refused, as above, except where *Which DID document* requires the placeholder instead. For a record whose author's DID does not resolve, a reader MAY, instead of refusing it, show a placeholder saying that the record's author cannot be verified, in the room's conversation, ordered by the host's `createdAt` for it, else its `updatedAt`, so that replies naming its key still anchor to it. It MUST NOT show or use any member of the body — not its `body`, `title`, `file`, `kind`, `inReplyTo` or `writtenAt` — MUST NOT count it as a reaction, and MUST NOT accept it as the room's profile (`RoomProfileStatement`). A placeholder is not a record shown with a warning: it shows none of the record.
14487
+ *
14488
+ * **A file's caption.** On a record carrying `file`, `body` is the file's caption. A reader that shows the file SHOULD show its `body` with it. A manifest's `width`, `height` and `preview` let a reader lay out and show an image before fetching it; they are advisory (`FileManifest`).
14489
+ *
14490
+ * **When a writer may use these members.** `kind`, `inReplyTo`, `writtenAt` and `editedAt`, and the `FileManifest` members `width`, `height` and `preview` inside `file`, are gated together. A conforming reader that predates them refuses a body carrying any of them by rule (1), as it refused provenance before it knew it: a message written with `kind` is invisible to it rather than shown wrong. **Not every reader conforms.** A reader that ignores the members it does not know shows a reaction as a post holding its value, and a withdrawn reaction as an empty post — which is why a room's readers move first, and the room says when its writers may follow. A writer MUST NOT write `kind`, `inReplyTo`, `writtenAt`, `editedAt`, `width`, `height` or `preview` into a room unless the room's current profile (`RoomProfileStatement`, as a reader resolves it) lists that member in `recordMembers` (`RoomProfile`). No profile, a profile without `recordMembers`, or one the writer cannot resolve means none of them may be written — the most restrictive reading. A writer MAY rely on a profile it resolved within the room's current epoch, without resolving it again for each write; once the room's epoch advances, it resolves the profile again before writing any of them. A writer that may not use them MAY write a message as a record with `body` and no `title`, which every reader shows (*Untitled records*). On the sealed tiers a writer whose key holder signs or seals for it needs one that accepts these members: `rooms/keys/seal/0.3` does, which `trust-task-discovery` tells it, and a key holder that predates them refuses them with `bodyInvalid`, as it refuses provenance.
14491
+ *
14492
+ * **Turning them on.** Whether a room's readers are ready is decided out of band by the room's owner or a curator: nothing in this family tells them which readers the room's members use. They list a member in `recordMembers` only once every reader they expect in the room accepts it — non-conforming readers included, which show the new records wrong rather than not at all — and in this order: (1) the readers, including every reader of the room's profile, since a reader that predates `recordMembers` refuses the profile carrying it; (2) the owner's key holder, which re-writes the profile under each new epoch after a removal (`RoomProfileStatement`, `rooms/keys/profile/write`) and MUST accept a profile carrying `recordMembers` before any profile carries it — one that refused it would re-write an older profile, or none, and the next removal would silently turn the members off; (3) on the sealed tiers, the key holders that seal for the room's writers (`rooms/keys/seal/0.3`); (4) then the profile. No room lists them by default. A room's profile lists them when its owner or a curator writes it with them — with `rooms/keys/profile/write` on an `attributed` or `private` room, or by writing the record at `room-profile` with `rooms/records/put` on an `open` one — both of which need `curate` or `admin`.
14493
+ */
14494
+ export interface SealedRecordBody {
14495
+ /**
14496
+ * The room the record was written in, exactly as on the wire.
14497
+ */
14498
+ roomId: string;
14499
+ /**
14500
+ * The record's key, as in `rooms/records/put`.
14501
+ */
14502
+ key: string;
14503
+ /**
14504
+ * The version the writer intended the record to take, as sealed with `rooms/keys/seal`: the version the body is bound to. A record curated since keeps its body and moves to a new version, and carries this one as `sealed.version` (`SealedRecord`).
14505
+ */
14506
+ version: number;
14507
+ /**
14508
+ * The DID of the party that wrote the record: the member, or the agent acting under an attenuated credential, whose key signed `proof`. On a `private` room this is the only attribution there is.
14509
+ */
14510
+ author: string;
14511
+ title?: string;
14512
+ description?: string;
14513
+ /**
14514
+ * The record's text: plain text on a `message`, the value on a `reaction`, markdown on a note and on a kind the reader does not know (*What `body` is*). Human-readable, never a model-optimised blob, and rendered inert.
14515
+ */
14516
+ body?: string;
14517
+ /**
14518
+ * @maxItems 32
14519
+ */
14520
+ tags?: string[];
14521
+ kind?: RecordKind;
14522
+ /**
14523
+ * The record this one answers or, on a `reaction`, responds to. See *Replies* and *Reactions*.
14524
+ */
14525
+ inReplyTo?: RecordReference;
14526
+ writtenAt?: RecordWrittenAt;
14527
+ editedAt?: RecordEditedAt;
14528
+ basis?: RecordBasis;
14529
+ confidence?: RecordConfidence;
14530
+ evidence?: RecordEvidenceList;
14531
+ validFor?: PermittedUse;
14532
+ validUntil?: RecordValidUntil;
14533
+ /**
14534
+ * Present when the record carries a file. Its `blobRef` MUST be the one the record names in `blobs`.
14535
+ */
14536
+ file?: FileManifest;
14537
+ /**
14538
+ * Present only on the room's profile record, which then carries no `title`, `description`, `body`, `tags` or `file`. See `RoomProfileStatement`.
14539
+ */
14540
+ roomProfile?: RoomProfileStatement;
14541
+ /**
14542
+ * The author's Data Integrity proof over every other member.
14543
+ */
14544
+ proof: {};
14545
+ }
14195
14546
  export interface SealedShare {
14196
14547
  recipient: TrusteeIndex;
14197
14548
  share: SealedPayload;