@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 @@
1
+ {"version":3,"sources":["../src/editable-artifacts.ts"],"sourcesContent":["import { sha256 } from \"@noble/hashes/sha256\";\nimport { bytesToHex } from \"@noble/hashes/utils\";\n\nexport * from \"./spreadsheet-artifact-commands\";\nexport * from \"./spreadsheet-artifact-query\";\nexport * from \"./editable-artifact-causal-frontier\";\nexport * from \"./document-artifact-commands\";\nexport * from \"./presentation-artifact-commands\";\nexport * from \"./editable-artifact-codec-registry\";\n\nexport const EDITABLE_ARTIFACT_INTENT_VERSION = 1 as const;\nexport const EDITABLE_ARTIFACT_INTENT_MAX_BYTES = 5 * 1024 * 1024;\nexport const EDITABLE_ARTIFACT_COMMAND_MAX_BYTES = 4 * 1024 * 1024;\nexport const EDITABLE_ARTIFACT_KERNEL_VERSION_MAX_BYTES = 512;\n/** Largest durable snapshot every supported browser/WASM client can open. */\nexport const EDITABLE_ARTIFACT_PRODUCT_MAX_SNAPSHOT_BYTES = 64 * 1024 * 1024;\nexport const EDITABLE_ARTIFACT_INTENT_MAX_CAUSAL_ACTORS = 1_024;\nexport const EDITABLE_ARTIFACT_INTENT_MAX_UNDO_TARGETS = 10_000;\n\nconst MAGIC = new TextEncoder().encode(\"OGATX001\");\nconst textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder(\"utf-8\", { fatal: true });\nconst STABLE_ID = /^[0-9a-f]{32}$/u;\nconst REPLICA_ID = /^[0-9a-f]{16}$/u;\nconst CLIENT_TRANSACTION_ID = /^[A-Za-z0-9._:-]{1,200}$/u;\nconst REQUEST_HASH = /^sha256:[0-9a-f]{64}$/u;\n\nexport type EditableArtifactCausalEntry = Readonly<{\n replicaId: string;\n counter: number;\n}>;\n\n/**\n * Exact client-authored mutation identity. Scope and actor authority are\n * deliberately absent: the server derives them and binds them in the\n * idempotency lookup tuple instead of trusting client bytes.\n */\nexport type EditableArtifactMutationIntent = Readonly<{\n envelopeVersion: typeof EDITABLE_ARTIFACT_INTENT_VERSION;\n protocolVersion: number;\n modelSchemaVersion: number;\n commandProtocolVersion: number;\n artifactId: string;\n clientTransactionId: string;\n replicaId: string;\n replicaCounter: number;\n previousLocalTransactionId: string | null;\n observedHeadSequence: number;\n causalBase: readonly EditableArtifactCausalEntry[];\n selectiveUndoOperationIds: readonly string[];\n commandBytes: Uint8Array;\n}>;\n\nexport function encodeEditableArtifactMutationIntent(\n input: EditableArtifactMutationIntent,\n): Uint8Array {\n // The writer owns the emitted bytes, so a second eager copy of a potentially\n // multi-megabyte command block would add no safety.\n const intent = normalizeIntent(input, false);\n const writer = new BinaryWriter(EDITABLE_ARTIFACT_INTENT_MAX_BYTES);\n writer.bytes(MAGIC);\n writer.u16(intent.envelopeVersion);\n writer.u16(intent.protocolVersion);\n writer.u16(intent.modelSchemaVersion);\n writer.u16(intent.commandProtocolVersion);\n writer.string(intent.artifactId);\n writer.string(intent.clientTransactionId);\n writer.string(intent.replicaId);\n writer.u64(intent.replicaCounter);\n writer.u8(intent.previousLocalTransactionId === null ? 0 : 1);\n if (intent.previousLocalTransactionId !== null) {\n writer.string(intent.previousLocalTransactionId);\n }\n writer.u64(intent.observedHeadSequence);\n writer.u16(intent.causalBase.length);\n for (const entry of intent.causalBase) {\n writer.string(entry.replicaId);\n writer.u64(entry.counter);\n }\n writer.u16(intent.selectiveUndoOperationIds.length);\n for (const operationId of intent.selectiveUndoOperationIds) writer.string(operationId);\n writer.byteBlock(intent.commandBytes);\n return writer.finish();\n}\n\nexport function decodeEditableArtifactMutationIntent(\n bytes: Uint8Array,\n): EditableArtifactMutationIntent {\n return parseEditableArtifactMutationIntent(bytes, true);\n}\n\nfunction parseEditableArtifactMutationIntent(\n bytes: Uint8Array,\n copyCommandBytes: boolean,\n): EditableArtifactMutationIntent {\n if (!(bytes instanceof Uint8Array)) throw new TypeError(\"intent bytes must be a Uint8Array\");\n if (bytes.byteLength > EDITABLE_ARTIFACT_INTENT_MAX_BYTES) {\n throw new RangeError(\"editable artifact intent exceeds its byte limit\");\n }\n const reader = new BinaryReader(bytes);\n const magic = reader.bytes(MAGIC.byteLength);\n if (!equalBytes(magic, MAGIC)) throw new TypeError(\"invalid editable artifact intent magic\");\n const envelopeVersion = reader.u16();\n if (envelopeVersion !== EDITABLE_ARTIFACT_INTENT_VERSION) {\n throw new TypeError(`unsupported editable artifact intent version: ${envelopeVersion}`);\n }\n const protocolVersion = reader.u16();\n const modelSchemaVersion = reader.u16();\n const commandProtocolVersion = reader.u16();\n const artifactId = reader.string();\n const clientTransactionId = reader.string();\n const replicaId = reader.string();\n const replicaCounter = reader.u64();\n const predecessorFlag = reader.u8();\n if (predecessorFlag > 1) throw new TypeError(\"invalid predecessor presence flag\");\n const previousLocalTransactionId = predecessorFlag === 1 ? reader.string() : null;\n const observedHeadSequence = reader.u64();\n const causalCount = reader.u16();\n if (causalCount > EDITABLE_ARTIFACT_INTENT_MAX_CAUSAL_ACTORS) {\n throw new RangeError(\"editable artifact causal base exceeds its actor limit\");\n }\n const causalBase: EditableArtifactCausalEntry[] = [];\n let previousReplicaId = \"\";\n for (let index = 0; index < causalCount; index += 1) {\n const causalReplicaId = reader.string();\n if (causalReplicaId <= previousReplicaId) {\n throw new TypeError(\"causal base replica ids must be unique and canonically sorted\");\n }\n previousReplicaId = causalReplicaId;\n causalBase.push(Object.freeze({ replicaId: causalReplicaId, counter: reader.u64() }));\n }\n const undoCount = reader.u16();\n if (undoCount > EDITABLE_ARTIFACT_INTENT_MAX_UNDO_TARGETS) {\n throw new RangeError(\"editable artifact undo targets exceed their limit\");\n }\n const selectiveUndoOperationIds: string[] = [];\n let previousOperationId = \"\";\n for (let index = 0; index < undoCount; index += 1) {\n const operationId = reader.string();\n if (operationId <= previousOperationId) {\n throw new TypeError(\"undo operation ids must be unique and canonically sorted\");\n }\n previousOperationId = operationId;\n selectiveUndoOperationIds.push(operationId);\n }\n const commandBytes = reader.byteBlock(EDITABLE_ARTIFACT_COMMAND_MAX_BYTES);\n reader.done();\n return normalizeIntent(\n {\n envelopeVersion: EDITABLE_ARTIFACT_INTENT_VERSION,\n protocolVersion,\n modelSchemaVersion,\n commandProtocolVersion,\n artifactId,\n clientTransactionId,\n replicaId,\n replicaCounter,\n previousLocalTransactionId,\n observedHeadSequence,\n causalBase,\n selectiveUndoOperationIds,\n commandBytes,\n },\n copyCommandBytes,\n );\n}\n\nexport function hashEditableArtifactMutationIntentBytes(bytes: Uint8Array): string {\n // Decode first so noncanonical or malformed bytes can never acquire a valid\n // application-level request hash merely because SHA-256 accepts any bytes.\n parseEditableArtifactMutationIntent(bytes, false);\n return `sha256:${bytesToHex(sha256(bytes))}`;\n}\n\nexport function hashEditableArtifactMutationIntent(intent: EditableArtifactMutationIntent): {\n bytes: Uint8Array;\n requestHash: string;\n} {\n const bytes = encodeEditableArtifactMutationIntent(intent);\n return { bytes, requestHash: `sha256:${bytesToHex(sha256(bytes))}` };\n}\n\nexport function assertEditableArtifactRequestHash(value: string): string {\n if (!REQUEST_HASH.test(value)) {\n throw new TypeError(\"editable artifact request hash must be canonical sha256 text\");\n }\n return value;\n}\n\nfunction normalizeIntent(\n input: EditableArtifactMutationIntent,\n copyCommandBytes = true,\n): EditableArtifactMutationIntent {\n if (!isPlainRecord(input)) throw new TypeError(\"editable artifact intent must be a plain record\");\n if (input.envelopeVersion !== EDITABLE_ARTIFACT_INTENT_VERSION) {\n throw new TypeError(\"editable artifact intent envelope version must be 1\");\n }\n const protocolVersion = positiveU16(input.protocolVersion, \"protocolVersion\");\n const modelSchemaVersion = positiveU16(input.modelSchemaVersion, \"modelSchemaVersion\");\n const commandProtocolVersion = positiveU16(\n input.commandProtocolVersion,\n \"commandProtocolVersion\",\n );\n const artifactId = stableId(input.artifactId, \"artifactId\");\n const clientTransactionId = portableTransactionId(\n input.clientTransactionId,\n \"clientTransactionId\",\n );\n const replicaId = replicaIdentity(input.replicaId, \"replicaId\");\n const replicaCounter = positiveSafeInteger(input.replicaCounter, \"replicaCounter\");\n const previousLocalTransactionId =\n input.previousLocalTransactionId === null\n ? null\n : portableTransactionId(input.previousLocalTransactionId, \"previousLocalTransactionId\");\n const observedHeadSequence = nonnegativeSafeInteger(\n input.observedHeadSequence,\n \"observedHeadSequence\",\n );\n if (!Array.isArray(input.causalBase)) throw new TypeError(\"causalBase must be an array\");\n if (input.causalBase.length > EDITABLE_ARTIFACT_INTENT_MAX_CAUSAL_ACTORS) {\n throw new RangeError(\"editable artifact causal base exceeds its actor limit\");\n }\n const causalByReplica = new Map<string, number>();\n for (const entry of input.causalBase) {\n if (!isPlainRecord(entry)) throw new TypeError(\"causal entries must be plain records\");\n const causalReplicaId = replicaIdentity(entry.replicaId, \"causal replicaId\");\n if (causalByReplica.has(causalReplicaId)) throw new TypeError(\"duplicate causal replicaId\");\n causalByReplica.set(\n causalReplicaId,\n positiveSafeInteger(entry.counter, `causal counter for ${causalReplicaId}`),\n );\n }\n const causalBase = [...causalByReplica]\n .sort(([left], [right]) => compareCodeUnits(left, right))\n .map(([causalReplicaId, counter]) => Object.freeze({ replicaId: causalReplicaId, counter }));\n if (!Array.isArray(input.selectiveUndoOperationIds)) {\n throw new TypeError(\"selectiveUndoOperationIds must be an array\");\n }\n if (input.selectiveUndoOperationIds.length > EDITABLE_ARTIFACT_INTENT_MAX_UNDO_TARGETS) {\n throw new RangeError(\"editable artifact undo targets exceed their limit\");\n }\n const undoSet = new Set<string>();\n for (const value of input.selectiveUndoOperationIds) {\n const operationId = stableId(value, \"selective undo operation id\");\n if (undoSet.has(operationId)) throw new TypeError(\"duplicate selective undo operation id\");\n undoSet.add(operationId);\n }\n const selectiveUndoOperationIds = [...undoSet].sort(compareCodeUnits);\n if (!(input.commandBytes instanceof Uint8Array)) {\n throw new TypeError(\"commandBytes must be a Uint8Array\");\n }\n if (input.commandBytes.byteLength < 1) throw new TypeError(\"commandBytes must not be empty\");\n if (input.commandBytes.byteLength > EDITABLE_ARTIFACT_COMMAND_MAX_BYTES) {\n throw new RangeError(\"commandBytes exceeds its byte limit\");\n }\n return Object.freeze({\n envelopeVersion: EDITABLE_ARTIFACT_INTENT_VERSION,\n protocolVersion,\n modelSchemaVersion,\n commandProtocolVersion,\n artifactId,\n clientTransactionId,\n replicaId,\n replicaCounter,\n previousLocalTransactionId,\n observedHeadSequence,\n causalBase: Object.freeze(causalBase),\n selectiveUndoOperationIds: Object.freeze(selectiveUndoOperationIds),\n commandBytes: copyCommandBytes ? input.commandBytes.slice() : input.commandBytes,\n });\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === \"object\" && value !== null && Object.getPrototypeOf(value) === Object.prototype\n );\n}\n\nfunction stableId(value: unknown, label: string): string {\n if (typeof value !== \"string\" || !STABLE_ID.test(value) || /^0+$/u.test(value)) {\n throw new TypeError(`${label} must be nonzero fixed-width lowercase hexadecimal text`);\n }\n return value;\n}\n\nfunction replicaIdentity(value: unknown, label: string): string {\n if (typeof value !== \"string\" || !REPLICA_ID.test(value) || /^0+$/u.test(value)) {\n throw new TypeError(`${label} must be nonzero 64-bit lowercase hexadecimal text`);\n }\n return value;\n}\n\nfunction portableTransactionId(value: unknown, label: string): string {\n if (typeof value !== \"string\" || !CLIENT_TRANSACTION_ID.test(value)) {\n throw new TypeError(`${label} must contain 1-200 portable identifier characters`);\n }\n return value;\n}\n\nfunction positiveU16(value: unknown, label: string): number {\n if (!Number.isInteger(value) || (value as number) < 1 || (value as number) > 0xffff) {\n throw new TypeError(`${label} must be a positive 16-bit integer`);\n }\n return value as number;\n}\n\nfunction positiveSafeInteger(value: unknown, label: string): number {\n if (!Number.isSafeInteger(value) || (value as number) < 1) {\n throw new TypeError(`${label} must be a positive safe integer`);\n }\n return value as number;\n}\n\nfunction nonnegativeSafeInteger(value: unknown, label: string): number {\n if (!Number.isSafeInteger(value) || (value as number) < 0) {\n throw new TypeError(`${label} must be a nonnegative safe integer`);\n }\n return value as number;\n}\n\nfunction compareCodeUnits(left: string, right: string): number {\n return left < right ? -1 : left > right ? 1 : 0;\n}\n\nfunction equalBytes(left: Uint8Array, right: Uint8Array): boolean {\n return (\n left.byteLength === right.byteLength && left.every((value, index) => value === right[index])\n );\n}\n\nclass BinaryWriter {\n private buffer = new Uint8Array(1_024);\n private length = 0;\n\n constructor(private readonly maximum: number) {}\n\n u8(value: number): void {\n this.ensure(1);\n this.buffer[this.length++] = value;\n }\n\n u16(value: number): void {\n this.ensure(2);\n this.buffer[this.length++] = value & 0xff;\n this.buffer[this.length++] = (value >>> 8) & 0xff;\n }\n\n u32(value: number): void {\n this.ensure(4);\n for (let offset = 0; offset < 4; offset += 1) {\n this.buffer[this.length++] = Math.floor(value / 2 ** (offset * 8)) & 0xff;\n }\n }\n\n u64(value: number): void {\n if (!Number.isSafeInteger(value) || value < 0) throw new TypeError(\"u64 must be safe\");\n this.ensure(8);\n let remaining = BigInt(value);\n for (let offset = 0; offset < 8; offset += 1) {\n this.buffer[this.length++] = Number(remaining & 0xffn);\n remaining >>= 8n;\n }\n }\n\n string(value: string): void {\n const bytes = textEncoder.encode(value);\n if (bytes.byteLength > 0xffff) throw new RangeError(\"intent string exceeds 65535 bytes\");\n this.u16(bytes.byteLength);\n this.bytes(bytes);\n }\n\n byteBlock(value: Uint8Array): void {\n this.u32(value.byteLength);\n this.bytes(value);\n }\n\n bytes(value: Uint8Array): void {\n this.ensure(value.byteLength);\n this.buffer.set(value, this.length);\n this.length += value.byteLength;\n }\n\n finish(): Uint8Array {\n return this.buffer.slice(0, this.length);\n }\n\n private ensure(additional: number): void {\n const needed = this.length + additional;\n if (!Number.isSafeInteger(needed) || needed > this.maximum) {\n throw new RangeError(\"editable artifact intent exceeds its byte limit\");\n }\n if (needed <= this.buffer.byteLength) return;\n let size = this.buffer.byteLength;\n while (size < needed) size = Math.min(this.maximum, size * 2);\n const next = new Uint8Array(size);\n next.set(this.buffer.subarray(0, this.length));\n this.buffer = next;\n }\n}\n\nclass BinaryReader {\n private offset = 0;\n\n constructor(private readonly input: Uint8Array) {}\n\n u8(): number {\n this.require(1);\n return this.input[this.offset++]!;\n }\n\n u16(): number {\n this.require(2);\n const value = this.input[this.offset]! | (this.input[this.offset + 1]! << 8);\n this.offset += 2;\n return value;\n }\n\n u32(): number {\n this.require(4);\n const value =\n this.input[this.offset]! +\n this.input[this.offset + 1]! * 2 ** 8 +\n this.input[this.offset + 2]! * 2 ** 16 +\n this.input[this.offset + 3]! * 2 ** 24;\n this.offset += 4;\n return value;\n }\n\n u64(): number {\n this.require(8);\n let value = 0n;\n for (let offset = 0; offset < 8; offset += 1) {\n value |= BigInt(this.input[this.offset + offset]!) << BigInt(offset * 8);\n }\n this.offset += 8;\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) throw new RangeError(\"u64 exceeds safe integer\");\n return Number(value);\n }\n\n string(): string {\n return textDecoder.decode(this.bytes(this.u16()));\n }\n\n byteBlock(maximum: number): Uint8Array {\n const length = this.u32();\n if (length < 1) throw new TypeError(\"commandBytes must not be empty\");\n if (length > maximum) throw new RangeError(\"commandBytes exceeds its byte limit\");\n return this.bytes(length);\n }\n\n bytes(length: number): Uint8Array {\n this.require(length);\n const output = this.input.subarray(this.offset, this.offset + length);\n this.offset += length;\n return output;\n }\n\n done(): void {\n if (this.offset !== this.input.byteLength) {\n throw new TypeError(\"editable artifact intent contains trailing bytes\");\n }\n }\n\n private require(length: number): void {\n if (\n !Number.isSafeInteger(length) ||\n length < 0 ||\n this.offset + length > this.input.byteLength\n ) {\n throw new TypeError(\"truncated editable artifact intent\");\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -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":";;;;;AAYO,IAAM,kCAAkC,IAAI,OAAO;AACnD,IAAM,uCAAuC;AAC7C,IAAM,4CAA4C;AAClD,IAAM,kCAAkC;AAE/C,IAAM,QAAQ,IAAI,WAAW,CAAC,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,EAAI,CAAC;AAC7E,IAAM,eAAe;AACrB,IAAM,iBAAiB;AACvB,IAAM,aAAa;AACnB,IAAM,kBAAkB;AACxB,IAAM,6BAA6B,IAAI,OAAO;AAC9C,IAAM,oBAAoB;AAC1B,IAAM,WAAW;AACjB,IAAM,UAAU;AAChB,IAAM,iBAAiB;AACvB,IAAM,kBAAkB;AACxB,IAAM,gBAAgB;AAEtB,IAAM,MAAM,MAAM,KAAK,EAAE,QAAQ,IAAI,GAAG,CAAC,GAAG,UAAU,MAAM,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC;AAwBlF,SAAS,kCAAkC,OAAgD;AAChG,cAAY,KAAK;AACjB,MAAI,MAAM,aAAa,iCAAiC;AACtD,UAAM,IAAI,WAAW,0CAA0C;AAAA,EACjE;AACA,MAAI,MAAM,aAAa,eAAe,gBAAgB;AACpD,UAAM,IAAI,UAAU,6BAA6B;AAAA,EACnD;AAEA,QAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,WAAS,QAAQ,GAAG,QAAQ,MAAM,YAAY,SAAS,GAAG;AACxD,QAAI,MAAM,KAAK,MAAM,MAAM,KAAK,EAAG,OAAM,IAAI,UAAU,wBAAwB;AAAA,EACjF;AAEA,QAAM,UAAU,KAAK,UAAU,GAAG,IAAI;AACtC,MAAI,YAAY,wCAAwC;AACtD,UAAM,IAAI,UAAU,iCAAiC,OAAO,EAAE;AAAA,EAChE;AACA,MAAI,KAAK,UAAU,IAAI,IAAI,MAAM,GAAG;AAClC,UAAM,IAAI,UAAU,uCAAuC;AAAA,EAC7D;AAEA,QAAM,iBAAiB,KAAK,UAAU,IAAI,IAAI;AAC9C,MAAI,mBAAmB,KAAK,iBAAiB,sCAAsC;AACjF,UAAM,IAAI,WAAW,0DAA0D;AAAA,EACjF;AAEA,QAAM,gBAAgB,UAAU,MAAM,IAAI,2BAA2B,KAAK;AAC1E,QAAM,aAAa,WAAW,cAAc,eAAe,yBAAyB;AACpF,QAAM,iBAAiB,WAAW,YAAY,gBAAgB,0BAA0B;AACxF,MAAI,MAAM,eAAe,gBAAgB;AACvC,UAAM,IAAI;AAAA,MACR,MAAM,aAAa,iBACf,+BACA;AAAA,IACN;AAAA,EACF;AAEA,QAAM,CAAC,aAAa,YAAY,IAAI,QAAQ,OAAO,UAAU;AAC7D,MACE,KAAK,UAAU,YAAY,IAAI,MAAM,eACrC,KAAK,UAAU,aAAa,GAAG,IAAI,MAAM,cACzC;AACA,UAAM,IAAI,UAAU,4BAA4B;AAAA,EAClD;AAEA,QAAM,SAAS,IAAI,OAAO,OAAO,cAAc,UAAU;AACzD,QAAM,gBAAgB,OAAO,SAAS,gBAAgB;AACtD,QAAM,MAAM,OAAO,OAAO;AAAA,IACxB,WAAW,OAAO,UAAU,yBAAyB;AAAA,IACrD,SAAS,OAAO,QAAQ,2BAA2B,IAAI;AAAA,EACzD,CAAC;AACD,QAAM,qBAAqB,OAAO,SAAS,sBAAsB;AACjE,QAAM,iBAAiB,OAAO,UAAU,kBAAkB;AAE1D,QAAM,eAAyB,CAAC;AAChC,QAAM,mBAAmB,oBAAI,IAAY;AACzC,MAAI,aAAa;AACjB,WAAS,QAAQ,GAAG,QAAQ,gBAAgB,SAAS,GAAG;AACtD,UAAM,cAAc,OAAO,SAAS,aAAa,KAAK,KAAK;AAC3D,QAAI,iBAAiB,IAAI,WAAW,GAAG;AACrC,YAAM,IAAI,UAAU,uCAAuC;AAAA,IAC7D;AACA,qBAAiB,IAAI,WAAW;AAChC,iBAAa,KAAK,WAAW;AAC7B,iBAAa,OAAO,YAAY,UAAU;AAAA,EAC5C;AAEA,QAAM,0BAA0B,OAAO,SAAS,2BAA2B;AAC3E,QAAM,YAAY,OAAO,UAAU,sBAAsB;AACzD,SAAO,KAAK;AAEZ,SAAO,OAAO,OAAO;AAAA,IACnB,0BAA0B;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,OAAO,OAAO,YAAY;AAAA,IACxC;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,IAAM,SAAN,MAAa;AAAA,EACF;AAAA,EACA;AAAA,EACA;AAAA,EACT;AAAA,EAEA,YAAY,OAAmB,QAAgB,KAAa;AAC1D,SAAK,SAAS;AACd,SAAK,QAAQ,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,SAAK,UAAU;AACf,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,KAAK,QAAgB,OAA2B;AAC9C,UAAM,SAAS,KAAK,QAAQ,QAAQ,KAAK;AACzC,WAAO,KAAK,OAAO,SAAS,QAAQ,SAAS,MAAM;AAAA,EACrD;AAAA,EAEA,QAAQ,QAAgB,OAAuB;AAC7C,QAAI,CAAC,OAAO,cAAc,MAAM,KAAK,SAAS,GAAG;AAC/C,YAAM,IAAI,WAAW,GAAG,KAAK,6BAA6B;AAAA,IAC5D;AACA,UAAM,SAAS,KAAK;AACpB,UAAM,MAAM,WAAW,QAAQ,QAAQ,GAAG,KAAK,aAAa;AAC5D,QAAI,MAAM,KAAK,KAAM,OAAM,IAAI,UAAU,aAAa,KAAK,EAAE;AAC7D,SAAK,UAAU;AACf,WAAO;AAAA,EACT;AAAA,EAEA,GAAG,OAAuB;AACxB,WAAO,KAAK,OAAO,KAAK,QAAQ,GAAG,KAAK,CAAC;AAAA,EAC3C;AAAA,EAEA,IAAI,OAAuB;AACzB,UAAM,SAAS,KAAK,QAAQ,GAAG,KAAK;AACpC,WAAO,KAAK,MAAM,UAAU,QAAQ,IAAI;AAAA,EAC1C;AAAA,EAEA,QAAQ,OAAe,UAA2B;AAChD,UAAM,SAAS,KAAK,QAAQ,GAAG,KAAK;AACpC,UAAM,QAAQ,UAAU,KAAK,OAAO,QAAQ,OAAO,QAAQ;AAC3D,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,OAAuB;AAC/B,UAAM,SAAS,KAAK,QAAQ,GAAG,KAAK;AACpC,UAAM,MAAM,KAAK,MAAM,UAAU,QAAQ,IAAI;AAC7C,UAAM,OAAO,KAAK,MAAM,UAAU,SAAS,GAAG,IAAI;AAClD,QAAI,QAAQ,KAAK,SAAS,EAAG,OAAM,IAAI,UAAU,GAAG,KAAK,kBAAkB;AAC3E,WAAO,OAAO,MAAM,GAAG;AAAA,EACzB;AAAA,EAEA,SAAS,OAAuB;AAC9B,UAAM,SAAS,KAAK,QAAQ,iBAAiB,KAAK;AAClD,UAAM,aAAa,KAAK,MAAM,UAAU,QAAQ,IAAI;AACpD,UAAM,cAAc,KAAK,MAAM,UAAU,SAAS,GAAG,IAAI;AACzD,UAAM,eAAe,KAAK,MAAM,UAAU,SAAS,GAAG,IAAI;AAC1D,UAAM,gBAAgB,KAAK,MAAM,UAAU,SAAS,IAAI,IAAI;AAC5D,QAAI,eAAe,KAAK,gBAAgB,KAAK,iBAAiB,KAAK,kBAAkB,GAAG;AACtF,YAAM,IAAI,UAAU,GAAG,KAAK,8BAA8B;AAAA,IAC5D;AACA,WAAO,GAAG,OAAO,eAAe,YAAY,CAAC,GAAG,OAAO,aAAa,UAAU,CAAC;AAAA,EACjF;AAAA,EAEA,cAAc,OAAuB;AACnC,UAAM,SAAS,KAAK;AACpB,UAAM,KAAK,KAAK,SAAS,KAAK;AAC9B,UAAM,gBACJ,KAAK,MAAM,UAAU,QAAQ,IAAI,MAAM,KAAK,KAAK,MAAM,UAAU,SAAS,GAAG,IAAI,MAAM;AACzF,UAAM,kBACJ,KAAK,MAAM,UAAU,SAAS,GAAG,IAAI,MAAM,KAAK,KAAK,MAAM,UAAU,SAAS,IAAI,IAAI,MAAM;AAC9F,QAAI,iBAAiB,iBAAiB;AACpC,YAAM,IAAI,UAAU,GAAG,KAAK,yCAAyC;AAAA,IACvE;AACA,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,OAAuB;AAC/B,WAAO,UAAU,SAAS,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC;AAAA,EACzD;AAAA,EAEA,SAAS,OAA2D;AAClE,UAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,QAAQ;AACvC,QAAI,QAAQ,2CAA2C;AACrD,YAAM,IAAI,WAAW,GAAG,KAAK,4BAA4B;AAAA,IAC3D;AACA,UAAM,UAA6C,CAAC;AACpD,QAAI,cAAc;AAClB,QAAI,eAAe;AACnB,QAAI,cAAc;AAClB,aAAS,QAAQ,GAAG,QAAQ,OAAO,SAAS,GAAG;AAC7C,YAAM,gBAAgB,KAAK;AAC3B,YAAM,YAAY,KAAK,UAAU,GAAG,KAAK,YAAY,KAAK,EAAE;AAC5D,YAAM,aAAa,KAAK,MAAM,UAAU,eAAe,IAAI;AAC3D,YAAM,cAAc,KAAK,MAAM,UAAU,gBAAgB,GAAG,IAAI;AAChE,UACE,gBACC,cAAc,gBAAiB,gBAAgB,gBAAgB,cAAc,cAC9E;AACA,cAAM,IAAI,UAAU,GAAG,KAAK,+CAA+C;AAAA,MAC7E;AACA,YAAM,UAAU,KAAK,QAAQ,GAAG,KAAK,YAAY,KAAK,IAAI,IAAI;AAC9D,cAAQ,KAAK,OAAO,OAAO,EAAE,WAAW,QAAQ,CAAC,CAAC;AAClD,oBAAc;AACd,qBAAe;AACf,oBAAc;AAAA,IAChB;AACA,WAAO,OAAO,OAAO,OAAO;AAAA,EAC9B;AAAA,EAEA,YAAY,YAA4B;AACtC,UAAM,MAAM,KAAK,GAAG,2BAA2B;AAC/C,YAAQ,KAAK;AAAA,MACX,KAAK,GAAG;AACN,aAAK,cAAc,kBAAkB;AACrC,aAAK,WAAW,oBAAoB;AACpC,cAAM,QAAQ,KAAK,GAAG,gCAAgC;AACtD,YAAI,UAAU,EAAG,MAAK,eAAe,2BAA2B;AAAA,iBACvD,UAAU,EAAG,OAAM,IAAI,UAAU,wCAAwC;AAClF,eAAO;AAAA,MACT;AAAA,MACA,KAAK;AACH,aAAK,eAAe,0BAA0B;AAC9C,aAAK,WAAW,oBAAoB;AACpC,eAAO;AAAA,MACT,KAAK;AACH,aAAK,eAAe,0BAA0B;AAC9C,eAAO;AAAA,MACT,KAAK;AACH,eAAO,KAAK,aAAa,UAAU;AAAA,MACrC,KAAK,GAAG;AACN,aAAK,eAAe,0BAA0B;AAC9C,cAAM,WAAW,KAAK,IAAI,uBAAuB;AACjD,cAAM,cAAc,KAAK,IAAI,0BAA0B;AACvD,cAAM,SAAS,KAAK,IAAI,qBAAqB;AAC7C,cAAM,YAAY,KAAK,IAAI,wBAAwB;AACnD,YAAI,WAAW,UAAU,cAAc,WAAW;AAChD,gBAAM,IAAI,UAAU,wCAAwC;AAAA,QAC9D;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK;AACH,aAAK,SAAS,uBAAuB;AACrC,eAAO;AAAA,MACT;AACE,cAAM,IAAI,UAAU,+CAA+C,GAAG,EAAE;AAAA,IAC5E;AAAA,EACF;AAAA,EAEA,aAAa,YAA4B;AACvC,SAAK,eAAe,6BAA6B;AACjD,UAAM,YAAY,KAAK,IAAI,uBAAuB;AAClD,UAAM,eAAe,KAAK,IAAI,0BAA0B;AACxD,UAAM,OAAO,KAAK,IAAI,iBAAiB;AACvC,UAAM,UAAU,KAAK,IAAI,oBAAoB;AAC7C,QAAI,SAAS,KAAK,YAAY,GAAG;AAC/B,YAAM,IAAI,UAAU,gDAAgD;AAAA,IACtE;AACA,QAAI,YAAY,WAAW,OAAO,MAAM,eAAe,WAAW,UAAU,IAAI;AAC9E,YAAM,IAAI,WAAW,8CAA8C;AAAA,IACrE;AACA,QAAI,OAAO,KAAK,MAAM,kCAAkC,OAAO,GAAG;AAChE,YAAM,IAAI,WAAW,4CAA4C;AAAA,IACnE;AACA,UAAM,YAAY,OAAO;AACzB,UAAM,YAAY,aAAa;AAC/B,QAAI,YAAY,iCAAiC;AAC/C,YAAM,IAAI,WAAW,6CAA6C;AAAA,IACpE;AACA,aAAS,QAAQ,GAAG,QAAQ,WAAW,SAAS,EAAG,MAAK,SAAS;AACjE,WAAO;AAAA,EACT;AAAA,EAEA,WAAiB;AACf,UAAM,aAAa,KAAK,GAAG,kBAAkB;AAC7C,QAAI,eAAe,GAAG;AACpB,UAAI,KAAK,WAAW,cAAc,MAAM,GAAG;AACzC,cAAM,IAAI,UAAU,oCAAoC;AAAA,MAC1D;AAAA,IACF,WAAW,eAAe,GAAG;AAC3B,YAAM,IAAI,UAAU,sCAAsC,UAAU,EAAE;AAAA,IACxE;AAEA,UAAM,WAAW,KAAK,GAAG,gBAAgB;AACzC,YAAQ,UAAU;AAAA,MAChB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH;AAAA,MACF,KAAK;AACH,aAAK,WAAW;AAChB;AAAA,MACF,KAAK;AACH,aAAK,WAAW,WAAW;AAC3B;AAAA,MACF,KAAK;AACH,aAAK,iBAAiB;AACtB;AAAA,MACF;AACE,cAAM,IAAI,UAAU,oCAAoC,QAAQ,EAAE;AAAA,IACtE;AAAA,EACF;AAAA,EAEA,aAAmB;AACjB,UAAM,SAAS,KAAK,QAAQ,GAAG,aAAa;AAC5C,UAAM,MAAM,KAAK,MAAM,UAAU,QAAQ,IAAI;AAC7C,UAAM,OAAO,KAAK,MAAM,UAAU,SAAS,GAAG,IAAI;AAClD,QAAI,QAAQ,KAAK,SAAS,YAAa;AACrC,YAAM,IAAI,UAAU,yCAAyC;AAAA,IAC/D;AACA,SAAK,OAAO,gBAAiB,YAAa;AACxC,YAAM,IAAI,UAAU,sCAAsC;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,mBAAyB;AACvB,UAAM,MAAM,KAAK,GAAG,mBAAmB;AACvC,QAAI,OAAO,EAAG;AACd,QAAI,QAAQ,GAAG;AACb,WAAK,WAAW,sBAAsB;AACtC;AAAA,IACF;AACA,UAAM,IAAI,UAAU,uCAAuC,GAAG,EAAE;AAAA,EAClE;AAAA,EAEA,eAAe,OAAqB;AAClC,SAAK,cAAc,GAAG,KAAK,WAAW;AACtC,SAAK,SAAS,GAAG,KAAK,wBAAwB;AAAA,EAChD;AAAA,EAEA,WAAW,OAAuB;AAChC,UAAM,SAAS,KAAK,IAAI,GAAG,KAAK,SAAS;AACzC,QAAI,SAAS,4BAA4B;AACvC,YAAM,IAAI,WAAW,GAAG,KAAK,yBAAyB;AAAA,IACxD;AACA,UAAM,QAAQ,KAAK,KAAK,QAAQ,KAAK;AACrC,eAAW,OAAO,KAAK;AACvB,WAAO;AAAA,EACT;AAAA,EAEA,OAAa;AACX,QAAI,KAAK,YAAY,KAAK,KAAM,OAAM,IAAI,UAAU,oCAAoC;AAAA,EAC1F;AACF;AAEA,SAAS,YAAY,OAAyB;AAC5C,MAAI,EAAE,iBAAiB,aAAa;AAClC,UAAM,IAAI,UAAU,qCAAqC;AAAA,EAC3D;AACA,MAAI,OAAO,sBAAsB,eAAe,MAAM,kBAAkB,mBAAmB;AACzF,UAAM,IAAI,UAAU,mDAAmD;AAAA,EACzE;AACF;AAEA,SAAS,UAAU,MAAgB,QAAgB,OAAe,UAA2B;AAC3F,QAAM,MAAM,KAAK,UAAU,QAAQ,IAAI;AACvC,QAAM,OAAO,KAAK,UAAU,SAAS,GAAG,IAAI;AAC5C,MAAI,OAAO;AACT,UAAM,IAAI,WAAW,GAAG,KAAK,wCAAwC;AACvE,QAAM,QAAQ,OAAO,WAAW;AAChC,MAAI,YAAY,UAAU,EAAG,OAAM,IAAI,UAAU,GAAG,KAAK,kBAAkB;AAC3E,SAAO;AACT;AAEA,SAAS,WAAW,MAAc,OAAe,OAAuB;AACtE,QAAM,SAAS,OAAO;AACtB,MAAI,CAAC,OAAO,cAAc,MAAM,EAAG,OAAM,IAAI,WAAW,GAAG,KAAK,6BAA6B;AAC7F,SAAO;AACT;AAGA,SAAS,WAAW,OAAmB,OAAqB;AAC1D,WAAS,QAAQ,GAAG,QAAQ,MAAM,UAAS;AACzC,UAAM,QAAQ,MAAM,KAAK;AACzB,QAAI,SAAS,KAAM;AACjB,eAAS;AACT;AAAA,IACF;AACA,UAAM,SAAS,MAAM,QAAQ,CAAC;AAC9B,QAAI,SAAS,OAAQ,SAAS,OAAQ,aAAa,MAAM,GAAG;AAC1D,eAAS;AACT;AAAA,IACF;AACA,UAAM,QAAQ,MAAM,QAAQ,CAAC;AAC7B,SACI,UAAU,OAAQ,QAAQ,QAAQ,KAAM,GAAI,KAC3C,SAAS,OAAQ,SAAS,OAAQ,aAAa,MAAM,KACrD,UAAU,OAAQ,QAAQ,QAAQ,KAAM,GAAI,KAC5C,SAAS,OAAQ,SAAS,OAAQ,aAAa,MAAM,MACxD,aAAa,KAAK,GAClB;AACA,eAAS;AACT;AAAA,IACF;AACA,UAAM,SAAS,MAAM,QAAQ,CAAC;AAC9B,SACI,UAAU,OAAQ,QAAQ,QAAQ,KAAM,GAAI,KAC3C,SAAS,OAAQ,SAAS,OAAQ,aAAa,MAAM,KACrD,UAAU,OAAQ,QAAQ,QAAQ,KAAM,GAAI,MAC/C,aAAa,KAAK,KAClB,aAAa,MAAM,GACnB;AACA,eAAS;AACT;AAAA,IACF;AACA,UAAM,IAAI,UAAU,GAAG,KAAK,yBAAyB;AAAA,EACvD;AACF;AAEA,SAAS,aAAa,OAAoC;AACxD,SAAO,UAAU,UAAa,SAAS,OAAQ,SAAS;AAC1D;AAEA,SAAS,QAAQ,OAA2B,SAAiB,SAA0B;AACrF,SAAO,UAAU,UAAa,SAAS,WAAW,SAAS;AAC7D;AAEA,SAAS,OAAO,MAAc,KAAqB;AACjD,SAAO,GAAG,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,GAAG,IAAI,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC;AAClF;AAEA,SAAS,SAAS,OAA2B;AAC3C,MAAI,SAAS;AACb,aAAW,QAAQ,MAAO,WAAU,IAAI,IAAI;AAC5C,SAAO;AACT;AAGA,SAAS,QAAQ,OAAmB,KAAmD;AACrF,MAAI,MAAM;AACV,MAAI,OAAO;AACX,WAAS,QAAQ,GAAG,QAAQ,KAAK,SAAS,GAAG;AAC3C,WAAO,MAAM,MAAM,KAAK,OAAQ;AAChC,UAAM,aAAa,MAAM;AACzB,UAAM,QAAQ,KAAK,MAAM,aAAa,QAAQ;AAC9C,WAAQ,OAAO,gBAAgB,QAAQ,MAAM,QAAW;AACxD,UAAM,eAAe;AAAA,EACvB;AACA,SAAO,CAAC,KAAK,IAAI;AACnB;","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