@real-life/trust-protocol 0.3.2 → 0.5.0

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 (277) hide show
  1. package/CHANGELOG.md +97 -0
  2. package/README.md +209 -78
  3. package/dist/ack.d.ts +84 -0
  4. package/dist/ack.d.ts.map +1 -0
  5. package/dist/ack.js +114 -0
  6. package/dist/ack.js.map +1 -0
  7. package/dist/adapters/vti-mediator.d.ts +169 -0
  8. package/dist/adapters/vti-mediator.d.ts.map +1 -0
  9. package/dist/adapters/vti-mediator.js +659 -0
  10. package/dist/adapters/vti-mediator.js.map +1 -0
  11. package/dist/anchor.d.ts +226 -0
  12. package/dist/anchor.d.ts.map +1 -0
  13. package/dist/anchor.js +347 -0
  14. package/dist/anchor.js.map +1 -0
  15. package/dist/{holder.d.ts → carrier-holder.d.ts} +1 -1
  16. package/dist/carrier-holder.d.ts.map +1 -0
  17. package/dist/{holder.js → carrier-holder.js} +5 -4
  18. package/dist/carrier-holder.js.map +1 -0
  19. package/dist/carrier-identity.js +4 -4
  20. package/dist/carrier-identity.js.map +1 -1
  21. package/dist/carrier.d.ts.map +1 -1
  22. package/dist/carrier.js +4 -3
  23. package/dist/carrier.js.map +1 -1
  24. package/dist/ceremony.d.ts +3 -2
  25. package/dist/ceremony.d.ts.map +1 -1
  26. package/dist/ceremony.js +16 -26
  27. package/dist/ceremony.js.map +1 -1
  28. package/dist/codec.d.ts +54 -0
  29. package/dist/codec.d.ts.map +1 -0
  30. package/dist/codec.js +494 -0
  31. package/dist/codec.js.map +1 -0
  32. package/dist/continuity.d.ts +67 -0
  33. package/dist/continuity.d.ts.map +1 -0
  34. package/dist/continuity.js +110 -0
  35. package/dist/continuity.js.map +1 -0
  36. package/dist/core.d.ts +4 -0
  37. package/dist/core.d.ts.map +1 -1
  38. package/dist/core.js.map +1 -1
  39. package/dist/crypto.d.ts +23 -7
  40. package/dist/crypto.d.ts.map +1 -1
  41. package/dist/crypto.js +54 -20
  42. package/dist/crypto.js.map +1 -1
  43. package/dist/delivery.d.ts +31 -3
  44. package/dist/delivery.d.ts.map +1 -1
  45. package/dist/delivery.js +75 -28
  46. package/dist/delivery.js.map +1 -1
  47. package/dist/encounter/ceremony.d.ts +37 -0
  48. package/dist/encounter/ceremony.d.ts.map +1 -0
  49. package/dist/encounter/ceremony.js +662 -0
  50. package/dist/encounter/ceremony.js.map +1 -0
  51. package/dist/encounter.d.ts +91 -1
  52. package/dist/encounter.d.ts.map +1 -1
  53. package/dist/encounter.js +191 -12
  54. package/dist/encounter.js.map +1 -1
  55. package/dist/engine.d.ts +303 -0
  56. package/dist/engine.d.ts.map +1 -0
  57. package/dist/engine.js +1509 -0
  58. package/dist/engine.js.map +1 -0
  59. package/dist/entropy.d.ts +28 -0
  60. package/dist/entropy.d.ts.map +1 -0
  61. package/dist/entropy.js +96 -0
  62. package/dist/entropy.js.map +1 -0
  63. package/dist/events.d.ts +198 -0
  64. package/dist/events.d.ts.map +1 -0
  65. package/dist/events.js +2 -0
  66. package/dist/events.js.map +1 -0
  67. package/dist/fixtures.d.ts +30 -0
  68. package/dist/fixtures.d.ts.map +1 -0
  69. package/dist/fixtures.js +155 -0
  70. package/dist/fixtures.js.map +1 -0
  71. package/dist/forge.d.ts +47 -0
  72. package/dist/forge.d.ts.map +1 -0
  73. package/dist/forge.js +20 -0
  74. package/dist/forge.js.map +1 -0
  75. package/dist/group-star.d.ts +251 -0
  76. package/dist/group-star.d.ts.map +1 -0
  77. package/dist/group-star.js +348 -0
  78. package/dist/group-star.js.map +1 -0
  79. package/dist/holder-api.d.ts +165 -0
  80. package/dist/holder-api.d.ts.map +1 -0
  81. package/dist/holder-api.js +142 -0
  82. package/dist/holder-api.js.map +1 -0
  83. package/dist/holder-state-v1.d.ts +801 -0
  84. package/dist/holder-state-v1.d.ts.map +1 -0
  85. package/dist/holder-state-v1.js +2 -0
  86. package/dist/holder-state-v1.js.map +1 -0
  87. package/dist/holder-state-v2.d.ts +858 -0
  88. package/dist/holder-state-v2.d.ts.map +1 -0
  89. package/dist/holder-state-v2.js +2 -0
  90. package/dist/holder-state-v2.js.map +1 -0
  91. package/dist/identity-state.d.ts +43 -0
  92. package/dist/identity-state.d.ts.map +1 -0
  93. package/dist/identity-state.js +345 -0
  94. package/dist/identity-state.js.map +1 -0
  95. package/dist/identity.d.ts +24 -2
  96. package/dist/identity.d.ts.map +1 -1
  97. package/dist/identity.js +70 -11
  98. package/dist/identity.js.map +1 -1
  99. package/dist/index.d.ts +27 -1
  100. package/dist/index.d.ts.map +1 -1
  101. package/dist/index.js +81 -29
  102. package/dist/index.js.map +1 -1
  103. package/dist/internal.d.ts +37 -0
  104. package/dist/internal.d.ts.map +1 -0
  105. package/dist/internal.js +22 -0
  106. package/dist/internal.js.map +1 -0
  107. package/dist/introduction/holder.d.ts +18 -0
  108. package/dist/introduction/holder.d.ts.map +1 -0
  109. package/dist/introduction/holder.js +764 -0
  110. package/dist/introduction/holder.js.map +1 -0
  111. package/dist/introduction.d.ts +101 -0
  112. package/dist/introduction.d.ts.map +1 -0
  113. package/dist/introduction.js +132 -0
  114. package/dist/introduction.js.map +1 -0
  115. package/dist/invariants.d.ts +43 -0
  116. package/dist/invariants.d.ts.map +1 -0
  117. package/dist/invariants.js +953 -0
  118. package/dist/invariants.js.map +1 -0
  119. package/dist/keys-seed.d.ts +7 -0
  120. package/dist/keys-seed.d.ts.map +1 -0
  121. package/dist/keys-seed.js +133 -0
  122. package/dist/keys-seed.js.map +1 -0
  123. package/dist/log-memory.d.ts +12 -0
  124. package/dist/log-memory.d.ts.map +1 -0
  125. package/dist/log-memory.js +101 -0
  126. package/dist/log-memory.js.map +1 -0
  127. package/dist/membership/holder.d.ts +33 -0
  128. package/dist/membership/holder.d.ts.map +1 -0
  129. package/dist/membership/holder.js +929 -0
  130. package/dist/membership/holder.js.map +1 -0
  131. package/dist/membership.d.ts +123 -0
  132. package/dist/membership.d.ts.map +1 -0
  133. package/dist/membership.js +180 -0
  134. package/dist/membership.js.map +1 -0
  135. package/dist/message/holder.d.ts +49 -0
  136. package/dist/message/holder.d.ts.map +1 -0
  137. package/dist/message/holder.js +290 -0
  138. package/dist/message/holder.js.map +1 -0
  139. package/dist/message.d.ts +43 -0
  140. package/dist/message.d.ts.map +1 -0
  141. package/dist/message.js +51 -0
  142. package/dist/message.js.map +1 -0
  143. package/dist/ports.d.ts +237 -0
  144. package/dist/ports.d.ts.map +1 -0
  145. package/dist/ports.js +2 -0
  146. package/dist/ports.js.map +1 -0
  147. package/dist/profile.d.ts +56 -0
  148. package/dist/profile.d.ts.map +1 -0
  149. package/dist/profile.js +193 -0
  150. package/dist/profile.js.map +1 -0
  151. package/dist/prompts.d.ts +14 -0
  152. package/dist/prompts.d.ts.map +1 -0
  153. package/dist/prompts.js +69 -0
  154. package/dist/prompts.js.map +1 -0
  155. package/dist/receive.d.ts +134 -0
  156. package/dist/receive.d.ts.map +1 -0
  157. package/dist/receive.js +317 -0
  158. package/dist/receive.js.map +1 -0
  159. package/dist/results.d.ts +173 -0
  160. package/dist/results.d.ts.map +1 -0
  161. package/dist/results.js +21 -0
  162. package/dist/results.js.map +1 -0
  163. package/dist/schemas.d.ts.map +1 -1
  164. package/dist/schemas.js +45 -38
  165. package/dist/schemas.js.map +1 -1
  166. package/dist/sha256.d.ts +3 -0
  167. package/dist/sha256.d.ts.map +1 -0
  168. package/dist/sha256.js +69 -0
  169. package/dist/sha256.js.map +1 -0
  170. package/dist/star.d.ts +31 -0
  171. package/dist/star.d.ts.map +1 -0
  172. package/dist/star.js +56 -0
  173. package/dist/star.js.map +1 -0
  174. package/dist/state-builder.d.ts +42 -0
  175. package/dist/state-builder.d.ts.map +1 -0
  176. package/dist/state-builder.js +100 -0
  177. package/dist/state-builder.js.map +1 -0
  178. package/dist/state.d.ts +914 -0
  179. package/dist/state.d.ts.map +1 -0
  180. package/dist/state.js +37 -0
  181. package/dist/state.js.map +1 -0
  182. package/dist/store-contract.d.ts +11 -0
  183. package/dist/store-contract.d.ts.map +1 -0
  184. package/dist/store-contract.js +189 -0
  185. package/dist/store-contract.js.map +1 -0
  186. package/dist/store-memory.d.ts +8 -0
  187. package/dist/store-memory.d.ts.map +1 -0
  188. package/dist/store-memory.js +17 -0
  189. package/dist/store-memory.js.map +1 -0
  190. package/dist/testing.d.ts +22 -0
  191. package/dist/testing.d.ts.map +1 -0
  192. package/dist/testing.js +21 -0
  193. package/dist/testing.js.map +1 -0
  194. package/dist/trust/continuity.d.ts +71 -0
  195. package/dist/trust/continuity.d.ts.map +1 -0
  196. package/dist/trust/continuity.js +1222 -0
  197. package/dist/trust/continuity.js.map +1 -0
  198. package/dist/trust/duties.d.ts +67 -0
  199. package/dist/trust/duties.d.ts.map +1 -0
  200. package/dist/trust/duties.js +179 -0
  201. package/dist/trust/duties.js.map +1 -0
  202. package/dist/trust/entries.d.ts +139 -0
  203. package/dist/trust/entries.d.ts.map +1 -0
  204. package/dist/trust/entries.js +795 -0
  205. package/dist/trust/entries.js.map +1 -0
  206. package/dist/trust/group-star.d.ts +43 -0
  207. package/dist/trust/group-star.d.ts.map +1 -0
  208. package/dist/trust/group-star.js +188 -0
  209. package/dist/trust/group-star.js.map +1 -0
  210. package/dist/trust/mapping.d.ts +56 -0
  211. package/dist/trust/mapping.d.ts.map +1 -0
  212. package/dist/trust/mapping.js +584 -0
  213. package/dist/trust/mapping.js.map +1 -0
  214. package/dist/trust/profile.d.ts +25 -0
  215. package/dist/trust/profile.d.ts.map +1 -0
  216. package/dist/trust/profile.js +249 -0
  217. package/dist/trust/profile.js.map +1 -0
  218. package/dist/trust/star.d.ts +208 -0
  219. package/dist/trust/star.d.ts.map +1 -0
  220. package/dist/trust/star.js +588 -0
  221. package/dist/trust/star.js.map +1 -0
  222. package/dist/trust/state.d.ts +83 -0
  223. package/dist/trust/state.d.ts.map +1 -0
  224. package/dist/trust/state.js +154 -0
  225. package/dist/trust/state.js.map +1 -0
  226. package/dist/util-freeze.d.ts +3 -0
  227. package/dist/util-freeze.d.ts.map +1 -0
  228. package/dist/util-freeze.js +11 -0
  229. package/dist/util-freeze.js.map +1 -0
  230. package/dist/views.d.ts +179 -0
  231. package/dist/views.d.ts.map +1 -0
  232. package/dist/views.js +286 -0
  233. package/dist/views.js.map +1 -0
  234. package/dist/visibility.d.ts +5 -5
  235. package/dist/visibility.d.ts.map +1 -1
  236. package/dist/visibility.js +22 -28
  237. package/dist/visibility.js.map +1 -1
  238. package/dist/wire.d.ts +218 -83
  239. package/dist/wire.d.ts.map +1 -1
  240. package/dist/wire.js.map +1 -1
  241. package/package.json +60 -10
  242. package/schemas/holder-state-v1.schema.json +3880 -0
  243. package/schemas/holder-state-v2.schema.json +4123 -0
  244. package/dist/holder.d.ts.map +0 -1
  245. package/dist/holder.js.map +0 -1
  246. package/dist/probe/acks.d.ts +0 -27
  247. package/dist/probe/acks.d.ts.map +0 -1
  248. package/dist/probe/acks.js +0 -152
  249. package/dist/probe/acks.js.map +0 -1
  250. package/dist/probe/continuity.d.ts +0 -20
  251. package/dist/probe/continuity.d.ts.map +0 -1
  252. package/dist/probe/continuity.js +0 -805
  253. package/dist/probe/continuity.js.map +0 -1
  254. package/dist/probe/deps.d.ts +0 -61
  255. package/dist/probe/deps.d.ts.map +0 -1
  256. package/dist/probe/deps.js +0 -54
  257. package/dist/probe/deps.js.map +0 -1
  258. package/dist/probe/encounter.d.ts +0 -26
  259. package/dist/probe/encounter.d.ts.map +0 -1
  260. package/dist/probe/encounter.js +0 -938
  261. package/dist/probe/encounter.js.map +0 -1
  262. package/dist/probe/introduce.d.ts +0 -62
  263. package/dist/probe/introduce.d.ts.map +0 -1
  264. package/dist/probe/introduce.js +0 -306
  265. package/dist/probe/introduce.js.map +0 -1
  266. package/dist/probe/membership.d.ts +0 -96
  267. package/dist/probe/membership.d.ts.map +0 -1
  268. package/dist/probe/membership.js +0 -467
  269. package/dist/probe/membership.js.map +0 -1
  270. package/dist/probe/trust.d.ts +0 -156
  271. package/dist/probe/trust.d.ts.map +0 -1
  272. package/dist/probe/trust.js +0 -1233
  273. package/dist/probe/trust.js.map +0 -1
  274. package/dist/probe.d.ts +0 -7
  275. package/dist/probe.d.ts.map +0 -1
  276. package/dist/probe.js +0 -42
  277. package/dist/probe.js.map +0 -1
package/dist/codec.js ADDED
@@ -0,0 +1,494 @@
1
+ // codec — the HolderState storage format (lib Stage 2, note §2.2).
2
+ //
3
+ // decodeState is the one way in: JSON purity, then the codec version, then
4
+ // the pure migration chain vN → vN+1, each step running between two states
5
+ // validated by their codec's own validator (hand-written; no schema engine
6
+ // in the published library). The validators check shape and a few local
7
+ // consistency rules; referential and domain invariants (active heads,
8
+ // register monotony, matching revisions) are the engine's (invariants.ts).
9
+ // An unknown or higher codec is refused, never read best-effort. Store
10
+ // adapters keep bytes or JSON and never migrate themselves. Wire
11
+ // versions and the codec are independent; a migration never re-issues
12
+ // stored documents, outbound or acks.
13
+ //
14
+ // Codec 1 is the format of 0.4.0: its golden fixtures are
15
+ // lib/test/fixtures/state-v1*.json (runs of lib 0.4.0, frozen), decoded and
16
+ // re-encoded byte-identically and migrated by test/codec-fixture.test.mjs.
17
+ // Codec 2 is the format of 0.5.0 (Message Tasks 0.1, Membership 0.20): its
18
+ // fixtures are lib/test/fixtures/state-v2*.json (deterministic runs,
19
+ // test/fixtures/gen-state-v2.mjs, reproduced in npm test). The rule: codecs
20
+ // 1 and 2 are read, 1 migrated to 2; a newer codec is codec-newer; a codec
21
+ // without a validator is codec-unknown. Every later codec adds its
22
+ // validator, a migration from the one before, and its own fixture with a
23
+ // migration test.
24
+ import { jcs } from './core.js';
25
+ /** The codec this library writes. */
26
+ export const CODEC = 2;
27
+ /** The tuples of a codec-1 state on which a document of the counterpart
28
+ * was accepted, as far as the state shows it (Message Tasks 5.1): a probe,
29
+ * a star, a group star, a continuity or anchor mapping, or a profile
30
+ * received; or the counterparty's step credential of its enactment record. */
31
+ function readyOf1(s) {
32
+ const out = new Set();
33
+ const inRec = new Set(Object.values(s.encounter.records).filter((r) => r.in !== null).map((r) => r.label));
34
+ for (const r of Object.values(s.relationships)) {
35
+ for (const t of r.tuples) {
36
+ if (t.probeIn.hwm !== '0' || t.starIn.hwm !== '0' || t.groupStarIn.hwm !== '0' || t.continuityIn.rev !== '0' ||
37
+ t.mappingIn.rev !== '0' || t.profileIn.rev !== '0' || inRec.has(t.ownPairLabel))
38
+ out.add(t.ownPairLabel);
39
+ }
40
+ }
41
+ return [...out].sort();
42
+ }
43
+ /**
44
+ * Migrations keyed by the codec they read: MIGRATIONS[n] maps a valid
45
+ * codec-n state to a codec-(n+1) state. Pure, never async, never keys.
46
+ *
47
+ * 1 → 2 (lib 0.5.0, Message Tasks 0.1, Membership 0.20): the message
48
+ * state starts empty (no block, no rate, no record, no inbox) but for the
49
+ * ready tuples, read from what the state shows a counterpart's document
50
+ * did (readyOf1); every invitation a codec-1 holder received was
51
+ * surfaced, so their credential digests seed the permanent record of
52
+ * RLTP-MT-3130; the register of declined invitations starts empty (codec 1
53
+ * knew no block).
54
+ */
55
+ export const MIGRATIONS = Object.freeze({
56
+ 1: (s) => ({
57
+ ...s,
58
+ codec: 2,
59
+ joining: { ...s.joining, surfaced: Object.keys(s.joining.invites).sort(), declined: [] },
60
+ messages: { blocked: [], rates: {}, ready: readyOf1(s), records: {}, inbox: {} },
61
+ }),
62
+ });
63
+ /** A stored state the library will not load (or a state it will not write). */
64
+ export class StateCodecError extends Error {
65
+ code;
66
+ /** JSON path of the offending value, for 'shape' */
67
+ path;
68
+ constructor(code, message, path) {
69
+ super(path === undefined ? `${code}: ${message}` : `${code} at ${path}: ${message}`);
70
+ this.name = 'StateCodecError';
71
+ this.code = code;
72
+ if (path !== undefined)
73
+ this.path = path;
74
+ }
75
+ }
76
+ const fail = (path, msg) => { throw new StateCodecError('shape', msg, path); };
77
+ const isObj = (x) => x !== null && typeof x === 'object' && !Array.isArray(x);
78
+ const str = (x, p) => { if (typeof x !== 'string')
79
+ fail(p, 'string expected'); };
80
+ const bool = (x, p) => { if (typeof x !== 'boolean')
81
+ fail(p, 'boolean expected'); };
82
+ const json = () => { }; // JSON purity is checked once, up front
83
+ const dec = (x, p) => { if (typeof x !== 'string' || !/^(0|[1-9][0-9]{0,17})$/.test(x))
84
+ fail(p, 'canonical decimal string expected'); };
85
+ const millis = (x, p) => { if (!Number.isSafeInteger(x) || x < 0)
86
+ fail(p, 'non-negative integer milliseconds expected'); };
87
+ const natural = (x, p) => { if (!Number.isSafeInteger(x) || x < 0)
88
+ fail(p, 'non-negative integer expected'); };
89
+ const positive = (x, p) => { if (!Number.isSafeInteger(x) || x < 1)
90
+ fail(p, 'positive integer expected'); };
91
+ const lit = (...vals) => (x, p) => { if (!vals.includes(x))
92
+ fail(p, 'one of ' + vals.map((v) => JSON.stringify(v)).join(', ') + ' expected'); };
93
+ const nullable = (v) => (x, p) => { if (x !== null)
94
+ v(x, p); };
95
+ const arr = (v) => (x, p) => {
96
+ if (!Array.isArray(x))
97
+ fail(p, 'array expected');
98
+ x.forEach((e, i) => v(e, `${p}[${i}]`));
99
+ };
100
+ /** an array used as a set: no duplicates */
101
+ const set = (v) => (x, p) => {
102
+ arr(v)(x, p);
103
+ if (new Set(x.map((e) => jcs(e))).size !== x.length)
104
+ fail(p, 'duplicate set element');
105
+ };
106
+ const rec = (v) => (x, p) => {
107
+ if (!isObj(x))
108
+ fail(p, 'object expected');
109
+ for (const [k, e] of Object.entries(x))
110
+ v(e, `${p}.${k}`);
111
+ };
112
+ /** a closed object: required fields, optional fields, nothing else */
113
+ const obj = (req, opt = {}) => (x, p) => {
114
+ if (!isObj(x))
115
+ fail(p, 'object expected');
116
+ const o = x;
117
+ for (const k of Object.keys(req)) {
118
+ if (!Object.hasOwn(o, k))
119
+ fail(`${p}.${k}`, 'missing');
120
+ req[k](o[k], `${p}.${k}`);
121
+ }
122
+ for (const k of Object.keys(o)) {
123
+ if (Object.hasOwn(req, k))
124
+ continue;
125
+ if (!Object.hasOwn(opt, k))
126
+ fail(`${p}.${k}`, 'unknown field');
127
+ opt[k](o[k], `${p}.${k}`);
128
+ }
129
+ };
130
+ /** a record whose values carry their own key in `idField` */
131
+ /** a JSON object, contents open */
132
+ const anyObj = (x, p) => { if (!isObj(x))
133
+ fail(p, 'object expected'); };
134
+ const keyed = (v, idField) => (x, p) => {
135
+ rec(v)(x, p);
136
+ for (const [k, e] of Object.entries(x))
137
+ if (e[idField] !== k)
138
+ fail(`${p}.${k}.${idField}`, 'must equal its key');
139
+ };
140
+ // ── the HolderState shape (state.ts) ───────────────────────────────────
141
+ const setting = lit('default', 'on', 'off');
142
+ const trustClass = lit('star', 'groupStar', 'anchorMapping', 'sealedGroupStar', 'profile');
143
+ const recipient = obj({ contactId: str, rkid: str, keyAgreement: str }, { anchor: str, via: str });
144
+ const envelope = obj({ rkid: str, epk: str, nonce: str, ciphertext: str });
145
+ const assembly = obj({ salt: dec, chunks: rec(json) });
146
+ const seqOutShape = (item) => obj({
147
+ lastSalt: dec, exhausted: bool, hwm: dec, snapshot: nullable(arr(item)), snapshotDigest: nullable(str),
148
+ inflight: rec(obj({ view: arr(item), viewDigest: str, digests: arr(str), acked: arr(str) })),
149
+ });
150
+ /** the snapshot and its digest are present together */
151
+ const seqOut = (item) => {
152
+ const shape = seqOutShape(item);
153
+ return (x, p) => {
154
+ shape(x, p);
155
+ const o = x;
156
+ if ((o.snapshot === null) !== (o.snapshotDigest === null))
157
+ fail(`${p}.snapshotDigest`, 'null exactly when snapshot is');
158
+ };
159
+ };
160
+ const seqIn = (accepted) => obj({ hwm: dec, lowerBound: dec, assembly: nullable(assembly), accepted: nullable(accepted) });
161
+ const starPair = obj({ member: str, head: str });
162
+ const groupStarItem = (x, p) => {
163
+ if (isObj(x) && x.mode === 'sealed')
164
+ return obj({ group: str, mode: str, member: str, memberOp: str })(x, p);
165
+ obj({ group: str, mode: lit('digest') })(x, p);
166
+ };
167
+ const starOut = seqOut(starPair);
168
+ const starIn = seqIn(obj({ salt: dec, blinded: arr(str), matches: arr(str) }));
169
+ const groupStarOut = seqOut(groupStarItem);
170
+ const groupStarIn = seqIn(obj({ salt: dec, entries: arr(obj({ d: str, c: str })), groups: arr(str) }));
171
+ const continuityDue = (x, p) => {
172
+ if (isObj(x) && x.kind === 'choice')
173
+ return obj({ kind: str, prior: str, alts: arr(str) })(x, p);
174
+ obj({ kind: lit('report', 'align'), prior: str })(x, p);
175
+ };
176
+ const logHead = (x, p) => {
177
+ if (isObj(x) && Object.hasOwn(x, 'empty'))
178
+ return obj({ genesis: str, empty: lit(true) })(x, p);
179
+ obj({ genesis: str, entryId: str, gen: positive, next: str, commit: str })(x, p);
180
+ };
181
+ const tuple = obj({
182
+ ownPairLabel: str, counterpartAnchor: str, counterpartKeyAgreement: str, rkid: str, entryId: str,
183
+ priorCandidates: arr(obj({ ownPairLabel: str, counterpartAnchor: str }, { replaces: arr(str) })),
184
+ starOut, starIn, groupStarOut, groupStarIn,
185
+ probeOut: obj({ seq: dec, inflight: rec(obj({ digests: arr(str), acked: arr(str) })), done: bool }),
186
+ probeIn: obj({ hwm: dec, lowerBound: dec, assembly: nullable(assembly) }),
187
+ continuityOut: obj({ rev: dec, body: json, proof: json, sent: arr(str), align: bool, chosen: nullable(str), reported: nullable(str), aligned: bool, due: nullable(continuityDue) }),
188
+ continuityIn: obj({ rev: dec, body: json, recordPrior: nullable(str) }),
189
+ mappingOut: obj({ rev: dec, body: json, underAnchor: nullable(str) }),
190
+ mappingIn: obj({ rev: dec, body: json, self: nullable(str), card: json }),
191
+ profileOut: obj({ rev: dec }),
192
+ profileIn: obj({ rev: dec, body: json, verifiedSeq: dec }),
193
+ deactivated: bool,
194
+ });
195
+ const relationship = obj({
196
+ id: str, contactId: str, tuples: arr(tuple), activeHead: str, earliestAnchor: nullable(str),
197
+ links: arr(obj({ prev: str, next: str })), bindings: rec(set(str)), heldCounterpartHead: nullable(str),
198
+ memory: rec(json), provenance: obj({ kind: lit('ceremony', 'introduced'), at: millis }, { via: str, viaPin: str }),
199
+ chainedInto: nullable(str), firstVerified: nullable(dec),
200
+ });
201
+ const contact = obj({
202
+ id: str, pos: nullable(dec), status: lit('none', 'admitted', 'pending'), aliases: set(str), relIds: set(str),
203
+ anchorHead: nullable(str),
204
+ settings: obj({ star: setting, groupStar: setting, anchorMapping: setting, sealedGroupStar: setting, profile: setting }),
205
+ groupSettings: rec(setting),
206
+ });
207
+ /** an outbox step of codec n: codec 2 added the failure reason task-expired */
208
+ const outboxStepOf = (codec) => (x, p) => {
209
+ if (!isObj(x))
210
+ fail(p, 'object expected');
211
+ const s = x;
212
+ switch (s.status) {
213
+ case 'submitted': return obj({ status: str, at: millis, attempt: positive })(x, p);
214
+ case 'awaiting-transport': return obj({ status: str, at: millis, reason: lit('offline', 'transport-unreachable', 'carrier-refused-retriable') })(x, p);
215
+ case 'accepted': return obj({ status: str, at: millis })(x, p);
216
+ case 'delivered': return obj({ status: str, at: millis, late: bool })(x, p);
217
+ case 'failed': return s.reason === 'rejected-by-receiver'
218
+ ? obj({ status: str, at: millis, reason: str, code: lit('malformedRequest', 'unsupportedType', 'proofRequired', 'proofInvalid', 'wrongRecipient', 'identityMismatch') })(x, p)
219
+ : obj({ status: str, at: millis, reason: codec < 2 ? lit('unroutable', 'oversize', 'expired-by-adapter-policy') : lit('unroutable', 'oversize', 'expired-by-adapter-policy', 'task-expired') })(x, p);
220
+ default: fail(`${p}.status`, 'unknown outbox status');
221
+ }
222
+ };
223
+ /** an outbox item of codec n: codec 2 added expiresAt (the sender lifetime);
224
+ * the envelope is sealed to the counterpart key, never to the own rkid */
225
+ const outboxItemOf = (codec) => {
226
+ const shape = obj({
227
+ type: str, threadId: str, recipient, envelope, attempt: positive, history: arr(outboxStepOf(codec)),
228
+ }, codec < 2 ? { nextAttemptAt: millis } : { nextAttemptAt: millis, expiresAt: millis });
229
+ return (x, p) => {
230
+ shape(x, p);
231
+ const o = x;
232
+ if (o.envelope.rkid !== o.recipient.keyAgreement)
233
+ fail(`${p}.envelope.rkid`, 'must equal recipient.keyAgreement');
234
+ };
235
+ };
236
+ const DUE = { dueAt: millis };
237
+ /** a retained ack: sealed to the counterpart key, like an outbox item */
238
+ const storedAck = (x, p) => {
239
+ obj({ digest: str, envelope, threadId: str, recipient, at: millis, attempt: positive, sent: bool }, { nextAttemptAt: millis, sentBy: lit('report', 'horizon') })(x, p);
240
+ const a = x;
241
+ if (a.envelope.rkid !== a.recipient.keyAgreement)
242
+ fail(`${p}.envelope.rkid`, 'must equal recipient.keyAgreement');
243
+ };
244
+ const KNOWN_DUTIES = {
245
+ 'reissue-mapping': { v: 1, shape: obj({ kind: str, v: positive, id: str, contactId: str, relId: str, awaitHead: nullable(str) }, DUE) },
246
+ 'class-on': { v: 1, shape: obj({ kind: str, v: positive, id: str, contactId: str, relId: str, cls: trustClass }, DUE) },
247
+ profile: { v: 1, shape: obj({ kind: str, v: positive, id: str, contactId: str, relId: str, rev: dec }, DUE) },
248
+ continuity: { v: 1, shape: obj({ kind: str, v: positive, id: str, relId: str, tuple: str, step: lit('probe', 'mapping') }, { ...DUE, attempt: natural, lastAt: millis }) },
249
+ merge: { v: 1, shape: obj({ kind: str, v: positive, id: str, entryIds: set(str), relId: str, witness: obj({ heads: rec(str), superseded: rec(set(str)) }) }, DUE) },
250
+ rotation: { v: 1, shape: obj({ kind: str, v: positive, id: str, rotationId: str }, { ...DUE, attempt: natural, lastAt: millis }) },
251
+ 'intro-ack': { v: 1, shape: obj({ kind: str, v: positive, id: str, act: str }, DUE) },
252
+ };
253
+ /** Is this a duty kind and version this library handles? Unknown ones are kept as they are. */
254
+ export const isKnownDuty = (d) => Object.hasOwn(KNOWN_DUTIES, d.kind) && KNOWN_DUTIES[d.kind].v === d.v;
255
+ const duty = (x, p) => {
256
+ if (!isObj(x))
257
+ fail(p, 'object expected');
258
+ const d = x;
259
+ str(d.kind, `${p}.kind`);
260
+ natural(d.v, `${p}.v`);
261
+ str(d.id, `${p}.id`);
262
+ if (isKnownDuty(d))
263
+ KNOWN_DUTIES[d.kind].shape(x, p);
264
+ };
265
+ const EVENT_FIELDS = {
266
+ 'contact.added': [{ contactId: str }],
267
+ 'contact.verified': [{ contactId: str, relationshipId: str }],
268
+ 'contact.chained': [{ contactId: str, from: str, into: str }],
269
+ 'contact.merged': [{ contactId: str, merged: arr(str) }],
270
+ 'contact.split': [{ contactId: str, leaver: str, relationshipId: str }],
271
+ 'contact.departed': [{ contactId: str, relationshipIds: arr(str), removed: bool }],
272
+ 'trust.given': [{ contactId: str }],
273
+ 'trust.received': [{ contactId: str }],
274
+ 'trust.paused': [{ contactId: str, paused: bool }],
275
+ 'group.joined': [{ groupId: str }],
276
+ 'prompt.opened': [{ promptId: str, kind: lit('encounter-confirm', 'group-invite', 'introduction') }],
277
+ 'prompt.decided': [{ promptId: str, kind: lit('encounter-confirm', 'group-invite', 'introduction'), choice: lit('accept', 'decline') }],
278
+ 'delivery.status': [{ digest: str, threadId: str, status: lit('submitted', 'accepted', 'delivered', 'failed') }, { late: bool }],
279
+ 'profile.updated': [{ contactId: nullable(str) }],
280
+ 'anchor.rotated': [{ generation: dec }],
281
+ 'device.added': [{ name: str }],
282
+ 'device.revoked': [{ name: str }],
283
+ 'duty.unsupported': [{ dutyId: str, kind: str, v: natural }],
284
+ 'star.accepted': [{ contactId: str, relationshipId: str, salt: dec }],
285
+ 'groupStar.accepted': [{ contactId: str, relationshipId: str, salt: dec }],
286
+ 'encounter.shown': [{ challenge: str, card: anyObj }],
287
+ 'encounter.scanned': [{ contactId: str, card: anyObj }],
288
+ 'encounter.recorded': [{ contactId: str, relationshipId: str, role: lit('scanner', 'displayer') }],
289
+ 'encounter.accepted': [{ contactId: str, relationshipId: str, mutual: bool }],
290
+ 'group.founded': [{ groupId: str }],
291
+ 'group.admitted': [{ groupId: str, member: str }],
292
+ 'group.vouched': [{ groupId: str, member: str }],
293
+ 'contact.blocked': [{ contactId: str, blocked: bool }],
294
+ 'message.sent': [{ contactId: str, mid: str, digest: str }],
295
+ 'message.received': [{ contactId: str, inboxId: str }],
296
+ };
297
+ /** the event types codec 2 added: codec 1 does not know them */
298
+ const EVENTS_SINCE_2 = new Set(['contact.blocked', 'message.sent', 'message.received']);
299
+ const eventOf = (codec) => (x, p) => {
300
+ if (!isObj(x))
301
+ fail(p, 'object expected');
302
+ const t = x.type;
303
+ if (typeof t !== 'string' || !Object.hasOwn(EVENT_FIELDS, t) || (codec < 2 && EVENTS_SINCE_2.has(t)))
304
+ fail(`${p}.type`, 'unknown event type');
305
+ const [req, opt = {}] = EVENT_FIELDS[t];
306
+ obj({ type: str, eventId: str, commitSeq: dec, ...req }, { actId: str, ...opt })(x, p);
307
+ };
308
+ const rosterEntry = obj({ anchor: str, op: str, keyAgreement: str, addedAt: millis }, { name: str, contactId: str, rkid: str });
309
+ const openInvitation = obj({ invitee: str, keyAgreement: str, contactId: str, rkid: str, threadId: str, credDigest: str, invite: anyObj, validUntil: millis });
310
+ const evidence = obj({ invite: anyObj, accept: anyObj, vouches: arr(anyObj), at: millis });
311
+ const groupShape = obj({
312
+ id: str, name: str, memberLabel: str, rules: obj({ vouchThreshold: dec }), listed: bool,
313
+ roster: keyed(rosterEntry, 'anchor'), invitations: keyed(openInvitation, 'threadId'), evidence: rec(evidence),
314
+ preludes: rec(obj({ contactId: str, rkid: str, at: millis })),
315
+ }, { did: str, genesis: anyObj, memberAnchor: str, memberOp: str, acceptDigest: str });
316
+ /** a listed group carries its member anchor and memberOp: the group star
317
+ * seals them (Trust 5400, 5430), and their absence is no filler condition */
318
+ const group = (x, p) => {
319
+ groupShape(x, p);
320
+ const g = x;
321
+ if (g.listed && g.memberAnchor === undefined)
322
+ fail(`${p}.memberAnchor`, 'missing on a listed group');
323
+ if (g.listed && g.memberOp === undefined)
324
+ fail(`${p}.memberOp`, 'missing on a listed group');
325
+ };
326
+ const heldCredential = obj({ digest: str, credential: anyObj });
327
+ const enactmentRecord = obj({
328
+ ceremony: str, own: str, tCh: millis, peer: str, counterpart: str, card: anyObj, bind: str, at: millis, label: str, relId: str,
329
+ role: lit('scanner', 'displayer'), out: nullable(heldCredential), in: nullable(heldCredential),
330
+ thread: nullable(str), bundleDigest: nullable(str), threads: rec(str), sentCard: nullable(anyObj), counterPending: bool,
331
+ });
332
+ const introAct = obj({
333
+ key: str, act: str, role: lit('requester', 'mediator', 'target'),
334
+ status: lit('sent', 'acked', 'completed', 'failed', 'received', 'forwarded', 'consented', 'refused'),
335
+ issuedAt: millis, request: anyObj, requestCard: anyObj, reply: nullable(anyObj), replyCard: nullable(anyObj),
336
+ pins: obj({}, { requester: str, target: str, mediator: str }), threads: obj({ request: str }, { forward: str }),
337
+ at: millis, ackDelayMs: natural, ownLabel: nullable(str), ack: nullable(anyObj), replyForwarded: bool, vouchersSent: bool,
338
+ pendingVoucher: nullable(anyObj), voucher: nullable(anyObj), vouched: bool, promptId: nullable(str),
339
+ }, { peerName: str });
340
+ const fields1 = {
341
+ codec: lit(1),
342
+ commitSeq: dec,
343
+ lastWhen: millis,
344
+ register: obj({
345
+ labels: set(str), pairNonces: rec(str),
346
+ carriers: rec(arr(obj({ nonce: str, generation: dec }))),
347
+ devices: obj({ names: set(str), revoked: set(str) }),
348
+ community: nullable(obj({ genesis: str, head: dec })),
349
+ lineage: arr(anyObj),
350
+ }),
351
+ addresses: obj({ keys: rec(obj({ label: str, lastShown: millis }, { retiredAt: millis })), tombstones: set(str) }),
352
+ contacts: keyed(contact, 'id'),
353
+ relationships: keyed(relationship, 'id'),
354
+ entryOrder: obj({ nextPos: dec, heads: set(str) }),
355
+ groups: keyed(group, 'id'),
356
+ profile: obj({ body: json, revision: dec }),
357
+ effects: rec(obj({ ack: nullable(storedAck), expiresAt: millis })),
358
+ outbox: rec(outboxItemOf(1)),
359
+ duties: keyed(duty, 'id'),
360
+ rotations: keyed(obj({
361
+ id: str, from: dec, to: dec, step: lit('register', 'log', 'duties'), startedAt: millis,
362
+ entry: json, overHead: logHead, awaitHead: rec(nullable(str)),
363
+ }), 'id'),
364
+ prompts: keyed(obj({ id: str, kind: lit('encounter-confirm', 'group-invite', 'introduction'), openedAt: millis }, { contactId: str, groupId: str, expiresAt: millis }), 'id'),
365
+ acts: keyed(obj({ actId: str, inputHash: str, commitSeq: dec, outboundDigests: arr(str), events: arr(eventOf(1)), at: millis }), 'actId'),
366
+ encounter: obj({
367
+ challenges: keyed(obj({ value: str, tCh: millis, label: str, card: anyObj }), 'value'),
368
+ records: keyed(enactmentRecord, 'own'),
369
+ introductions: keyed(introAct, 'key'),
370
+ offers: keyed(obj({ id: str, mediatorContactId: str, pin: str, target: str, at: millis }, { label: str }), 'id'),
371
+ designators: rec(str),
372
+ declarations: rec(obj({ issuer: str, role: str, revision: dec, constants: rec(str), at: millis })),
373
+ }),
374
+ joining: obj({
375
+ preludes: rec(obj({ group: str, inviter: str, contactId: str, rkid: str, memberLabel: str, at: millis })),
376
+ invites: keyed(obj({
377
+ credDigest: str, group: str, name: str, contactId: str, rkid: str, memberLabel: str, invite: anyObj, promptId: str, validUntil: millis,
378
+ status: lit('open', 'accepted', 'declined', 'joined'), at: millis,
379
+ }, { acceptDigest: str }), 'credDigest'),
380
+ }),
381
+ };
382
+ const codec1 = obj(fields1);
383
+ /** a sorted set of strings */
384
+ const sortedSet = (x, p) => {
385
+ set(str)(x, p);
386
+ const a = x;
387
+ for (let i = 1; i < a.length; i++)
388
+ if (!(a[i - 1] < a[i]))
389
+ fail(`${p}[${i}]`, 'a sorted set expected');
390
+ };
391
+ /** an invitation received: attributed to a relationship (contactId and
392
+ * rkid together) or to none (Membership RLTP-MT-3100) */
393
+ const receivedInvite2 = (x, p) => {
394
+ obj({
395
+ credDigest: str, group: str, name: str, memberLabel: str, invite: anyObj, promptId: str, validUntil: millis,
396
+ status: lit('open', 'accepted', 'declined', 'joined'), at: millis,
397
+ }, { acceptDigest: str, contactId: str, rkid: str })(x, p);
398
+ const i = x;
399
+ if ((i.contactId === undefined) !== (i.rkid === undefined))
400
+ fail(`${p}.rkid`, 'present exactly with contactId');
401
+ };
402
+ const codec2 = obj({
403
+ ...fields1,
404
+ codec: lit(2),
405
+ outbox: rec(outboxItemOf(2)),
406
+ acts: keyed(obj({ actId: str, inputHash: str, commitSeq: dec, outboundDigests: arr(str), events: arr(eventOf(2)), at: millis }), 'actId'),
407
+ joining: obj({
408
+ preludes: rec(obj({ group: str, inviter: str, contactId: str, rkid: str, memberLabel: str, at: millis })),
409
+ invites: keyed(receivedInvite2, 'credDigest'),
410
+ surfaced: sortedSet,
411
+ declined: sortedSet,
412
+ }),
413
+ messages: obj({
414
+ blocked: sortedSet,
415
+ rates: rec(obj({ invites: arr(millis), messages: arr(millis) })),
416
+ ready: sortedSet,
417
+ records: rec(rec(obj({ bodyDigest: str, sentAt: millis }))),
418
+ inbox: keyed(obj({ id: str, tuple: str, mid: str, body: anyObj, receivedAt: millis, displayAt: millis }), 'id'),
419
+ }),
420
+ });
421
+ /** Structural validators per codec version; every readable codec has one. */
422
+ export const VALIDATORS = Object.freeze({
423
+ 1: (raw) => codec1(raw, '$'),
424
+ 2: (raw) => codec2(raw, '$'),
425
+ });
426
+ // ── the codec ──────────────────────────────────────────────────────────
427
+ /** Canonical JSON text of a JSON-pure value, or not-json. */
428
+ const canonical = (x) => {
429
+ try {
430
+ return jcs(x);
431
+ }
432
+ catch (e) {
433
+ throw new StateCodecError('not-json', e.message);
434
+ }
435
+ };
436
+ const validatorOf = (chain, c) => {
437
+ const v = chain.validators[c];
438
+ if (!v)
439
+ throw new StateCodecError('codec-unknown', `no validator for codec ${c}`);
440
+ return v;
441
+ };
442
+ /**
443
+ * Decode under an explicit chain: JSON purity, codec gate, then
444
+ * validate(c) → migrate(c) → validate(c+1) … up to chain.codec. Returns
445
+ * an independent copy. decodeState is this function over the library's
446
+ * own chain; tests drive it with fake chains.
447
+ */
448
+ export function decodeChain(raw, chain) {
449
+ let x = raw;
450
+ if (typeof raw === 'string') {
451
+ try {
452
+ x = JSON.parse(raw);
453
+ }
454
+ catch (e) {
455
+ throw new StateCodecError('not-json', e.message);
456
+ }
457
+ }
458
+ let s = JSON.parse(canonical(x));
459
+ if (!isObj(s))
460
+ fail('$', 'object expected');
461
+ const at = s.codec;
462
+ if (!Number.isSafeInteger(at) || at < 0)
463
+ throw new StateCodecError('codec-unknown', 'codec must be a non-negative integer');
464
+ if (at > chain.codec)
465
+ throw new StateCodecError('codec-newer', `codec ${at} is newer than ${chain.codec}`);
466
+ validatorOf(chain, at)(s);
467
+ for (let c = at; c < chain.codec; c++) {
468
+ const up = chain.migrations[c];
469
+ if (!up)
470
+ throw new StateCodecError('codec-unknown', `no migration from codec ${c}`);
471
+ s = JSON.parse(canonical(up(JSON.parse(canonical(s)))));
472
+ if (!isObj(s) || s.codec !== c + 1)
473
+ fail('$.codec', `migration ${c} must produce codec ${c + 1}`);
474
+ validatorOf(chain, c + 1)(s);
475
+ }
476
+ return s;
477
+ }
478
+ const LIBRARY_CHAIN = { codec: CODEC, migrations: MIGRATIONS, validators: VALIDATORS };
479
+ /**
480
+ * Load a stored state: a JSON string or an already parsed value. Returns
481
+ * an independent copy at the current codec, or throws StateCodecError.
482
+ */
483
+ export function decodeState(raw) {
484
+ return decodeChain(raw, LIBRARY_CHAIN);
485
+ }
486
+ /** Serialize a state for storage: canonical JSON, validated first. */
487
+ export function encodeState(state) {
488
+ const text = canonical(state);
489
+ validatorOf(LIBRARY_CHAIN, CODEC)(JSON.parse(text));
490
+ return text;
491
+ }
492
+ /** Deterministic equality of two states (their JCS forms). */
493
+ export const sameState = (a, b) => jcs(a) === jcs(b);
494
+ //# sourceMappingURL=codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec.js","sourceRoot":"","sources":["../src/codec.ts"],"names":[],"mappings":"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","sourcesContent":["// codec — the HolderState storage format (lib Stage 2, note §2.2).\n//\n// decodeState is the one way in: JSON purity, then the codec version, then\n// the pure migration chain vN → vN+1, each step running between two states\n// validated by their codec's own validator (hand-written; no schema engine\n// in the published library). The validators check shape and a few local\n// consistency rules; referential and domain invariants (active heads,\n// register monotony, matching revisions) are the engine's (invariants.ts).\n// An unknown or higher codec is refused, never read best-effort. Store\n// adapters keep bytes or JSON and never migrate themselves. Wire\n// versions and the codec are independent; a migration never re-issues\n// stored documents, outbound or acks.\n//\n// Codec 1 is the format of 0.4.0: its golden fixtures are\n// lib/test/fixtures/state-v1*.json (runs of lib 0.4.0, frozen), decoded and\n// re-encoded byte-identically and migrated by test/codec-fixture.test.mjs.\n// Codec 2 is the format of 0.5.0 (Message Tasks 0.1, Membership 0.20): its\n// fixtures are lib/test/fixtures/state-v2*.json (deterministic runs,\n// test/fixtures/gen-state-v2.mjs, reproduced in npm test). The rule: codecs\n// 1 and 2 are read, 1 migrated to 2; a newer codec is codec-newer; a codec\n// without a validator is codec-unknown. Every later codec adds its\n// validator, a migration from the one before, and its own fixture with a\n// migration test.\nimport { jcs } from './core.js'\nimport type { Duty, HolderState, KnownDuty } from './state.js'\nimport type { HolderEventType } from './events.js'\n\n/** The codec this library writes. */\nexport const CODEC = 2\n\n/** The tuples of a codec-1 state on which a document of the counterpart\n * was accepted, as far as the state shows it (Message Tasks 5.1): a probe,\n * a star, a group star, a continuity or anchor mapping, or a profile\n * received; or the counterparty's step credential of its enactment record. */\nfunction readyOf1 (s: any): string[] {\n const out = new Set<string>()\n const inRec = new Set<string>(Object.values(s.encounter.records as Record<string, any>).filter((r) => r.in !== null).map((r) => r.label))\n for (const r of Object.values(s.relationships as Record<string, any>)) {\n for (const t of r.tuples) {\n if (t.probeIn.hwm !== '0' || t.starIn.hwm !== '0' || t.groupStarIn.hwm !== '0' || t.continuityIn.rev !== '0' ||\n t.mappingIn.rev !== '0' || t.profileIn.rev !== '0' || inRec.has(t.ownPairLabel)) out.add(t.ownPairLabel)\n }\n }\n return [...out].sort()\n}\n\n/**\n * Migrations keyed by the codec they read: MIGRATIONS[n] maps a valid\n * codec-n state to a codec-(n+1) state. Pure, never async, never keys.\n *\n * 1 → 2 (lib 0.5.0, Message Tasks 0.1, Membership 0.20): the message\n * state starts empty (no block, no rate, no record, no inbox) but for the\n * ready tuples, read from what the state shows a counterpart's document\n * did (readyOf1); every invitation a codec-1 holder received was\n * surfaced, so their credential digests seed the permanent record of\n * RLTP-MT-3130; the register of declined invitations starts empty (codec 1\n * knew no block).\n */\nexport const MIGRATIONS: Readonly<Record<number, (state: any) => any>> = Object.freeze({\n 1: (s: any) => ({\n ...s,\n codec: 2,\n joining: { ...s.joining, surfaced: Object.keys(s.joining.invites).sort(), declined: [] },\n messages: { blocked: [], rates: {}, ready: readyOf1(s), records: {}, inbox: {} },\n }),\n})\n\n/** A codec's structural validator: throws StateCodecError('shape') or returns. */\nexport type StateValidator = (raw: unknown) => void\n\n/** One codec chain: the target codec, its migrations and a validator for\n * every codec from the oldest readable one up to the target. */\nexport interface CodecChain {\n codec: number\n migrations: Readonly<Record<number, (state: any) => any>>\n validators: Readonly<Record<number, StateValidator>>\n}\n\nexport type StateCodecErrorCode = 'not-json' | 'codec-unknown' | 'codec-newer' | 'shape'\n\n/** A stored state the library will not load (or a state it will not write). */\nexport class StateCodecError extends Error {\n readonly code: StateCodecErrorCode\n /** JSON path of the offending value, for 'shape' */\n readonly path?: string\n constructor (code: StateCodecErrorCode, message: string, path?: string) {\n super(path === undefined ? `${code}: ${message}` : `${code} at ${path}: ${message}`)\n this.name = 'StateCodecError'\n this.code = code\n if (path !== undefined) this.path = path\n }\n}\n\n// ── the validator kit ──────────────────────────────────────────────────\ntype V = (x: unknown, path: string) => void\n\nconst fail = (path: string, msg: string): never => { throw new StateCodecError('shape', msg, path) }\nconst isObj = (x: unknown): x is Record<string, unknown> => x !== null && typeof x === 'object' && !Array.isArray(x)\n\nconst str: V = (x, p) => { if (typeof x !== 'string') fail(p, 'string expected') }\nconst bool: V = (x, p) => { if (typeof x !== 'boolean') fail(p, 'boolean expected') }\nconst json: V = () => {} // JSON purity is checked once, up front\nconst dec: V = (x, p) => { if (typeof x !== 'string' || !/^(0|[1-9][0-9]{0,17})$/.test(x)) fail(p, 'canonical decimal string expected') }\nconst millis: V = (x, p) => { if (!Number.isSafeInteger(x) || (x as number) < 0) fail(p, 'non-negative integer milliseconds expected') }\nconst natural: V = (x, p) => { if (!Number.isSafeInteger(x) || (x as number) < 0) fail(p, 'non-negative integer expected') }\nconst positive: V = (x, p) => { if (!Number.isSafeInteger(x) || (x as number) < 1) fail(p, 'positive integer expected') }\nconst lit = (...vals: unknown[]): V => (x, p) => { if (!vals.includes(x)) fail(p, 'one of ' + vals.map((v) => JSON.stringify(v)).join(', ') + ' expected') }\nconst nullable = (v: V): V => (x, p) => { if (x !== null) v(x, p) }\nconst arr = (v: V): V => (x, p) => {\n if (!Array.isArray(x)) fail(p, 'array expected')\n ;(x as unknown[]).forEach((e, i) => v(e, `${p}[${i}]`))\n}\n/** an array used as a set: no duplicates */\nconst set = (v: V): V => (x, p) => {\n arr(v)(x, p)\n if (new Set((x as unknown[]).map((e) => jcs(e))).size !== (x as unknown[]).length) fail(p, 'duplicate set element')\n}\nconst rec = (v: V): V => (x, p) => {\n if (!isObj(x)) fail(p, 'object expected')\n for (const [k, e] of Object.entries(x as Record<string, unknown>)) v(e, `${p}.${k}`)\n}\n/** a closed object: required fields, optional fields, nothing else */\nconst obj = (req: Record<string, V>, opt: Record<string, V> = {}): V => (x, p) => {\n if (!isObj(x)) fail(p, 'object expected')\n const o = x as Record<string, unknown>\n for (const k of Object.keys(req)) {\n if (!Object.hasOwn(o, k)) fail(`${p}.${k}`, 'missing')\n req[k](o[k], `${p}.${k}`)\n }\n for (const k of Object.keys(o)) {\n if (Object.hasOwn(req, k)) continue\n if (!Object.hasOwn(opt, k)) fail(`${p}.${k}`, 'unknown field')\n opt[k](o[k], `${p}.${k}`)\n }\n}\n/** a record whose values carry their own key in `idField` */\n/** a JSON object, contents open */\nconst anyObj: V = (x, p) => { if (!isObj(x)) fail(p, 'object expected') }\nconst keyed = (v: V, idField: string): V => (x, p) => {\n rec(v)(x, p)\n for (const [k, e] of Object.entries(x as Record<string, Record<string, unknown>>)) if (e[idField] !== k) fail(`${p}.${k}.${idField}`, 'must equal its key')\n}\n\n// ── the HolderState shape (state.ts) ───────────────────────────────────\nconst setting = lit('default', 'on', 'off')\nconst trustClass = lit('star', 'groupStar', 'anchorMapping', 'sealedGroupStar', 'profile')\nconst recipient = obj({ contactId: str, rkid: str, keyAgreement: str }, { anchor: str, via: str })\nconst envelope = obj({ rkid: str, epk: str, nonce: str, ciphertext: str })\nconst assembly = obj({ salt: dec, chunks: rec(json) })\nconst seqOutShape = (item: V): V => obj({\n lastSalt: dec, exhausted: bool, hwm: dec, snapshot: nullable(arr(item)), snapshotDigest: nullable(str),\n inflight: rec(obj({ view: arr(item), viewDigest: str, digests: arr(str), acked: arr(str) })),\n})\n/** the snapshot and its digest are present together */\nconst seqOut = (item: V): V => {\n const shape = seqOutShape(item)\n return (x, p) => {\n shape(x, p)\n const o = x as { snapshot: unknown, snapshotDigest: unknown }\n if ((o.snapshot === null) !== (o.snapshotDigest === null)) fail(`${p}.snapshotDigest`, 'null exactly when snapshot is')\n }\n}\nconst seqIn = (accepted: V): V => obj({ hwm: dec, lowerBound: dec, assembly: nullable(assembly), accepted: nullable(accepted) })\nconst starPair = obj({ member: str, head: str })\nconst groupStarItem: V = (x, p) => {\n if (isObj(x) && x.mode === 'sealed') return obj({ group: str, mode: str, member: str, memberOp: str })(x, p)\n obj({ group: str, mode: lit('digest') })(x, p)\n}\nconst starOut = seqOut(starPair)\nconst starIn = seqIn(obj({ salt: dec, blinded: arr(str), matches: arr(str) }))\nconst groupStarOut = seqOut(groupStarItem)\nconst groupStarIn = seqIn(obj({ salt: dec, entries: arr(obj({ d: str, c: str })), groups: arr(str) }))\nconst continuityDue: V = (x, p) => {\n if (isObj(x) && x.kind === 'choice') return obj({ kind: str, prior: str, alts: arr(str) })(x, p)\n obj({ kind: lit('report', 'align'), prior: str })(x, p)\n}\nconst logHead: V = (x, p) => {\n if (isObj(x) && Object.hasOwn(x, 'empty')) return obj({ genesis: str, empty: lit(true) })(x, p)\n obj({ genesis: str, entryId: str, gen: positive, next: str, commit: str })(x, p)\n}\n\nconst tuple = obj({\n ownPairLabel: str, counterpartAnchor: str, counterpartKeyAgreement: str, rkid: str, entryId: str,\n priorCandidates: arr(obj({ ownPairLabel: str, counterpartAnchor: str }, { replaces: arr(str) })),\n starOut, starIn, groupStarOut, groupStarIn,\n probeOut: obj({ seq: dec, inflight: rec(obj({ digests: arr(str), acked: arr(str) })), done: bool }),\n probeIn: obj({ hwm: dec, lowerBound: dec, assembly: nullable(assembly) }),\n continuityOut: obj({ rev: dec, body: json, proof: json, sent: arr(str), align: bool, chosen: nullable(str), reported: nullable(str), aligned: bool, due: nullable(continuityDue) }),\n continuityIn: obj({ rev: dec, body: json, recordPrior: nullable(str) }),\n mappingOut: obj({ rev: dec, body: json, underAnchor: nullable(str) }),\n mappingIn: obj({ rev: dec, body: json, self: nullable(str), card: json }),\n profileOut: obj({ rev: dec }),\n profileIn: obj({ rev: dec, body: json, verifiedSeq: dec }),\n deactivated: bool,\n})\n\nconst relationship = obj({\n id: str, contactId: str, tuples: arr(tuple), activeHead: str, earliestAnchor: nullable(str),\n links: arr(obj({ prev: str, next: str })), bindings: rec(set(str)), heldCounterpartHead: nullable(str),\n memory: rec(json), provenance: obj({ kind: lit('ceremony', 'introduced'), at: millis }, { via: str, viaPin: str }),\n chainedInto: nullable(str), firstVerified: nullable(dec),\n})\n\nconst contact = obj({\n id: str, pos: nullable(dec), status: lit('none', 'admitted', 'pending'), aliases: set(str), relIds: set(str),\n anchorHead: nullable(str),\n settings: obj({ star: setting, groupStar: setting, anchorMapping: setting, sealedGroupStar: setting, profile: setting }),\n groupSettings: rec(setting),\n})\n\n/** an outbox step of codec n: codec 2 added the failure reason task-expired */\nconst outboxStepOf = (codec: number): V => (x, p) => {\n if (!isObj(x)) fail(p, 'object expected')\n const s = x as Record<string, unknown>\n switch (s.status) {\n case 'submitted': return obj({ status: str, at: millis, attempt: positive })(x, p)\n case 'awaiting-transport': return obj({ status: str, at: millis, reason: lit('offline', 'transport-unreachable', 'carrier-refused-retriable') })(x, p)\n case 'accepted': return obj({ status: str, at: millis })(x, p)\n case 'delivered': return obj({ status: str, at: millis, late: bool })(x, p)\n case 'failed': return s.reason === 'rejected-by-receiver'\n ? obj({ status: str, at: millis, reason: str, code: lit('malformedRequest', 'unsupportedType', 'proofRequired', 'proofInvalid', 'wrongRecipient', 'identityMismatch') })(x, p)\n : obj({ status: str, at: millis, reason: codec < 2 ? lit('unroutable', 'oversize', 'expired-by-adapter-policy') : lit('unroutable', 'oversize', 'expired-by-adapter-policy', 'task-expired') })(x, p)\n default: fail(`${p}.status`, 'unknown outbox status')\n }\n}\n\n/** an outbox item of codec n: codec 2 added expiresAt (the sender lifetime);\n * the envelope is sealed to the counterpart key, never to the own rkid */\nconst outboxItemOf = (codec: number): V => {\n const shape = obj({\n type: str, threadId: str, recipient, envelope, attempt: positive, history: arr(outboxStepOf(codec)),\n }, codec < 2 ? { nextAttemptAt: millis } : { nextAttemptAt: millis, expiresAt: millis })\n return (x, p) => {\n shape(x, p)\n const o = x as { recipient: { keyAgreement: string }, envelope: { rkid: string } }\n if (o.envelope.rkid !== o.recipient.keyAgreement) fail(`${p}.envelope.rkid`, 'must equal recipient.keyAgreement')\n }\n}\n\nconst DUE = { dueAt: millis }\n/** a retained ack: sealed to the counterpart key, like an outbox item */\nconst storedAck: V = (x, p) => {\n obj({ digest: str, envelope, threadId: str, recipient, at: millis, attempt: positive, sent: bool }, { nextAttemptAt: millis, sentBy: lit('report', 'horizon') })(x, p)\n const a = x as { recipient: { keyAgreement: string }, envelope: { rkid: string } }\n if (a.envelope.rkid !== a.recipient.keyAgreement) fail(`${p}.envelope.rkid`, 'must equal recipient.keyAgreement')\n}\n\nconst KNOWN_DUTIES: Record<KnownDuty['kind'], { v: number, shape: V }> = {\n 'reissue-mapping': { v: 1, shape: obj({ kind: str, v: positive, id: str, contactId: str, relId: str, awaitHead: nullable(str) }, DUE) },\n 'class-on': { v: 1, shape: obj({ kind: str, v: positive, id: str, contactId: str, relId: str, cls: trustClass }, DUE) },\n profile: { v: 1, shape: obj({ kind: str, v: positive, id: str, contactId: str, relId: str, rev: dec }, DUE) },\n continuity: { v: 1, shape: obj({ kind: str, v: positive, id: str, relId: str, tuple: str, step: lit('probe', 'mapping') }, { ...DUE, attempt: natural, lastAt: millis }) },\n merge: { v: 1, shape: obj({ kind: str, v: positive, id: str, entryIds: set(str), relId: str, witness: obj({ heads: rec(str), superseded: rec(set(str)) }) }, DUE) },\n rotation: { v: 1, shape: obj({ kind: str, v: positive, id: str, rotationId: str }, { ...DUE, attempt: natural, lastAt: millis }) },\n 'intro-ack': { v: 1, shape: obj({ kind: str, v: positive, id: str, act: str }, DUE) },\n}\n\n/** Is this a duty kind and version this library handles? Unknown ones are kept as they are. */\nexport const isKnownDuty = (d: Duty): d is KnownDuty =>\n Object.hasOwn(KNOWN_DUTIES, d.kind) && KNOWN_DUTIES[d.kind as KnownDuty['kind']].v === d.v\n\nconst duty: V = (x, p) => {\n if (!isObj(x)) fail(p, 'object expected')\n const d = x as Record<string, unknown>\n str(d.kind, `${p}.kind`); natural(d.v, `${p}.v`); str(d.id, `${p}.id`)\n if (isKnownDuty(d as unknown as Duty)) KNOWN_DUTIES[d.kind as KnownDuty['kind']].shape(x, p)\n}\n\nconst EVENT_FIELDS: Record<HolderEventType, [Record<string, V>, Record<string, V>?]> = {\n 'contact.added': [{ contactId: str }],\n 'contact.verified': [{ contactId: str, relationshipId: str }],\n 'contact.chained': [{ contactId: str, from: str, into: str }],\n 'contact.merged': [{ contactId: str, merged: arr(str) }],\n 'contact.split': [{ contactId: str, leaver: str, relationshipId: str }],\n 'contact.departed': [{ contactId: str, relationshipIds: arr(str), removed: bool }],\n 'trust.given': [{ contactId: str }],\n 'trust.received': [{ contactId: str }],\n 'trust.paused': [{ contactId: str, paused: bool }],\n 'group.joined': [{ groupId: str }],\n 'prompt.opened': [{ promptId: str, kind: lit('encounter-confirm', 'group-invite', 'introduction') }],\n 'prompt.decided': [{ promptId: str, kind: lit('encounter-confirm', 'group-invite', 'introduction'), choice: lit('accept', 'decline') }],\n 'delivery.status': [{ digest: str, threadId: str, status: lit('submitted', 'accepted', 'delivered', 'failed') }, { late: bool }],\n 'profile.updated': [{ contactId: nullable(str) }],\n 'anchor.rotated': [{ generation: dec }],\n 'device.added': [{ name: str }],\n 'device.revoked': [{ name: str }],\n 'duty.unsupported': [{ dutyId: str, kind: str, v: natural }],\n 'star.accepted': [{ contactId: str, relationshipId: str, salt: dec }],\n 'groupStar.accepted': [{ contactId: str, relationshipId: str, salt: dec }],\n 'encounter.shown': [{ challenge: str, card: anyObj }],\n 'encounter.scanned': [{ contactId: str, card: anyObj }],\n 'encounter.recorded': [{ contactId: str, relationshipId: str, role: lit('scanner', 'displayer') }],\n 'encounter.accepted': [{ contactId: str, relationshipId: str, mutual: bool }],\n 'group.founded': [{ groupId: str }],\n 'group.admitted': [{ groupId: str, member: str }],\n 'group.vouched': [{ groupId: str, member: str }],\n 'contact.blocked': [{ contactId: str, blocked: bool }],\n 'message.sent': [{ contactId: str, mid: str, digest: str }],\n 'message.received': [{ contactId: str, inboxId: str }],\n}\n/** the event types codec 2 added: codec 1 does not know them */\nconst EVENTS_SINCE_2: ReadonlySet<string> = new Set(['contact.blocked', 'message.sent', 'message.received'])\nconst eventOf = (codec: number): V => (x, p) => {\n if (!isObj(x)) fail(p, 'object expected')\n const t = (x as Record<string, unknown>).type\n if (typeof t !== 'string' || !Object.hasOwn(EVENT_FIELDS, t) || (codec < 2 && EVENTS_SINCE_2.has(t))) fail(`${p}.type`, 'unknown event type')\n const [req, opt = {}] = EVENT_FIELDS[t as HolderEventType]\n obj({ type: str, eventId: str, commitSeq: dec, ...req }, { actId: str, ...opt })(x, p)\n}\n\nconst rosterEntry = obj({ anchor: str, op: str, keyAgreement: str, addedAt: millis }, { name: str, contactId: str, rkid: str })\nconst openInvitation = obj({ invitee: str, keyAgreement: str, contactId: str, rkid: str, threadId: str, credDigest: str, invite: anyObj, validUntil: millis })\nconst evidence = obj({ invite: anyObj, accept: anyObj, vouches: arr(anyObj), at: millis })\nconst groupShape = obj({\n id: str, name: str, memberLabel: str, rules: obj({ vouchThreshold: dec }), listed: bool,\n roster: keyed(rosterEntry, 'anchor'), invitations: keyed(openInvitation, 'threadId'), evidence: rec(evidence),\n preludes: rec(obj({ contactId: str, rkid: str, at: millis })),\n}, { did: str, genesis: anyObj, memberAnchor: str, memberOp: str, acceptDigest: str })\n/** a listed group carries its member anchor and memberOp: the group star\n * seals them (Trust 5400, 5430), and their absence is no filler condition */\nconst group: V = (x, p) => {\n groupShape(x, p)\n const g = x as { listed: boolean, memberAnchor?: unknown, memberOp?: unknown }\n if (g.listed && g.memberAnchor === undefined) fail(`${p}.memberAnchor`, 'missing on a listed group')\n if (g.listed && g.memberOp === undefined) fail(`${p}.memberOp`, 'missing on a listed group')\n}\n\nconst heldCredential = obj({ digest: str, credential: anyObj })\nconst enactmentRecord = obj({\n ceremony: str, own: str, tCh: millis, peer: str, counterpart: str, card: anyObj, bind: str, at: millis, label: str, relId: str,\n role: lit('scanner', 'displayer'), out: nullable(heldCredential), in: nullable(heldCredential),\n thread: nullable(str), bundleDigest: nullable(str), threads: rec(str), sentCard: nullable(anyObj), counterPending: bool,\n})\n\nconst introAct = obj({\n key: str, act: str, role: lit('requester', 'mediator', 'target'),\n status: lit('sent', 'acked', 'completed', 'failed', 'received', 'forwarded', 'consented', 'refused'),\n issuedAt: millis, request: anyObj, requestCard: anyObj, reply: nullable(anyObj), replyCard: nullable(anyObj),\n pins: obj({}, { requester: str, target: str, mediator: str }), threads: obj({ request: str }, { forward: str }),\n at: millis, ackDelayMs: natural, ownLabel: nullable(str), ack: nullable(anyObj), replyForwarded: bool, vouchersSent: bool,\n pendingVoucher: nullable(anyObj), voucher: nullable(anyObj), vouched: bool, promptId: nullable(str),\n}, { peerName: str })\n\nconst fields1: Record<string, V> = {\n codec: lit(1),\n commitSeq: dec,\n lastWhen: millis,\n register: obj({\n labels: set(str), pairNonces: rec(str),\n carriers: rec(arr(obj({ nonce: str, generation: dec }))),\n devices: obj({ names: set(str), revoked: set(str) }),\n community: nullable(obj({ genesis: str, head: dec })),\n lineage: arr(anyObj),\n }),\n addresses: obj({ keys: rec(obj({ label: str, lastShown: millis }, { retiredAt: millis })), tombstones: set(str) }),\n contacts: keyed(contact, 'id'),\n relationships: keyed(relationship, 'id'),\n entryOrder: obj({ nextPos: dec, heads: set(str) }),\n groups: keyed(group, 'id'),\n profile: obj({ body: json, revision: dec }),\n effects: rec(obj({ ack: nullable(storedAck), expiresAt: millis })),\n outbox: rec(outboxItemOf(1)),\n duties: keyed(duty, 'id'),\n rotations: keyed(obj({\n id: str, from: dec, to: dec, step: lit('register', 'log', 'duties'), startedAt: millis,\n entry: json, overHead: logHead, awaitHead: rec(nullable(str)),\n }), 'id'),\n prompts: keyed(obj({ id: str, kind: lit('encounter-confirm', 'group-invite', 'introduction'), openedAt: millis }, { contactId: str, groupId: str, expiresAt: millis }), 'id'),\n acts: keyed(obj({ actId: str, inputHash: str, commitSeq: dec, outboundDigests: arr(str), events: arr(eventOf(1)), at: millis }), 'actId'),\n encounter: obj({\n challenges: keyed(obj({ value: str, tCh: millis, label: str, card: anyObj }), 'value'),\n records: keyed(enactmentRecord, 'own'),\n introductions: keyed(introAct, 'key'),\n offers: keyed(obj({ id: str, mediatorContactId: str, pin: str, target: str, at: millis }, { label: str }), 'id'),\n designators: rec(str),\n declarations: rec(obj({ issuer: str, role: str, revision: dec, constants: rec(str), at: millis })),\n }),\n joining: obj({\n preludes: rec(obj({ group: str, inviter: str, contactId: str, rkid: str, memberLabel: str, at: millis })),\n invites: keyed(obj({\n credDigest: str, group: str, name: str, contactId: str, rkid: str, memberLabel: str, invite: anyObj, promptId: str, validUntil: millis,\n status: lit('open', 'accepted', 'declined', 'joined'), at: millis,\n }, { acceptDigest: str }), 'credDigest'),\n }),\n}\nconst codec1 = obj(fields1)\n\n/** a sorted set of strings */\nconst sortedSet: V = (x, p) => {\n set(str)(x, p)\n const a = x as string[]\n for (let i = 1; i < a.length; i++) if (!(a[i - 1] < a[i])) fail(`${p}[${i}]`, 'a sorted set expected')\n}\n\n/** an invitation received: attributed to a relationship (contactId and\n * rkid together) or to none (Membership RLTP-MT-3100) */\nconst receivedInvite2: V = (x, p) => {\n obj({\n credDigest: str, group: str, name: str, memberLabel: str, invite: anyObj, promptId: str, validUntil: millis,\n status: lit('open', 'accepted', 'declined', 'joined'), at: millis,\n }, { acceptDigest: str, contactId: str, rkid: str })(x, p)\n const i = x as { contactId?: unknown, rkid?: unknown }\n if ((i.contactId === undefined) !== (i.rkid === undefined)) fail(`${p}.rkid`, 'present exactly with contactId')\n}\n\nconst codec2 = obj({\n ...fields1,\n codec: lit(2),\n outbox: rec(outboxItemOf(2)),\n acts: keyed(obj({ actId: str, inputHash: str, commitSeq: dec, outboundDigests: arr(str), events: arr(eventOf(2)), at: millis }), 'actId'),\n joining: obj({\n preludes: rec(obj({ group: str, inviter: str, contactId: str, rkid: str, memberLabel: str, at: millis })),\n invites: keyed(receivedInvite2, 'credDigest'),\n surfaced: sortedSet,\n declined: sortedSet,\n }),\n messages: obj({\n blocked: sortedSet,\n rates: rec(obj({ invites: arr(millis), messages: arr(millis) })),\n ready: sortedSet,\n records: rec(rec(obj({ bodyDigest: str, sentAt: millis }))),\n inbox: keyed(obj({ id: str, tuple: str, mid: str, body: anyObj, receivedAt: millis, displayAt: millis }), 'id'),\n }),\n})\n\n/** Structural validators per codec version; every readable codec has one. */\nexport const VALIDATORS: Readonly<Record<number, StateValidator>> = Object.freeze({\n 1: (raw: unknown) => codec1(raw, '$'),\n 2: (raw: unknown) => codec2(raw, '$'),\n})\n\n// ── the codec ──────────────────────────────────────────────────────────\n\n/** Canonical JSON text of a JSON-pure value, or not-json. */\nconst canonical = (x: unknown): string => {\n try { return jcs(x) } catch (e) { throw new StateCodecError('not-json', (e as Error).message) }\n}\n\nconst validatorOf = (chain: CodecChain, c: number): StateValidator => {\n const v = chain.validators[c]\n if (!v) throw new StateCodecError('codec-unknown', `no validator for codec ${c}`)\n return v\n}\n\n/**\n * Decode under an explicit chain: JSON purity, codec gate, then\n * validate(c) → migrate(c) → validate(c+1) … up to chain.codec. Returns\n * an independent copy. decodeState is this function over the library's\n * own chain; tests drive it with fake chains.\n */\nexport function decodeChain (raw: unknown, chain: CodecChain): unknown {\n let x = raw\n if (typeof raw === 'string') {\n try { x = JSON.parse(raw) } catch (e) { throw new StateCodecError('not-json', (e as Error).message) }\n }\n let s = JSON.parse(canonical(x)) as unknown\n if (!isObj(s)) fail('$', 'object expected')\n const at = (s as { codec?: unknown }).codec\n if (!Number.isSafeInteger(at) || (at as number) < 0) throw new StateCodecError('codec-unknown', 'codec must be a non-negative integer')\n if ((at as number) > chain.codec) throw new StateCodecError('codec-newer', `codec ${at} is newer than ${chain.codec}`)\n validatorOf(chain, at as number)(s)\n for (let c = at as number; c < chain.codec; c++) {\n const up = chain.migrations[c]\n if (!up) throw new StateCodecError('codec-unknown', `no migration from codec ${c}`)\n s = JSON.parse(canonical(up(JSON.parse(canonical(s)))))\n if (!isObj(s) || s.codec !== c + 1) fail('$.codec', `migration ${c} must produce codec ${c + 1}`)\n validatorOf(chain, c + 1)(s)\n }\n return s\n}\n\nconst LIBRARY_CHAIN: CodecChain = { codec: CODEC, migrations: MIGRATIONS, validators: VALIDATORS }\n\n/**\n * Load a stored state: a JSON string or an already parsed value. Returns\n * an independent copy at the current codec, or throws StateCodecError.\n */\nexport function decodeState (raw: unknown): HolderState {\n return decodeChain(raw, LIBRARY_CHAIN) as HolderState\n}\n\n/** Serialize a state for storage: canonical JSON, validated first. */\nexport function encodeState (state: HolderState): string {\n const text = canonical(state)\n validatorOf(LIBRARY_CHAIN, CODEC)(JSON.parse(text))\n return text\n}\n\n/** Deterministic equality of two states (their JCS forms). */\nexport const sameState = (a: HolderState, b: HolderState): boolean => jcs(a) === jcs(b)\n"]}