@opengeni/contracts 0.40.0 → 0.50.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 (148) hide show
  1. package/dist/atlassian.d.ts +278 -0
  2. package/dist/atlassian.js +57 -0
  3. package/dist/atlassian.js.map +1 -0
  4. package/dist/canonical-human-identities.d.ts +157 -0
  5. package/dist/canonical-human-identities.js +23 -0
  6. package/dist/canonical-human-identities.js.map +1 -0
  7. package/dist/{chunk-7JZMI22I.js → chunk-5UDNP7AO.js} +34 -2
  8. package/dist/chunk-5UDNP7AO.js.map +1 -0
  9. package/dist/chunk-BVGIYW7D.js +11 -0
  10. package/dist/chunk-BVGIYW7D.js.map +1 -0
  11. package/dist/chunk-CADSX6UN.js +1145 -0
  12. package/dist/chunk-CADSX6UN.js.map +1 -0
  13. package/dist/chunk-CM6BMECR.js +24 -0
  14. package/dist/chunk-CM6BMECR.js.map +1 -0
  15. package/dist/chunk-D2HKF2EF.js +1460 -0
  16. package/dist/chunk-D2HKF2EF.js.map +1 -0
  17. package/dist/chunk-JBCIY7QD.js +194 -0
  18. package/dist/chunk-JBCIY7QD.js.map +1 -0
  19. package/dist/chunk-JUFK3T4Q.js +80 -0
  20. package/dist/chunk-JUFK3T4Q.js.map +1 -0
  21. package/dist/chunk-LSB7GRLG.js +779 -0
  22. package/dist/chunk-LSB7GRLG.js.map +1 -0
  23. package/dist/chunk-LW7OH6CS.js +382 -0
  24. package/dist/chunk-LW7OH6CS.js.map +1 -0
  25. package/dist/chunk-M5ZGRVIQ.js +719 -0
  26. package/dist/chunk-M5ZGRVIQ.js.map +1 -0
  27. package/dist/chunk-MYBZRDTY.js +340 -0
  28. package/dist/chunk-MYBZRDTY.js.map +1 -0
  29. package/dist/chunk-Q6A7XT2N.js +16734 -0
  30. package/dist/chunk-Q6A7XT2N.js.map +1 -0
  31. package/dist/chunk-RIY7GYQS.js +1204 -0
  32. package/dist/chunk-RIY7GYQS.js.map +1 -0
  33. package/dist/chunk-TZ6YEYN4.js +386 -0
  34. package/dist/chunk-TZ6YEYN4.js.map +1 -0
  35. package/dist/chunk-Y3MLSLB4.js +392 -0
  36. package/dist/chunk-Y3MLSLB4.js.map +1 -0
  37. package/dist/chunk-YRKRZ6OF.js +134 -0
  38. package/dist/chunk-YRKRZ6OF.js.map +1 -0
  39. package/dist/codex-provider-account-authority.d.ts +23 -0
  40. package/dist/codex-provider-account-authority.js +23 -0
  41. package/dist/codex-provider-account-authority.js.map +1 -0
  42. package/dist/company-profile.d.ts +629 -0
  43. package/dist/document-artifact-commands.d.ts +282 -0
  44. package/dist/document-artifact-commands.js +54 -0
  45. package/dist/document-artifact-commands.js.map +1 -0
  46. package/dist/document-artifact-query.d.ts +2 -0
  47. package/dist/document-artifact-query.js +54 -0
  48. package/dist/document-artifact-query.js.map +1 -0
  49. package/dist/editable-artifact-binary.d.ts +56 -0
  50. package/dist/editable-artifact-causal-frontier.d.ts +12 -0
  51. package/dist/editable-artifact-causal-frontier.js +18 -0
  52. package/dist/editable-artifact-causal-frontier.js.map +1 -0
  53. package/dist/editable-artifact-codec-registry.d.ts +48 -0
  54. package/dist/editable-artifact-codec-registry.js +20 -0
  55. package/dist/editable-artifact-codec-registry.js.map +1 -0
  56. package/dist/editable-artifact-committed-transaction.d.ts +35 -0
  57. package/dist/editable-artifact-committed-transaction.js +19 -0
  58. package/dist/editable-artifact-committed-transaction.js.map +1 -0
  59. package/dist/editable-artifact-live.d.ts +276 -0
  60. package/dist/editable-artifact-live.js +907 -0
  61. package/dist/editable-artifact-live.js.map +1 -0
  62. package/dist/editable-artifact-serialized-commit.d.ts +53 -0
  63. package/dist/editable-artifact-serialized-commit.js +26 -0
  64. package/dist/editable-artifact-serialized-commit.js.map +1 -0
  65. package/dist/editable-artifact-versions.d.ts +6 -0
  66. package/dist/editable-artifact-versions.js +11 -0
  67. package/dist/editable-artifact-versions.js.map +1 -0
  68. package/dist/editable-artifacts.d.ts +46 -0
  69. package/dist/editable-artifacts.js +236 -0
  70. package/dist/editable-artifacts.js.map +1 -0
  71. package/dist/event-preview.d.ts +1 -1
  72. package/dist/google-drive.d.ts +114 -2
  73. package/dist/google-drive.js +72 -14
  74. package/dist/google-drive.js.map +1 -1
  75. package/dist/image-generation.d.ts +70 -0
  76. package/dist/index.d.ts +5661 -166
  77. package/dist/index.js +1438 -21
  78. package/dist/interaction.d.ts +8290 -0
  79. package/dist/knowledge.d.ts +543 -0
  80. package/dist/memory-slack-delivery.d.ts +397 -0
  81. package/dist/presentation-artifact-commands.d.ts +349 -0
  82. package/dist/presentation-artifact-commands.js +66 -0
  83. package/dist/presentation-artifact-commands.js.map +1 -0
  84. package/dist/presentation-artifact-query.d.ts +2 -0
  85. package/dist/presentation-artifact-query.js +66 -0
  86. package/dist/presentation-artifact-query.js.map +1 -0
  87. package/dist/retained-output.d.ts +24 -0
  88. package/dist/sandbox-snapshots.d.ts +9 -0
  89. package/dist/scoped-knowledge.d.ts +14 -13
  90. package/dist/slack-bot-scopes.d.ts +4 -0
  91. package/dist/slack-bot-scopes.js +3 -1
  92. package/dist/slack-task-policy.d.ts +294 -0
  93. package/dist/spreadsheet-artifact-commands.d.ts +101 -0
  94. package/dist/spreadsheet-artifact-commands.js +27 -0
  95. package/dist/spreadsheet-artifact-commands.js.map +1 -0
  96. package/dist/spreadsheet-artifact-date.d.ts +4 -0
  97. package/dist/spreadsheet-artifact-query.d.ts +120 -0
  98. package/dist/spreadsheet-artifact-query.js +48 -0
  99. package/dist/spreadsheet-artifact-query.js.map +1 -0
  100. package/dist/task-notes.d.ts +128 -0
  101. package/dist/tool-catalog.d.ts +576 -0
  102. package/dist/video-generation.d.ts +580 -0
  103. package/dist/video-generation.js +59 -0
  104. package/dist/video-generation.js.map +1 -0
  105. package/dist/workspace-learning-policy.d.ts +208 -0
  106. package/dist/xai-provider-account-authority.d.ts +23 -0
  107. package/dist/xai-provider-account-authority.js +9 -0
  108. package/dist/xai-provider-account-authority.js.map +1 -0
  109. package/package.json +73 -1
  110. package/src/artifacts.ts +1 -1
  111. package/src/atlassian.ts +160 -0
  112. package/src/canonical-human-identities.ts +93 -0
  113. package/src/codex-provider-account-authority.ts +37 -0
  114. package/src/company-profile.ts +306 -0
  115. package/src/document-artifact-commands.ts +1709 -0
  116. package/src/document-artifact-query.ts +2 -0
  117. package/src/editable-artifact-binary.ts +396 -0
  118. package/src/editable-artifact-causal-frontier.ts +154 -0
  119. package/src/editable-artifact-codec-registry.ts +261 -0
  120. package/src/editable-artifact-committed-transaction.ts +478 -0
  121. package/src/editable-artifact-live.ts +1379 -0
  122. package/src/editable-artifact-serialized-commit.ts +494 -0
  123. package/src/editable-artifact-versions.ts +8 -0
  124. package/src/editable-artifacts.ts +473 -0
  125. package/src/google-drive.ts +68 -15
  126. package/src/image-generation.ts +106 -0
  127. package/src/index.ts +2920 -326
  128. package/src/interaction.ts +3173 -0
  129. package/src/knowledge.ts +207 -0
  130. package/src/memory-slack-delivery.ts +183 -0
  131. package/src/presentation-artifact-commands.ts +2035 -0
  132. package/src/presentation-artifact-query.ts +2 -0
  133. package/src/retained-output.ts +149 -2
  134. package/src/sandbox-snapshots.ts +28 -1
  135. package/src/scoped-knowledge.ts +18 -4
  136. package/src/slack-bot-scopes.ts +34 -1
  137. package/src/slack-task-policy.ts +215 -0
  138. package/src/spreadsheet-artifact-commands.ts +999 -0
  139. package/src/spreadsheet-artifact-date.ts +21 -0
  140. package/src/spreadsheet-artifact-query.ts +1411 -0
  141. package/src/task-notes.ts +92 -0
  142. package/src/tool-catalog.ts +334 -0
  143. package/src/video-generation.ts +431 -0
  144. package/src/workspace-learning-policy.ts +233 -0
  145. package/src/xai-provider-account-authority.ts +37 -0
  146. package/dist/chunk-5HR2GPSC.js +0 -11031
  147. package/dist/chunk-5HR2GPSC.js.map +0 -1
  148. package/dist/chunk-7JZMI22I.js.map +0 -1
@@ -0,0 +1,907 @@
1
+ import {
2
+ EDITABLE_ARTIFACT_INTENT_MAX_BYTES,
3
+ hashEditableArtifactMutationIntentBytes
4
+ } from "./chunk-TZ6YEYN4.js";
5
+ import "./chunk-YRKRZ6OF.js";
6
+ import "./chunk-JBCIY7QD.js";
7
+ import "./chunk-RIY7GYQS.js";
8
+ import "./chunk-CADSX6UN.js";
9
+ import "./chunk-D2HKF2EF.js";
10
+ import "./chunk-MYBZRDTY.js";
11
+ import "./chunk-LSB7GRLG.js";
12
+ import "./chunk-BVGIYW7D.js";
13
+
14
+ // src/editable-artifact-live.ts
15
+ var MAGIC = new TextEncoder().encode("OGALV001");
16
+ var HEADER_BYTES = 20;
17
+ var MAX_METADATA_BYTES = 64 * 1024;
18
+ var MAX_TOKEN_BYTES = 4096;
19
+ var MAX_IDENTIFIER_BYTES = 512;
20
+ var MAX_CAUSAL_ACTORS = 1024;
21
+ var textEncoder = new TextEncoder();
22
+ var strictDecoder = new TextDecoder("utf-8", { fatal: true });
23
+ var CLIENT_OPEN = 1;
24
+ var CLIENT_APPLIED = 2;
25
+ var CLIENT_MUTATION = 3;
26
+ var SERVER_OPEN = 64;
27
+ var SERVER_SNAPSHOT = 65;
28
+ var SERVER_TRANSACTION = 66;
29
+ var SERVER_BARRIER = 67;
30
+ var SERVER_WATERMARK = 68;
31
+ var SERVER_RESYNC_REQUIRED = 69;
32
+ var SERVER_APPLIED = 70;
33
+ var SERVER_AUTHORIZATION_CHANGED = 71;
34
+ var SERVER_MUTATION_ACCEPTED = 72;
35
+ var SERVER_MUTATION_REJECTED = 73;
36
+ var RESYNC_REASONS = /* @__PURE__ */ new Set([
37
+ "retention_gap",
38
+ "durable_gap",
39
+ "invalid_ack",
40
+ "slow_client",
41
+ "oversized_frame"
42
+ ]);
43
+ var MUTATION_REJECTION_CODES = /* @__PURE__ */ new Set([
44
+ "invalid_request",
45
+ "forbidden",
46
+ "conflict",
47
+ "unsupported",
48
+ "unavailable"
49
+ ]);
50
+ var EDITABLE_ARTIFACT_LIVE_WIRE_VERSION = 1;
51
+ var EditableArtifactLiveError = class extends Error {
52
+ constructor(code, message, options = {}) {
53
+ super(message, options.cause === void 0 ? void 0 : { cause: options.cause });
54
+ this.code = code;
55
+ this.options = options;
56
+ this.name = "EditableArtifactLiveError";
57
+ }
58
+ get retryable() {
59
+ return this.options.retryable ?? false;
60
+ }
61
+ get requiresSnapshot() {
62
+ return this.options.requiresSnapshot ?? false;
63
+ }
64
+ };
65
+ function decodeEditableArtifactLiveClientWireFrame(bytes) {
66
+ const decoded = decodeEnvelope(bytes);
67
+ if (decoded.kind === CLIENT_OPEN) return decodeOpen(decoded.metadata, decoded.payload);
68
+ if (decoded.kind === CLIENT_APPLIED) return decodeApplied(decoded.metadata, decoded.payload);
69
+ if (decoded.kind === CLIENT_MUTATION) return decodeMutation(decoded.metadata, decoded.payload);
70
+ throw invalidFrame("Unknown editable artifact client frame kind");
71
+ }
72
+ function encodeEditableArtifactLiveOpenWireFrame(frame) {
73
+ const artifactId = editableArtifactId(frame.artifactId);
74
+ const protocolVersion = positiveInteger(frame.protocolVersion, "protocolVersion");
75
+ const token = boundedToken(frame.token);
76
+ const resume = normalizeResume(frame.resume);
77
+ if (resume.modality === "document" || resume.modality === "presentation") {
78
+ return encodeEnvelope(
79
+ CLIENT_OPEN,
80
+ {
81
+ type: "open",
82
+ protocolVersion,
83
+ artifactId,
84
+ token,
85
+ modality: resume.modality,
86
+ localCursor: resume.localCursor,
87
+ localStateHash: resume.localStateHash,
88
+ localNativeRevision: resume.localNativeRevision,
89
+ requireSnapshot: resume.requireSnapshot
90
+ },
91
+ EMPTY_BYTES
92
+ );
93
+ }
94
+ if (!("localCausalFrontier" in resume)) {
95
+ throw invalidFrame("spreadsheet resume requires a causal frontier");
96
+ }
97
+ return encodeEnvelope(
98
+ CLIENT_OPEN,
99
+ {
100
+ type: "open",
101
+ protocolVersion,
102
+ artifactId,
103
+ token,
104
+ localCursor: resume.localCursor,
105
+ localStateHash: resume.localStateHash,
106
+ localCausalFrontier: resume.localCausalFrontier,
107
+ requireSnapshot: resume.requireSnapshot
108
+ },
109
+ EMPTY_BYTES
110
+ );
111
+ }
112
+ function encodeEditableArtifactLiveAppliedWireFrame(frame) {
113
+ return encodeEnvelope(
114
+ CLIENT_APPLIED,
115
+ {
116
+ type: "applied",
117
+ protocolVersion: positiveInteger(frame.protocolVersion, "protocolVersion"),
118
+ artifactId: editableArtifactId(frame.artifactId),
119
+ streamEpoch: boundedString(frame.streamEpoch, "streamEpoch", MAX_IDENTIFIER_BYTES),
120
+ sequence: nonnegativeInteger(frame.sequence, "sequence"),
121
+ stateHash: editableArtifactStateHash(frame.stateHash)
122
+ },
123
+ EMPTY_BYTES
124
+ );
125
+ }
126
+ function encodeEditableArtifactLiveMutationWireFrame(frame) {
127
+ const intentBytes = ownPayload(frame.intentBytes, EDITABLE_ARTIFACT_INTENT_MAX_BYTES, false);
128
+ const requestHash = editableArtifactRequestHash(frame.requestHash);
129
+ if (hashEditableArtifactMutationIntentBytes(intentBytes) !== requestHash) {
130
+ throw invalidFrame("Mutation request hash does not match exact OGATX bytes");
131
+ }
132
+ return encodeEnvelope(
133
+ CLIENT_MUTATION,
134
+ {
135
+ type: "mutation",
136
+ protocolVersion: positiveInteger(frame.protocolVersion, "protocolVersion"),
137
+ artifactId: editableArtifactId(frame.artifactId),
138
+ streamEpoch: boundedString(frame.streamEpoch, "streamEpoch", MAX_IDENTIFIER_BYTES),
139
+ requestHash
140
+ },
141
+ intentBytes
142
+ );
143
+ }
144
+ function encodeEditableArtifactLiveServerWireFrame(frame) {
145
+ switch (frame.type) {
146
+ case "open": {
147
+ const { modality, ...metadata } = frame;
148
+ return encodeEnvelope(
149
+ SERVER_OPEN,
150
+ modality === "document" || modality === "presentation" ? {
151
+ type: metadata.type,
152
+ protocolVersion: metadata.protocolVersion,
153
+ artifactId: metadata.artifactId,
154
+ streamEpoch: metadata.streamEpoch,
155
+ modality,
156
+ writable: metadata.writable,
157
+ headSequence: metadata.headSequence,
158
+ minimumReplaySequence: metadata.minimumReplaySequence,
159
+ maxClientFrameBytes: metadata.maxClientFrameBytes,
160
+ maxCommandBytes: metadata.maxCommandBytes,
161
+ maxIntentBytes: metadata.maxIntentBytes,
162
+ maxCommittedTransactionBytes: metadata.maxCommittedTransactionBytes,
163
+ maxSnapshotBytes: metadata.maxSnapshotBytes,
164
+ maxInFlightTransactions: metadata.maxInFlightTransactions,
165
+ maxInFlightBytes: metadata.maxInFlightBytes
166
+ } : metadata,
167
+ EMPTY_BYTES
168
+ );
169
+ }
170
+ case "snapshot": {
171
+ const { bytes, modality, ...metadata } = frame;
172
+ if ((modality === "document" || modality === "presentation") && !("nativeRevision" in metadata)) {
173
+ throw invalidFrame("serialized snapshot requires a native revision");
174
+ }
175
+ if (modality !== "document" && modality !== "presentation" && !("causalFrontier" in metadata)) {
176
+ throw invalidFrame("spreadsheet snapshot requires a causal frontier");
177
+ }
178
+ return encodeEnvelope(
179
+ SERVER_SNAPSHOT,
180
+ modality === "document" || modality === "presentation" ? {
181
+ type: metadata.type,
182
+ protocolVersion: metadata.protocolVersion,
183
+ artifactId: metadata.artifactId,
184
+ streamEpoch: metadata.streamEpoch,
185
+ modality,
186
+ sequence: metadata.sequence,
187
+ stateHash: metadata.stateHash,
188
+ nativeRevision: metadata.nativeRevision,
189
+ digest: metadata.digest,
190
+ kernelVersion: metadata.kernelVersion,
191
+ modelSchemaVersion: metadata.modelSchemaVersion,
192
+ offset: metadata.offset,
193
+ totalBytes: metadata.totalBytes,
194
+ final: metadata.final
195
+ } : {
196
+ type: metadata.type,
197
+ protocolVersion: metadata.protocolVersion,
198
+ artifactId: metadata.artifactId,
199
+ streamEpoch: metadata.streamEpoch,
200
+ sequence: metadata.sequence,
201
+ stateHash: metadata.stateHash,
202
+ causalFrontier: metadata.causalFrontier,
203
+ digest: metadata.digest,
204
+ kernelVersion: metadata.kernelVersion,
205
+ modelSchemaVersion: metadata.modelSchemaVersion,
206
+ offset: metadata.offset,
207
+ totalBytes: metadata.totalBytes,
208
+ final: metadata.final
209
+ },
210
+ bytes
211
+ );
212
+ }
213
+ case "transaction": {
214
+ const { committedTransactionBytes, ...transaction } = frame.transaction;
215
+ const serializedTransaction = transaction;
216
+ const transactionMetadata = transaction.modality === void 0 || transaction.modality === "spreadsheet" ? {
217
+ artifactId: transaction.artifactId,
218
+ transactionId: transaction.transactionId,
219
+ requestHash: transaction.requestHash,
220
+ startSequence: transaction.startSequence,
221
+ endSequence: transaction.endSequence,
222
+ priorStateHash: transaction.priorStateHash,
223
+ stateHash: transaction.stateHash,
224
+ causalFrontier: transaction.causalFrontier,
225
+ protocolVersion: transaction.protocolVersion
226
+ } : {
227
+ artifactId: serializedTransaction.artifactId,
228
+ modality: serializedTransaction.modality,
229
+ transactionId: serializedTransaction.transactionId,
230
+ requestHash: serializedTransaction.requestHash,
231
+ startSequence: serializedTransaction.startSequence,
232
+ endSequence: serializedTransaction.endSequence,
233
+ priorStateHash: serializedTransaction.priorStateHash,
234
+ stateHash: serializedTransaction.stateHash,
235
+ priorNativeRevision: serializedTransaction.priorNativeRevision,
236
+ nativeRevision: serializedTransaction.nativeRevision,
237
+ commitProtocolVersion: serializedTransaction.commitProtocolVersion
238
+ };
239
+ return encodeEnvelope(
240
+ SERVER_TRANSACTION,
241
+ { ...frame, transaction: transactionMetadata },
242
+ committedTransactionBytes
243
+ );
244
+ }
245
+ case "barrier":
246
+ return encodeEnvelope(SERVER_BARRIER, { ...frame }, EMPTY_BYTES);
247
+ case "watermark":
248
+ return encodeEnvelope(SERVER_WATERMARK, { ...frame }, EMPTY_BYTES);
249
+ case "resyncRequired":
250
+ return encodeEnvelope(SERVER_RESYNC_REQUIRED, { ...frame }, EMPTY_BYTES);
251
+ case "applied":
252
+ return encodeEnvelope(SERVER_APPLIED, { ...frame }, EMPTY_BYTES);
253
+ case "authorizationChanged":
254
+ return encodeEnvelope(SERVER_AUTHORIZATION_CHANGED, { ...frame }, EMPTY_BYTES);
255
+ case "mutationAccepted":
256
+ return encodeEnvelope(SERVER_MUTATION_ACCEPTED, { ...frame }, EMPTY_BYTES);
257
+ case "mutationRejected":
258
+ return encodeEnvelope(SERVER_MUTATION_REJECTED, { ...frame }, EMPTY_BYTES);
259
+ }
260
+ }
261
+ function decodeEditableArtifactLiveServerWireFrame(bytes) {
262
+ const decoded = decodeEnvelope(bytes);
263
+ const metadata = decoded.metadata;
264
+ switch (decoded.kind) {
265
+ case SERVER_OPEN: {
266
+ requireNoPayload(decoded.payload);
267
+ const modality = serverModality(metadata);
268
+ requireServerKeys(metadata, "open", [
269
+ ...modality === "spreadsheet" ? [] : ["modality"],
270
+ "writable",
271
+ "headSequence",
272
+ "minimumReplaySequence",
273
+ "maxClientFrameBytes",
274
+ "maxCommandBytes",
275
+ "maxIntentBytes",
276
+ "maxCommittedTransactionBytes",
277
+ "maxSnapshotBytes",
278
+ "maxInFlightTransactions",
279
+ "maxInFlightBytes"
280
+ ]);
281
+ const common = {
282
+ ...serverIdentity(metadata, "open"),
283
+ writable: requiredBoolean(metadata.writable, "writable"),
284
+ headSequence: nonnegativeInteger(metadata.headSequence, "headSequence"),
285
+ minimumReplaySequence: nonnegativeInteger(
286
+ metadata.minimumReplaySequence,
287
+ "minimumReplaySequence"
288
+ ),
289
+ maxClientFrameBytes: positiveInteger(metadata.maxClientFrameBytes, "maxClientFrameBytes"),
290
+ maxCommandBytes: nonnegativeInteger(metadata.maxCommandBytes, "maxCommandBytes"),
291
+ maxIntentBytes: nonnegativeInteger(metadata.maxIntentBytes, "maxIntentBytes"),
292
+ maxCommittedTransactionBytes: nonnegativeInteger(
293
+ metadata.maxCommittedTransactionBytes,
294
+ "maxCommittedTransactionBytes"
295
+ ),
296
+ maxSnapshotBytes: positiveInteger(metadata.maxSnapshotBytes, "maxSnapshotBytes"),
297
+ maxInFlightTransactions: positiveInteger(
298
+ metadata.maxInFlightTransactions,
299
+ "maxInFlightTransactions"
300
+ ),
301
+ maxInFlightBytes: positiveInteger(metadata.maxInFlightBytes, "maxInFlightBytes")
302
+ };
303
+ return Object.freeze(modality === "spreadsheet" ? common : { ...common, modality });
304
+ }
305
+ case SERVER_SNAPSHOT: {
306
+ const modality = serverModality(metadata);
307
+ requireServerKeys(metadata, "snapshot", [
308
+ ...modality === "spreadsheet" ? [] : ["modality"],
309
+ "sequence",
310
+ "stateHash",
311
+ modality === "spreadsheet" ? "causalFrontier" : "nativeRevision",
312
+ "digest",
313
+ "kernelVersion",
314
+ "modelSchemaVersion",
315
+ "offset",
316
+ "totalBytes",
317
+ "final"
318
+ ]);
319
+ const offset = nonnegativeInteger(metadata.offset, "offset");
320
+ const totalBytes = positiveInteger(metadata.totalBytes, "totalBytes");
321
+ const final = requiredBoolean(metadata.final, "final");
322
+ if (decoded.payload.byteLength === 0 || offset + decoded.payload.byteLength > totalBytes) {
323
+ throw invalidFrame("snapshot chunk bounds are invalid");
324
+ }
325
+ if (final !== (offset + decoded.payload.byteLength === totalBytes)) {
326
+ throw invalidFrame("snapshot final flag does not match its byte boundary");
327
+ }
328
+ const common = {
329
+ ...serverIdentity(metadata, "snapshot"),
330
+ sequence: nonnegativeInteger(metadata.sequence, "sequence"),
331
+ stateHash: editableArtifactStateHash(requiredString(metadata.stateHash, "stateHash")),
332
+ digest: editableArtifactContentHash(requiredString(metadata.digest, "digest")),
333
+ kernelVersion: boundedString(
334
+ requiredString(metadata.kernelVersion, "kernelVersion"),
335
+ "kernelVersion",
336
+ MAX_IDENTIFIER_BYTES
337
+ ),
338
+ modelSchemaVersion: positiveInteger(metadata.modelSchemaVersion, "modelSchemaVersion"),
339
+ offset,
340
+ totalBytes,
341
+ final,
342
+ bytes: decoded.payload
343
+ };
344
+ return Object.freeze(
345
+ modality === "spreadsheet" ? {
346
+ ...common,
347
+ causalFrontier: requiredFrontier(metadata.causalFrontier)
348
+ } : {
349
+ ...common,
350
+ modality,
351
+ nativeRevision: nonnegativeInteger(metadata.nativeRevision, "nativeRevision")
352
+ }
353
+ );
354
+ }
355
+ case SERVER_TRANSACTION: {
356
+ requireServerKeys(metadata, "transaction", ["transaction"]);
357
+ const transaction = requiredRecord(metadata.transaction, "transaction");
358
+ const modality = transactionModality(transaction);
359
+ requireExactKeys(
360
+ transaction,
361
+ modality === "spreadsheet" ? [
362
+ "artifactId",
363
+ "transactionId",
364
+ "requestHash",
365
+ "startSequence",
366
+ "endSequence",
367
+ "priorStateHash",
368
+ "stateHash",
369
+ "causalFrontier",
370
+ "protocolVersion"
371
+ ] : [
372
+ "artifactId",
373
+ "modality",
374
+ "transactionId",
375
+ "requestHash",
376
+ "startSequence",
377
+ "endSequence",
378
+ "priorStateHash",
379
+ "stateHash",
380
+ "priorNativeRevision",
381
+ "nativeRevision",
382
+ "commitProtocolVersion"
383
+ ]
384
+ );
385
+ if (decoded.payload.byteLength === 0) {
386
+ throw invalidFrame("transaction payload must not be empty");
387
+ }
388
+ const startSequence = positiveInteger(transaction.startSequence, "startSequence");
389
+ const endSequence = positiveInteger(transaction.endSequence, "endSequence");
390
+ if (endSequence < startSequence)
391
+ throw invalidFrame("transaction sequence interval is inverted");
392
+ const common = {
393
+ ...serverIdentity(metadata, "transaction"),
394
+ transaction: {
395
+ artifactId: editableArtifactId(requiredString(transaction.artifactId, "artifactId")),
396
+ transactionId: editableArtifactTransactionId(
397
+ requiredString(transaction.transactionId, "transactionId")
398
+ ),
399
+ requestHash: editableArtifactRequestHash(
400
+ requiredString(transaction.requestHash, "requestHash")
401
+ ),
402
+ startSequence,
403
+ endSequence,
404
+ priorStateHash: editableArtifactStateHash(
405
+ requiredString(transaction.priorStateHash, "priorStateHash")
406
+ ),
407
+ stateHash: editableArtifactStateHash(requiredString(transaction.stateHash, "stateHash")),
408
+ committedTransactionBytes: decoded.payload
409
+ }
410
+ };
411
+ return Object.freeze({
412
+ ...common,
413
+ transaction: Object.freeze(
414
+ modality === "spreadsheet" ? {
415
+ ...common.transaction,
416
+ causalFrontier: requiredFrontier(transaction.causalFrontier),
417
+ protocolVersion: positiveInteger(transaction.protocolVersion, "protocolVersion")
418
+ } : {
419
+ ...common.transaction,
420
+ modality,
421
+ priorNativeRevision: nonnegativeInteger(
422
+ transaction.priorNativeRevision,
423
+ "priorNativeRevision"
424
+ ),
425
+ nativeRevision: nonnegativeInteger(transaction.nativeRevision, "nativeRevision"),
426
+ commitProtocolVersion: positiveInteger(
427
+ transaction.commitProtocolVersion,
428
+ "commitProtocolVersion"
429
+ )
430
+ }
431
+ )
432
+ });
433
+ }
434
+ case SERVER_BARRIER:
435
+ case SERVER_APPLIED: {
436
+ const type = decoded.kind === SERVER_BARRIER ? "barrier" : "applied";
437
+ requireNoPayload(decoded.payload);
438
+ requireServerKeys(metadata, type, ["sequence", "stateHash"]);
439
+ return Object.freeze({
440
+ ...serverIdentity(metadata, type),
441
+ sequence: nonnegativeInteger(metadata.sequence, "sequence"),
442
+ stateHash: editableArtifactStateHash(requiredString(metadata.stateHash, "stateHash"))
443
+ });
444
+ }
445
+ case SERVER_WATERMARK: {
446
+ requireNoPayload(decoded.payload);
447
+ requireServerKeys(metadata, "watermark", ["headSequence"]);
448
+ return Object.freeze({
449
+ ...serverIdentity(metadata, "watermark"),
450
+ headSequence: nonnegativeInteger(metadata.headSequence, "headSequence")
451
+ });
452
+ }
453
+ case SERVER_RESYNC_REQUIRED: {
454
+ requireNoPayload(decoded.payload);
455
+ requireServerKeys(metadata, "resyncRequired", ["reason", "headSequence"]);
456
+ const reason = requiredString(metadata.reason, "reason");
457
+ if (!RESYNC_REASONS.has(reason)) throw invalidFrame("resync reason is invalid");
458
+ return Object.freeze({
459
+ ...serverIdentity(metadata, "resyncRequired"),
460
+ reason,
461
+ headSequence: nonnegativeInteger(metadata.headSequence, "headSequence")
462
+ });
463
+ }
464
+ case SERVER_AUTHORIZATION_CHANGED: {
465
+ requireNoPayload(decoded.payload);
466
+ requireServerKeys(metadata, "authorizationChanged", ["writable"]);
467
+ return Object.freeze({
468
+ ...serverIdentity(metadata, "authorizationChanged"),
469
+ writable: requiredBoolean(metadata.writable, "writable")
470
+ });
471
+ }
472
+ case SERVER_MUTATION_ACCEPTED: {
473
+ requireNoPayload(decoded.payload);
474
+ requireServerKeys(metadata, "mutationAccepted", [
475
+ "requestHash",
476
+ "clientTransactionId",
477
+ "transactionId",
478
+ "startSequence",
479
+ "endSequence",
480
+ "stateHash"
481
+ ]);
482
+ const startSequence = positiveInteger(metadata.startSequence, "startSequence");
483
+ const endSequence = positiveInteger(metadata.endSequence, "endSequence");
484
+ if (endSequence < startSequence) throw invalidFrame("accepted sequence interval is inverted");
485
+ return Object.freeze({
486
+ ...serverIdentity(metadata, "mutationAccepted"),
487
+ requestHash: editableArtifactRequestHash(
488
+ requiredString(metadata.requestHash, "requestHash")
489
+ ),
490
+ clientTransactionId: editableArtifactClientTransactionId(
491
+ requiredString(metadata.clientTransactionId, "clientTransactionId")
492
+ ),
493
+ transactionId: editableArtifactTransactionId(
494
+ requiredString(metadata.transactionId, "transactionId")
495
+ ),
496
+ startSequence,
497
+ endSequence,
498
+ stateHash: editableArtifactStateHash(requiredString(metadata.stateHash, "stateHash"))
499
+ });
500
+ }
501
+ case SERVER_MUTATION_REJECTED: {
502
+ requireNoPayload(decoded.payload);
503
+ requireServerKeys(metadata, "mutationRejected", ["requestHash", "code", "retryable"]);
504
+ const code = requiredString(metadata.code, "code");
505
+ if (!MUTATION_REJECTION_CODES.has(code)) {
506
+ throw invalidFrame("mutation rejection code is invalid");
507
+ }
508
+ return Object.freeze({
509
+ ...serverIdentity(metadata, "mutationRejected"),
510
+ requestHash: editableArtifactRequestHash(
511
+ requiredString(metadata.requestHash, "requestHash")
512
+ ),
513
+ code,
514
+ retryable: requiredBoolean(metadata.retryable, "retryable")
515
+ });
516
+ }
517
+ default:
518
+ throw invalidFrame("Unknown editable artifact server frame kind");
519
+ }
520
+ }
521
+ function inspectEditableArtifactLiveWireEnvelope(bytes) {
522
+ return decodeEnvelope(bytes);
523
+ }
524
+ function decodeOpen(metadata, payload) {
525
+ requireNoPayload(payload);
526
+ const modality = clientOpenModality(metadata);
527
+ requireExactKeys(
528
+ metadata,
529
+ modality === "spreadsheet" ? [
530
+ "type",
531
+ "protocolVersion",
532
+ "artifactId",
533
+ "token",
534
+ "localCursor",
535
+ "localStateHash",
536
+ "localCausalFrontier",
537
+ "requireSnapshot"
538
+ ] : [
539
+ "type",
540
+ "protocolVersion",
541
+ "artifactId",
542
+ "token",
543
+ "modality",
544
+ "localCursor",
545
+ "localStateHash",
546
+ "localNativeRevision",
547
+ "requireSnapshot"
548
+ ]
549
+ );
550
+ requireLiteral(metadata.type, "open", "type");
551
+ return Object.freeze({
552
+ type: "open",
553
+ protocolVersion: positiveInteger(metadata.protocolVersion, "protocolVersion"),
554
+ artifactId: editableArtifactId(requiredString(metadata.artifactId, "artifactId")),
555
+ token: boundedToken(requiredString(metadata.token, "token")),
556
+ resume: normalizeResume(
557
+ modality === "spreadsheet" ? {
558
+ modality,
559
+ localCursor: nullableNonnegativeInteger(metadata.localCursor, "localCursor"),
560
+ localStateHash: metadata.localStateHash === null ? null : editableArtifactStateHash(
561
+ requiredString(metadata.localStateHash, "localStateHash")
562
+ ),
563
+ localCausalFrontier: requiredFrontier(metadata.localCausalFrontier),
564
+ requireSnapshot: requiredBoolean(metadata.requireSnapshot, "requireSnapshot")
565
+ } : {
566
+ modality,
567
+ localCursor: nullableNonnegativeInteger(metadata.localCursor, "localCursor"),
568
+ localStateHash: metadata.localStateHash === null ? null : editableArtifactStateHash(
569
+ requiredString(metadata.localStateHash, "localStateHash")
570
+ ),
571
+ localNativeRevision: nullableNonnegativeInteger(
572
+ metadata.localNativeRevision,
573
+ "localNativeRevision"
574
+ ),
575
+ requireSnapshot: requiredBoolean(metadata.requireSnapshot, "requireSnapshot")
576
+ }
577
+ )
578
+ });
579
+ }
580
+ function decodeApplied(metadata, payload) {
581
+ requireNoPayload(payload);
582
+ requireExactKeys(metadata, [
583
+ "type",
584
+ "protocolVersion",
585
+ "artifactId",
586
+ "streamEpoch",
587
+ "sequence",
588
+ "stateHash"
589
+ ]);
590
+ requireLiteral(metadata.type, "applied", "type");
591
+ return Object.freeze({
592
+ type: "applied",
593
+ protocolVersion: positiveInteger(metadata.protocolVersion, "protocolVersion"),
594
+ artifactId: editableArtifactId(requiredString(metadata.artifactId, "artifactId")),
595
+ streamEpoch: boundedString(
596
+ requiredString(metadata.streamEpoch, "streamEpoch"),
597
+ "streamEpoch",
598
+ MAX_IDENTIFIER_BYTES
599
+ ),
600
+ sequence: nonnegativeInteger(metadata.sequence, "sequence"),
601
+ stateHash: editableArtifactStateHash(requiredString(metadata.stateHash, "stateHash"))
602
+ });
603
+ }
604
+ function decodeMutation(metadata, payload) {
605
+ requireExactKeys(metadata, [
606
+ "type",
607
+ "protocolVersion",
608
+ "artifactId",
609
+ "streamEpoch",
610
+ "requestHash"
611
+ ]);
612
+ requireLiteral(metadata.type, "mutation", "type");
613
+ const requestHash = editableArtifactRequestHash(
614
+ requiredString(metadata.requestHash, "requestHash")
615
+ );
616
+ const intentBytes = ownPayload(payload, EDITABLE_ARTIFACT_INTENT_MAX_BYTES, false);
617
+ try {
618
+ if (hashEditableArtifactMutationIntentBytes(intentBytes) !== requestHash) {
619
+ throw new TypeError("request hash mismatch");
620
+ }
621
+ } catch (cause) {
622
+ throw invalidFrame("Mutation request hash does not match exact OGATX bytes", cause);
623
+ }
624
+ return Object.freeze({
625
+ type: "mutation",
626
+ protocolVersion: positiveInteger(metadata.protocolVersion, "protocolVersion"),
627
+ artifactId: editableArtifactId(requiredString(metadata.artifactId, "artifactId")),
628
+ streamEpoch: boundedString(
629
+ requiredString(metadata.streamEpoch, "streamEpoch"),
630
+ "streamEpoch",
631
+ MAX_IDENTIFIER_BYTES
632
+ ),
633
+ requestHash,
634
+ intentBytes
635
+ });
636
+ }
637
+ function encodeEnvelope(kind, metadata, rawPayload) {
638
+ if (!Number.isInteger(kind) || kind < 1 || kind > 255) throw new TypeError("wire kind invalid");
639
+ const metadataBytes = textEncoder.encode(JSON.stringify(metadata));
640
+ if (metadataBytes.byteLength < 2 || metadataBytes.byteLength > MAX_METADATA_BYTES) {
641
+ throw new RangeError("Editable artifact wire metadata exceeds bound");
642
+ }
643
+ const payload = ownPayload(rawPayload, 128 * 1024 * 1024, true);
644
+ const total = HEADER_BYTES + metadataBytes.byteLength + payload.byteLength;
645
+ if (!Number.isSafeInteger(total)) throw new RangeError("Editable artifact wire frame too large");
646
+ const output = new Uint8Array(total);
647
+ output.set(MAGIC, 0);
648
+ const view = new DataView(output.buffer);
649
+ view.setUint8(8, EDITABLE_ARTIFACT_LIVE_WIRE_VERSION);
650
+ view.setUint8(9, kind);
651
+ view.setUint16(10, 0, true);
652
+ view.setUint32(12, metadataBytes.byteLength, true);
653
+ view.setUint32(16, payload.byteLength, true);
654
+ output.set(metadataBytes, HEADER_BYTES);
655
+ output.set(payload, HEADER_BYTES + metadataBytes.byteLength);
656
+ return output;
657
+ }
658
+ function decodeEnvelope(bytes) {
659
+ if (!(bytes instanceof Uint8Array) || bytes.byteLength < HEADER_BYTES) {
660
+ throw invalidFrame("Editable artifact wire frame is truncated");
661
+ }
662
+ for (let index = 0; index < MAGIC.byteLength; index += 1) {
663
+ if (bytes[index] !== MAGIC[index]) throw invalidFrame("Editable artifact wire magic mismatch");
664
+ }
665
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
666
+ if (view.getUint8(8) !== EDITABLE_ARTIFACT_LIVE_WIRE_VERSION) {
667
+ throw new EditableArtifactLiveError("protocol_mismatch", "Live wire version unsupported");
668
+ }
669
+ const kind = view.getUint8(9);
670
+ if (view.getUint16(10, true) !== 0) throw invalidFrame("Editable artifact wire flags invalid");
671
+ const metadataLength = view.getUint32(12, true);
672
+ const payloadLength = view.getUint32(16, true);
673
+ if (metadataLength < 2 || metadataLength > MAX_METADATA_BYTES) {
674
+ throw invalidFrame("Editable artifact wire metadata exceeds bound");
675
+ }
676
+ const expected = HEADER_BYTES + metadataLength + payloadLength;
677
+ if (expected !== bytes.byteLength) throw invalidFrame("Editable artifact wire length mismatch");
678
+ const metadataBytes = bytes.subarray(HEADER_BYTES, HEADER_BYTES + metadataLength);
679
+ let metadataText;
680
+ let value;
681
+ try {
682
+ metadataText = strictDecoder.decode(metadataBytes);
683
+ value = JSON.parse(metadataText);
684
+ } catch (cause) {
685
+ throw invalidFrame("Editable artifact wire metadata is not UTF-8 JSON", cause);
686
+ }
687
+ const metadata = requiredRecord(value, "metadata");
688
+ if (JSON.stringify(metadata) !== metadataText) {
689
+ throw invalidFrame("Editable artifact wire metadata is not canonical JSON");
690
+ }
691
+ return Object.freeze({
692
+ kind,
693
+ metadata: Object.freeze(metadata),
694
+ payload: bytes.slice(HEADER_BYTES + metadataLength)
695
+ });
696
+ }
697
+ function normalizeResume(resume) {
698
+ if (!resume || typeof resume !== "object") throw invalidFrame("resume must be an object");
699
+ const localCursor = nullableNonnegativeInteger(resume.localCursor, "localCursor");
700
+ const localStateHash = resume.localStateHash === null ? null : editableArtifactStateHash(resume.localStateHash);
701
+ const requireSnapshot = requiredBoolean(resume.requireSnapshot, "requireSnapshot");
702
+ if (localCursor === null !== (localStateHash === null)) {
703
+ throw invalidFrame("resume cursor and state hash must both be null or both be present");
704
+ }
705
+ const modality = resume.modality ?? "spreadsheet";
706
+ if (modality === "spreadsheet") {
707
+ if (!("localCausalFrontier" in resume)) {
708
+ throw invalidFrame("spreadsheet resume requires a causal frontier");
709
+ }
710
+ return Object.freeze({
711
+ localCursor,
712
+ localStateHash,
713
+ localCausalFrontier: requiredFrontier(resume.localCausalFrontier),
714
+ requireSnapshot
715
+ });
716
+ }
717
+ editableArtifactLiveModality(modality);
718
+ if (!("localNativeRevision" in resume)) {
719
+ throw invalidFrame("serialized resume requires a native revision");
720
+ }
721
+ const localNativeRevision = nullableNonnegativeInteger(
722
+ resume.localNativeRevision,
723
+ "localNativeRevision"
724
+ );
725
+ if (localCursor === null !== (localNativeRevision === null)) {
726
+ throw invalidFrame(
727
+ "serialized resume cursor and native revision must both be null or both be present"
728
+ );
729
+ }
730
+ return Object.freeze({
731
+ modality,
732
+ localCursor,
733
+ localStateHash,
734
+ localNativeRevision,
735
+ requireSnapshot
736
+ });
737
+ }
738
+ function requiredFrontier(value) {
739
+ if (!Array.isArray(value) || value.length > MAX_CAUSAL_ACTORS) {
740
+ throw invalidFrame("causal frontier exceeds bound");
741
+ }
742
+ return editableArtifactCausalFrontier(value);
743
+ }
744
+ function editableArtifactLiveModality(value) {
745
+ if (value !== "document" && value !== "spreadsheet" && value !== "presentation") {
746
+ throw invalidFrame("editable artifact modality is invalid");
747
+ }
748
+ return value;
749
+ }
750
+ function clientOpenModality(metadata) {
751
+ return metadata.modality === void 0 ? "spreadsheet" : editableArtifactLiveModality(metadata.modality);
752
+ }
753
+ function serverModality(metadata) {
754
+ return metadata.modality === void 0 ? "spreadsheet" : editableArtifactLiveModality(metadata.modality);
755
+ }
756
+ function transactionModality(transaction) {
757
+ return transaction.modality === void 0 ? "spreadsheet" : editableArtifactLiveModality(transaction.modality);
758
+ }
759
+ function requireExactKeys(record, expected) {
760
+ const keys = Object.keys(record);
761
+ if (keys.length !== expected.length || keys.some((key, index) => key !== expected[index])) {
762
+ throw invalidFrame("Editable artifact wire metadata fields are invalid or out of order");
763
+ }
764
+ }
765
+ function requireServerKeys(metadata, type, trailing) {
766
+ requireExactKeys(metadata, ["type", "protocolVersion", "artifactId", "streamEpoch", ...trailing]);
767
+ requireLiteral(metadata.type, type, "type");
768
+ }
769
+ function serverIdentity(metadata, type) {
770
+ return Object.freeze({
771
+ type,
772
+ protocolVersion: positiveInteger(metadata.protocolVersion, "protocolVersion"),
773
+ artifactId: editableArtifactId(requiredString(metadata.artifactId, "artifactId")),
774
+ streamEpoch: boundedString(
775
+ requiredString(metadata.streamEpoch, "streamEpoch"),
776
+ "streamEpoch",
777
+ MAX_IDENTIFIER_BYTES
778
+ )
779
+ });
780
+ }
781
+ function requiredRecord(value, label) {
782
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
783
+ throw invalidFrame(`${label} must be an object`);
784
+ }
785
+ const prototype = Object.getPrototypeOf(value);
786
+ if (prototype !== Object.prototype && prototype !== null) {
787
+ throw invalidFrame(`${label} must be a plain object`);
788
+ }
789
+ return value;
790
+ }
791
+ function requiredString(value, label) {
792
+ if (typeof value !== "string") throw invalidFrame(`${label} must be a string`);
793
+ return value;
794
+ }
795
+ function requiredBoolean(value, label) {
796
+ if (typeof value !== "boolean") throw invalidFrame(`${label} must be boolean`);
797
+ return value;
798
+ }
799
+ function requireLiteral(value, expected, label) {
800
+ if (value !== expected) throw invalidFrame(`${label} must equal ${expected}`);
801
+ }
802
+ function positiveInteger(value, label) {
803
+ if (!Number.isSafeInteger(value) || value < 1) {
804
+ throw invalidFrame(`${label} must be a positive safe integer`);
805
+ }
806
+ return value;
807
+ }
808
+ function nonnegativeInteger(value, label) {
809
+ if (!Number.isSafeInteger(value) || value < 0) {
810
+ throw invalidFrame(`${label} must be a nonnegative safe integer`);
811
+ }
812
+ return value;
813
+ }
814
+ function nullableNonnegativeInteger(value, label) {
815
+ return value === null ? null : nonnegativeInteger(value, label);
816
+ }
817
+ function boundedString(value, label, maxBytes) {
818
+ const bytes = textEncoder.encode(value).byteLength;
819
+ if (bytes < 1 || bytes > maxBytes || value.trim() !== value) {
820
+ throw invalidFrame(`${label} is malformed`);
821
+ }
822
+ return value;
823
+ }
824
+ function boundedToken(value) {
825
+ const token = boundedString(value, "token", MAX_TOKEN_BYTES);
826
+ if (!/^[A-Za-z0-9._~-]+$/u.test(token)) throw invalidFrame("token is malformed");
827
+ return token;
828
+ }
829
+ function editableArtifactId(value) {
830
+ return stableId(value, "artifact id");
831
+ }
832
+ function editableArtifactTransactionId(value) {
833
+ return stableId(value, "server transaction id");
834
+ }
835
+ function editableArtifactClientTransactionId(value) {
836
+ if (!/^[A-Za-z0-9._:-]{1,200}$/u.test(value)) {
837
+ throw invalidFrame("clientTransactionId is malformed");
838
+ }
839
+ return value;
840
+ }
841
+ function editableArtifactRequestHash(value) {
842
+ return sha256Text(value, "request hash");
843
+ }
844
+ function editableArtifactStateHash(value) {
845
+ return sha256Text(value, "state hash");
846
+ }
847
+ function editableArtifactContentHash(value) {
848
+ return sha256Text(value, "content hash");
849
+ }
850
+ function stableId(value, label) {
851
+ if (!/^[0-9a-f]{32}$/u.test(value) || /^0{32}$/u.test(value)) {
852
+ throw invalidFrame(`${label} is malformed`);
853
+ }
854
+ return value;
855
+ }
856
+ function sha256Text(value, label) {
857
+ if (!/^sha256:[0-9a-f]{64}$/u.test(value)) {
858
+ throw invalidFrame(`${label} is malformed`);
859
+ }
860
+ return value;
861
+ }
862
+ function editableArtifactCausalFrontier(entries) {
863
+ const seen = /* @__PURE__ */ new Set();
864
+ const normalized = entries.map((entry, index) => {
865
+ const record = requiredRecord(entry, `causal frontier entry ${index}`);
866
+ requireExactKeys(record, ["replicaId", "counter"]);
867
+ const replicaId = requiredString(record.replicaId, "causal replicaId");
868
+ if (!/^[0-9a-f]{16}$/u.test(replicaId) || /^0{16}$/u.test(replicaId)) {
869
+ throw invalidFrame("causal replicaId is malformed");
870
+ }
871
+ const counter = positiveInteger(record.counter, "causal counter");
872
+ if (seen.has(replicaId)) throw invalidFrame("duplicate causal replicaId");
873
+ seen.add(replicaId);
874
+ return Object.freeze({ replicaId, counter });
875
+ });
876
+ normalized.sort(
877
+ (left, right) => left.replicaId < right.replicaId ? -1 : left.replicaId > right.replicaId ? 1 : 0
878
+ );
879
+ return Object.freeze(normalized);
880
+ }
881
+ function ownPayload(value, maxBytes, allowEmpty) {
882
+ if (!(value instanceof Uint8Array) || !allowEmpty && value.byteLength === 0 || value.byteLength > maxBytes) {
883
+ throw invalidFrame("Editable artifact wire payload exceeds bound");
884
+ }
885
+ return value.slice();
886
+ }
887
+ function requireNoPayload(payload) {
888
+ if (payload.byteLength !== 0) throw invalidFrame("Frame kind must not carry a binary payload");
889
+ }
890
+ function invalidFrame(message, cause) {
891
+ return new EditableArtifactLiveError("invalid_frame", message, {
892
+ ...cause ? { cause } : {}
893
+ });
894
+ }
895
+ var EMPTY_BYTES = new Uint8Array(0);
896
+ export {
897
+ EDITABLE_ARTIFACT_LIVE_WIRE_VERSION,
898
+ EditableArtifactLiveError,
899
+ decodeEditableArtifactLiveClientWireFrame,
900
+ decodeEditableArtifactLiveServerWireFrame,
901
+ encodeEditableArtifactLiveAppliedWireFrame,
902
+ encodeEditableArtifactLiveMutationWireFrame,
903
+ encodeEditableArtifactLiveOpenWireFrame,
904
+ encodeEditableArtifactLiveServerWireFrame,
905
+ inspectEditableArtifactLiveWireEnvelope
906
+ };
907
+ //# sourceMappingURL=editable-artifact-live.js.map