@opengeni/contracts 0.39.0 → 0.44.1

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 (130) hide show
  1. package/dist/atlassian.d.ts +278 -0
  2. package/dist/atlassian.js +55 -0
  3. package/dist/atlassian.js.map +1 -0
  4. package/dist/chunk-52SGB2QO.js +688 -0
  5. package/dist/chunk-52SGB2QO.js.map +1 -0
  6. package/dist/{chunk-7JZMI22I.js → chunk-5UDNP7AO.js} +34 -2
  7. package/dist/chunk-5UDNP7AO.js.map +1 -0
  8. package/dist/chunk-BVGIYW7D.js +11 -0
  9. package/dist/chunk-BVGIYW7D.js.map +1 -0
  10. package/dist/chunk-CADSX6UN.js +1145 -0
  11. package/dist/chunk-CADSX6UN.js.map +1 -0
  12. package/dist/chunk-D2HKF2EF.js +1460 -0
  13. package/dist/chunk-D2HKF2EF.js.map +1 -0
  14. package/dist/chunk-FJBG5E4O.js +194 -0
  15. package/dist/chunk-FJBG5E4O.js.map +1 -0
  16. package/dist/chunk-H5BVCZKF.js +382 -0
  17. package/dist/chunk-H5BVCZKF.js.map +1 -0
  18. package/dist/chunk-LSB7GRLG.js +779 -0
  19. package/dist/chunk-LSB7GRLG.js.map +1 -0
  20. package/dist/chunk-MYBZRDTY.js +340 -0
  21. package/dist/chunk-MYBZRDTY.js.map +1 -0
  22. package/dist/chunk-RIY7GYQS.js +1204 -0
  23. package/dist/chunk-RIY7GYQS.js.map +1 -0
  24. package/dist/chunk-TZ6YEYN4.js +386 -0
  25. package/dist/chunk-TZ6YEYN4.js.map +1 -0
  26. package/dist/chunk-VA22KRHS.js +15177 -0
  27. package/dist/chunk-VA22KRHS.js.map +1 -0
  28. package/dist/chunk-Y3MLSLB4.js +392 -0
  29. package/dist/chunk-Y3MLSLB4.js.map +1 -0
  30. package/dist/chunk-YRKRZ6OF.js +134 -0
  31. package/dist/chunk-YRKRZ6OF.js.map +1 -0
  32. package/dist/company-profile.d.ts +629 -0
  33. package/dist/document-artifact-commands.d.ts +282 -0
  34. package/dist/document-artifact-commands.js +54 -0
  35. package/dist/document-artifact-commands.js.map +1 -0
  36. package/dist/document-artifact-query.d.ts +2 -0
  37. package/dist/document-artifact-query.js +54 -0
  38. package/dist/document-artifact-query.js.map +1 -0
  39. package/dist/editable-artifact-binary.d.ts +56 -0
  40. package/dist/editable-artifact-causal-frontier.d.ts +12 -0
  41. package/dist/editable-artifact-causal-frontier.js +18 -0
  42. package/dist/editable-artifact-causal-frontier.js.map +1 -0
  43. package/dist/editable-artifact-codec-registry.d.ts +48 -0
  44. package/dist/editable-artifact-codec-registry.js +20 -0
  45. package/dist/editable-artifact-codec-registry.js.map +1 -0
  46. package/dist/editable-artifact-committed-transaction.d.ts +35 -0
  47. package/dist/editable-artifact-committed-transaction.js +19 -0
  48. package/dist/editable-artifact-committed-transaction.js.map +1 -0
  49. package/dist/editable-artifact-live.d.ts +276 -0
  50. package/dist/editable-artifact-live.js +907 -0
  51. package/dist/editable-artifact-live.js.map +1 -0
  52. package/dist/editable-artifact-serialized-commit.d.ts +53 -0
  53. package/dist/editable-artifact-serialized-commit.js +26 -0
  54. package/dist/editable-artifact-serialized-commit.js.map +1 -0
  55. package/dist/editable-artifact-versions.d.ts +6 -0
  56. package/dist/editable-artifact-versions.js +11 -0
  57. package/dist/editable-artifact-versions.js.map +1 -0
  58. package/dist/editable-artifacts.d.ts +46 -0
  59. package/dist/editable-artifacts.js +236 -0
  60. package/dist/editable-artifacts.js.map +1 -0
  61. package/dist/event-preview.d.ts +7 -7
  62. package/dist/google-drive.d.ts +114 -2
  63. package/dist/google-drive.js +70 -14
  64. package/dist/google-drive.js.map +1 -1
  65. package/dist/image-generation.d.ts +70 -0
  66. package/dist/index.d.ts +5180 -329
  67. package/dist/index.js +1173 -40
  68. package/dist/interaction.d.ts +6895 -0
  69. package/dist/mcp-receipts.d.ts +96 -0
  70. package/dist/memory-slack-delivery.d.ts +397 -0
  71. package/dist/presentation-artifact-commands.d.ts +349 -0
  72. package/dist/presentation-artifact-commands.js +66 -0
  73. package/dist/presentation-artifact-commands.js.map +1 -0
  74. package/dist/presentation-artifact-query.d.ts +2 -0
  75. package/dist/presentation-artifact-query.js +66 -0
  76. package/dist/presentation-artifact-query.js.map +1 -0
  77. package/dist/retained-output.d.ts +83 -6
  78. package/dist/sandbox-snapshots.d.ts +9 -0
  79. package/dist/scoped-knowledge.d.ts +14 -13
  80. package/dist/slack-bot-scopes.d.ts +4 -0
  81. package/dist/slack-bot-scopes.js +3 -1
  82. package/dist/spreadsheet-artifact-commands.d.ts +101 -0
  83. package/dist/spreadsheet-artifact-commands.js +27 -0
  84. package/dist/spreadsheet-artifact-commands.js.map +1 -0
  85. package/dist/spreadsheet-artifact-date.d.ts +4 -0
  86. package/dist/spreadsheet-artifact-query.d.ts +120 -0
  87. package/dist/spreadsheet-artifact-query.js +48 -0
  88. package/dist/spreadsheet-artifact-query.js.map +1 -0
  89. package/dist/tool-catalog.d.ts +576 -0
  90. package/dist/video-generation.d.ts +532 -0
  91. package/dist/video-generation.js +51 -0
  92. package/dist/video-generation.js.map +1 -0
  93. package/dist/workspace-learning-policy.d.ts +208 -0
  94. package/package.json +61 -1
  95. package/src/atlassian.ts +160 -0
  96. package/src/company-profile.ts +306 -0
  97. package/src/document-artifact-commands.ts +1709 -0
  98. package/src/document-artifact-query.ts +2 -0
  99. package/src/editable-artifact-binary.ts +396 -0
  100. package/src/editable-artifact-causal-frontier.ts +154 -0
  101. package/src/editable-artifact-codec-registry.ts +261 -0
  102. package/src/editable-artifact-committed-transaction.ts +478 -0
  103. package/src/editable-artifact-live.ts +1379 -0
  104. package/src/editable-artifact-serialized-commit.ts +494 -0
  105. package/src/editable-artifact-versions.ts +8 -0
  106. package/src/editable-artifacts.ts +473 -0
  107. package/src/event-preview.ts +6 -6
  108. package/src/google-drive.ts +68 -15
  109. package/src/image-generation.ts +106 -0
  110. package/src/index.ts +2535 -282
  111. package/src/interaction.ts +2292 -0
  112. package/src/mcp-receipts.ts +281 -0
  113. package/src/memory-slack-delivery.ts +183 -0
  114. package/src/presentation-artifact-commands.ts +2035 -0
  115. package/src/presentation-artifact-query.ts +2 -0
  116. package/src/retained-output.ts +248 -8
  117. package/src/sandbox-snapshots.ts +28 -1
  118. package/src/scoped-knowledge.ts +18 -4
  119. package/src/slack-bot-scopes.ts +34 -1
  120. package/src/spreadsheet-artifact-commands.ts +999 -0
  121. package/src/spreadsheet-artifact-date.ts +21 -0
  122. package/src/spreadsheet-artifact-query.ts +1411 -0
  123. package/src/tool-catalog.ts +334 -0
  124. package/src/video-generation.ts +394 -0
  125. package/src/workspace-learning-policy.ts +233 -0
  126. package/dist/chunk-7JZMI22I.js.map +0 -1
  127. package/dist/chunk-PCTCJEAF.js +0 -10799
  128. package/dist/chunk-PCTCJEAF.js.map +0 -1
  129. package/dist/secret-redaction.d.ts +0 -40
  130. package/src/secret-redaction.ts +0 -364
@@ -0,0 +1,392 @@
1
+ import {
2
+ COMMITTED_TRANSACTION_PROTOCOL_VERSION
3
+ } from "./chunk-BVGIYW7D.js";
4
+
5
+ // src/editable-artifact-committed-transaction.ts
6
+ var MAX_COMMITTED_TRANSACTION_BYTES = 8 * 1024 * 1024;
7
+ var MAX_COMMITTED_TRANSACTION_OPERATIONS = 4096;
8
+ var MAX_COMMITTED_TRANSACTION_CAUSAL_REPLICAS = 1e5;
9
+ var MAX_COMMITTED_TRANSACTION_CELLS = 1e6;
10
+ var MAGIC = new Uint8Array([79, 71, 65, 67, 79, 48, 48, 49]);
11
+ var HEADER_BYTES = 24;
12
+ var CHECKSUM_BYTES = 8;
13
+ var HASH_BYTES = 32;
14
+ var STABLE_ID_BYTES = 16;
15
+ var MAX_OPERATION_STRING_BYTES = 4 * 1024 * 1024;
16
+ var MAX_SAFE_U64_HIGH = 2097151;
17
+ var U32_SIZE = 4294967296;
18
+ var U32_MAX = 4294967295;
19
+ var FNV_OFFSET_LOW = 2216829733;
20
+ var FNV_OFFSET_HIGH = 3421674724;
21
+ var FNV_PRIME_LOW = 435;
22
+ var HEX = Array.from({ length: 256 }, (_, value) => value.toString(16).padStart(2, "0"));
23
+ function decodeCommittedTransactionSummary(bytes) {
24
+ assertInput(bytes);
25
+ if (bytes.byteLength > MAX_COMMITTED_TRANSACTION_BYTES) {
26
+ throw new RangeError("OGACO001 envelope exceeds its byte limit");
27
+ }
28
+ if (bytes.byteLength < HEADER_BYTES + CHECKSUM_BYTES) {
29
+ throw new TypeError("truncated OGACO001 envelope");
30
+ }
31
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
32
+ for (let index = 0; index < MAGIC.byteLength; index += 1) {
33
+ if (bytes[index] !== MAGIC[index]) throw new TypeError("invalid OGACO001 magic");
34
+ }
35
+ const version = view.getUint16(8, true);
36
+ if (version !== COMMITTED_TRANSACTION_PROTOCOL_VERSION) {
37
+ throw new TypeError(`unsupported OGACO001 version: ${version}`);
38
+ }
39
+ if (view.getUint16(10, true) !== 0) {
40
+ throw new TypeError("reserved OGACO001 header bits are set");
41
+ }
42
+ const operationCount = view.getUint32(12, true);
43
+ if (operationCount === 0 || operationCount > MAX_COMMITTED_TRANSACTION_OPERATIONS) {
44
+ throw new RangeError("OGACO001 operation count is outside its canonical bounds");
45
+ }
46
+ const payloadLength = safeU64At(view, 16, "OGACO001 payload length", false);
47
+ const payloadEnd = checkedAdd(HEADER_BYTES, payloadLength, "OGACO001 payload length");
48
+ const expectedLength = checkedAdd(payloadEnd, CHECKSUM_BYTES, "OGACO001 envelope length");
49
+ if (bytes.byteLength !== expectedLength) {
50
+ throw new TypeError(
51
+ bytes.byteLength < expectedLength ? "truncated OGACO001 payload" : "trailing bytes after OGACO001 envelope"
52
+ );
53
+ }
54
+ const [checksumLow, checksumHigh] = fnv1a64(bytes, payloadEnd);
55
+ if (view.getUint32(payloadEnd, true) !== checksumLow || view.getUint32(payloadEnd + 4, true) !== checksumHigh) {
56
+ throw new TypeError("OGACO001 checksum mismatch");
57
+ }
58
+ const reader = new Reader(bytes, HEADER_BYTES, payloadEnd);
59
+ const transactionId = reader.stableId("transaction id");
60
+ const dot = Object.freeze({
61
+ replicaId: reader.replicaId("transaction dot replica"),
62
+ counter: reader.safeU64("transaction dot counter", true)
63
+ });
64
+ const resolvedCausalBase = reader.frontier("resolved causal base");
65
+ const priorStateHash = reader.stateHash("prior state hash");
66
+ const operationIds = [];
67
+ const seenOperationIds = /* @__PURE__ */ new Set();
68
+ let totalCells = 0;
69
+ for (let index = 0; index < operationCount; index += 1) {
70
+ const operationId = reader.stableId(`operation ${index} id`);
71
+ if (seenOperationIds.has(operationId)) {
72
+ throw new TypeError("OGACO001 operation ids must be unique");
73
+ }
74
+ seenOperationIds.add(operationId);
75
+ operationIds.push(operationId);
76
+ totalCells = reader.skipCommand(totalCells);
77
+ }
78
+ const resultingCausalFrontier = reader.frontier("resulting causal frontier");
79
+ const stateHash = reader.stateHash("resulting state hash");
80
+ reader.done();
81
+ return Object.freeze({
82
+ operationProtocolVersion: COMMITTED_TRANSACTION_PROTOCOL_VERSION,
83
+ transactionId,
84
+ dot,
85
+ resolvedCausalBase,
86
+ operationIds: Object.freeze(operationIds),
87
+ priorStateHash,
88
+ resultingCausalFrontier,
89
+ stateHash
90
+ });
91
+ }
92
+ var Reader = class {
93
+ #bytes;
94
+ #view;
95
+ #end;
96
+ #offset;
97
+ constructor(bytes, offset, end) {
98
+ this.#bytes = bytes;
99
+ this.#view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
100
+ this.#offset = offset;
101
+ this.#end = end;
102
+ }
103
+ take(length, label) {
104
+ const offset = this.reserve(length, label);
105
+ return this.#bytes.subarray(offset, offset + length);
106
+ }
107
+ reserve(length, label) {
108
+ if (!Number.isSafeInteger(length) || length < 0) {
109
+ throw new RangeError(`${label} has an invalid byte length`);
110
+ }
111
+ const offset = this.#offset;
112
+ const end = checkedAdd(offset, length, `${label} byte range`);
113
+ if (end > this.#end) throw new TypeError(`truncated ${label}`);
114
+ this.#offset = end;
115
+ return offset;
116
+ }
117
+ u8(label) {
118
+ return this.#bytes[this.reserve(1, label)];
119
+ }
120
+ u32(label) {
121
+ const offset = this.reserve(4, label);
122
+ return this.#view.getUint32(offset, true);
123
+ }
124
+ safeU64(label, positive) {
125
+ const offset = this.reserve(8, label);
126
+ const value = safeU64At(this.#view, offset, label, positive);
127
+ return value;
128
+ }
129
+ replicaId(label) {
130
+ const offset = this.reserve(8, label);
131
+ const low = this.#view.getUint32(offset, true);
132
+ const high = this.#view.getUint32(offset + 4, true);
133
+ if (low === 0 && high === 0) throw new TypeError(`${label} must be nonzero`);
134
+ return hexU64(high, low);
135
+ }
136
+ stableId(label) {
137
+ const offset = this.reserve(STABLE_ID_BYTES, label);
138
+ const counterLow = this.#view.getUint32(offset, true);
139
+ const counterHigh = this.#view.getUint32(offset + 4, true);
140
+ const namespaceLow = this.#view.getUint32(offset + 8, true);
141
+ const namespaceHigh = this.#view.getUint32(offset + 12, true);
142
+ if (counterLow === 0 && counterHigh === 0 && namespaceLow === 0 && namespaceHigh === 0) {
143
+ throw new TypeError(`${label} reserves the all-zero value`);
144
+ }
145
+ return `${hexU64(namespaceHigh, namespaceLow)}${hexU64(counterHigh, counterLow)}`;
146
+ }
147
+ sheetObjectId(label) {
148
+ const offset = this.#offset;
149
+ const id = this.stableId(label);
150
+ const counterIsZero = this.#view.getUint32(offset, true) === 0 && this.#view.getUint32(offset + 4, true) === 0;
151
+ const namespaceIsZero = this.#view.getUint32(offset + 8, true) === 0 && this.#view.getUint32(offset + 12, true) === 0;
152
+ if (counterIsZero || namespaceIsZero) {
153
+ throw new TypeError(`${label} requires nonzero namespace and counter`);
154
+ }
155
+ return id;
156
+ }
157
+ stateHash(label) {
158
+ return `sha256:${hexBytes(this.take(HASH_BYTES, label))}`;
159
+ }
160
+ frontier(label) {
161
+ const count = this.u32(`${label} count`);
162
+ if (count > MAX_COMMITTED_TRANSACTION_CAUSAL_REPLICAS) {
163
+ throw new RangeError(`${label} exceeds its replica limit`);
164
+ }
165
+ const entries = [];
166
+ let previousLow = 0;
167
+ let previousHigh = 0;
168
+ let hasPrevious = false;
169
+ for (let index = 0; index < count; index += 1) {
170
+ const replicaOffset = this.#offset;
171
+ const replicaId = this.replicaId(`${label} replica ${index}`);
172
+ const replicaLow = this.#view.getUint32(replicaOffset, true);
173
+ const replicaHigh = this.#view.getUint32(replicaOffset + 4, true);
174
+ if (hasPrevious && (replicaHigh < previousHigh || replicaHigh === previousHigh && replicaLow <= previousLow)) {
175
+ throw new TypeError(`${label} replicas must be unique and strictly ordered`);
176
+ }
177
+ const counter = this.safeU64(`${label} counter ${index}`, true);
178
+ entries.push(Object.freeze({ replicaId, counter }));
179
+ previousLow = replicaLow;
180
+ previousHigh = replicaHigh;
181
+ hasPrevious = true;
182
+ }
183
+ return Object.freeze(entries);
184
+ }
185
+ skipCommand(totalCells) {
186
+ const tag = this.u8("collaboration command tag");
187
+ switch (tag) {
188
+ case 0: {
189
+ this.sheetObjectId("created sheet id");
190
+ this.skipString("created sheet name");
191
+ const after = this.u8("created sheet predecessor flag");
192
+ if (after === 1) this.skipGeneration("created sheet predecessor");
193
+ else if (after !== 0) throw new TypeError("invalid created sheet predecessor flag");
194
+ return totalCells;
195
+ }
196
+ case 1:
197
+ this.skipGeneration("renamed sheet generation");
198
+ this.skipString("renamed sheet name");
199
+ return totalCells;
200
+ case 2:
201
+ this.skipGeneration("deleted sheet generation");
202
+ return totalCells;
203
+ case 3:
204
+ return this.skipSetCells(totalCells);
205
+ case 4: {
206
+ this.skipGeneration("cleared sheet generation");
207
+ const startRow = this.u32("clear range start row");
208
+ const startColumn = this.u32("clear range start column");
209
+ const endRow = this.u32("clear range end row");
210
+ const endColumn = this.u32("clear range end column");
211
+ if (startRow > endRow || startColumn > endColumn) {
212
+ throw new TypeError("OGACO001 clear range is not normalized");
213
+ }
214
+ return totalCells;
215
+ }
216
+ case 5:
217
+ this.stableId("selective undo target");
218
+ return totalCells;
219
+ default:
220
+ throw new TypeError(`invalid OGACO001 collaboration command tag: ${tag}`);
221
+ }
222
+ }
223
+ skipSetCells(totalCells) {
224
+ this.skipGeneration("cell block sheet generation");
225
+ const anchorRow = this.u32("cell block anchor row");
226
+ const anchorColumn = this.u32("cell block anchor column");
227
+ const rows = this.u32("cell block rows");
228
+ const columns = this.u32("cell block columns");
229
+ if (rows === 0 || columns === 0) {
230
+ throw new TypeError("OGACO001 cell block dimensions must be nonzero");
231
+ }
232
+ if (anchorRow > U32_MAX - (rows - 1) || anchorColumn > U32_MAX - (columns - 1)) {
233
+ throw new RangeError("OGACO001 cell block coordinates overflow u32");
234
+ }
235
+ if (rows > Math.floor(MAX_COMMITTED_TRANSACTION_CELLS / columns)) {
236
+ throw new RangeError("OGACO001 cell block exceeds its cell limit");
237
+ }
238
+ const cellCount = rows * columns;
239
+ const nextTotal = totalCells + cellCount;
240
+ if (nextTotal > MAX_COMMITTED_TRANSACTION_CELLS) {
241
+ throw new RangeError("OGACO001 transaction exceeds its cell limit");
242
+ }
243
+ for (let index = 0; index < cellCount; index += 1) this.skipCell();
244
+ return nextTotal;
245
+ }
246
+ skipCell() {
247
+ const formulaTag = this.u8("cell formula tag");
248
+ if (formulaTag === 1) {
249
+ if (this.skipString("cell formula") === 0) {
250
+ throw new TypeError("OGACO001 formula must not be empty");
251
+ }
252
+ } else if (formulaTag !== 0) {
253
+ throw new TypeError(`invalid OGACO001 cell formula tag: ${formulaTag}`);
254
+ }
255
+ const valueTag = this.u8("cell value tag");
256
+ switch (valueTag) {
257
+ case 0:
258
+ case 1:
259
+ case 2:
260
+ return;
261
+ case 3:
262
+ this.skipNumber();
263
+ return;
264
+ case 4:
265
+ this.skipString("cell text");
266
+ return;
267
+ case 5:
268
+ this.skipFormulaError();
269
+ return;
270
+ default:
271
+ throw new TypeError(`invalid OGACO001 cell value tag: ${valueTag}`);
272
+ }
273
+ }
274
+ skipNumber() {
275
+ const offset = this.reserve(8, "cell number");
276
+ const low = this.#view.getUint32(offset, true);
277
+ const high = this.#view.getUint32(offset + 4, true);
278
+ if (low === 0 && high === 2147483648) {
279
+ throw new TypeError("OGACO001 cell number uses negative zero");
280
+ }
281
+ if ((high & 2146435072) === 2146435072) {
282
+ throw new TypeError("OGACO001 cell numbers must be finite");
283
+ }
284
+ }
285
+ skipFormulaError() {
286
+ const tag = this.u8("formula error tag");
287
+ if (tag <= 8) return;
288
+ if (tag === 9) {
289
+ this.skipString("custom formula error");
290
+ return;
291
+ }
292
+ throw new TypeError(`invalid OGACO001 formula error tag: ${tag}`);
293
+ }
294
+ skipGeneration(label) {
295
+ this.sheetObjectId(`${label} sheet id`);
296
+ this.stableId(`${label} creation operation id`);
297
+ }
298
+ skipString(label) {
299
+ const length = this.u32(`${label} length`);
300
+ if (length > MAX_OPERATION_STRING_BYTES) {
301
+ throw new RangeError(`${label} exceeds its byte limit`);
302
+ }
303
+ const value = this.take(length, label);
304
+ assertUtf8(value, label);
305
+ return length;
306
+ }
307
+ done() {
308
+ if (this.#offset !== this.#end) throw new TypeError("trailing bytes in OGACO001 payload");
309
+ }
310
+ };
311
+ function assertInput(bytes) {
312
+ if (!(bytes instanceof Uint8Array)) {
313
+ throw new TypeError("OGACO001 bytes must be a Uint8Array");
314
+ }
315
+ if (typeof SharedArrayBuffer !== "undefined" && bytes.buffer instanceof SharedArrayBuffer) {
316
+ throw new TypeError("OGACO001 bytes must not use shared mutable memory");
317
+ }
318
+ }
319
+ function safeU64At(view, offset, label, positive) {
320
+ const low = view.getUint32(offset, true);
321
+ const high = view.getUint32(offset + 4, true);
322
+ if (high > MAX_SAFE_U64_HIGH)
323
+ throw new RangeError(`${label} exceeds JavaScript safe integer range`);
324
+ const value = high * U32_SIZE + low;
325
+ if (positive && value === 0) throw new TypeError(`${label} must be nonzero`);
326
+ return value;
327
+ }
328
+ function checkedAdd(left, right, label) {
329
+ const result = left + right;
330
+ if (!Number.isSafeInteger(result)) throw new RangeError(`${label} exceeds safe integer range`);
331
+ return result;
332
+ }
333
+ function assertUtf8(bytes, label) {
334
+ for (let index = 0; index < bytes.length; ) {
335
+ const first = bytes[index];
336
+ if (first <= 127) {
337
+ index += 1;
338
+ continue;
339
+ }
340
+ const second = bytes[index + 1];
341
+ if (first >= 194 && first <= 223 && continuation(second)) {
342
+ index += 2;
343
+ continue;
344
+ }
345
+ const third = bytes[index + 2];
346
+ if ((first === 224 && between(second, 160, 191) || first >= 225 && first <= 236 && continuation(second) || first === 237 && between(second, 128, 159) || first >= 238 && first <= 239 && continuation(second)) && continuation(third)) {
347
+ index += 3;
348
+ continue;
349
+ }
350
+ const fourth = bytes[index + 3];
351
+ if ((first === 240 && between(second, 144, 191) || first >= 241 && first <= 243 && continuation(second) || first === 244 && between(second, 128, 143)) && continuation(third) && continuation(fourth)) {
352
+ index += 4;
353
+ continue;
354
+ }
355
+ throw new TypeError(`${label} is not canonical UTF-8`);
356
+ }
357
+ }
358
+ function continuation(value) {
359
+ return value !== void 0 && value >= 128 && value <= 191;
360
+ }
361
+ function between(value, minimum, maximum) {
362
+ return value !== void 0 && value >= minimum && value <= maximum;
363
+ }
364
+ function hexU64(high, low) {
365
+ return `${high.toString(16).padStart(8, "0")}${low.toString(16).padStart(8, "0")}`;
366
+ }
367
+ function hexBytes(bytes) {
368
+ let result = "";
369
+ for (const byte of bytes) result += HEX[byte];
370
+ return result;
371
+ }
372
+ function fnv1a64(bytes, end) {
373
+ let low = FNV_OFFSET_LOW;
374
+ let high = FNV_OFFSET_HIGH;
375
+ for (let index = 0; index < end; index += 1) {
376
+ low = (low ^ bytes[index]) >>> 0;
377
+ const lowProduct = low * FNV_PRIME_LOW;
378
+ const carry = Math.floor(lowProduct / U32_SIZE);
379
+ high = high * FNV_PRIME_LOW + carry + low * 256 >>> 0;
380
+ low = lowProduct >>> 0;
381
+ }
382
+ return [low, high];
383
+ }
384
+
385
+ export {
386
+ MAX_COMMITTED_TRANSACTION_BYTES,
387
+ MAX_COMMITTED_TRANSACTION_OPERATIONS,
388
+ MAX_COMMITTED_TRANSACTION_CAUSAL_REPLICAS,
389
+ MAX_COMMITTED_TRANSACTION_CELLS,
390
+ decodeCommittedTransactionSummary
391
+ };
392
+ //# sourceMappingURL=chunk-Y3MLSLB4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/editable-artifact-committed-transaction.ts"],"sourcesContent":["/**\n * Strict, allocation-bounded inspection of canonical OGACO001 transactions.\n *\n * The Rust kernel remains the authority for applying operations. This decoder\n * validates the complete envelope and every typed operation so metadata after\n * the operation stream cannot be located by trusting attacker-controlled\n * lengths. It intentionally does not construct an editable artifact model.\n */\n\nimport { COMMITTED_TRANSACTION_PROTOCOL_VERSION } from \"./editable-artifact-versions\";\n\nexport { COMMITTED_TRANSACTION_PROTOCOL_VERSION } from \"./editable-artifact-versions\";\nexport const MAX_COMMITTED_TRANSACTION_BYTES = 8 * 1024 * 1024;\nexport const MAX_COMMITTED_TRANSACTION_OPERATIONS = 4_096;\nexport const MAX_COMMITTED_TRANSACTION_CAUSAL_REPLICAS = 100_000;\nexport const MAX_COMMITTED_TRANSACTION_CELLS = 1_000_000;\n\nconst MAGIC = new Uint8Array([0x4f, 0x47, 0x41, 0x43, 0x4f, 0x30, 0x30, 0x31]); // OGACO001\nconst HEADER_BYTES = 24;\nconst CHECKSUM_BYTES = 8;\nconst HASH_BYTES = 32;\nconst STABLE_ID_BYTES = 16;\nconst MAX_OPERATION_STRING_BYTES = 4 * 1024 * 1024;\nconst MAX_SAFE_U64_HIGH = 0x1f_ffff;\nconst U32_SIZE = 0x1_0000_0000;\nconst U32_MAX = 0xffff_ffff;\nconst FNV_OFFSET_LOW = 0x8422_2325;\nconst FNV_OFFSET_HIGH = 0xcbf2_9ce4;\nconst FNV_PRIME_LOW = 0x01b3;\n\nconst HEX = Array.from({ length: 256 }, (_, value) => value.toString(16).padStart(2, \"0\"));\n\nexport type CommittedTransactionCausalEntry = Readonly<{\n replicaId: string;\n counter: number;\n}>;\n\nexport type CommittedTransactionSummary = Readonly<{\n operationProtocolVersion: typeof COMMITTED_TRANSACTION_PROTOCOL_VERSION;\n transactionId: string;\n dot: CommittedTransactionCausalEntry;\n resolvedCausalBase: readonly CommittedTransactionCausalEntry[];\n operationIds: readonly string[];\n priorStateHash: string;\n resultingCausalFrontier: readonly CommittedTransactionCausalEntry[];\n stateHash: string;\n}>;\n\n/**\n * Decodes only the metadata of one exact canonical OGACO001 byte envelope.\n *\n * This function is synchronous and never mutates or retains `bytes`. The\n * caller remains the owner of the exact canonical envelope.\n */\nexport function decodeCommittedTransactionSummary(bytes: Uint8Array): CommittedTransactionSummary {\n assertInput(bytes);\n if (bytes.byteLength > MAX_COMMITTED_TRANSACTION_BYTES) {\n throw new RangeError(\"OGACO001 envelope exceeds its byte limit\");\n }\n if (bytes.byteLength < HEADER_BYTES + CHECKSUM_BYTES) {\n throw new TypeError(\"truncated OGACO001 envelope\");\n }\n\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n for (let index = 0; index < MAGIC.byteLength; index += 1) {\n if (bytes[index] !== MAGIC[index]) throw new TypeError(\"invalid OGACO001 magic\");\n }\n\n const version = view.getUint16(8, true);\n if (version !== COMMITTED_TRANSACTION_PROTOCOL_VERSION) {\n throw new TypeError(`unsupported OGACO001 version: ${version}`);\n }\n if (view.getUint16(10, true) !== 0) {\n throw new TypeError(\"reserved OGACO001 header bits are set\");\n }\n\n const operationCount = view.getUint32(12, true);\n if (operationCount === 0 || operationCount > MAX_COMMITTED_TRANSACTION_OPERATIONS) {\n throw new RangeError(\"OGACO001 operation count is outside its canonical bounds\");\n }\n\n const payloadLength = safeU64At(view, 16, \"OGACO001 payload length\", false);\n const payloadEnd = checkedAdd(HEADER_BYTES, payloadLength, \"OGACO001 payload length\");\n const expectedLength = checkedAdd(payloadEnd, CHECKSUM_BYTES, \"OGACO001 envelope length\");\n if (bytes.byteLength !== expectedLength) {\n throw new TypeError(\n bytes.byteLength < expectedLength\n ? \"truncated OGACO001 payload\"\n : \"trailing bytes after OGACO001 envelope\",\n );\n }\n\n const [checksumLow, checksumHigh] = fnv1a64(bytes, payloadEnd);\n if (\n view.getUint32(payloadEnd, true) !== checksumLow ||\n view.getUint32(payloadEnd + 4, true) !== checksumHigh\n ) {\n throw new TypeError(\"OGACO001 checksum mismatch\");\n }\n\n const reader = new Reader(bytes, HEADER_BYTES, payloadEnd);\n const transactionId = reader.stableId(\"transaction id\");\n const dot = Object.freeze({\n replicaId: reader.replicaId(\"transaction dot replica\"),\n counter: reader.safeU64(\"transaction dot counter\", true),\n });\n const resolvedCausalBase = reader.frontier(\"resolved causal base\");\n const priorStateHash = reader.stateHash(\"prior state hash\");\n\n const operationIds: string[] = [];\n const seenOperationIds = new Set<string>();\n let totalCells = 0;\n for (let index = 0; index < operationCount; index += 1) {\n const operationId = reader.stableId(`operation ${index} id`);\n if (seenOperationIds.has(operationId)) {\n throw new TypeError(\"OGACO001 operation ids must be unique\");\n }\n seenOperationIds.add(operationId);\n operationIds.push(operationId);\n totalCells = reader.skipCommand(totalCells);\n }\n\n const resultingCausalFrontier = reader.frontier(\"resulting causal frontier\");\n const stateHash = reader.stateHash(\"resulting state hash\");\n reader.done();\n\n return Object.freeze({\n operationProtocolVersion: COMMITTED_TRANSACTION_PROTOCOL_VERSION,\n transactionId,\n dot,\n resolvedCausalBase,\n operationIds: Object.freeze(operationIds),\n priorStateHash,\n resultingCausalFrontier,\n stateHash,\n });\n}\n\nclass Reader {\n readonly #bytes: Uint8Array;\n readonly #view: DataView;\n readonly #end: number;\n #offset: number;\n\n constructor(bytes: Uint8Array, offset: number, end: number) {\n this.#bytes = bytes;\n this.#view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n this.#offset = offset;\n this.#end = end;\n }\n\n take(length: number, label: string): Uint8Array {\n const offset = this.reserve(length, label);\n return this.#bytes.subarray(offset, offset + length);\n }\n\n reserve(length: number, label: string): number {\n if (!Number.isSafeInteger(length) || length < 0) {\n throw new RangeError(`${label} has an invalid byte length`);\n }\n const offset = this.#offset;\n const end = checkedAdd(offset, length, `${label} byte range`);\n if (end > this.#end) throw new TypeError(`truncated ${label}`);\n this.#offset = end;\n return offset;\n }\n\n u8(label: string): number {\n return this.#bytes[this.reserve(1, label)]!;\n }\n\n u32(label: string): number {\n const offset = this.reserve(4, label);\n return this.#view.getUint32(offset, true);\n }\n\n safeU64(label: string, positive: boolean): number {\n const offset = this.reserve(8, label);\n const value = safeU64At(this.#view, offset, label, positive);\n return value;\n }\n\n replicaId(label: string): string {\n const offset = this.reserve(8, label);\n const low = this.#view.getUint32(offset, true);\n const high = this.#view.getUint32(offset + 4, true);\n if (low === 0 && high === 0) throw new TypeError(`${label} must be nonzero`);\n return hexU64(high, low);\n }\n\n stableId(label: string): string {\n const offset = this.reserve(STABLE_ID_BYTES, label);\n const counterLow = this.#view.getUint32(offset, true);\n const counterHigh = this.#view.getUint32(offset + 4, true);\n const namespaceLow = this.#view.getUint32(offset + 8, true);\n const namespaceHigh = this.#view.getUint32(offset + 12, true);\n if (counterLow === 0 && counterHigh === 0 && namespaceLow === 0 && namespaceHigh === 0) {\n throw new TypeError(`${label} reserves the all-zero value`);\n }\n return `${hexU64(namespaceHigh, namespaceLow)}${hexU64(counterHigh, counterLow)}`;\n }\n\n sheetObjectId(label: string): string {\n const offset = this.#offset;\n const id = this.stableId(label);\n const counterIsZero =\n this.#view.getUint32(offset, true) === 0 && this.#view.getUint32(offset + 4, true) === 0;\n const namespaceIsZero =\n this.#view.getUint32(offset + 8, true) === 0 && this.#view.getUint32(offset + 12, true) === 0;\n if (counterIsZero || namespaceIsZero) {\n throw new TypeError(`${label} requires nonzero namespace and counter`);\n }\n return id;\n }\n\n stateHash(label: string): string {\n return `sha256:${hexBytes(this.take(HASH_BYTES, label))}`;\n }\n\n frontier(label: string): readonly CommittedTransactionCausalEntry[] {\n const count = this.u32(`${label} count`);\n if (count > MAX_COMMITTED_TRANSACTION_CAUSAL_REPLICAS) {\n throw new RangeError(`${label} exceeds its replica limit`);\n }\n const entries: CommittedTransactionCausalEntry[] = [];\n let previousLow = 0;\n let previousHigh = 0;\n let hasPrevious = false;\n for (let index = 0; index < count; index += 1) {\n const replicaOffset = this.#offset;\n const replicaId = this.replicaId(`${label} replica ${index}`);\n const replicaLow = this.#view.getUint32(replicaOffset, true);\n const replicaHigh = this.#view.getUint32(replicaOffset + 4, true);\n if (\n hasPrevious &&\n (replicaHigh < previousHigh || (replicaHigh === previousHigh && replicaLow <= previousLow))\n ) {\n throw new TypeError(`${label} replicas must be unique and strictly ordered`);\n }\n const counter = this.safeU64(`${label} counter ${index}`, true);\n entries.push(Object.freeze({ replicaId, counter }));\n previousLow = replicaLow;\n previousHigh = replicaHigh;\n hasPrevious = true;\n }\n return Object.freeze(entries);\n }\n\n skipCommand(totalCells: number): number {\n const tag = this.u8(\"collaboration command tag\");\n switch (tag) {\n case 0: {\n this.sheetObjectId(\"created sheet id\");\n this.skipString(\"created sheet name\");\n const after = this.u8(\"created sheet predecessor flag\");\n if (after === 1) this.skipGeneration(\"created sheet predecessor\");\n else if (after !== 0) throw new TypeError(\"invalid created sheet predecessor flag\");\n return totalCells;\n }\n case 1:\n this.skipGeneration(\"renamed sheet generation\");\n this.skipString(\"renamed sheet name\");\n return totalCells;\n case 2:\n this.skipGeneration(\"deleted sheet generation\");\n return totalCells;\n case 3:\n return this.skipSetCells(totalCells);\n case 4: {\n this.skipGeneration(\"cleared sheet generation\");\n const startRow = this.u32(\"clear range start row\");\n const startColumn = this.u32(\"clear range start column\");\n const endRow = this.u32(\"clear range end row\");\n const endColumn = this.u32(\"clear range end column\");\n if (startRow > endRow || startColumn > endColumn) {\n throw new TypeError(\"OGACO001 clear range is not normalized\");\n }\n return totalCells;\n }\n case 5:\n this.stableId(\"selective undo target\");\n return totalCells;\n default:\n throw new TypeError(`invalid OGACO001 collaboration command tag: ${tag}`);\n }\n }\n\n skipSetCells(totalCells: number): number {\n this.skipGeneration(\"cell block sheet generation\");\n const anchorRow = this.u32(\"cell block anchor row\");\n const anchorColumn = this.u32(\"cell block anchor column\");\n const rows = this.u32(\"cell block rows\");\n const columns = this.u32(\"cell block columns\");\n if (rows === 0 || columns === 0) {\n throw new TypeError(\"OGACO001 cell block dimensions must be nonzero\");\n }\n if (anchorRow > U32_MAX - (rows - 1) || anchorColumn > U32_MAX - (columns - 1)) {\n throw new RangeError(\"OGACO001 cell block coordinates overflow u32\");\n }\n if (rows > Math.floor(MAX_COMMITTED_TRANSACTION_CELLS / columns)) {\n throw new RangeError(\"OGACO001 cell block exceeds its cell limit\");\n }\n const cellCount = rows * columns;\n const nextTotal = totalCells + cellCount;\n if (nextTotal > MAX_COMMITTED_TRANSACTION_CELLS) {\n throw new RangeError(\"OGACO001 transaction exceeds its cell limit\");\n }\n for (let index = 0; index < cellCount; index += 1) this.skipCell();\n return nextTotal;\n }\n\n skipCell(): void {\n const formulaTag = this.u8(\"cell formula tag\");\n if (formulaTag === 1) {\n if (this.skipString(\"cell formula\") === 0) {\n throw new TypeError(\"OGACO001 formula must not be empty\");\n }\n } else if (formulaTag !== 0) {\n throw new TypeError(`invalid OGACO001 cell formula tag: ${formulaTag}`);\n }\n\n const valueTag = this.u8(\"cell value tag\");\n switch (valueTag) {\n case 0:\n case 1:\n case 2:\n return;\n case 3:\n this.skipNumber();\n return;\n case 4:\n this.skipString(\"cell text\");\n return;\n case 5:\n this.skipFormulaError();\n return;\n default:\n throw new TypeError(`invalid OGACO001 cell value tag: ${valueTag}`);\n }\n }\n\n skipNumber(): void {\n const offset = this.reserve(8, \"cell number\");\n const low = this.#view.getUint32(offset, true);\n const high = this.#view.getUint32(offset + 4, true);\n if (low === 0 && high === 0x8000_0000) {\n throw new TypeError(\"OGACO001 cell number uses negative zero\");\n }\n if ((high & 0x7ff0_0000) === 0x7ff0_0000) {\n throw new TypeError(\"OGACO001 cell numbers must be finite\");\n }\n }\n\n skipFormulaError(): void {\n const tag = this.u8(\"formula error tag\");\n if (tag <= 8) return;\n if (tag === 9) {\n this.skipString(\"custom formula error\");\n return;\n }\n throw new TypeError(`invalid OGACO001 formula error tag: ${tag}`);\n }\n\n skipGeneration(label: string): void {\n this.sheetObjectId(`${label} sheet id`);\n this.stableId(`${label} creation operation id`);\n }\n\n skipString(label: string): number {\n const length = this.u32(`${label} length`);\n if (length > MAX_OPERATION_STRING_BYTES) {\n throw new RangeError(`${label} exceeds its byte limit`);\n }\n const value = this.take(length, label);\n assertUtf8(value, label);\n return length;\n }\n\n done(): void {\n if (this.#offset !== this.#end) throw new TypeError(\"trailing bytes in OGACO001 payload\");\n }\n}\n\nfunction assertInput(bytes: Uint8Array): void {\n if (!(bytes instanceof Uint8Array)) {\n throw new TypeError(\"OGACO001 bytes must be a Uint8Array\");\n }\n if (typeof SharedArrayBuffer !== \"undefined\" && bytes.buffer instanceof SharedArrayBuffer) {\n throw new TypeError(\"OGACO001 bytes must not use shared mutable memory\");\n }\n}\n\nfunction safeU64At(view: DataView, offset: number, label: string, positive: boolean): number {\n const low = view.getUint32(offset, true);\n const high = view.getUint32(offset + 4, true);\n if (high > MAX_SAFE_U64_HIGH)\n throw new RangeError(`${label} exceeds JavaScript safe integer range`);\n const value = high * U32_SIZE + low;\n if (positive && value === 0) throw new TypeError(`${label} must be nonzero`);\n return value;\n}\n\nfunction checkedAdd(left: number, right: number, label: string): number {\n const result = left + right;\n if (!Number.isSafeInteger(result)) throw new RangeError(`${label} exceeds safe integer range`);\n return result;\n}\n\n/** Allocation-free UTF-8 scalar validation equivalent to Rust `str::from_utf8`. */\nfunction assertUtf8(bytes: Uint8Array, label: string): void {\n for (let index = 0; index < bytes.length;) {\n const first = bytes[index]!;\n if (first <= 0x7f) {\n index += 1;\n continue;\n }\n const second = bytes[index + 1];\n if (first >= 0xc2 && first <= 0xdf && continuation(second)) {\n index += 2;\n continue;\n }\n const third = bytes[index + 2];\n if (\n ((first === 0xe0 && between(second, 0xa0, 0xbf)) ||\n (first >= 0xe1 && first <= 0xec && continuation(second)) ||\n (first === 0xed && between(second, 0x80, 0x9f)) ||\n (first >= 0xee && first <= 0xef && continuation(second))) &&\n continuation(third)\n ) {\n index += 3;\n continue;\n }\n const fourth = bytes[index + 3];\n if (\n ((first === 0xf0 && between(second, 0x90, 0xbf)) ||\n (first >= 0xf1 && first <= 0xf3 && continuation(second)) ||\n (first === 0xf4 && between(second, 0x80, 0x8f))) &&\n continuation(third) &&\n continuation(fourth)\n ) {\n index += 4;\n continue;\n }\n throw new TypeError(`${label} is not canonical UTF-8`);\n }\n}\n\nfunction continuation(value: number | undefined): boolean {\n return value !== undefined && value >= 0x80 && value <= 0xbf;\n}\n\nfunction between(value: number | undefined, minimum: number, maximum: number): boolean {\n return value !== undefined && value >= minimum && value <= maximum;\n}\n\nfunction hexU64(high: number, low: number): string {\n return `${high.toString(16).padStart(8, \"0\")}${low.toString(16).padStart(8, \"0\")}`;\n}\n\nfunction hexBytes(bytes: Uint8Array): string {\n let result = \"\";\n for (const byte of bytes) result += HEX[byte];\n return result;\n}\n\n/** FNV-1a-64 using exact 32-bit limbs; avoids a BigInt allocation per byte. */\nfunction fnv1a64(bytes: Uint8Array, end: number): readonly [low: number, high: number] {\n let low = FNV_OFFSET_LOW;\n let high = FNV_OFFSET_HIGH;\n for (let index = 0; index < end; index += 1) {\n low = (low ^ bytes[index]!) >>> 0;\n const lowProduct = low * FNV_PRIME_LOW;\n const carry = Math.floor(lowProduct / U32_SIZE);\n high = (high * FNV_PRIME_LOW + carry + low * 0x100) >>> 0;\n low = lowProduct >>> 0;\n }\n return [low, high];\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,134 @@
1
+ import {
2
+ ArtifactBinaryReader,
3
+ ArtifactBinaryWriter,
4
+ equalBytes,
5
+ fnv1a64,
6
+ positiveSafeInteger,
7
+ strictUtf8
8
+ } from "./chunk-MYBZRDTY.js";
9
+
10
+ // src/editable-artifact-causal-frontier.ts
11
+ var EDITABLE_ARTIFACT_CAUSAL_FRONTIER_VERSION = 1;
12
+ var EDITABLE_ARTIFACT_CAUSAL_FRONTIER_MAX_REPLICAS = 1024;
13
+ var EDITABLE_ARTIFACT_CAUSAL_FRONTIER_MAX_BYTES = 8 + 2 + 2 + 4 + EDITABLE_ARTIFACT_CAUSAL_FRONTIER_MAX_REPLICAS * 16 + 8;
14
+ var MAGIC = strictUtf8("OGACF001", "causal frontier magic");
15
+ var REPLICA_ID = /^[0-9a-f]{16}$/u;
16
+ var HEADER_BYTES = 16;
17
+ var CHECKSUM_BYTES = 8;
18
+ function encodeEditableArtifactCausalFrontier(frontier) {
19
+ const entries = normalizeFrontier(frontier);
20
+ const writer = new ArtifactBinaryWriter(EDITABLE_ARTIFACT_CAUSAL_FRONTIER_MAX_BYTES);
21
+ writer.bytes(MAGIC);
22
+ writer.u16(EDITABLE_ARTIFACT_CAUSAL_FRONTIER_VERSION);
23
+ writer.u16(0);
24
+ writer.u32(entries.length);
25
+ for (const entry of entries) {
26
+ writer.u64(BigInt(`0x${entry.replicaId}`));
27
+ writer.u64(entry.counter);
28
+ }
29
+ writer.u64(fnv1a64(writer.view()));
30
+ return writer.finish();
31
+ }
32
+ function decodeEditableArtifactCausalFrontier(bytes) {
33
+ if (!(bytes instanceof Uint8Array))
34
+ throw new TypeError("causal frontier bytes must be a Uint8Array");
35
+ if (bytes.byteLength > EDITABLE_ARTIFACT_CAUSAL_FRONTIER_MAX_BYTES) {
36
+ throw new RangeError("causal frontier exceeds its byte limit");
37
+ }
38
+ if (bytes.byteLength < HEADER_BYTES + CHECKSUM_BYTES) {
39
+ throw new TypeError("truncated causal frontier");
40
+ }
41
+ const reader = new ArtifactBinaryReader(bytes);
42
+ if (!equalBytes(reader.bytes(8), MAGIC)) throw new TypeError("invalid causal frontier magic");
43
+ const version = reader.u16();
44
+ if (version !== EDITABLE_ARTIFACT_CAUSAL_FRONTIER_VERSION) {
45
+ throw new TypeError(`unsupported causal frontier version: ${version}`);
46
+ }
47
+ if (reader.u16() !== 0) throw new TypeError("reserved causal frontier flags must be zero");
48
+ const count = reader.u32();
49
+ if (count > EDITABLE_ARTIFACT_CAUSAL_FRONTIER_MAX_REPLICAS) {
50
+ throw new RangeError("causal frontier exceeds its replica limit");
51
+ }
52
+ const expected = HEADER_BYTES + count * 16 + CHECKSUM_BYTES;
53
+ if (bytes.byteLength < expected) throw new TypeError("truncated causal frontier");
54
+ if (bytes.byteLength > expected) throw new TypeError("causal frontier contains trailing bytes");
55
+ if (fnv1a64(bytes.subarray(0, -CHECKSUM_BYTES)) !== readU64At(bytes, expected - CHECKSUM_BYTES)) {
56
+ throw new TypeError("causal frontier checksum does not match");
57
+ }
58
+ const entries = [];
59
+ let previous = 0n;
60
+ for (let index = 0; index < count; index += 1) {
61
+ const replica = reader.u64BigInt();
62
+ const counter = reader.u64Safe("causal frontier counter");
63
+ if (replica === 0n || replica <= previous || counter === 0) {
64
+ throw new TypeError("causal frontier entries must be nonzero and strictly ordered");
65
+ }
66
+ previous = replica;
67
+ entries.push(
68
+ Object.freeze({
69
+ replicaId: replica.toString(16).padStart(16, "0"),
70
+ counter
71
+ })
72
+ );
73
+ }
74
+ reader.u64BigInt();
75
+ reader.done();
76
+ return Object.freeze(entries);
77
+ }
78
+ function assertCanonicalEditableArtifactCausalFrontierBytes(bytes) {
79
+ const decoded = decodeEditableArtifactCausalFrontier(bytes);
80
+ if (!equalBytes(bytes, encodeEditableArtifactCausalFrontier(decoded))) {
81
+ throw new TypeError("causal frontier is not canonically encoded");
82
+ }
83
+ }
84
+ function normalizeFrontier(frontier) {
85
+ if (!Array.isArray(frontier)) throw new TypeError("causal frontier must be an array");
86
+ if (frontier.length > EDITABLE_ARTIFACT_CAUSAL_FRONTIER_MAX_REPLICAS) {
87
+ throw new RangeError("causal frontier exceeds its replica limit");
88
+ }
89
+ let previous = "";
90
+ const entries = [];
91
+ for (const entry of frontier) {
92
+ if (typeof entry !== "object" || entry === null || Array.isArray(entry) || Object.getPrototypeOf(entry) !== Object.prototype && Object.getPrototypeOf(entry) !== null) {
93
+ throw new TypeError("causal frontier entries must be records");
94
+ }
95
+ const keys = Reflect.ownKeys(entry);
96
+ if (keys.length !== 2 || keys.some((key) => typeof key !== "string") || !keys.includes("counter") || !keys.includes("replicaId")) {
97
+ throw new TypeError("causal frontier entry fields must be exactly counter and replicaId");
98
+ }
99
+ for (const key of keys) {
100
+ const descriptor = Object.getOwnPropertyDescriptor(entry, key);
101
+ if (!descriptor || !("value" in descriptor) || !descriptor.enumerable) {
102
+ throw new TypeError("causal frontier entries must contain enumerable data properties");
103
+ }
104
+ }
105
+ if (!REPLICA_ID.test(entry.replicaId) || entry.replicaId === "0000000000000000") {
106
+ throw new TypeError("causal frontier replicaId must be canonical nonzero lowercase hex");
107
+ }
108
+ if (entry.replicaId <= previous) {
109
+ throw new TypeError("causal frontier replica ids must be unique and strictly ordered");
110
+ }
111
+ previous = entry.replicaId;
112
+ entries.push(
113
+ Object.freeze({
114
+ replicaId: entry.replicaId,
115
+ counter: positiveSafeInteger(entry.counter, "causal frontier counter")
116
+ })
117
+ );
118
+ }
119
+ return Object.freeze(entries);
120
+ }
121
+ function readU64At(bytes, offset) {
122
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
123
+ return view.getBigUint64(offset, true);
124
+ }
125
+
126
+ export {
127
+ EDITABLE_ARTIFACT_CAUSAL_FRONTIER_VERSION,
128
+ EDITABLE_ARTIFACT_CAUSAL_FRONTIER_MAX_REPLICAS,
129
+ EDITABLE_ARTIFACT_CAUSAL_FRONTIER_MAX_BYTES,
130
+ encodeEditableArtifactCausalFrontier,
131
+ decodeEditableArtifactCausalFrontier,
132
+ assertCanonicalEditableArtifactCausalFrontierBytes
133
+ };
134
+ //# sourceMappingURL=chunk-YRKRZ6OF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/editable-artifact-causal-frontier.ts"],"sourcesContent":["import {\n ArtifactBinaryReader,\n ArtifactBinaryWriter,\n equalBytes,\n fnv1a64,\n positiveSafeInteger,\n strictUtf8,\n} from \"./editable-artifact-binary\";\n\nexport const EDITABLE_ARTIFACT_CAUSAL_FRONTIER_VERSION = 1 as const;\n/** Exact effective Rust OGACF001 bound (`MAX_INTENT_CAUSAL_ACTORS`). */\nexport const EDITABLE_ARTIFACT_CAUSAL_FRONTIER_MAX_REPLICAS = 1_024;\nexport const EDITABLE_ARTIFACT_CAUSAL_FRONTIER_MAX_BYTES =\n 8 + 2 + 2 + 4 + EDITABLE_ARTIFACT_CAUSAL_FRONTIER_MAX_REPLICAS * 16 + 8;\n\nconst MAGIC = strictUtf8(\"OGACF001\", \"causal frontier magic\");\nconst REPLICA_ID = /^[0-9a-f]{16}$/u;\nconst HEADER_BYTES = 16;\nconst CHECKSUM_BYTES = 8;\n\nexport type EditableArtifactCausalFrontierEntry = Readonly<{\n replicaId: string;\n counter: number;\n}>;\n\nexport type EditableArtifactCausalFrontier = readonly EditableArtifactCausalFrontierEntry[];\n\nexport function encodeEditableArtifactCausalFrontier(\n frontier: EditableArtifactCausalFrontier,\n): Uint8Array {\n const entries = normalizeFrontier(frontier);\n const writer = new ArtifactBinaryWriter(EDITABLE_ARTIFACT_CAUSAL_FRONTIER_MAX_BYTES);\n writer.bytes(MAGIC);\n writer.u16(EDITABLE_ARTIFACT_CAUSAL_FRONTIER_VERSION);\n writer.u16(0);\n writer.u32(entries.length);\n for (const entry of entries) {\n writer.u64(BigInt(`0x${entry.replicaId}`));\n writer.u64(entry.counter);\n }\n writer.u64(fnv1a64(writer.view()));\n return writer.finish();\n}\n\nexport function decodeEditableArtifactCausalFrontier(\n bytes: Uint8Array,\n): EditableArtifactCausalFrontier {\n if (!(bytes instanceof Uint8Array))\n throw new TypeError(\"causal frontier bytes must be a Uint8Array\");\n if (bytes.byteLength > EDITABLE_ARTIFACT_CAUSAL_FRONTIER_MAX_BYTES) {\n throw new RangeError(\"causal frontier exceeds its byte limit\");\n }\n if (bytes.byteLength < HEADER_BYTES + CHECKSUM_BYTES) {\n throw new TypeError(\"truncated causal frontier\");\n }\n const reader = new ArtifactBinaryReader(bytes);\n if (!equalBytes(reader.bytes(8), MAGIC)) throw new TypeError(\"invalid causal frontier magic\");\n const version = reader.u16();\n if (version !== EDITABLE_ARTIFACT_CAUSAL_FRONTIER_VERSION) {\n throw new TypeError(`unsupported causal frontier version: ${version}`);\n }\n if (reader.u16() !== 0) throw new TypeError(\"reserved causal frontier flags must be zero\");\n const count = reader.u32();\n if (count > EDITABLE_ARTIFACT_CAUSAL_FRONTIER_MAX_REPLICAS) {\n throw new RangeError(\"causal frontier exceeds its replica limit\");\n }\n const expected = HEADER_BYTES + count * 16 + CHECKSUM_BYTES;\n if (bytes.byteLength < expected) throw new TypeError(\"truncated causal frontier\");\n if (bytes.byteLength > expected) throw new TypeError(\"causal frontier contains trailing bytes\");\n if (fnv1a64(bytes.subarray(0, -CHECKSUM_BYTES)) !== readU64At(bytes, expected - CHECKSUM_BYTES)) {\n throw new TypeError(\"causal frontier checksum does not match\");\n }\n const entries: EditableArtifactCausalFrontierEntry[] = [];\n let previous = 0n;\n for (let index = 0; index < count; index += 1) {\n const replica = reader.u64BigInt();\n const counter = reader.u64Safe(\"causal frontier counter\");\n if (replica === 0n || replica <= previous || counter === 0) {\n throw new TypeError(\"causal frontier entries must be nonzero and strictly ordered\");\n }\n previous = replica;\n entries.push(\n Object.freeze({\n replicaId: replica.toString(16).padStart(16, \"0\"),\n counter,\n }),\n );\n }\n reader.u64BigInt();\n reader.done();\n return Object.freeze(entries);\n}\n\nexport function assertCanonicalEditableArtifactCausalFrontierBytes(bytes: Uint8Array): void {\n const decoded = decodeEditableArtifactCausalFrontier(bytes);\n if (!equalBytes(bytes, encodeEditableArtifactCausalFrontier(decoded))) {\n throw new TypeError(\"causal frontier is not canonically encoded\");\n }\n}\n\nfunction normalizeFrontier(\n frontier: EditableArtifactCausalFrontier,\n): EditableArtifactCausalFrontier {\n if (!Array.isArray(frontier)) throw new TypeError(\"causal frontier must be an array\");\n if (frontier.length > EDITABLE_ARTIFACT_CAUSAL_FRONTIER_MAX_REPLICAS) {\n throw new RangeError(\"causal frontier exceeds its replica limit\");\n }\n let previous = \"\";\n const entries: EditableArtifactCausalFrontierEntry[] = [];\n for (const entry of frontier) {\n if (\n typeof entry !== \"object\" ||\n entry === null ||\n Array.isArray(entry) ||\n (Object.getPrototypeOf(entry) !== Object.prototype && Object.getPrototypeOf(entry) !== null)\n ) {\n throw new TypeError(\"causal frontier entries must be records\");\n }\n const keys = Reflect.ownKeys(entry);\n if (\n keys.length !== 2 ||\n keys.some((key) => typeof key !== \"string\") ||\n !(keys as string[]).includes(\"counter\") ||\n !(keys as string[]).includes(\"replicaId\")\n ) {\n throw new TypeError(\"causal frontier entry fields must be exactly counter and replicaId\");\n }\n for (const key of keys as string[]) {\n const descriptor = Object.getOwnPropertyDescriptor(entry, key);\n if (!descriptor || !(\"value\" in descriptor) || !descriptor.enumerable) {\n throw new TypeError(\"causal frontier entries must contain enumerable data properties\");\n }\n }\n if (!REPLICA_ID.test(entry.replicaId) || entry.replicaId === \"0000000000000000\") {\n throw new TypeError(\"causal frontier replicaId must be canonical nonzero lowercase hex\");\n }\n if (entry.replicaId <= previous) {\n throw new TypeError(\"causal frontier replica ids must be unique and strictly ordered\");\n }\n previous = entry.replicaId;\n entries.push(\n Object.freeze({\n replicaId: entry.replicaId,\n counter: positiveSafeInteger(entry.counter, \"causal frontier counter\"),\n }),\n );\n }\n return Object.freeze(entries);\n}\n\nfunction readU64At(bytes: Uint8Array, offset: number): bigint {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n return view.getBigUint64(offset, true);\n}\n"],"mappings":";;;;;;;;;;AASO,IAAM,4CAA4C;AAElD,IAAM,iDAAiD;AACvD,IAAM,8CACX,IAAI,IAAI,IAAI,IAAI,iDAAiD,KAAK;AAExE,IAAM,QAAQ,WAAW,YAAY,uBAAuB;AAC5D,IAAM,aAAa;AACnB,IAAM,eAAe;AACrB,IAAM,iBAAiB;AAShB,SAAS,qCACd,UACY;AACZ,QAAM,UAAU,kBAAkB,QAAQ;AAC1C,QAAM,SAAS,IAAI,qBAAqB,2CAA2C;AACnF,SAAO,MAAM,KAAK;AAClB,SAAO,IAAI,yCAAyC;AACpD,SAAO,IAAI,CAAC;AACZ,SAAO,IAAI,QAAQ,MAAM;AACzB,aAAW,SAAS,SAAS;AAC3B,WAAO,IAAI,OAAO,KAAK,MAAM,SAAS,EAAE,CAAC;AACzC,WAAO,IAAI,MAAM,OAAO;AAAA,EAC1B;AACA,SAAO,IAAI,QAAQ,OAAO,KAAK,CAAC,CAAC;AACjC,SAAO,OAAO,OAAO;AACvB;AAEO,SAAS,qCACd,OACgC;AAChC,MAAI,EAAE,iBAAiB;AACrB,UAAM,IAAI,UAAU,4CAA4C;AAClE,MAAI,MAAM,aAAa,6CAA6C;AAClE,UAAM,IAAI,WAAW,wCAAwC;AAAA,EAC/D;AACA,MAAI,MAAM,aAAa,eAAe,gBAAgB;AACpD,UAAM,IAAI,UAAU,2BAA2B;AAAA,EACjD;AACA,QAAM,SAAS,IAAI,qBAAqB,KAAK;AAC7C,MAAI,CAAC,WAAW,OAAO,MAAM,CAAC,GAAG,KAAK,EAAG,OAAM,IAAI,UAAU,+BAA+B;AAC5F,QAAM,UAAU,OAAO,IAAI;AAC3B,MAAI,YAAY,2CAA2C;AACzD,UAAM,IAAI,UAAU,wCAAwC,OAAO,EAAE;AAAA,EACvE;AACA,MAAI,OAAO,IAAI,MAAM,EAAG,OAAM,IAAI,UAAU,6CAA6C;AACzF,QAAM,QAAQ,OAAO,IAAI;AACzB,MAAI,QAAQ,gDAAgD;AAC1D,UAAM,IAAI,WAAW,2CAA2C;AAAA,EAClE;AACA,QAAM,WAAW,eAAe,QAAQ,KAAK;AAC7C,MAAI,MAAM,aAAa,SAAU,OAAM,IAAI,UAAU,2BAA2B;AAChF,MAAI,MAAM,aAAa,SAAU,OAAM,IAAI,UAAU,yCAAyC;AAC9F,MAAI,QAAQ,MAAM,SAAS,GAAG,CAAC,cAAc,CAAC,MAAM,UAAU,OAAO,WAAW,cAAc,GAAG;AAC/F,UAAM,IAAI,UAAU,yCAAyC;AAAA,EAC/D;AACA,QAAM,UAAiD,CAAC;AACxD,MAAI,WAAW;AACf,WAAS,QAAQ,GAAG,QAAQ,OAAO,SAAS,GAAG;AAC7C,UAAM,UAAU,OAAO,UAAU;AACjC,UAAM,UAAU,OAAO,QAAQ,yBAAyB;AACxD,QAAI,YAAY,MAAM,WAAW,YAAY,YAAY,GAAG;AAC1D,YAAM,IAAI,UAAU,8DAA8D;AAAA,IACpF;AACA,eAAW;AACX,YAAQ;AAAA,MACN,OAAO,OAAO;AAAA,QACZ,WAAW,QAAQ,SAAS,EAAE,EAAE,SAAS,IAAI,GAAG;AAAA,QAChD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO,UAAU;AACjB,SAAO,KAAK;AACZ,SAAO,OAAO,OAAO,OAAO;AAC9B;AAEO,SAAS,mDAAmD,OAAyB;AAC1F,QAAM,UAAU,qCAAqC,KAAK;AAC1D,MAAI,CAAC,WAAW,OAAO,qCAAqC,OAAO,CAAC,GAAG;AACrE,UAAM,IAAI,UAAU,4CAA4C;AAAA,EAClE;AACF;AAEA,SAAS,kBACP,UACgC;AAChC,MAAI,CAAC,MAAM,QAAQ,QAAQ,EAAG,OAAM,IAAI,UAAU,kCAAkC;AACpF,MAAI,SAAS,SAAS,gDAAgD;AACpE,UAAM,IAAI,WAAW,2CAA2C;AAAA,EAClE;AACA,MAAI,WAAW;AACf,QAAM,UAAiD,CAAC;AACxD,aAAW,SAAS,UAAU;AAC5B,QACE,OAAO,UAAU,YACjB,UAAU,QACV,MAAM,QAAQ,KAAK,KAClB,OAAO,eAAe,KAAK,MAAM,OAAO,aAAa,OAAO,eAAe,KAAK,MAAM,MACvF;AACA,YAAM,IAAI,UAAU,yCAAyC;AAAA,IAC/D;AACA,UAAM,OAAO,QAAQ,QAAQ,KAAK;AAClC,QACE,KAAK,WAAW,KAChB,KAAK,KAAK,CAAC,QAAQ,OAAO,QAAQ,QAAQ,KAC1C,CAAE,KAAkB,SAAS,SAAS,KACtC,CAAE,KAAkB,SAAS,WAAW,GACxC;AACA,YAAM,IAAI,UAAU,oEAAoE;AAAA,IAC1F;AACA,eAAW,OAAO,MAAkB;AAClC,YAAM,aAAa,OAAO,yBAAyB,OAAO,GAAG;AAC7D,UAAI,CAAC,cAAc,EAAE,WAAW,eAAe,CAAC,WAAW,YAAY;AACrE,cAAM,IAAI,UAAU,iEAAiE;AAAA,MACvF;AAAA,IACF;AACA,QAAI,CAAC,WAAW,KAAK,MAAM,SAAS,KAAK,MAAM,cAAc,oBAAoB;AAC/E,YAAM,IAAI,UAAU,mEAAmE;AAAA,IACzF;AACA,QAAI,MAAM,aAAa,UAAU;AAC/B,YAAM,IAAI,UAAU,iEAAiE;AAAA,IACvF;AACA,eAAW,MAAM;AACjB,YAAQ;AAAA,MACN,OAAO,OAAO;AAAA,QACZ,WAAW,MAAM;AAAA,QACjB,SAAS,oBAAoB,MAAM,SAAS,yBAAyB;AAAA,MACvE,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO,OAAO,OAAO,OAAO;AAC9B;AAEA,SAAS,UAAU,OAAmB,QAAwB;AAC5D,QAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,SAAO,KAAK,aAAa,QAAQ,IAAI;AACvC;","names":[]}