@opengeni/core 0.28.1 → 2.1.0-canary.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 (99) hide show
  1. package/dist/access/index.d.ts +37 -0
  2. package/dist/application/new-session-drafts.d.ts +8 -1
  3. package/dist/application/session-commands.d.ts +18 -11
  4. package/dist/application/session-tenancy.d.ts +18 -0
  5. package/dist/application/user-resource-grants.d.ts +20 -0
  6. package/dist/{chunk-6WKPWE5S.js → chunk-H7X52RI2.js} +27 -18
  7. package/dist/chunk-H7X52RI2.js.map +1 -0
  8. package/dist/{chunk-JJU6I5XD.js → chunk-VCZFFEPB.js} +21 -9
  9. package/dist/chunk-VCZFFEPB.js.map +1 -0
  10. package/dist/{chunk-NYPMQ7NO.js → chunk-ZYCNLYGH.js} +29 -27
  11. package/dist/chunk-ZYCNLYGH.js.map +1 -0
  12. package/dist/dependencies.d.ts +12 -1
  13. package/dist/domain/automations.d.ts +51 -0
  14. package/dist/domain/company-brain-governed-writes.d.ts +70 -0
  15. package/dist/domain/company-profile-agent-admin.d.ts +24 -0
  16. package/dist/domain/connection-authority.d.ts +97 -0
  17. package/dist/domain/connection-authority.js +169 -0
  18. package/dist/domain/connection-authority.js.map +1 -0
  19. package/dist/domain/editable-artifacts/service.d.ts +1 -2
  20. package/dist/domain/environments.d.ts +1 -1
  21. package/dist/domain/github-repository-bindings.d.ts +117 -0
  22. package/dist/domain/governed-learning-activation.d.ts +16 -0
  23. package/dist/domain/governed-learning-evaluator.d.ts +6 -0
  24. package/dist/domain/governed-learning-slack-publication.d.ts +45 -0
  25. package/dist/domain/memory-slack-delivery.d.ts +1 -4
  26. package/dist/domain/organization-membership-lifecycle.d.ts +1 -0
  27. package/dist/domain/packs.d.ts +5 -1
  28. package/dist/domain/personal-connection-delegations.d.ts +44 -2
  29. package/dist/domain/pr-review.d.ts +149 -0
  30. package/dist/domain/remember.d.ts +69 -0
  31. package/dist/domain/resources.d.ts +23 -2
  32. package/dist/domain/scheduled-tasks.d.ts +43 -2
  33. package/dist/domain/session-tool-policy.d.ts +1 -1
  34. package/dist/domain/sessions.d.ts +43 -9
  35. package/dist/editable-artifact-live/application.d.ts +10 -2
  36. package/dist/editable-artifact-live/ports.d.ts +0 -1
  37. package/dist/editable-artifact-live/server.d.ts +0 -1
  38. package/dist/editable-artifact-live/ticket.d.ts +0 -1
  39. package/dist/editable-artifact-live/types.d.ts +5 -2
  40. package/dist/editable-artifact-live.js +2 -2
  41. package/dist/editable-artifacts.js +2 -4
  42. package/dist/index.d.ts +13 -1
  43. package/dist/index.js +4973 -1243
  44. package/dist/index.js.map +1 -1
  45. package/dist/rigs/index.d.ts +22 -5
  46. package/dist/sandbox/fleet.d.ts +34 -6
  47. package/dist/sandbox/routing.d.ts +15 -1
  48. package/dist/sandbox/runtime-settings.d.ts +39 -0
  49. package/package.json +16 -11
  50. package/src/access/index.ts +151 -31
  51. package/src/application/new-session-drafts.ts +32 -5
  52. package/src/application/session-commands.ts +305 -71
  53. package/src/application/session-tenancy.ts +321 -0
  54. package/src/application/user-resource-grants.ts +140 -0
  55. package/src/billing/limits.ts +25 -15
  56. package/src/dependencies.ts +12 -1
  57. package/src/domain/automations.ts +196 -0
  58. package/src/domain/capabilities.ts +7 -1
  59. package/src/domain/company-brain-governed-writes.ts +330 -0
  60. package/src/domain/company-profile-agent-admin.ts +55 -0
  61. package/src/domain/connection-authority.ts +329 -0
  62. package/src/domain/editable-artifacts/agent-application.ts +17 -9
  63. package/src/domain/editable-artifacts/service.ts +12 -1
  64. package/src/domain/editable-artifacts/snapshot-compaction.ts +9 -5
  65. package/src/domain/editable-artifacts/snapshot-verifier-genesis.ts +10 -8
  66. package/src/domain/editable-artifacts/snapshot-verifier.ts +10 -3
  67. package/src/domain/environments.ts +16 -3
  68. package/src/domain/github-repository-bindings.ts +295 -0
  69. package/src/domain/governed-learning-activation.ts +44 -0
  70. package/src/domain/governed-learning-evaluator.ts +49 -0
  71. package/src/domain/governed-learning-slack-publication.ts +157 -0
  72. package/src/domain/insights.ts +9 -0
  73. package/src/domain/memory-slack-delivery.ts +0 -30
  74. package/src/domain/organization-membership-lifecycle.ts +9 -0
  75. package/src/domain/packs.ts +106 -3
  76. package/src/domain/personal-connection-delegations.ts +597 -42
  77. package/src/domain/pr-review.ts +671 -0
  78. package/src/domain/remember.ts +549 -0
  79. package/src/domain/resources.ts +144 -6
  80. package/src/domain/scheduled-tasks.ts +504 -77
  81. package/src/domain/session-tool-policy.ts +12 -9
  82. package/src/domain/sessions.ts +629 -176
  83. package/src/editable-artifact-live/application.ts +21 -3
  84. package/src/editable-artifact-live/ports.ts +0 -1
  85. package/src/editable-artifact-live/server.ts +13 -7
  86. package/src/editable-artifact-live/ticket.ts +1 -5
  87. package/src/editable-artifact-live/types.ts +6 -2
  88. package/src/editable-artifact-live/wire.ts +0 -10
  89. package/src/index.ts +13 -1
  90. package/src/rigs/index.ts +165 -48
  91. package/src/sandbox/fleet.ts +376 -30
  92. package/src/sandbox/routing.ts +91 -29
  93. package/src/sandbox/runtime-settings.ts +274 -0
  94. package/src/session-authorization.ts +17 -49
  95. package/dist/chunk-6WKPWE5S.js.map +0 -1
  96. package/dist/chunk-JJU6I5XD.js.map +0 -1
  97. package/dist/chunk-NYPMQ7NO.js.map +0 -1
  98. package/dist/domain/durable-learning-slack-publication.d.ts +0 -72
  99. package/src/domain/durable-learning-slack-publication.ts +0 -202
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/editable-artifact-live/application.ts","../src/editable-artifact-live/errors.ts","../src/editable-artifact-live/outbox-dispatcher.ts","../src/editable-artifact-live/server.ts","../src/editable-artifact-live/types.ts","../src/editable-artifact-live/ticket.ts","../src/editable-artifact-live/wire.ts"],"sourcesContent":["import type { EditableArtifactService } from \"../domain/editable-artifacts/service\";\nimport { EDITABLE_ARTIFACT_KERNEL_VERSION_MAX_BYTES } from \"@opengeni/contracts/editable-artifacts\";\nimport {\n editableArtifactClientTransactionId,\n editableArtifactId,\n editableArtifactScope,\n validateEditableArtifactActor,\n type EditableArtifact,\n type EditableArtifactActor,\n type EditableArtifactClientTransactionId,\n type EditableArtifactId,\n type EditableArtifactModality,\n type EditableArtifactOriginalImport,\n type EditableArtifactScope,\n type ImportEditableArtifactRequest,\n} from \"../domain/editable-artifacts/types\";\nimport type {\n EditableArtifactLiveSession,\n EditableArtifactLiveServer,\n OpenEditableArtifactLiveInput,\n} from \"./server\";\nimport type { EditableArtifactLiveTicket } from \"./types\";\n\nexport type EditableArtifactLiveCompatibilityRequest = Readonly<{\n artifact: EditableArtifact;\n protocolVersion: number;\n kernelVersion: string;\n modelSchemaVersion: number;\n}>;\n\n/** A client/runtime protocol tuple cannot be served by the loaded kernel. */\nexport class EditableArtifactCompatibilityError extends Error {\n readonly code = \"unsupported_protocol\" as const;\n\n constructor(message = \"Editable artifact runtime is incompatible\") {\n super(message);\n this.name = \"EditableArtifactCompatibilityError\";\n }\n}\n\n/** Local runtime compatibility; unsupported native/WASM assets fail closed. */\nexport interface EditableArtifactLiveCompatibilityPort {\n assertCompatible(input: EditableArtifactLiveCompatibilityRequest): Promise<void> | void;\n}\n\nexport type CreateEditableArtifactApplicationInput = Readonly<{\n scope: EditableArtifactScope;\n actor: EditableArtifactActor;\n idempotencyKey: EditableArtifactClientTransactionId;\n modality: EditableArtifactModality;\n title: string;\n signal?: AbortSignal;\n}>;\n\nexport type ImportEditableArtifactApplicationInput = Readonly<{\n scope: EditableArtifactScope;\n actor: EditableArtifactActor;\n idempotencyKey: EditableArtifactClientTransactionId;\n modality: EditableArtifactModality;\n title: string;\n originalImport: EditableArtifactOriginalImport;\n snapshot: ImportEditableArtifactRequest[\"snapshot\"];\n signal?: AbortSignal;\n}>;\n\nexport type ReadEditableArtifactApplicationInput = Readonly<{\n scope: EditableArtifactScope;\n actor: EditableArtifactActor;\n artifactId: EditableArtifactId;\n}>;\n\nexport type MintEditableArtifactApplicationTicketInput = ReadEditableArtifactApplicationInput &\n Readonly<{\n protocolVersion: number;\n kernelVersion: string;\n modelSchemaVersion: number;\n allowEdit: boolean;\n }>;\n\n/** Exact application seam used by standalone API and embedding hosts. */\nexport interface EditableArtifactApplicationPort {\n createArtifact(input: CreateEditableArtifactApplicationInput): Promise<EditableArtifact>;\n importArtifact(input: ImportEditableArtifactApplicationInput): Promise<EditableArtifact>;\n readArtifact(input: ReadEditableArtifactApplicationInput): Promise<EditableArtifact>;\n mintLiveTicket(\n input: MintEditableArtifactApplicationTicketInput,\n ): Promise<EditableArtifactLiveTicket>;\n openLive(input: OpenEditableArtifactLiveInput): Promise<EditableArtifactLiveSession>;\n}\n\nexport class EditableArtifactApplication implements EditableArtifactApplicationPort {\n constructor(\n private readonly dependencies: Readonly<{\n domain: EditableArtifactService;\n live: EditableArtifactLiveServer;\n compatibility: EditableArtifactLiveCompatibilityPort;\n }>,\n ) {}\n\n async createArtifact(input: CreateEditableArtifactApplicationInput): Promise<EditableArtifact> {\n const scope = editableArtifactScope(input.scope);\n validateEditableArtifactActor(input.actor);\n const result = await this.dependencies.domain.createArtifact({\n scope,\n actor: Object.freeze({ ...input.actor }) as EditableArtifactActor,\n request: {\n idempotencyKey: editableArtifactClientTransactionId(input.idempotencyKey),\n modality: input.modality,\n title: input.title,\n },\n ...(input.signal ? { signal: input.signal } : {}),\n });\n return result.artifact;\n }\n\n async importArtifact(input: ImportEditableArtifactApplicationInput): Promise<EditableArtifact> {\n const scope = editableArtifactScope(input.scope);\n validateEditableArtifactActor(input.actor);\n const result = await this.dependencies.domain.importArtifact({\n scope,\n actor: Object.freeze({ ...input.actor }) as EditableArtifactActor,\n request: {\n idempotencyKey: editableArtifactClientTransactionId(input.idempotencyKey),\n modality: input.modality,\n title: input.title,\n originalImport: input.originalImport,\n snapshot: input.snapshot,\n },\n ...(input.signal ? { signal: input.signal } : {}),\n });\n return result.artifact;\n }\n\n async readArtifact(input: ReadEditableArtifactApplicationInput): Promise<EditableArtifact> {\n const scope = editableArtifactScope(input.scope);\n const artifactId = editableArtifactId(input.artifactId);\n validateEditableArtifactActor(input.actor);\n return await this.dependencies.domain.getArtifact({\n scope,\n artifactId,\n actor: Object.freeze({ ...input.actor }) as EditableArtifactActor,\n });\n }\n\n async mintLiveTicket(\n input: MintEditableArtifactApplicationTicketInput,\n ): Promise<EditableArtifactLiveTicket> {\n const artifact = await this.readArtifact(input);\n await this.dependencies.compatibility.assertCompatible({\n artifact,\n protocolVersion: positiveInteger(input.protocolVersion, \"protocolVersion\"),\n kernelVersion: boundedVersion(input.kernelVersion, \"kernelVersion\"),\n modelSchemaVersion: positiveInteger(input.modelSchemaVersion, \"modelSchemaVersion\"),\n });\n return await this.dependencies.live.mintTicket({\n scope: artifact.scope,\n artifactId: artifact.id,\n modality: artifact.modality,\n actor: input.actor,\n allowEdit: input.allowEdit,\n });\n }\n\n openLive(input: OpenEditableArtifactLiveInput): Promise<EditableArtifactLiveSession> {\n return this.dependencies.live.openLive(input);\n }\n}\n\nfunction positiveInteger(value: number, label: string): number {\n if (!Number.isSafeInteger(value) || value < 1) {\n throw new TypeError(`${label} must be a positive safe integer`);\n }\n return value;\n}\n\nfunction boundedVersion(value: string, label: string): string {\n const bytes = new TextEncoder().encode(value).byteLength;\n if (bytes < 1 || bytes > EDITABLE_ARTIFACT_KERNEL_VERSION_MAX_BYTES || value.trim() !== value) {\n throw new TypeError(`${label} is malformed`);\n }\n return value;\n}\n","export {\n EditableArtifactLiveError,\n type EditableArtifactLiveErrorCode,\n} from \"@opengeni/contracts/editable-artifact-live\";\n","import {\n assertNonnegativeSafeInteger,\n assertPositiveSafeInteger,\n editableArtifactId,\n editableArtifactOutboxId,\n editableArtifactScope,\n editableArtifactSnapshotId,\n editableArtifactStateHash,\n type EditableArtifactLiveOutboxRecord,\n type EditableArtifactModality,\n type EditableArtifactOutboxId,\n type EditableArtifactScope,\n} from \"../domain/editable-artifacts/types\";\nimport type { EditableArtifactLiveClockPort, EditableArtifactLiveSchedulerPort } from \"./ports\";\n\nconst textEncoder = new TextEncoder();\n\nexport const EDITABLE_ARTIFACT_HINT_MAX_BYTES = 16 * 1024;\nexport const EDITABLE_ARTIFACT_HINT_SUBJECT_PREFIX = \"editable_artifacts.v1\";\n\ntype EditableArtifactBrokerHeadHintCommon = Readonly<{\n kind: \"head_advanced\";\n schemaVersion: 1;\n scope: EditableArtifactScope;\n artifactId: string;\n modality: EditableArtifactModality;\n headSequence: number;\n stateHash: string;\n}>;\n\ntype EditableArtifactBrokerSnapshotHintCommon = Readonly<{\n kind: \"snapshot_available\";\n schemaVersion: 1;\n scope: EditableArtifactScope;\n artifactId: string;\n modality: EditableArtifactModality;\n headSequence: number;\n stateHash: string;\n snapshotId: string;\n}>;\n\nexport type EditableArtifactBrokerHint =\n | (EditableArtifactBrokerHeadHintCommon &\n Readonly<{ modality: \"spreadsheet\"; operationProtocolVersion: number }>)\n | (EditableArtifactBrokerHeadHintCommon &\n Readonly<{\n modality: \"document\" | \"presentation\";\n commitProtocolVersion: number;\n }>)\n | (EditableArtifactBrokerSnapshotHintCommon &\n Readonly<{ modality: \"spreadsheet\"; operationProtocolVersion: number }>)\n | (EditableArtifactBrokerSnapshotHintCommon &\n Readonly<{ modality: \"document\" | \"presentation\" }>);\n\nexport type EditableArtifactEncodedBrokerHint = Readonly<{\n subject: string;\n payload: Uint8Array;\n hint: EditableArtifactBrokerHint;\n}>;\n\nexport interface EditableArtifactOutboxDispatcherStorePort {\n claimLiveOutbox(input: {\n owner: string;\n leaseDurationMs: number;\n limit: number;\n }): Promise<readonly EditableArtifactLiveOutboxRecord[]>;\n renewLiveOutbox(input: {\n outboxId: EditableArtifactOutboxId;\n owner: string;\n attemptCount: number;\n leaseDurationMs: number;\n }): Promise<void>;\n markLiveOutboxPublished(input: {\n outboxId: EditableArtifactOutboxId;\n owner: string;\n attemptCount: number;\n }): Promise<void>;\n retryLiveOutbox(input: {\n outboxId: EditableArtifactOutboxId;\n owner: string;\n attemptCount: number;\n retryDelayMs: number;\n errorCode: EditableArtifactOutboxRetryErrorCode;\n }): Promise<void>;\n deadLetterLiveOutbox(input: {\n outboxId: EditableArtifactOutboxId;\n owner: string;\n attemptCount: number;\n errorCode: EditableArtifactOutboxDeadLetterErrorCode;\n }): Promise<void>;\n}\n\n/** Resolves only after the broker has acknowledged every preceding publish. */\nexport interface EditableArtifactHintBrokerPort {\n publish(\n input: Readonly<{\n subject: string;\n payload: Uint8Array;\n signal: AbortSignal;\n }>,\n ): Promise<void>;\n}\n\nexport interface EditableArtifactOutboxRandomPort {\n unit(): number;\n}\n\nexport type EditableArtifactOutboxMetricOutcome =\n | \"claimed\"\n | \"published\"\n | \"retried\"\n | \"dead_lettered\"\n | \"lease_lost\"\n | \"claim_failed\"\n | \"mark_failed\"\n | \"retry_store_failed\"\n | \"dead_letter_store_failed\";\n\n/** Labels are closed unions; artifact/workspace identities must never become metric labels. */\nexport interface EditableArtifactOutboxMetricsPort {\n increment(outcome: EditableArtifactOutboxMetricOutcome, count?: number): void;\n observePublishSeconds(outcome: \"acked\" | \"failed\" | \"timed_out\", seconds: number): void;\n}\n\nexport interface EditableArtifactOutboxLoggerPort {\n warn(message: string, attributes: Readonly<Record<string, unknown>>): void;\n}\n\nexport type EditableArtifactOutboxRetryErrorCode =\n | \"broker_unavailable\"\n | \"broker_backpressure\"\n | \"publish_timeout\";\n\nexport type EditableArtifactOutboxDeadLetterErrorCode = \"invalid_hint\" | \"oversized_hint\";\n\nexport type EditableArtifactOutboxDispatcherOptions = Readonly<{\n owner: string;\n batchSize?: number;\n concurrency?: number;\n leaseDurationMs?: number;\n leaseRenewIntervalMs?: number;\n pollIntervalMs?: number;\n publishTimeoutMs?: number;\n retryBaseMs?: number;\n retryMaxMs?: number;\n retryJitterRatio?: number;\n claimBackoffBaseMs?: number;\n claimBackoffMaxMs?: number;\n maxHintBytes?: number;\n}>;\n\nexport type EditableArtifactOutboxDispatcherDependencies = Readonly<{\n store: EditableArtifactOutboxDispatcherStorePort;\n broker: EditableArtifactHintBrokerPort;\n clock: EditableArtifactLiveClockPort;\n scheduler: EditableArtifactLiveSchedulerPort;\n random: EditableArtifactOutboxRandomPort;\n metrics?: EditableArtifactOutboxMetricsPort;\n logger?: EditableArtifactOutboxLoggerPort;\n}>;\n\nexport type EditableArtifactOutboxDispatchSummary = Readonly<{\n claimed: number;\n published: number;\n retried: number;\n deadLettered: number;\n leaseLost: number;\n markFailed: number;\n claimFailed: boolean;\n}>;\n\ntype NormalizedOptions = Required<EditableArtifactOutboxDispatcherOptions>;\ntype MutableSummary = {\n claimed: number;\n published: number;\n retried: number;\n deadLettered: number;\n leaseLost: number;\n markFailed: number;\n claimFailed: boolean;\n};\n\nconst DEFAULTS = Object.freeze({\n batchSize: 32,\n concurrency: 8,\n leaseDurationMs: 30_000,\n leaseRenewIntervalMs: 10_000,\n pollIntervalMs: 500,\n publishTimeoutMs: 5_000,\n retryBaseMs: 500,\n retryMaxMs: 60_000,\n retryJitterRatio: 0.2,\n claimBackoffBaseMs: 500,\n claimBackoffMaxMs: 30_000,\n maxHintBytes: EDITABLE_ARTIFACT_HINT_MAX_BYTES,\n});\n\nexport class EditableArtifactLiveOutboxDispatcher {\n private readonly options: NormalizedOptions;\n private activeDispatch: Promise<EditableArtifactOutboxDispatchSummary> | null = null;\n\n constructor(\n private readonly dependencies: EditableArtifactOutboxDispatcherDependencies,\n options: EditableArtifactOutboxDispatcherOptions,\n ) {\n this.options = normalizeOptions(options);\n }\n\n /**\n * Long-running resilient loop. Abort stops new claims; an already-claimed\n * bounded batch drains before this promise resolves.\n */\n async run(signal: AbortSignal): Promise<void> {\n let consecutiveClaimFailures = 0;\n while (!signal.aborted) {\n const summary = await this.dispatchOnce();\n if (summary.claimFailed) consecutiveClaimFailures += 1;\n else consecutiveClaimFailures = 0;\n if (signal.aborted) break;\n const delay = summary.claimFailed\n ? exponentialDelay(\n consecutiveClaimFailures,\n this.options.claimBackoffBaseMs,\n this.options.claimBackoffMaxMs,\n this.options.retryJitterRatio,\n this.dependencies.random,\n )\n : summary.claimed === 0\n ? this.options.pollIntervalMs\n : 0;\n if (delay > 0 && !(await sleepUntilNextPoll(this.dependencies.scheduler, delay, signal))) {\n break;\n }\n }\n await this.drain();\n }\n\n /** Concurrent callers share one bounded claim/dispatch pass. */\n dispatchOnce(): Promise<EditableArtifactOutboxDispatchSummary> {\n if (this.activeDispatch) return this.activeDispatch;\n const dispatch = this.dispatchBatch();\n this.activeDispatch = dispatch;\n void dispatch.then(\n () => {\n if (this.activeDispatch === dispatch) this.activeDispatch = null;\n },\n () => {\n if (this.activeDispatch === dispatch) this.activeDispatch = null;\n },\n );\n return dispatch;\n }\n\n async drain(): Promise<void> {\n await this.activeDispatch;\n }\n\n private async dispatchBatch(): Promise<EditableArtifactOutboxDispatchSummary> {\n const summary = mutableSummary();\n let records: readonly EditableArtifactLiveOutboxRecord[];\n try {\n records = await this.dependencies.store.claimLiveOutbox({\n owner: this.options.owner,\n leaseDurationMs: this.options.leaseDurationMs,\n limit: this.options.batchSize,\n });\n if (!Array.isArray(records) || records.length > this.options.batchSize) {\n throw new TypeError(\"Outbox store returned an invalid claim batch\");\n }\n } catch (error) {\n summary.claimFailed = true;\n this.metric(\"claim_failed\");\n this.warn(\"Editable artifact outbox claim failed\", \"claim_failed\", error);\n return freezeSummary(summary);\n }\n summary.claimed = records.length;\n if (records.length > 0) this.metric(\"claimed\", records.length);\n let cursor = 0;\n const worker = async () => {\n for (;;) {\n const index = cursor;\n cursor += 1;\n const record = records[index];\n if (!record) return;\n await this.dispatchRecord(record, summary);\n }\n };\n await Promise.all(\n Array.from(\n { length: Math.min(records.length, this.options.concurrency) },\n async () => await worker(),\n ),\n );\n return freezeSummary(summary);\n }\n\n private async dispatchRecord(\n record: EditableArtifactLiveOutboxRecord,\n summary: MutableSummary,\n ): Promise<void> {\n let outboxId: EditableArtifactOutboxId;\n try {\n outboxId = validateClaimedRecord(record, this.options.owner);\n } catch (error) {\n await this.deadLetter(record, \"invalid_hint\", summary, error);\n return;\n }\n let encoded: EditableArtifactEncodedBrokerHint;\n try {\n encoded = encodeEditableArtifactBrokerHint(record, this.options.maxHintBytes);\n } catch (error) {\n await this.deadLetter(\n record,\n error instanceof EditableArtifactHintEncodingError && error.code === \"oversized_hint\"\n ? \"oversized_hint\"\n : \"invalid_hint\",\n summary,\n error,\n );\n return;\n }\n\n const publishAbort = new AbortController();\n const renewalAbort = new AbortController();\n let leaseLost = false;\n const renewal = this.renewWhilePublishing(record, renewalAbort.signal, publishAbort, () => {\n leaseLost = true;\n }).catch((error: unknown) => {\n leaseLost = true;\n publishAbort.abort();\n this.warn(\"Editable artifact outbox renewal loop failed\", \"lease_lost\", error);\n });\n let publishError: unknown = null;\n let timedOut = false;\n const startedAt = this.dependencies.clock.now().getTime();\n try {\n await withTimeout(\n this.dependencies.broker.publish({\n subject: encoded.subject,\n payload: encoded.payload.slice(),\n signal: publishAbort.signal,\n }),\n this.options.publishTimeoutMs,\n this.dependencies.scheduler,\n publishAbort,\n () => {\n timedOut = true;\n },\n );\n } catch (error) {\n publishError = error;\n } finally {\n renewalAbort.abort();\n await renewal;\n this.observePublish(timedOut ? \"timed_out\" : publishError ? \"failed\" : \"acked\", startedAt);\n }\n if (leaseLost) {\n summary.leaseLost += 1;\n this.metric(\"lease_lost\");\n return;\n }\n if (publishError) {\n const errorCode: EditableArtifactOutboxRetryErrorCode = timedOut\n ? \"publish_timeout\"\n : brokerErrorCode(publishError);\n await this.retry(record, errorCode, summary, publishError);\n return;\n }\n\n // Extend once after broker ACK so the fenced mark cannot race a lease that\n // was nearly exhausted during publication.\n try {\n await this.dependencies.store.renewLiveOutbox({\n outboxId,\n owner: this.options.owner,\n attemptCount: record.attemptCount,\n leaseDurationMs: this.options.leaseDurationMs,\n });\n } catch (error) {\n summary.leaseLost += 1;\n this.metric(\"lease_lost\");\n this.warn(\"Editable artifact outbox lease was lost after broker ACK\", \"lease_lost\", error);\n return;\n }\n try {\n await this.dependencies.store.markLiveOutboxPublished({\n outboxId,\n owner: this.options.owner,\n attemptCount: record.attemptCount,\n });\n summary.published += 1;\n this.metric(\"published\");\n } catch (error) {\n // The publish may have succeeded. Never turn an unknown mark outcome into\n // an eager retry; lease expiry safely permits an at-least-once duplicate.\n summary.markFailed += 1;\n this.metric(\"mark_failed\");\n this.warn(\"Editable artifact outbox publish mark failed\", \"mark_failed\", error);\n }\n }\n\n private async renewWhilePublishing(\n record: EditableArtifactLiveOutboxRecord,\n signal: AbortSignal,\n publishAbort: AbortController,\n onLeaseLost: () => void,\n ): Promise<void> {\n for (;;) {\n if (\n !(await sleepUntilNextPoll(\n this.dependencies.scheduler,\n this.options.leaseRenewIntervalMs,\n signal,\n ))\n ) {\n return;\n }\n try {\n await this.dependencies.store.renewLiveOutbox({\n outboxId: editableArtifactOutboxId(record.outboxId),\n owner: this.options.owner,\n attemptCount: record.attemptCount,\n leaseDurationMs: this.options.leaseDurationMs,\n });\n } catch (error) {\n onLeaseLost();\n publishAbort.abort();\n this.warn(\"Editable artifact outbox lease renewal failed\", \"lease_lost\", error);\n return;\n }\n }\n }\n\n private async retry(\n record: EditableArtifactLiveOutboxRecord,\n errorCode: EditableArtifactOutboxRetryErrorCode,\n summary: MutableSummary,\n error: unknown,\n ): Promise<void> {\n const retryDelayMs = exponentialDelay(\n record.attemptCount,\n this.options.retryBaseMs,\n this.options.retryMaxMs,\n this.options.retryJitterRatio,\n this.dependencies.random,\n );\n try {\n await this.dependencies.store.retryLiveOutbox({\n outboxId: editableArtifactOutboxId(record.outboxId),\n owner: this.options.owner,\n attemptCount: record.attemptCount,\n retryDelayMs,\n errorCode,\n });\n summary.retried += 1;\n this.metric(\"retried\");\n } catch (retryError) {\n this.metric(\"retry_store_failed\");\n this.warn(\n \"Editable artifact outbox retry persistence failed\",\n \"retry_store_failed\",\n retryError,\n );\n }\n this.warn(\"Editable artifact hint publish failed\", errorCode, error);\n }\n\n private async deadLetter(\n record: EditableArtifactLiveOutboxRecord,\n errorCode: EditableArtifactOutboxDeadLetterErrorCode,\n summary: MutableSummary,\n error: unknown,\n ): Promise<void> {\n try {\n await this.dependencies.store.deadLetterLiveOutbox({\n outboxId: editableArtifactOutboxId(record.outboxId),\n owner: this.options.owner,\n attemptCount: record.attemptCount,\n errorCode,\n });\n summary.deadLettered += 1;\n this.metric(\"dead_lettered\");\n } catch (deadLetterError) {\n this.metric(\"dead_letter_store_failed\");\n this.warn(\n \"Editable artifact outbox dead-letter persistence failed\",\n \"dead_letter_store_failed\",\n deadLetterError,\n );\n }\n this.warn(\"Editable artifact outbox contains an undeliverable hint\", errorCode, error);\n }\n\n private metric(outcome: EditableArtifactOutboxMetricOutcome, count = 1): void {\n try {\n this.dependencies.metrics?.increment(outcome, count);\n } catch {\n // Metrics cannot affect delivery.\n }\n }\n\n private observePublish(outcome: \"acked\" | \"failed\" | \"timed_out\", startedAt: number): void {\n let elapsed = 0;\n const now = this.dependencies.clock.now().getTime();\n if (Number.isFinite(now) && Number.isFinite(startedAt)) elapsed = Math.max(0, now - startedAt);\n try {\n this.dependencies.metrics?.observePublishSeconds(outcome, elapsed / 1_000);\n } catch {\n // Metrics cannot affect delivery.\n }\n }\n\n private warn(message: string, code: string, error: unknown): void {\n try {\n this.dependencies.logger?.warn(message, {\n code,\n errorClass: error instanceof Error ? error.name : \"UnknownError\",\n });\n } catch {\n // Logging cannot affect delivery.\n }\n }\n}\n\nexport class EditableArtifactHintEncodingError extends Error {\n constructor(\n readonly code: EditableArtifactOutboxDeadLetterErrorCode,\n message: string,\n ) {\n super(message);\n this.name = \"EditableArtifactHintEncodingError\";\n }\n}\n\nexport function encodeEditableArtifactBrokerHint(\n record: EditableArtifactLiveOutboxRecord,\n maxBytes = EDITABLE_ARTIFACT_HINT_MAX_BYTES,\n): EditableArtifactEncodedBrokerHint {\n assertPositiveSafeInteger(maxBytes, \"maximum broker hint bytes\");\n let hint: EditableArtifactBrokerHint;\n try {\n const event = record.event;\n const scope = editableArtifactScope(event.scope);\n const artifactId = editableArtifactId(event.artifactId);\n const stateHash = editableArtifactStateHash(event.stateHash);\n if (event.schemaVersion !== 1) throw new TypeError(\"Unsupported artifact hint schema\");\n if (event.kind === \"transaction_committed\") {\n assertPositiveSafeInteger(event.sequenceEnd, \"hint head sequence\");\n const common = {\n kind: \"head_advanced\",\n schemaVersion: 1,\n scope,\n artifactId,\n modality: event.modality,\n headSequence: event.sequenceEnd,\n stateHash,\n } as const;\n if (event.modality === \"spreadsheet\") {\n assertPositiveSafeInteger(\n event.operationProtocolVersion,\n \"hint operation protocol version\",\n );\n hint = Object.freeze({\n ...common,\n modality: \"spreadsheet\",\n operationProtocolVersion: event.operationProtocolVersion,\n });\n } else {\n assertPositiveSafeInteger(event.commitProtocolVersion, \"hint commit protocol version\");\n hint = Object.freeze({\n ...common,\n modality: event.modality,\n commitProtocolVersion: event.commitProtocolVersion,\n });\n }\n } else if (event.kind === \"snapshot_published\") {\n assertNonnegativeSafeInteger(event.coveredHeadSequence, \"snapshot hint head sequence\");\n const common = {\n kind: \"snapshot_available\",\n schemaVersion: 1,\n scope,\n artifactId,\n modality: event.modality,\n headSequence: event.coveredHeadSequence,\n stateHash,\n snapshotId: editableArtifactSnapshotId(event.snapshotId),\n } as const;\n if (event.modality === \"spreadsheet\") {\n assertPositiveSafeInteger(\n event.operationProtocolVersion,\n \"hint operation protocol version\",\n );\n hint = Object.freeze({\n ...common,\n modality: \"spreadsheet\",\n operationProtocolVersion: event.operationProtocolVersion,\n });\n } else {\n hint = Object.freeze({ ...common, modality: event.modality });\n }\n } else {\n throw new TypeError(\"Unknown editable artifact outbox event\");\n }\n const payload = textEncoder.encode(JSON.stringify(hint));\n if (payload.byteLength > maxBytes) {\n throw new EditableArtifactHintEncodingError(\n \"oversized_hint\",\n \"Editable artifact broker hint exceeds its byte limit\",\n );\n }\n return Object.freeze({\n subject: editableArtifactLiveHintSubject(scope, artifactId),\n payload,\n hint,\n });\n } catch (error) {\n if (error instanceof EditableArtifactHintEncodingError) throw error;\n throw new EditableArtifactHintEncodingError(\n \"invalid_hint\",\n \"Editable artifact outbox event cannot be projected to a broker hint\",\n );\n }\n}\n\nexport function editableArtifactLiveHintSubject(\n scope: EditableArtifactScope,\n artifactIdInput: string,\n): string {\n const normalized = editableArtifactScope(scope);\n const artifactId = editableArtifactId(artifactIdInput);\n const subject = [\n EDITABLE_ARTIFACT_HINT_SUBJECT_PREFIX,\n base64Url(textEncoder.encode(normalized.accountId)),\n base64Url(textEncoder.encode(normalized.workspaceId)),\n artifactId,\n ].join(\".\");\n if (textEncoder.encode(subject).byteLength > 1_024) {\n throw new EditableArtifactHintEncodingError(\n \"invalid_hint\",\n \"Editable artifact hint subject exceeds its byte limit\",\n );\n }\n return subject;\n}\n\nexport function decodeEditableArtifactBrokerHint(\n payload: Uint8Array,\n expected: Readonly<{ scope: EditableArtifactScope; artifactId: string }>,\n maxBytes = EDITABLE_ARTIFACT_HINT_MAX_BYTES,\n): EditableArtifactBrokerHint {\n if (!(payload instanceof Uint8Array) || payload.byteLength < 2 || payload.byteLength > maxBytes) {\n throw new EditableArtifactHintEncodingError(\n \"oversized_hint\",\n \"Editable artifact broker hint exceeds its byte limit\",\n );\n }\n try {\n const text = new TextDecoder(\"utf-8\", { fatal: true }).decode(payload);\n const value = JSON.parse(text) as unknown;\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new TypeError(\"hint must be an object\");\n }\n const record = value as Record<string, unknown>;\n if (JSON.stringify(record) !== text) throw new TypeError(\"hint must be canonical JSON\");\n const kind = record.kind;\n const modality = record.modality;\n if (modality !== \"spreadsheet\" && modality !== \"document\" && modality !== \"presentation\") {\n throw new TypeError(\"hint modality invalid\");\n }\n const keys = Object.keys(record);\n const expectedKeys =\n kind === \"head_advanced\"\n ? modality === \"spreadsheet\"\n ? [\n \"kind\",\n \"schemaVersion\",\n \"scope\",\n \"artifactId\",\n \"modality\",\n \"headSequence\",\n \"stateHash\",\n \"operationProtocolVersion\",\n ]\n : [\n \"kind\",\n \"schemaVersion\",\n \"scope\",\n \"artifactId\",\n \"modality\",\n \"headSequence\",\n \"stateHash\",\n \"commitProtocolVersion\",\n ]\n : modality === \"spreadsheet\"\n ? [\n \"kind\",\n \"schemaVersion\",\n \"scope\",\n \"artifactId\",\n \"modality\",\n \"headSequence\",\n \"stateHash\",\n \"snapshotId\",\n \"operationProtocolVersion\",\n ]\n : [\n \"kind\",\n \"schemaVersion\",\n \"scope\",\n \"artifactId\",\n \"modality\",\n \"headSequence\",\n \"stateHash\",\n \"snapshotId\",\n ];\n if (\n keys.length !== expectedKeys.length ||\n keys.some((key, index) => key !== expectedKeys[index])\n ) {\n throw new TypeError(\"hint fields invalid\");\n }\n if (record.schemaVersion !== 1) throw new TypeError(\"hint schema invalid\");\n const scope = editableArtifactScope(record.scope as EditableArtifactScope);\n const artifactId = editableArtifactId(record.artifactId as string);\n if (\n scope.accountId !== expected.scope.accountId ||\n scope.workspaceId !== expected.scope.workspaceId ||\n artifactId !== editableArtifactId(expected.artifactId)\n ) {\n throw new TypeError(\"hint authority mismatch\");\n }\n assertNonnegativeSafeInteger(record.headSequence as number, \"hint head sequence\");\n if (modality === \"spreadsheet\") {\n assertPositiveSafeInteger(\n record.operationProtocolVersion as number,\n \"hint operation protocol version\",\n );\n } else if (kind === \"head_advanced\") {\n assertPositiveSafeInteger(\n record.commitProtocolVersion as number,\n \"hint commit protocol version\",\n );\n }\n editableArtifactStateHash(record.stateHash as string);\n if (kind === \"head_advanced\") return Object.freeze(record) as EditableArtifactBrokerHint;\n if (kind === \"snapshot_available\") {\n editableArtifactSnapshotId(record.snapshotId as string);\n return Object.freeze(record) as EditableArtifactBrokerHint;\n }\n throw new TypeError(\"hint kind invalid\");\n } catch (error) {\n if (error instanceof EditableArtifactHintEncodingError) throw error;\n throw new EditableArtifactHintEncodingError(\n \"invalid_hint\",\n \"Editable artifact broker hint is invalid\",\n );\n }\n}\n\nexport class MathEditableArtifactOutboxRandom implements EditableArtifactOutboxRandomPort {\n unit(): number {\n return Math.random();\n }\n}\n\nfunction validateClaimedRecord(\n record: EditableArtifactLiveOutboxRecord,\n owner: string,\n): EditableArtifactOutboxId {\n const outboxId = editableArtifactOutboxId(record.outboxId);\n if (record.state !== \"publishing\") throw new TypeError(\"Claimed outbox row is not publishing\");\n if (record.leaseOwner !== owner) throw new TypeError(\"Claimed outbox row has another owner\");\n assertPositiveSafeInteger(record.attemptCount, \"outbox attempt count\");\n if (record.leaseExpiresAt === null) throw new TypeError(\"Claimed outbox row has no lease expiry\");\n return outboxId;\n}\n\nfunction normalizeOptions(options: EditableArtifactOutboxDispatcherOptions): NormalizedOptions {\n const owner = boundedOwner(options.owner);\n const normalized = {\n owner,\n batchSize: options.batchSize ?? DEFAULTS.batchSize,\n concurrency: options.concurrency ?? DEFAULTS.concurrency,\n leaseDurationMs: options.leaseDurationMs ?? DEFAULTS.leaseDurationMs,\n leaseRenewIntervalMs: options.leaseRenewIntervalMs ?? DEFAULTS.leaseRenewIntervalMs,\n pollIntervalMs: options.pollIntervalMs ?? DEFAULTS.pollIntervalMs,\n publishTimeoutMs: options.publishTimeoutMs ?? DEFAULTS.publishTimeoutMs,\n retryBaseMs: options.retryBaseMs ?? DEFAULTS.retryBaseMs,\n retryMaxMs: options.retryMaxMs ?? DEFAULTS.retryMaxMs,\n retryJitterRatio: options.retryJitterRatio ?? DEFAULTS.retryJitterRatio,\n claimBackoffBaseMs: options.claimBackoffBaseMs ?? DEFAULTS.claimBackoffBaseMs,\n claimBackoffMaxMs: options.claimBackoffMaxMs ?? DEFAULTS.claimBackoffMaxMs,\n maxHintBytes: options.maxHintBytes ?? DEFAULTS.maxHintBytes,\n };\n for (const [label, value] of Object.entries(normalized)) {\n if (label === \"owner\" || label === \"retryJitterRatio\") continue;\n if (typeof value !== \"number\") throw new TypeError(`${label} must be numeric`);\n assertPositiveSafeInteger(value, label);\n }\n if (normalized.batchSize > 256) throw new TypeError(\"outbox batch size exceeds 256\");\n if (normalized.concurrency > normalized.batchSize)\n throw new TypeError(\"outbox concurrency exceeds batch size\");\n if (normalized.leaseDurationMs < 5_000 || normalized.leaseDurationMs > 300_000)\n throw new TypeError(\"outbox lease duration must be 5-300 seconds\");\n if (normalized.leaseRenewIntervalMs * 2 >= normalized.leaseDurationMs)\n throw new TypeError(\"outbox lease renewal interval must be less than half the lease\");\n if (normalized.publishTimeoutMs >= normalized.leaseDurationMs)\n throw new TypeError(\"outbox publish timeout must be shorter than the lease\");\n if (normalized.retryBaseMs > normalized.retryMaxMs)\n throw new TypeError(\"outbox retry base exceeds retry maximum\");\n if (normalized.claimBackoffBaseMs > normalized.claimBackoffMaxMs)\n throw new TypeError(\"outbox claim backoff base exceeds its maximum\");\n if (\n !Number.isFinite(normalized.retryJitterRatio) ||\n normalized.retryJitterRatio < 0 ||\n normalized.retryJitterRatio > 1\n ) {\n throw new TypeError(\"outbox retry jitter ratio must be between zero and one\");\n }\n if (normalized.maxHintBytes > EDITABLE_ARTIFACT_HINT_MAX_BYTES)\n throw new TypeError(\"outbox hint byte limit exceeds the protocol maximum\");\n return Object.freeze(normalized);\n}\n\nfunction boundedOwner(value: string): string {\n const bytes = textEncoder.encode(value).byteLength;\n if (bytes < 1 || bytes > 200 || value.trim() !== value || !/^[A-Za-z0-9._:-]+$/u.test(value)) {\n throw new TypeError(\"outbox owner is malformed\");\n }\n return value;\n}\n\nfunction exponentialDelay(\n attempt: number,\n base: number,\n maximum: number,\n jitterRatio: number,\n random: EditableArtifactOutboxRandomPort,\n): number {\n const exponent = Math.min(30, Math.max(0, attempt - 1));\n const withoutJitter = Math.min(maximum, base * 2 ** exponent);\n const sample = random.unit();\n const unit = Number.isFinite(sample) && sample >= 0 && sample < 1 ? sample : 0.5;\n const jitter = Math.floor(withoutJitter * jitterRatio * unit);\n return Math.min(maximum, withoutJitter + jitter);\n}\n\nasync function withTimeout(\n operation: Promise<void>,\n timeoutMs: number,\n scheduler: EditableArtifactLiveSchedulerPort,\n operationAbort: AbortController,\n onTimeout: () => void,\n): Promise<void> {\n const timeoutAbort = new AbortController();\n try {\n await Promise.race([\n operation,\n scheduler.sleep(timeoutMs, timeoutAbort.signal).then(() => {\n onTimeout();\n operationAbort.abort();\n throw new Error(\"Editable artifact broker publish timed out\");\n }),\n ]);\n } finally {\n timeoutAbort.abort();\n }\n}\n\nasync function sleepUntilNextPoll(\n scheduler: EditableArtifactLiveSchedulerPort,\n milliseconds: number,\n signal: AbortSignal,\n): Promise<boolean> {\n try {\n await scheduler.sleep(milliseconds, signal);\n return true;\n } catch (error) {\n if (signal.aborted) return false;\n throw error;\n }\n}\n\nfunction brokerErrorCode(error: unknown): EditableArtifactOutboxRetryErrorCode {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"broker_backpressure\"\n ) {\n return \"broker_backpressure\";\n }\n return \"broker_unavailable\";\n}\n\nfunction mutableSummary(): MutableSummary {\n return {\n claimed: 0,\n published: 0,\n retried: 0,\n deadLettered: 0,\n leaseLost: 0,\n markFailed: 0,\n claimFailed: false,\n };\n}\n\nfunction freezeSummary(summary: MutableSummary): EditableArtifactOutboxDispatchSummary {\n return Object.freeze({ ...summary });\n}\n\nfunction base64Url(bytes: Uint8Array): string {\n let binary = \"\";\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return btoa(binary).replaceAll(\"+\", \"-\").replaceAll(\"/\", \"_\").replace(/=+$/u, \"\");\n}\n","import type { EditableArtifactAuthorizationPort } from \"../domain/editable-artifacts/ports\";\nimport type { EditableArtifactService } from \"../domain/editable-artifacts/service\";\nimport {\n EDITABLE_ARTIFACT_COMMAND_MAX_BYTES,\n EDITABLE_ARTIFACT_INTENT_MAX_BYTES,\n EDITABLE_ARTIFACT_KERNEL_VERSION_MAX_BYTES,\n EDITABLE_ARTIFACT_PRODUCT_MAX_SNAPSHOT_BYTES,\n} from \"@opengeni/contracts/editable-artifacts\";\nimport { decodeCommittedTransactionSummary } from \"@opengeni/contracts/editable-artifact-committed-transaction\";\nimport { decodeEditableArtifactSerializedCommit } from \"@opengeni/contracts/editable-artifact-serialized-commit\";\nimport { EDITABLE_ARTIFACT_MAX_COMMITTED_TRANSACTION_BYTES } from \"../domain/editable-artifacts/service\";\nimport {\n assertNonnegativeSafeInteger,\n assertPositiveSafeInteger,\n editableArtifactActorKey,\n editableArtifactCausalFrontier,\n editableArtifactId,\n editableArtifactRequestHash,\n editableArtifactStateHash,\n editableArtifactTransactionId,\n type EditableArtifactActor,\n type EditableArtifactCausalFrontier,\n type EditableArtifactId,\n type EditableArtifactModality,\n type EditableArtifactRequestHash,\n type EditableArtifactScope,\n type EditableArtifactStateHash,\n} from \"../domain/editable-artifacts/types\";\nimport { EditableArtifactLiveError } from \"./errors\";\nimport type {\n EditableArtifactLiveAuthorizationInvalidationPort,\n EditableArtifactLiveClockPort,\n EditableArtifactLiveHintPort,\n EditableArtifactLiveReadPort,\n EditableArtifactLiveSchedulerPort,\n EditableArtifactLiveServerDependencies,\n EditableArtifactLiveSinkPort,\n EditableArtifactLiveTicketStorePort,\n EditableArtifactLiveTokenPort,\n} from \"./ports\";\nimport { EditableArtifactLiveTicketAuthority } from \"./ticket\";\nimport {\n EDITABLE_ARTIFACT_LIVE_PROTOCOL_VERSION,\n type EditableArtifactLiveAppliedClientFrame,\n type EditableArtifactLiveBootstrap,\n type EditableArtifactLiveClientFrame,\n type EditableArtifactLiveClose,\n type EditableArtifactLiveCloseReason,\n type EditableArtifactLiveCommittedTransaction,\n type EditableArtifactLiveMutationClientFrame,\n type EditableArtifactLiveMutationReceipt,\n type EditableArtifactLiveResume,\n type EditableArtifactLiveServerFrame,\n type EditableArtifactLiveSnapshot,\n type EditableArtifactLiveTicket,\n type EditableArtifactLiveTicketRecord,\n} from \"./types\";\n\nconst textEncoder = new TextEncoder();\nconst strictDecoder = new TextDecoder(\"utf-8\", { fatal: true });\n\n// Shared OGATX is bounded at 5 MiB and whole OGACO at 8 MiB. Transport\n// metadata gets a small fixed allowance; valid SDK-authored transactions must\n// never enter a reconnect loop because a lower hidden live limit rejects them.\nconst DEFAULT_MAX_CLIENT_FRAME_BYTES = 5 * 1024 * 1024 + 64 * 1024;\nconst DEFAULT_MAX_OUTBOUND_FRAME_BYTES = 8 * 1024 * 1024 + 64 * 1024;\nconst DEFAULT_MAX_SNAPSHOT_BYTES = EDITABLE_ARTIFACT_PRODUCT_MAX_SNAPSHOT_BYTES;\nconst DEFAULT_SNAPSHOT_CHUNK_BYTES = 256 * 1024;\nconst DEFAULT_MAX_IN_FLIGHT_TRANSACTIONS = 256;\nconst DEFAULT_MAX_IN_FLIGHT_BYTES = 32 * 1024 * 1024;\nconst DEFAULT_REPLAY_PAGE_TRANSACTIONS = 256;\nconst DEFAULT_REPLAY_PAGE_BYTES = 32 * 1024 * 1024;\nconst DEFAULT_MAX_SOCKET_BUFFERED_BYTES = 16 * 1024 * 1024;\nconst DEFAULT_MAX_INBOUND_QUEUE_FRAMES = 64;\nconst DEFAULT_MAX_INBOUND_QUEUE_BYTES = 12 * 1024 * 1024;\nconst DEFAULT_RECONCILE_INTERVAL_MS = 5_000;\nconst DEFAULT_REAUTHORIZE_INTERVAL_MS = 15_000;\nconst DEFAULT_ACK_TIMEOUT_MS = 30_000;\nconst DEFAULT_SEND_TIMEOUT_MS = 10_000;\nconst MAX_IDENTIFIER_BYTES = 512;\nconst MAX_CAUSAL_ACTORS = 1_024;\n\nexport type EditableArtifactLiveServerOptions = Readonly<{\n protocolVersion?: number;\n ticketTtlMs?: number;\n maxClientFrameBytes?: number;\n maxOutboundFrameBytes?: number;\n maxSnapshotBytes?: number;\n snapshotChunkBytes?: number;\n maxInFlightTransactions?: number;\n maxInFlightBytes?: number;\n replayPageTransactions?: number;\n replayPageBytes?: number;\n maxSocketBufferedBytes?: number;\n maxInboundQueueFrames?: number;\n maxInboundQueueBytes?: number;\n reconcileIntervalMs?: number;\n reauthorizeIntervalMs?: number;\n ackTimeoutMs?: number;\n sendTimeoutMs?: number;\n}>;\n\ntype NormalizedOptions = Required<Omit<EditableArtifactLiveServerOptions, \"ticketTtlMs\">> &\n Readonly<{ ticketTtlMs?: number }>;\n\nexport type OpenEditableArtifactLiveInput = Readonly<{\n token: string;\n artifactId: EditableArtifactId;\n protocolVersion: number;\n resume: EditableArtifactLiveResume;\n sink: EditableArtifactLiveSinkPort;\n signal?: AbortSignal;\n}>;\n\nexport interface EditableArtifactLiveSession {\n readonly artifactId: EditableArtifactId;\n readonly modality: EditableArtifactModality;\n readonly streamEpoch: string;\n readonly closed: Promise<EditableArtifactLiveClose>;\n receive(bytes: Uint8Array): Promise<void>;\n acknowledge(frame: EditableArtifactLiveAppliedClientFrame): Promise<void>;\n submitIntent(\n input: Readonly<{\n protocolVersion: number;\n artifactId: EditableArtifactId;\n streamEpoch: string;\n requestHash: EditableArtifactRequestHash;\n intentBytes: Uint8Array;\n }>,\n ): Promise<EditableArtifactLiveMutationReceipt>;\n reconcileNow(): Promise<void>;\n reauthorizeNow(): Promise<void>;\n close(reason?: EditableArtifactLiveCloseReason): Promise<void>;\n}\n\nexport class EditableArtifactLiveServer {\n private readonly options: NormalizedOptions;\n private readonly ticketAuthority: EditableArtifactLiveTicketAuthority;\n\n constructor(\n private readonly dependencies: EditableArtifactLiveServerDependencies,\n options: EditableArtifactLiveServerOptions = {},\n ) {\n this.options = normalizeOptions(options);\n this.ticketAuthority = new EditableArtifactLiveTicketAuthority({\n authorization: dependencies.authorization,\n tickets: dependencies.tickets,\n tokens: dependencies.tokens,\n clock: dependencies.clock,\n protocolVersion: this.options.protocolVersion,\n ...(this.options.ticketTtlMs === undefined ? {} : { ttlMs: this.options.ticketTtlMs }),\n });\n }\n\n mintTicket(\n input: Readonly<{\n scope: EditableArtifactScope;\n artifactId: EditableArtifactId;\n modality: EditableArtifactModality;\n actor: EditableArtifactActor;\n allowEdit: boolean;\n }>,\n ): Promise<EditableArtifactLiveTicket> {\n return this.ticketAuthority.mint(input);\n }\n\n async openLive(input: OpenEditableArtifactLiveInput): Promise<EditableArtifactLiveSession> {\n const artifactId = editableArtifactId(input.artifactId);\n const ticket = await this.ticketAuthority.consume({\n token: input.token,\n artifactId,\n protocolVersion: input.protocolVersion,\n });\n validateResume(input.resume, ticket.modality);\n const streamEpoch = `live_${this.dependencies.tokens.randomOpaqueToken()}`;\n boundedString(streamEpoch, \"stream epoch\", MAX_IDENTIFIER_BYTES);\n const session = new EditableArtifactLiveSessionImpl({\n dependencies: this.dependencies,\n options: this.options,\n ticket,\n streamEpoch,\n resume: input.resume,\n sink: input.sink,\n ...(input.signal === undefined ? {} : { parentSignal: input.signal }),\n });\n await session.start();\n return session;\n }\n}\n\ntype SessionConstructor = Readonly<{\n dependencies: EditableArtifactLiveServerDependencies;\n options: NormalizedOptions;\n ticket: EditableArtifactLiveTicketRecord;\n streamEpoch: string;\n resume: EditableArtifactLiveResume;\n sink: EditableArtifactLiveSinkPort;\n parentSignal?: AbortSignal;\n}>;\n\ntype InFlight = Readonly<{\n bytes: number;\n stateHash: EditableArtifactStateHash;\n sentAt: number;\n}>;\n\nclass EditableArtifactLiveSessionImpl implements EditableArtifactLiveSession {\n readonly artifactId: EditableArtifactId;\n readonly modality: EditableArtifactModality;\n readonly streamEpoch: string;\n readonly closed: Promise<EditableArtifactLiveClose>;\n\n private readonly dependencies: EditableArtifactLiveServerDependencies;\n private readonly options: NormalizedOptions;\n private readonly ticket: EditableArtifactLiveTicketRecord;\n private readonly resume: EditableArtifactLiveResume;\n private readonly sink: EditableArtifactLiveSinkPort;\n private readonly abort = new AbortController();\n private readonly boundaries = new Map<number, EditableArtifactStateHash>();\n private readonly inFlight = new Map<number, InFlight>();\n private resolveClosed!: (close: EditableArtifactLiveClose) => void;\n private workTail: Promise<void> = Promise.resolve();\n private releaseHints: (() => void) | null = null;\n private releaseInvalidations: (() => void) | null = null;\n private detachParent: (() => void) | null = null;\n private maintenance: Promise<void> | null = null;\n private closedValue: EditableArtifactLiveClose | null = null;\n private bootstrapping = true;\n private reconcileRequested = false;\n private reconcileScheduled = false;\n private reauthorizationRequested = false;\n private reauthorizationScheduled = false;\n private sentSequence = 0;\n private sentStateHash: EditableArtifactStateHash | null = null;\n private ackedSequence = 0;\n private ackedStateHash: EditableArtifactStateHash | null = null;\n private targetHead = 0;\n private inFlightBytes = 0;\n private oldestInFlightAt = 0;\n private writable = false;\n private authorizationRevision = 0;\n private queuedInboundFrames = 0;\n private queuedInboundBytes = 0;\n\n constructor(input: SessionConstructor) {\n this.dependencies = input.dependencies;\n this.options = input.options;\n this.ticket = input.ticket;\n this.artifactId = input.ticket.artifactId;\n this.modality = input.ticket.modality;\n this.streamEpoch = input.streamEpoch;\n this.resume = input.resume;\n this.sink = input.sink;\n this.closed = new Promise((resolve) => {\n this.resolveClosed = resolve;\n });\n if (input.parentSignal) {\n const close = () => void this.close(\"closed\");\n if (input.parentSignal.aborted) close();\n else {\n input.parentSignal.addEventListener(\"abort\", close, { once: true });\n this.detachParent = () => input.parentSignal!.removeEventListener(\"abort\", close);\n }\n }\n }\n\n async start(): Promise<void> {\n try {\n this.assertOpen();\n this.authorizationRevision = await this.requireRead();\n this.assertOpen();\n\n // The hint subscription resolves only after its broker flush barrier.\n // It is deliberately established before the first authoritative head read.\n const releaseHints = await this.dependencies.hints.subscribe({\n scope: this.ticket.scope,\n artifactId: this.artifactId,\n onHint: () => this.requestReconcile(),\n onReconnect: () => this.requestReconcile(),\n });\n if (this.closedValue) {\n safeRelease(releaseHints);\n this.assertOpen();\n }\n this.releaseHints = releaseHints;\n const releaseInvalidations = await this.dependencies.invalidations.subscribe({\n scope: this.ticket.scope,\n artifactId: this.artifactId,\n actor: this.ticket.actor,\n onInvalidated: () => this.requestReauthorization(),\n });\n if (this.closedValue) {\n safeRelease(releaseInvalidations);\n this.assertOpen();\n }\n this.releaseInvalidations = releaseInvalidations;\n // Close the authorization-subscription race before reading any artifact\n // bytes. Later revocations are caught by the subscription and periodic\n // reauthorization.\n this.authorizationRevision = Math.max(this.authorizationRevision, await this.requireRead());\n this.assertOpen();\n let editDecision = await this.checkPermission(\"edit\");\n if (editDecision.revision > this.authorizationRevision) {\n this.authorizationRevision = editDecision.revision;\n await this.requireRead();\n } else if (editDecision.revision < this.authorizationRevision) {\n editDecision = await this.checkPermission(\"edit\");\n }\n this.writable = editDecision.revision === this.authorizationRevision && editDecision.allowed;\n this.assertOpen();\n const bootstrap = await this.dependencies.read.readBootstrap({\n scope: this.ticket.scope,\n artifactId: this.artifactId,\n resume: this.resume,\n protocolVersion: this.options.protocolVersion,\n });\n this.assertOpen();\n validateBootstrap(bootstrap, this.artifactId, this.modality, this.resume, this.options);\n this.targetHead = bootstrap.headSequence;\n await this.send({\n type: \"open\",\n protocolVersion: this.options.protocolVersion,\n artifactId: this.artifactId,\n streamEpoch: this.streamEpoch,\n modality: this.modality,\n writable: this.writable,\n headSequence: bootstrap.headSequence,\n minimumReplaySequence: bootstrap.minimumReplaySequence,\n maxClientFrameBytes: this.options.maxClientFrameBytes,\n maxCommandBytes: Math.min(\n EDITABLE_ARTIFACT_COMMAND_MAX_BYTES,\n Math.max(0, this.options.maxClientFrameBytes - 64 * 1024),\n ),\n maxIntentBytes: Math.min(\n EDITABLE_ARTIFACT_INTENT_MAX_BYTES,\n Math.max(0, this.options.maxClientFrameBytes - 64 * 1024),\n ),\n maxCommittedTransactionBytes: Math.min(\n EDITABLE_ARTIFACT_MAX_COMMITTED_TRANSACTION_BYTES,\n Math.max(0, this.options.maxOutboundFrameBytes - 64 * 1024),\n ),\n maxSnapshotBytes: this.options.maxSnapshotBytes,\n maxInFlightTransactions: this.options.maxInFlightTransactions,\n maxInFlightBytes: this.options.maxInFlightBytes,\n });\n await this.applyBootstrap(bootstrap);\n\n // Close the final-notification race even when the broker loses the hint:\n // reread durable authority after snapshot/replay, while already subscribed.\n await this.reconcileFromDurableHead();\n await this.sendBarrier();\n this.bootstrapping = false;\n if (this.reconcileRequested) this.requestReconcile();\n this.maintenance = this.runMaintenance().catch((error: unknown) => {\n if (!this.abort.signal.aborted) void this.fail(error);\n });\n } catch (error) {\n await this.fail(error);\n throw error;\n }\n }\n\n receive(bytes: Uint8Array): Promise<void> {\n if (this.closedValue)\n return Promise.reject(new EditableArtifactLiveError(\"closed\", \"Live session is closed\"));\n if (!(bytes instanceof Uint8Array)) {\n return Promise.reject(new TypeError(\"Live frame must be Uint8Array\"));\n }\n if (bytes.byteLength > this.options.maxClientFrameBytes) {\n const error = new EditableArtifactLiveError(\n \"oversized_frame\",\n \"Client live frame exceeds the byte limit\",\n );\n void this.fail(error);\n return Promise.reject(error);\n }\n let frame: EditableArtifactLiveClientFrame;\n try {\n frame = decodeClientFrame(\n bytes,\n this.artifactId,\n this.streamEpoch,\n this.options.protocolVersion,\n );\n } catch (error) {\n const failure =\n error instanceof EditableArtifactLiveError\n ? error\n : new EditableArtifactLiveError(\"invalid_frame\", \"Client live frame is malformed\", {\n cause: error,\n });\n void this.fail(failure);\n return Promise.reject(failure);\n }\n return this.enqueueInbound(bytes.byteLength, async () => {\n await this.applyAcknowledgement(frame);\n });\n }\n\n acknowledge(frame: EditableArtifactLiveAppliedClientFrame): Promise<void> {\n if (this.closedValue) {\n return Promise.reject(new EditableArtifactLiveError(\"closed\", \"Live session is closed\"));\n }\n let normalized: EditableArtifactLiveAppliedClientFrame;\n try {\n normalized = validateAppliedFrame(\n frame,\n this.artifactId,\n this.streamEpoch,\n this.options.protocolVersion,\n );\n } catch (error) {\n const failure =\n error instanceof EditableArtifactLiveError\n ? error\n : new EditableArtifactLiveError(\"invalid_frame\", \"Client live ACK is malformed\", {\n cause: error,\n });\n void this.fail(failure);\n return Promise.reject(failure);\n }\n return this.enqueueInbound(256, async () => {\n await this.applyAcknowledgement(normalized);\n });\n }\n\n submitIntent(\n input: Readonly<{\n protocolVersion: number;\n artifactId: EditableArtifactId;\n streamEpoch: string;\n requestHash: EditableArtifactRequestHash;\n intentBytes: Uint8Array;\n }>,\n ): Promise<EditableArtifactLiveMutationReceipt> {\n if (this.closedValue) {\n return Promise.reject(new EditableArtifactLiveError(\"closed\", \"Live session is closed\"));\n }\n if (input.protocolVersion !== this.options.protocolVersion) {\n const error = new EditableArtifactLiveError(\n \"protocol_mismatch\",\n \"Mutation protocol mismatch\",\n );\n void this.fail(error);\n return Promise.reject(error);\n }\n let inputArtifactId: EditableArtifactId;\n try {\n inputArtifactId = editableArtifactId(input.artifactId);\n } catch (cause) {\n const error = new EditableArtifactLiveError(\n \"invalid_frame\",\n \"Mutation artifact id is malformed\",\n { cause },\n );\n void this.fail(error);\n return Promise.reject(error);\n }\n if (inputArtifactId !== this.artifactId) {\n const error = new EditableArtifactLiveError(\"invalid_frame\", \"Mutation artifact mismatch\");\n void this.fail(error);\n return Promise.reject(error);\n }\n if (input.streamEpoch !== this.streamEpoch) {\n const error = new EditableArtifactLiveError(\n \"stale_epoch\",\n \"Mutation belongs to a stale stream epoch\",\n );\n void this.fail(error);\n return Promise.reject(error);\n }\n try {\n editableArtifactRequestHash(input.requestHash);\n } catch (cause) {\n const error = new EditableArtifactLiveError(\n \"invalid_frame\",\n \"Mutation request hash is malformed\",\n { cause },\n );\n return Promise.reject(error);\n }\n if (\n !(input.intentBytes instanceof Uint8Array) ||\n input.intentBytes.byteLength === 0 ||\n input.intentBytes.byteLength > this.options.maxClientFrameBytes\n ) {\n const error = new EditableArtifactLiveError(\n \"oversized_frame\",\n \"Mutation intent exceeds the byte limit\",\n );\n void this.fail(error);\n return Promise.reject(error);\n }\n return this.enqueueInbound(\n input.intentBytes.byteLength,\n () => this.applyMutation(input),\n false,\n );\n }\n\n reconcileNow(): Promise<void> {\n return this.enqueue(() => this.reconcileFromDurableHead());\n }\n\n reauthorizeNow(): Promise<void> {\n return this.enqueue(() => this.reauthorize());\n }\n\n async close(reason: EditableArtifactLiveCloseReason = \"closed\"): Promise<void> {\n if (this.closedValue) return;\n const close = closeValue(reason);\n this.closedValue = close;\n this.abort.abort();\n safeRelease(this.releaseHints);\n this.releaseHints = null;\n safeRelease(this.releaseInvalidations);\n this.releaseInvalidations = null;\n safeRelease(this.detachParent);\n this.detachParent = null;\n try {\n this.sink.close(close);\n } catch {\n // Adapter teardown is best effort; the protocol session is already\n // atomically closed and must never leak cleanup failures to callers.\n }\n this.resolveClosed(close);\n }\n\n private assertOpen(): void {\n if (this.closedValue) {\n throw new EditableArtifactLiveError(\"closed\", \"Live session is closed\");\n }\n }\n\n private enqueue<T>(task: () => Promise<T>): Promise<T> {\n const result = this.workTail.then(async () => {\n if (this.closedValue) {\n throw new EditableArtifactLiveError(\"closed\", \"Live session is closed\");\n }\n return await task();\n });\n this.workTail = result.then(\n () => undefined,\n (error: unknown) => this.fail(error),\n );\n return result;\n }\n\n private enqueueInbound<T>(bytes: number, task: () => Promise<T>, fatal = true): Promise<T> {\n if (\n this.queuedInboundFrames + 1 > this.options.maxInboundQueueFrames ||\n this.queuedInboundBytes + bytes > this.options.maxInboundQueueBytes\n ) {\n const error = new EditableArtifactLiveError(\n \"slow_client\",\n \"Live inbound work queue is full\",\n { requiresSnapshot: true },\n );\n void this.fail(error);\n return Promise.reject(error);\n }\n this.queuedInboundFrames += 1;\n this.queuedInboundBytes += bytes;\n const run = async () => {\n try {\n return await task();\n } finally {\n this.queuedInboundFrames -= 1;\n this.queuedInboundBytes -= bytes;\n }\n };\n if (fatal) return this.enqueue(run);\n const result = this.workTail.then(async () => {\n if (this.closedValue) {\n throw new EditableArtifactLiveError(\"closed\", \"Live session is closed\");\n }\n return await run();\n });\n // A rejected mutation is request-scoped. Unknown outcomes are retried with\n // the same intent/hash; they do not corrupt or tear down the read stream.\n this.workTail = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n }\n\n private requestReconcile(): void {\n if (this.closedValue) return;\n this.reconcileRequested = true;\n if (this.bootstrapping || this.reconcileScheduled) return;\n this.reconcileScheduled = true;\n void this.enqueue(async () => {\n try {\n while (this.reconcileRequested && !this.closedValue) {\n this.reconcileRequested = false;\n await this.reconcileFromDurableHead();\n }\n } finally {\n this.reconcileScheduled = false;\n if (this.reconcileRequested && !this.closedValue) this.requestReconcile();\n }\n }).catch(() => undefined);\n }\n\n private requestReauthorization(): void {\n if (this.closedValue) return;\n this.reauthorizationRequested = true;\n if (this.reauthorizationScheduled) return;\n this.reauthorizationScheduled = true;\n void this.enqueue(async () => {\n try {\n while (this.reauthorizationRequested && !this.closedValue) {\n this.reauthorizationRequested = false;\n await this.reauthorize();\n }\n } finally {\n this.reauthorizationScheduled = false;\n if (this.reauthorizationRequested && !this.closedValue) {\n this.requestReauthorization();\n }\n }\n }).catch(() => undefined);\n }\n\n private async applyBootstrap(bootstrap: EditableArtifactLiveBootstrap): Promise<void> {\n if (bootstrap.resumeAccepted) {\n this.sentSequence = bootstrap.resumeSequence;\n this.ackedSequence = bootstrap.resumeSequence;\n this.sentStateHash = bootstrap.resumeStateHash;\n this.ackedStateHash = bootstrap.resumeStateHash;\n this.boundaries.set(bootstrap.resumeSequence, bootstrap.resumeStateHash);\n } else if (bootstrap.snapshot) {\n await this.sendSnapshot(bootstrap.snapshot);\n this.sentSequence = bootstrap.snapshot.sequence;\n this.sentStateHash = bootstrap.snapshot.stateHash;\n this.boundaries.set(bootstrap.snapshot.sequence, bootstrap.snapshot.stateHash);\n // Sequence zero is the immutable genesis boundary, not a committed\n // mutation that needs a replica lease advancement. Seed only its hash so\n // the client's exact snapshot ACK is valid; snapshots above zero remain\n // unacknowledged until their ACK is durably recorded below.\n if (bootstrap.snapshot.sequence === 0) {\n this.ackedStateHash = bootstrap.snapshot.stateHash;\n }\n } else {\n await this.requireResync(\"retention_gap\", bootstrap.headSequence);\n return;\n }\n if (this.sentSequence + 1 < bootstrap.minimumReplaySequence) {\n await this.requireResync(\"retention_gap\", bootstrap.headSequence);\n return;\n }\n await this.pumpThrough(bootstrap.headSequence);\n if (\n !this.closedValue &&\n this.sentSequence === bootstrap.headSequence &&\n this.sentStateHash !== bootstrap.stateHash\n ) {\n await this.requireResync(\"durable_gap\", bootstrap.headSequence);\n }\n }\n\n private async sendSnapshot(snapshot: EditableArtifactLiveSnapshot): Promise<void> {\n if (snapshot.bytes.byteLength > this.options.maxSnapshotBytes) {\n await this.requireResync(\"oversized_frame\", snapshot.sequence);\n return;\n }\n // The durable read port owns this immutable snapshot for bootstrap. Copy\n // each bounded wire chunk, never the entire potentially 128 MiB snapshot.\n const snapshotBytes = snapshot.bytes;\n if (snapshot.modality !== this.modality) {\n throw new EditableArtifactLiveError(\n \"durable_gap\",\n \"Snapshot modality differs from its durable ticket\",\n { requiresSnapshot: true },\n );\n }\n const causalFrontier =\n snapshot.modality === \"spreadsheet\"\n ? validateFrontier(snapshot.causalFrontier, \"snapshot causal frontier\")\n : null;\n const totalBytes = snapshotBytes.byteLength;\n if (totalBytes === 0)\n throw new EditableArtifactLiveError(\"durable_gap\", \"Snapshot is empty\", {\n requiresSnapshot: true,\n });\n for (let offset = 0; offset < totalBytes; offset += this.options.snapshotChunkBytes) {\n const bytes = snapshotBytes.slice(\n offset,\n Math.min(offset + this.options.snapshotChunkBytes, totalBytes),\n );\n const common = {\n type: \"snapshot\",\n protocolVersion: this.options.protocolVersion,\n artifactId: this.artifactId,\n streamEpoch: this.streamEpoch,\n sequence: snapshot.sequence,\n stateHash: snapshot.stateHash,\n digest: snapshot.digest,\n kernelVersion: snapshot.kernelVersion,\n modelSchemaVersion: snapshot.modelSchemaVersion,\n offset,\n totalBytes,\n final: offset + bytes.byteLength === totalBytes,\n bytes,\n } as const;\n await this.send(\n snapshot.modality === \"spreadsheet\"\n ? { ...common, modality: snapshot.modality, causalFrontier: causalFrontier! }\n : {\n ...common,\n modality: snapshot.modality,\n nativeRevision: snapshot.nativeRevision,\n },\n );\n }\n }\n\n private async reconcileFromDurableHead(): Promise<void> {\n if (this.closedValue) return;\n const head = await this.dependencies.read.readHead(this.ticket.scope, this.artifactId);\n validateHead(head, this.modality);\n if (head.headSequence < this.sentSequence) {\n await this.requireResync(\"durable_gap\", head.headSequence);\n return;\n }\n this.targetHead = head.headSequence;\n if (this.sentSequence + 1 < head.minimumReplaySequence) {\n await this.requireResync(\"retention_gap\", head.headSequence);\n return;\n }\n await this.pumpThrough(head.headSequence);\n if (\n !this.closedValue &&\n this.sentSequence === head.headSequence &&\n this.sentStateHash !== head.stateHash\n ) {\n await this.requireResync(\"durable_gap\", head.headSequence);\n return;\n }\n if (!this.closedValue) {\n await this.send({\n type: \"watermark\",\n protocolVersion: this.options.protocolVersion,\n artifactId: this.artifactId,\n streamEpoch: this.streamEpoch,\n headSequence: head.headSequence,\n });\n }\n }\n\n private async pumpThrough(through: number): Promise<void> {\n assertNonnegativeSafeInteger(through, \"target head sequence\");\n while (!this.closedValue && this.sentSequence < through) {\n if (this.inFlight.size >= this.options.maxInFlightTransactions) return;\n const page = await this.dependencies.read.readTransactions({\n scope: this.ticket.scope,\n artifactId: this.artifactId,\n after: this.sentSequence,\n through,\n maxCount: this.options.replayPageTransactions,\n maxBytes: this.options.replayPageBytes,\n });\n validatePage(\n page,\n this.sentSequence,\n through,\n this.options.replayPageTransactions,\n this.options.replayPageBytes,\n );\n if (this.sentSequence + 1 < page.minimumReplaySequence) {\n await this.requireResync(\"retention_gap\", page.headSequence);\n return;\n }\n if (page.transactions.length === 0) {\n await this.requireResync(\"durable_gap\", page.headSequence);\n return;\n }\n let progressed = false;\n for (const transaction of page.transactions) {\n validateTransaction(\n transaction,\n this.artifactId,\n this.modality,\n Math.min(\n this.options.replayPageBytes,\n Math.max(0, this.options.maxOutboundFrameBytes - 64 * 1024),\n ),\n );\n if (transaction.endSequence > through) {\n await this.requireResync(\"durable_gap\", page.headSequence);\n return;\n }\n if (transaction.startSequence !== this.sentSequence + 1) {\n await this.requireResync(\"durable_gap\", page.headSequence);\n return;\n }\n if (this.sentStateHash && transaction.priorStateHash !== this.sentStateHash) {\n await this.requireResync(\"durable_gap\", page.headSequence);\n return;\n }\n const ownedTransaction = ownTransaction(transaction);\n const frameBytes = estimateFrameBytes({\n type: \"transaction\",\n protocolVersion: this.options.protocolVersion,\n artifactId: this.artifactId,\n streamEpoch: this.streamEpoch,\n transaction: ownedTransaction,\n });\n if (\n frameBytes > this.options.maxOutboundFrameBytes ||\n frameBytes > this.options.maxInFlightBytes\n ) {\n await this.requireResync(\"oversized_frame\", page.headSequence);\n return;\n }\n if (\n this.inFlight.size >= this.options.maxInFlightTransactions ||\n this.inFlightBytes + frameBytes > this.options.maxInFlightBytes\n ) {\n return;\n }\n await this.send({\n type: \"transaction\",\n protocolVersion: this.options.protocolVersion,\n artifactId: this.artifactId,\n streamEpoch: this.streamEpoch,\n transaction: ownedTransaction,\n });\n this.sentSequence = ownedTransaction.endSequence;\n this.sentStateHash = ownedTransaction.stateHash;\n this.boundaries.set(ownedTransaction.endSequence, ownedTransaction.stateHash);\n const sentAt = this.dependencies.clock.now().getTime();\n this.inFlight.set(ownedTransaction.endSequence, {\n bytes: frameBytes,\n stateHash: ownedTransaction.stateHash,\n sentAt,\n });\n this.inFlightBytes += frameBytes;\n if (this.oldestInFlightAt === 0) this.oldestInFlightAt = sentAt;\n progressed = true;\n if (this.sentSequence >= through) break;\n }\n if (!progressed) return;\n }\n }\n\n private async applyAcknowledgement(frame: EditableArtifactLiveAppliedClientFrame): Promise<void> {\n if (frame.sequence < this.ackedSequence || frame.sequence > this.sentSequence) {\n await this.requireResync(\"invalid_ack\", this.targetHead);\n return;\n }\n const expected =\n frame.sequence === this.ackedSequence\n ? this.ackedStateHash\n : this.boundaries.get(frame.sequence);\n if (!expected || expected !== frame.stateHash) {\n await this.requireResync(\"invalid_ack\", this.targetHead);\n return;\n }\n if (frame.sequence > this.ackedSequence) {\n await this.dependencies.read.acknowledgeReplica({\n scope: this.ticket.scope,\n artifactId: this.artifactId,\n replicaId: this.ticket.actor.replicaId,\n actorKey: editableArtifactActorKey(this.ticket.actor),\n streamEpoch: this.streamEpoch,\n sequence: frame.sequence,\n stateHash: frame.stateHash,\n });\n this.ackedSequence = frame.sequence;\n this.ackedStateHash = frame.stateHash;\n for (const [sequence, inFlight] of this.inFlight) {\n if (sequence <= frame.sequence) {\n this.inFlight.delete(sequence);\n this.inFlightBytes -= inFlight.bytes;\n }\n }\n for (const sequence of this.boundaries.keys()) {\n if (sequence < frame.sequence) this.boundaries.delete(sequence);\n }\n this.oldestInFlightAt =\n this.inFlight.size === 0\n ? 0\n : Math.min(...[...this.inFlight.values()].map((value) => value.sentAt));\n }\n await this.send({\n type: \"applied\",\n protocolVersion: this.options.protocolVersion,\n artifactId: this.artifactId,\n streamEpoch: this.streamEpoch,\n sequence: frame.sequence,\n stateHash: frame.stateHash,\n });\n await this.reconcileFromDurableHead();\n }\n\n private async applyMutation(\n frame: EditableArtifactLiveMutationClientFrame,\n ): Promise<EditableArtifactLiveMutationReceipt> {\n // Refresh both permissions at one local revision. An old allowed=true must\n // never re-enable writes after a newer revocation was observed.\n await this.reauthorize();\n if (this.closedValue) {\n throw new EditableArtifactLiveError(\n \"permission_changed\",\n \"Editable artifact read permission changed\",\n );\n }\n if (!this.writable) {\n throw new EditableArtifactLiveError(\n \"permission_changed\",\n \"Editable artifact edit permission denied\",\n );\n }\n let result: Awaited<ReturnType<EditableArtifactService[\"applyTransaction\"]>>;\n try {\n result = await this.dependencies.domain.applyTransaction({\n scope: this.ticket.scope,\n artifactId: this.artifactId,\n actor: this.ticket.actor,\n request: {\n intentBytes: frame.intentBytes.slice(),\n requestHash: frame.requestHash,\n },\n });\n } catch (error) {\n // The domain is authoritative for the mutation/revocation race. Refresh\n // presentation permissions before returning the request-scoped failure.\n await this.reauthorize();\n throw error;\n }\n const transaction = await this.dependencies.read.readCommittedTransaction({\n scope: this.ticket.scope,\n artifactId: this.artifactId,\n transactionId: result.receipt.serverTransactionId,\n });\n if (\n !transaction ||\n result.receipt.modality !== this.modality ||\n transaction.modality !== this.modality ||\n transaction.startSequence !== result.receipt.sequenceStart ||\n transaction.endSequence !== result.receipt.sequenceEnd ||\n transaction.transactionId !== result.receipt.serverTransactionId ||\n result.receipt.requestHash !== frame.requestHash ||\n transaction.requestHash !== result.receipt.requestHash ||\n transaction.stateHash !== result.receipt.stateHash\n ) {\n await this.requireResync(\"durable_gap\", this.targetHead);\n throw new EditableArtifactLiveError(\n \"durable_gap\",\n \"Committed mutation is unavailable from durable replay\",\n { requiresSnapshot: true },\n );\n }\n validateTransaction(\n transaction,\n this.artifactId,\n this.modality,\n Math.min(\n this.options.replayPageBytes,\n Math.max(0, this.options.maxOutboundFrameBytes - 64 * 1024),\n ),\n );\n const ownedTransaction = ownTransaction(transaction);\n await this.reconcileFromDurableHead();\n return Object.freeze({\n clientTransactionId: result.receipt.clientTransactionId,\n requestHash: result.receipt.requestHash,\n transaction: ownedTransaction,\n });\n }\n\n private async reauthorize(): Promise<void> {\n let readDecision = await this.checkPermission(\"read\");\n let editDecision = await this.checkPermission(\"edit\");\n const targetRevision = Math.max(\n this.authorizationRevision,\n readDecision.revision,\n editDecision.revision,\n );\n // A policy update can land between the two reads. Retry only the stale\n // decision once; persistent revision skew fails closed below.\n if (readDecision.revision < targetRevision) {\n readDecision = await this.checkPermission(\"read\");\n }\n if (editDecision.revision < targetRevision) {\n editDecision = await this.checkPermission(\"edit\");\n }\n const coherentRevision = Math.max(targetRevision, readDecision.revision, editDecision.revision);\n if (readDecision.revision !== coherentRevision) {\n await this.close(\"permission_changed\");\n return;\n }\n if (!readDecision.allowed) {\n await this.close(\"permission_changed\");\n return;\n }\n const nextWritable = editDecision.revision === coherentRevision && editDecision.allowed;\n const revisionChanged = coherentRevision !== this.authorizationRevision;\n this.authorizationRevision = coherentRevision;\n if (nextWritable !== this.writable || revisionChanged) {\n this.writable = nextWritable;\n await this.sendAuthorization();\n }\n }\n\n private async sendAuthorization(): Promise<void> {\n await this.send({\n type: \"authorizationChanged\",\n protocolVersion: this.options.protocolVersion,\n artifactId: this.artifactId,\n streamEpoch: this.streamEpoch,\n writable: this.writable,\n });\n }\n\n private async requireRead(): Promise<number> {\n const decision = await this.checkPermission(\"read\");\n if (!decision.allowed || decision.revision < this.authorizationRevision) {\n throw new EditableArtifactLiveError(\n \"permission_changed\",\n \"Editable artifact read permission denied\",\n );\n }\n return decision.revision;\n }\n\n private async checkPermission(\n permission: \"read\" | \"edit\",\n ): Promise<Awaited<ReturnType<EditableArtifactAuthorizationPort[\"authorize\"]>>> {\n const decision = await this.dependencies.authorization.authorize({\n scope: this.ticket.scope,\n artifactId: this.artifactId,\n actor: this.ticket.actor,\n permission,\n });\n if (permission === \"edit\" && !this.ticket.allowEdit) {\n return Object.freeze({ ...decision, allowed: false });\n }\n return decision;\n }\n\n private async sendBarrier(): Promise<void> {\n if (!this.sentStateHash)\n throw new EditableArtifactLiveError(\"durable_gap\", \"Bootstrap has no state boundary\");\n await this.send({\n type: \"barrier\",\n protocolVersion: this.options.protocolVersion,\n artifactId: this.artifactId,\n streamEpoch: this.streamEpoch,\n sequence: this.sentSequence,\n stateHash: this.sentStateHash,\n });\n }\n\n private async send(frame: EditableArtifactLiveServerFrame): Promise<void> {\n if (this.closedValue) return;\n const bytes = estimateFrameBytes(frame);\n if (bytes > this.options.maxOutboundFrameBytes) {\n throw new EditableArtifactLiveError(\n \"oversized_frame\",\n \"Server live frame exceeds the byte limit\",\n { requiresSnapshot: true },\n );\n }\n const buffered = this.sink.bufferedBytes();\n if (\n !Number.isSafeInteger(buffered) ||\n buffered < 0 ||\n buffered + bytes > this.options.maxSocketBufferedBytes\n ) {\n throw new EditableArtifactLiveError(\"slow_client\", \"Live socket send buffer is full\", {\n retryable: true,\n requiresSnapshot: true,\n });\n }\n const timeout = new AbortController();\n try {\n await Promise.race([\n this.sink.send(frame),\n this.dependencies.scheduler.sleep(this.options.sendTimeoutMs, timeout.signal).then(() => {\n throw new EditableArtifactLiveError(\"slow_client\", \"Live socket write timed out\", {\n retryable: true,\n requiresSnapshot: true,\n });\n }),\n ]);\n } finally {\n timeout.abort();\n }\n }\n\n private async requireResync(\n reason: \"retention_gap\" | \"durable_gap\" | \"invalid_ack\" | \"slow_client\" | \"oversized_frame\",\n headSequence: number,\n ): Promise<void> {\n if (this.closedValue) return;\n try {\n await this.send({\n type: \"resyncRequired\",\n protocolVersion: this.options.protocolVersion,\n artifactId: this.artifactId,\n streamEpoch: this.streamEpoch,\n reason,\n headSequence,\n });\n } catch {\n // A blocked transport may be unable to carry the advisory frame. The\n // typed close still forces a verified snapshot on reconnect.\n }\n await this.close(reason);\n }\n\n private async runMaintenance(): Promise<void> {\n let nextReconcile = this.dependencies.clock.now().getTime() + this.options.reconcileIntervalMs;\n let nextAuthorization =\n this.dependencies.clock.now().getTime() + this.options.reauthorizeIntervalMs;\n const tick = Math.max(\n 10,\n Math.min(\n this.options.reconcileIntervalMs,\n this.options.reauthorizeIntervalMs,\n this.options.ackTimeoutMs,\n ),\n );\n while (!this.abort.signal.aborted) {\n await this.dependencies.scheduler.sleep(tick, this.abort.signal);\n if (this.abort.signal.aborted || this.closedValue) return;\n const now = this.dependencies.clock.now().getTime();\n if (this.oldestInFlightAt !== 0 && now - this.oldestInFlightAt >= this.options.ackTimeoutMs) {\n await this.enqueue(() => this.requireResync(\"slow_client\", this.targetHead));\n return;\n }\n if (now >= nextAuthorization) {\n await this.reauthorizeNow();\n nextAuthorization = now + this.options.reauthorizeIntervalMs;\n }\n if (this.closedValue) return;\n if (now >= nextReconcile) {\n await this.reconcileNow();\n nextReconcile = now + this.options.reconcileIntervalMs;\n }\n }\n }\n\n private async fail(error: unknown): Promise<void> {\n if (this.closedValue) return;\n if (error instanceof EditableArtifactLiveError) {\n if (\n error.requiresSnapshot &&\n [\"durable_gap\", \"retention_gap\", \"invalid_ack\", \"slow_client\", \"oversized_frame\"].includes(\n error.code,\n )\n ) {\n await this.requireResync(\n error.code as\n | \"durable_gap\"\n | \"retention_gap\"\n | \"invalid_ack\"\n | \"slow_client\"\n | \"oversized_frame\",\n this.targetHead,\n );\n return;\n }\n await this.close(error.code === \"invalid_ticket\" ? \"transport_error\" : error.code);\n return;\n }\n await this.close(\"transport_error\");\n }\n}\n\nfunction decodeClientFrame(\n bytes: Uint8Array,\n artifactId: EditableArtifactId,\n streamEpoch: string,\n protocolVersion: number,\n): EditableArtifactLiveClientFrame {\n let value: unknown;\n try {\n value = JSON.parse(strictDecoder.decode(bytes));\n } catch (cause) {\n throw new EditableArtifactLiveError(\n \"invalid_frame\",\n \"Client live frame is not valid UTF-8 JSON\",\n { cause },\n );\n }\n const frame = plainRecord(value, \"client frame\");\n const type = requiredString(frame, \"type\", 32);\n const actualProtocol = requiredSafeInteger(frame, \"protocolVersion\");\n const actualArtifact = editableArtifactId(requiredString(frame, \"artifactId\", 64));\n const actualEpoch = requiredString(frame, \"streamEpoch\", MAX_IDENTIFIER_BYTES);\n if (actualProtocol !== protocolVersion)\n throw new EditableArtifactLiveError(\"protocol_mismatch\", \"Client frame protocol mismatch\");\n if (actualArtifact !== artifactId)\n throw new EditableArtifactLiveError(\"invalid_frame\", \"Client frame artifact mismatch\");\n if (actualEpoch !== streamEpoch)\n throw new EditableArtifactLiveError(\n \"stale_epoch\",\n \"Client frame belongs to a stale stream epoch\",\n );\n if (type === \"applied\") {\n rejectUnknown(frame, [\n \"type\",\n \"protocolVersion\",\n \"artifactId\",\n \"streamEpoch\",\n \"sequence\",\n \"stateHash\",\n ]);\n return validateAppliedFrame(\n Object.freeze({\n type,\n protocolVersion,\n artifactId,\n streamEpoch,\n sequence: requiredSafeInteger(frame, \"sequence\"),\n stateHash: editableArtifactStateHash(requiredString(frame, \"stateHash\", 80)),\n }),\n artifactId,\n streamEpoch,\n protocolVersion,\n );\n }\n throw new EditableArtifactLiveError(\"invalid_frame\", `Unknown client live frame: ${type}`);\n}\n\nfunction validateAppliedFrame(\n frame: EditableArtifactLiveAppliedClientFrame,\n artifactId: EditableArtifactId,\n streamEpoch: string,\n protocolVersion: number,\n): EditableArtifactLiveAppliedClientFrame {\n if (frame.type !== \"applied\") {\n throw new EditableArtifactLiveError(\"invalid_frame\", \"Client frame is not an apply ACK\");\n }\n if (frame.protocolVersion !== protocolVersion) {\n throw new EditableArtifactLiveError(\"protocol_mismatch\", \"Client frame protocol mismatch\");\n }\n if (editableArtifactId(frame.artifactId) !== artifactId) {\n throw new EditableArtifactLiveError(\"invalid_frame\", \"Client frame artifact mismatch\");\n }\n boundedString(frame.streamEpoch, \"stream epoch\", MAX_IDENTIFIER_BYTES);\n if (frame.streamEpoch !== streamEpoch) {\n throw new EditableArtifactLiveError(\n \"stale_epoch\",\n \"Client frame belongs to a stale stream epoch\",\n );\n }\n assertNonnegativeSafeInteger(frame.sequence, \"applied sequence\");\n return Object.freeze({\n type: \"applied\",\n protocolVersion,\n artifactId,\n streamEpoch,\n sequence: frame.sequence,\n stateHash: editableArtifactStateHash(frame.stateHash),\n });\n}\n\nfunction validateResume(\n resume: EditableArtifactLiveResume,\n durableModality: EditableArtifactModality,\n): void {\n const resumeModality = resume.modality ?? \"spreadsheet\";\n if (resumeModality !== durableModality) {\n throw new EditableArtifactLiveError(\n \"invalid_frame\",\n \"Resume modality differs from the durable artifact\",\n );\n }\n if (resume.localCursor !== null) assertNonnegativeSafeInteger(resume.localCursor, \"local cursor\");\n if (resume.localStateHash !== null) editableArtifactStateHash(resume.localStateHash);\n if (resumeModality === \"spreadsheet\") {\n if (!(\"localCausalFrontier\" in resume)) {\n throw new TypeError(\"spreadsheet resume requires a causal frontier\");\n }\n validateFrontier(resume.localCausalFrontier, \"local causal frontier\");\n } else if (\"localNativeRevision\" in resume && resume.localNativeRevision !== null) {\n assertNonnegativeSafeInteger(resume.localNativeRevision, \"local native revision\");\n } else if (!(\"localNativeRevision\" in resume)) {\n throw new TypeError(\"serialized resume requires a native revision\");\n }\n if (typeof resume.requireSnapshot !== \"boolean\")\n throw new TypeError(\"requireSnapshot must be boolean\");\n if ((resume.localCursor === null) !== (resume.localStateHash === null)) {\n throw new TypeError(\"resume cursor and state hash must both be null or present\");\n }\n if (\n resumeModality !== \"spreadsheet\" &&\n \"localNativeRevision\" in resume &&\n (resume.localCursor === null) !== (resume.localNativeRevision === null)\n ) {\n throw new TypeError(\n \"serialized resume cursor and native revision must both be null or present\",\n );\n }\n}\n\nfunction validateBootstrap(\n bootstrap: EditableArtifactLiveBootstrap,\n artifactId: EditableArtifactId,\n durableModality: EditableArtifactModality,\n resume: EditableArtifactLiveResume,\n options: NormalizedOptions,\n): void {\n validateHead(bootstrap, durableModality);\n assertNonnegativeSafeInteger(bootstrap.resumeSequence, \"bootstrap resume sequence\");\n editableArtifactStateHash(bootstrap.resumeStateHash);\n if (typeof bootstrap.resumeAccepted !== \"boolean\")\n throw new TypeError(\"resumeAccepted must be boolean\");\n if (bootstrap.resumeSequence > bootstrap.headSequence)\n throw new TypeError(\"bootstrap resume is beyond head\");\n if (\n bootstrap.resumeAccepted &&\n (resume.requireSnapshot ||\n resume.localCursor === null ||\n resume.localStateHash === null ||\n bootstrap.resumeSequence !== resume.localCursor ||\n bootstrap.resumeStateHash !== resume.localStateHash)\n ) {\n throw new TypeError(\"bootstrap accepted a different or unverified resume boundary\");\n }\n if (bootstrap.snapshot) {\n const snapshot = bootstrap.snapshot;\n if (snapshot.modality !== durableModality) throw new TypeError(\"snapshot modality mismatch\");\n if (snapshot.artifactId !== artifactId) throw new TypeError(\"snapshot artifact mismatch\");\n assertNonnegativeSafeInteger(snapshot.sequence, \"snapshot sequence\");\n if (snapshot.sequence > bootstrap.headSequence) throw new TypeError(\"snapshot is beyond head\");\n editableArtifactStateHash(snapshot.stateHash);\n if (snapshot.modality === \"spreadsheet\") {\n validateFrontier(snapshot.causalFrontier, \"snapshot causal frontier\");\n assertPositiveSafeInteger(\n snapshot.operationProtocolVersion,\n \"snapshot operation protocol version\",\n );\n } else {\n assertNonnegativeSafeInteger(snapshot.nativeRevision, \"snapshot native revision\");\n }\n if (!/^sha256:[0-9a-f]{64}$/u.test(snapshot.digest))\n throw new TypeError(\"snapshot digest is malformed\");\n assertPositiveSafeInteger(snapshot.modelSchemaVersion, \"snapshot model schema version\");\n boundedString(\n snapshot.kernelVersion,\n \"snapshot kernel version\",\n EDITABLE_ARTIFACT_KERNEL_VERSION_MAX_BYTES,\n );\n if (\n !(snapshot.bytes instanceof Uint8Array) ||\n snapshot.bytes.byteLength > options.maxSnapshotBytes\n ) {\n throw new EditableArtifactLiveError(\"oversized_frame\", \"Snapshot bytes exceed live limit\", {\n requiresSnapshot: true,\n });\n }\n }\n}\n\nfunction validateHead(\n head:\n | EditableArtifactLiveBootstrap\n | Awaited<ReturnType<EditableArtifactLiveReadPort[\"readHead\"]>>,\n durableModality: EditableArtifactModality,\n): void {\n if (head.modality !== durableModality) throw new TypeError(\"durable live head modality mismatch\");\n assertNonnegativeSafeInteger(head.headSequence, \"head sequence\");\n assertNonnegativeSafeInteger(head.minimumReplaySequence, \"minimum replay sequence\");\n if (head.minimumReplaySequence > head.headSequence + 1)\n throw new TypeError(\"minimum replay sequence is beyond head\");\n editableArtifactStateHash(head.stateHash);\n if (head.modality === \"spreadsheet\") {\n validateFrontier(head.causalFrontier, \"head causal frontier\");\n } else {\n assertNonnegativeSafeInteger(head.nativeRevision, \"head native revision\");\n }\n}\n\nfunction validatePage(\n page: {\n transactions: readonly EditableArtifactLiveCommittedTransaction[];\n headSequence: number;\n minimumReplaySequence: number;\n },\n after: number,\n through: number,\n maxCount: number,\n maxBytes: number,\n): void {\n if (!Array.isArray(page.transactions)) throw new TypeError(\"transaction page is malformed\");\n assertNonnegativeSafeInteger(page.headSequence, \"page head sequence\");\n assertNonnegativeSafeInteger(page.minimumReplaySequence, \"page minimum replay sequence\");\n if (page.headSequence < through || after > through)\n throw new TypeError(\"transaction page does not cover requested target\");\n if (page.transactions.length > maxCount) {\n throw new EditableArtifactLiveError(\n \"oversized_frame\",\n \"Durable transaction page exceeds the count limit\",\n { requiresSnapshot: true },\n );\n }\n let bytes = 0;\n for (const transaction of page.transactions) {\n bytes += transaction.committedTransactionBytes.byteLength;\n if (!Number.isSafeInteger(bytes) || bytes > maxBytes) {\n throw new EditableArtifactLiveError(\n \"oversized_frame\",\n \"Durable transaction page exceeds the byte limit\",\n { requiresSnapshot: true },\n );\n }\n }\n}\n\nfunction validateTransaction(\n transaction: EditableArtifactLiveCommittedTransaction,\n artifactId: EditableArtifactId,\n durableModality: EditableArtifactModality,\n maxBytes: number,\n): void {\n if (transaction.artifactId !== artifactId) throw new TypeError(\"transaction artifact mismatch\");\n if (transaction.modality !== durableModality)\n throw new TypeError(\"transaction modality differs from the durable artifact\");\n editableArtifactTransactionId(transaction.transactionId);\n assertPositiveSafeInteger(transaction.startSequence, \"transaction start sequence\");\n assertPositiveSafeInteger(transaction.endSequence, \"transaction end sequence\");\n if (transaction.endSequence < transaction.startSequence)\n throw new TypeError(\"transaction sequence interval is inverted\");\n editableArtifactRequestHash(transaction.requestHash);\n editableArtifactStateHash(transaction.priorStateHash);\n editableArtifactStateHash(transaction.stateHash);\n if (transaction.modality === \"spreadsheet\") {\n assertPositiveSafeInteger(\n transaction.operationProtocolVersion,\n \"transaction operation protocol version\",\n );\n validateFrontier(transaction.causalFrontier, \"transaction causal frontier\");\n } else {\n assertPositiveSafeInteger(\n transaction.commitProtocolVersion,\n \"transaction commit protocol version\",\n );\n assertNonnegativeSafeInteger(\n transaction.priorNativeRevision,\n \"transaction prior native revision\",\n );\n assertNonnegativeSafeInteger(transaction.nativeRevision, \"transaction native revision\");\n }\n if (\n !(transaction.committedTransactionBytes instanceof Uint8Array) ||\n transaction.committedTransactionBytes.byteLength === 0 ||\n transaction.committedTransactionBytes.byteLength > maxBytes\n ) {\n throw new EditableArtifactLiveError(\n \"oversized_frame\",\n \"Canonical transaction bytes exceed live limit\",\n { requiresSnapshot: true },\n );\n }\n try {\n if (transaction.modality === \"spreadsheet\") {\n const summary = decodeCommittedTransactionSummary(transaction.committedTransactionBytes);\n if (\n summary.transactionId !== transaction.transactionId ||\n summary.priorStateHash !== transaction.priorStateHash ||\n summary.stateHash !== transaction.stateHash ||\n summary.operationProtocolVersion !== transaction.operationProtocolVersion ||\n !sameFrontier(summary.resultingCausalFrontier, transaction.causalFrontier)\n ) {\n throw new TypeError(\"spreadsheet transaction projection mismatch\");\n }\n } else {\n const summary = decodeEditableArtifactSerializedCommit(\n transaction.committedTransactionBytes,\n transaction.modality,\n );\n if (\n summary.transactionId !== transaction.transactionId ||\n summary.requestHash !== transaction.requestHash ||\n summary.parentHeadSequence !== transaction.startSequence - 1 ||\n summary.resultHeadSequence !== transaction.endSequence ||\n summary.priorStateHash !== transaction.priorStateHash ||\n summary.stateHash !== transaction.stateHash ||\n summary.priorNativeRevision !== transaction.priorNativeRevision ||\n summary.nativeReceipt.revision !== transaction.nativeRevision ||\n summary.commitProtocolVersion !== transaction.commitProtocolVersion\n ) {\n throw new TypeError(\"serialized transaction projection mismatch\");\n }\n }\n } catch (cause) {\n throw new EditableArtifactLiveError(\n \"durable_gap\",\n \"Canonical transaction bytes disagree with durable live metadata\",\n { requiresSnapshot: true, cause },\n );\n }\n}\n\nfunction estimateFrameBytes(frame: EditableArtifactLiveServerFrame): number {\n if (frame.type === \"snapshot\") {\n const { bytes, ...metadata } = frame;\n return textEncoder.encode(JSON.stringify(metadata)).byteLength + bytes.byteLength + 128;\n }\n if (frame.type === \"transaction\") {\n const { committedTransactionBytes, ...transaction } = frame.transaction;\n return (\n textEncoder.encode(JSON.stringify({ ...frame, transaction })).byteLength +\n committedTransactionBytes.byteLength +\n 128\n );\n }\n return textEncoder.encode(JSON.stringify(frame)).byteLength;\n}\n\nfunction validateFrontier(\n frontier: EditableArtifactCausalFrontier,\n label: string,\n): EditableArtifactCausalFrontier {\n if (!Array.isArray(frontier) || frontier.length > MAX_CAUSAL_ACTORS) {\n throw new EditableArtifactLiveError(\n \"oversized_frame\",\n `${label} exceeds ${MAX_CAUSAL_ACTORS} actors`,\n { requiresSnapshot: true },\n );\n }\n const normalized = editableArtifactCausalFrontier(frontier);\n if (normalized.length > MAX_CAUSAL_ACTORS) {\n throw new EditableArtifactLiveError(\n \"oversized_frame\",\n `${label} exceeds ${MAX_CAUSAL_ACTORS} actors`,\n { requiresSnapshot: true },\n );\n }\n return normalized;\n}\n\nfunction sameFrontier(\n left: readonly Readonly<{ replicaId: string; counter: number }>[],\n right: readonly Readonly<{ replicaId: string; counter: number }>[],\n): boolean {\n return (\n left.length === right.length &&\n left.every(\n (entry, index) =>\n entry.replicaId === right[index]?.replicaId && entry.counter === right[index]?.counter,\n )\n );\n}\n\nfunction ownTransaction(\n transaction: EditableArtifactLiveCommittedTransaction,\n): EditableArtifactLiveCommittedTransaction {\n return transaction.modality === \"spreadsheet\"\n ? Object.freeze({\n ...transaction,\n causalFrontier: validateFrontier(transaction.causalFrontier, \"transaction causal frontier\"),\n committedTransactionBytes: transaction.committedTransactionBytes.slice(),\n })\n : Object.freeze({\n ...transaction,\n committedTransactionBytes: transaction.committedTransactionBytes.slice(),\n });\n}\n\nfunction plainRecord(value: unknown, label: string): Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new EditableArtifactLiveError(\"invalid_frame\", `${label} must be an object`);\n }\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n throw new EditableArtifactLiveError(\"invalid_frame\", `${label} must be a plain object`);\n }\n return value as Record<string, unknown>;\n}\n\nfunction requiredString(record: Record<string, unknown>, key: string, maxBytes: number): string {\n const value = record[key];\n if (typeof value !== \"string\")\n throw new EditableArtifactLiveError(\"invalid_frame\", `${key} must be a string`);\n boundedString(value, key, maxBytes);\n return value;\n}\n\nfunction requiredSafeInteger(record: Record<string, unknown>, key: string): number {\n const value = record[key];\n if (!Number.isSafeInteger(value))\n throw new EditableArtifactLiveError(\"invalid_frame\", `${key} must be a safe integer`);\n return value as number;\n}\n\nfunction rejectUnknown(record: Record<string, unknown>, allowed: readonly string[]): void {\n const allowedSet = new Set(allowed);\n const unknown = Object.keys(record).find((key) => !allowedSet.has(key));\n if (unknown)\n throw new EditableArtifactLiveError(\n \"invalid_frame\",\n `Unknown client frame property: ${unknown}`,\n );\n}\n\nfunction boundedString(value: string, label: string, maxBytes: number): void {\n const bytes = textEncoder.encode(value).byteLength;\n if (bytes < 1 || bytes > maxBytes || value.trim() !== value)\n throw new TypeError(`${label} is malformed`);\n}\n\nfunction normalizeOptions(options: EditableArtifactLiveServerOptions): NormalizedOptions {\n const normalized = {\n protocolVersion: options.protocolVersion ?? EDITABLE_ARTIFACT_LIVE_PROTOCOL_VERSION,\n maxClientFrameBytes: options.maxClientFrameBytes ?? DEFAULT_MAX_CLIENT_FRAME_BYTES,\n maxOutboundFrameBytes: options.maxOutboundFrameBytes ?? DEFAULT_MAX_OUTBOUND_FRAME_BYTES,\n maxSnapshotBytes: options.maxSnapshotBytes ?? DEFAULT_MAX_SNAPSHOT_BYTES,\n snapshotChunkBytes: options.snapshotChunkBytes ?? DEFAULT_SNAPSHOT_CHUNK_BYTES,\n maxInFlightTransactions: options.maxInFlightTransactions ?? DEFAULT_MAX_IN_FLIGHT_TRANSACTIONS,\n maxInFlightBytes: options.maxInFlightBytes ?? DEFAULT_MAX_IN_FLIGHT_BYTES,\n replayPageTransactions: options.replayPageTransactions ?? DEFAULT_REPLAY_PAGE_TRANSACTIONS,\n replayPageBytes: options.replayPageBytes ?? DEFAULT_REPLAY_PAGE_BYTES,\n maxSocketBufferedBytes: options.maxSocketBufferedBytes ?? DEFAULT_MAX_SOCKET_BUFFERED_BYTES,\n maxInboundQueueFrames: options.maxInboundQueueFrames ?? DEFAULT_MAX_INBOUND_QUEUE_FRAMES,\n maxInboundQueueBytes: options.maxInboundQueueBytes ?? DEFAULT_MAX_INBOUND_QUEUE_BYTES,\n reconcileIntervalMs: options.reconcileIntervalMs ?? DEFAULT_RECONCILE_INTERVAL_MS,\n reauthorizeIntervalMs: options.reauthorizeIntervalMs ?? DEFAULT_REAUTHORIZE_INTERVAL_MS,\n ackTimeoutMs: options.ackTimeoutMs ?? DEFAULT_ACK_TIMEOUT_MS,\n sendTimeoutMs: options.sendTimeoutMs ?? DEFAULT_SEND_TIMEOUT_MS,\n ...(options.ticketTtlMs === undefined ? {} : { ticketTtlMs: options.ticketTtlMs }),\n };\n for (const [label, value] of Object.entries(normalized)) {\n if (label === \"ticketTtlMs\") continue;\n assertPositiveSafeInteger(value, label);\n }\n if (normalized.maxSnapshotBytes > EDITABLE_ARTIFACT_PRODUCT_MAX_SNAPSHOT_BYTES) {\n throw new TypeError(\"maxSnapshotBytes exceeds the browser-compatible product limit\");\n }\n if (normalized.snapshotChunkBytes + 1024 > normalized.maxOutboundFrameBytes) {\n throw new TypeError(\"snapshot chunk exceeds maximum outbound frame\");\n }\n if (normalized.replayPageBytes < normalized.maxOutboundFrameBytes) {\n throw new TypeError(\"replay page bytes must cover one maximum outbound frame\");\n }\n return Object.freeze(normalized);\n}\n\nfunction closeValue(reason: EditableArtifactLiveCloseReason): EditableArtifactLiveClose {\n return Object.freeze({\n reason,\n retryable: [\"ticket_expired\", \"permission_changed\", \"slow_client\", \"transport_error\"].includes(\n reason,\n ),\n requiresSnapshot: [\n \"invalid_ack\",\n \"retention_gap\",\n \"durable_gap\",\n \"slow_client\",\n \"oversized_frame\",\n ].includes(reason),\n });\n}\n\nfunction safeRelease(release: (() => void) | null): void {\n try {\n release?.();\n } catch {\n // Subscription/listener teardown is best effort after the session has\n // already transitioned to its terminal state.\n }\n}\n\nexport class SystemEditableArtifactLiveClock implements EditableArtifactLiveClockPort {\n now(): Date {\n return new Date();\n }\n}\n\nexport class SystemEditableArtifactLiveScheduler implements EditableArtifactLiveSchedulerPort {\n sleep(milliseconds: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n reject(signal.reason ?? new Error(\"aborted\"));\n return;\n }\n const timer = setTimeout(resolve, milliseconds);\n signal.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timer);\n reject(signal.reason ?? new Error(\"aborted\"));\n },\n { once: true },\n );\n });\n }\n}\n\n// Re-export port names from this module's type surface for structural server factories.\nexport type {\n EditableArtifactAuthorizationPort,\n EditableArtifactService,\n EditableArtifactLiveAuthorizationInvalidationPort,\n EditableArtifactLiveHintPort,\n EditableArtifactLiveReadPort,\n EditableArtifactLiveSchedulerPort,\n EditableArtifactLiveSinkPort,\n EditableArtifactLiveTicketStorePort,\n EditableArtifactLiveTokenPort,\n};\n","import type {\n EditableArtifactActor,\n EditableArtifactCausalFrontier,\n EditableArtifactClientTransactionId,\n EditableArtifactContentHash,\n EditableArtifactId,\n EditableArtifactModality,\n EditableArtifactRequestHash,\n EditableArtifactScope,\n EditableArtifactStateHash,\n EditableArtifactTransactionId,\n} from \"../domain/editable-artifacts/types\";\n\nexport const EDITABLE_ARTIFACT_LIVE_PROTOCOL_VERSION = 1;\n\nexport type EditableArtifactLiveTicket = Readonly<{\n artifactId: EditableArtifactId;\n modality: EditableArtifactModality;\n replicaId: string;\n token: string;\n expiresAt: string;\n protocolVersion: number;\n}>;\n\n/** Stored under a digest of the opaque token and atomically consumed once. */\nexport type EditableArtifactLiveTicketRecord = Readonly<{\n tokenDigest: string;\n scope: EditableArtifactScope;\n artifactId: EditableArtifactId;\n modality: EditableArtifactModality;\n actor: EditableArtifactActor;\n /** Delegated ceiling captured by the authenticated ticket-minting request. */\n allowEdit: boolean;\n protocolVersion: number;\n issuedAt: string;\n expiresAt: string;\n}>;\n\ntype EditableArtifactLiveSnapshotCommon = Readonly<{\n artifactId: EditableArtifactId;\n sequence: number;\n stateHash: EditableArtifactStateHash;\n digest: EditableArtifactContentHash;\n kernelVersion: string;\n modelSchemaVersion: number;\n bytes: Uint8Array;\n}>;\n\nexport type EditableArtifactLiveSnapshot =\n | (EditableArtifactLiveSnapshotCommon &\n Readonly<{\n modality: \"spreadsheet\";\n causalFrontier: EditableArtifactCausalFrontier;\n operationProtocolVersion: number;\n }>)\n | (EditableArtifactLiveSnapshotCommon &\n Readonly<{\n modality: \"document\" | \"presentation\";\n nativeRevision: number;\n }>);\n\ntype EditableArtifactLiveCommittedTransactionCommon = Readonly<{\n artifactId: EditableArtifactId;\n transactionId: EditableArtifactTransactionId;\n requestHash: EditableArtifactRequestHash;\n startSequence: number;\n endSequence: number;\n priorStateHash: EditableArtifactStateHash;\n stateHash: EditableArtifactStateHash;\n committedTransactionBytes: Uint8Array;\n}>;\n\nexport type EditableArtifactLiveCommittedTransaction =\n | (EditableArtifactLiveCommittedTransactionCommon &\n Readonly<{\n modality: \"spreadsheet\";\n causalFrontier: EditableArtifactCausalFrontier;\n operationProtocolVersion: number;\n }>)\n | (EditableArtifactLiveCommittedTransactionCommon &\n Readonly<{\n modality: \"document\" | \"presentation\";\n priorNativeRevision: number;\n nativeRevision: number;\n commitProtocolVersion: number;\n }>);\n\ntype EditableArtifactLiveHeadCommon = Readonly<{\n headSequence: number;\n stateHash: EditableArtifactStateHash;\n minimumReplaySequence: number;\n}>;\n\nexport type EditableArtifactLiveHead =\n | (EditableArtifactLiveHeadCommon &\n Readonly<{\n modality: \"spreadsheet\";\n causalFrontier: EditableArtifactCausalFrontier;\n }>)\n | (EditableArtifactLiveHeadCommon &\n Readonly<{\n modality: \"document\" | \"presentation\";\n nativeRevision: number;\n }>);\n\nexport type EditableArtifactLiveBootstrap = EditableArtifactLiveHead &\n Readonly<{\n resumeAccepted: boolean;\n resumeSequence: number;\n resumeStateHash: EditableArtifactStateHash;\n snapshot: EditableArtifactLiveSnapshot | null;\n }>;\n\ntype EditableArtifactLiveResumeCommon = Readonly<{\n localCursor: number | null;\n localStateHash: EditableArtifactStateHash | null;\n requireSnapshot: boolean;\n}>;\n\nexport type EditableArtifactLiveResume =\n | (EditableArtifactLiveResumeCommon &\n Readonly<{\n modality?: \"spreadsheet\";\n localCausalFrontier: EditableArtifactCausalFrontier;\n }>)\n | (EditableArtifactLiveResumeCommon &\n Readonly<{\n modality: \"document\" | \"presentation\";\n localNativeRevision: number | null;\n }>);\n\nexport type EditableArtifactLiveServerFrame =\n | Readonly<{\n type: \"open\";\n protocolVersion: number;\n artifactId: EditableArtifactId;\n streamEpoch: string;\n modality: EditableArtifactModality;\n writable: boolean;\n headSequence: number;\n minimumReplaySequence: number;\n maxClientFrameBytes: number;\n maxCommandBytes: number;\n maxIntentBytes: number;\n maxCommittedTransactionBytes: number;\n maxSnapshotBytes: number;\n maxInFlightTransactions: number;\n maxInFlightBytes: number;\n }>\n | (Readonly<{\n type: \"snapshot\";\n protocolVersion: number;\n artifactId: EditableArtifactId;\n streamEpoch: string;\n sequence: number;\n stateHash: EditableArtifactStateHash;\n digest: EditableArtifactContentHash;\n kernelVersion: string;\n modelSchemaVersion: number;\n offset: number;\n totalBytes: number;\n final: boolean;\n bytes: Uint8Array;\n }> &\n (\n | Readonly<{\n modality: \"spreadsheet\";\n causalFrontier: EditableArtifactCausalFrontier;\n }>\n | Readonly<{\n modality: \"document\" | \"presentation\";\n nativeRevision: number;\n }>\n ))\n | Readonly<{\n type: \"transaction\";\n protocolVersion: number;\n artifactId: EditableArtifactId;\n streamEpoch: string;\n transaction: EditableArtifactLiveCommittedTransaction;\n }>\n | Readonly<{\n type: \"barrier\";\n protocolVersion: number;\n artifactId: EditableArtifactId;\n streamEpoch: string;\n sequence: number;\n stateHash: EditableArtifactStateHash;\n }>\n | Readonly<{\n type: \"watermark\";\n protocolVersion: number;\n artifactId: EditableArtifactId;\n streamEpoch: string;\n headSequence: number;\n }>\n | Readonly<{\n type: \"resyncRequired\";\n protocolVersion: number;\n artifactId: EditableArtifactId;\n streamEpoch: string;\n reason: \"retention_gap\" | \"durable_gap\" | \"invalid_ack\" | \"slow_client\" | \"oversized_frame\";\n headSequence: number;\n }>\n | Readonly<{\n type: \"applied\";\n protocolVersion: number;\n artifactId: EditableArtifactId;\n streamEpoch: string;\n sequence: number;\n stateHash: EditableArtifactStateHash;\n }>\n | Readonly<{\n type: \"authorizationChanged\";\n protocolVersion: number;\n artifactId: EditableArtifactId;\n streamEpoch: string;\n writable: boolean;\n }>\n | Readonly<{\n type: \"mutationAccepted\";\n protocolVersion: number;\n artifactId: EditableArtifactId;\n streamEpoch: string;\n requestHash: EditableArtifactRequestHash;\n clientTransactionId: EditableArtifactClientTransactionId;\n transactionId: EditableArtifactTransactionId;\n startSequence: number;\n endSequence: number;\n stateHash: EditableArtifactStateHash;\n }>\n | Readonly<{\n type: \"mutationRejected\";\n protocolVersion: number;\n artifactId: EditableArtifactId;\n streamEpoch: string;\n requestHash: EditableArtifactRequestHash;\n code: \"invalid_request\" | \"forbidden\" | \"conflict\" | \"unsupported\" | \"unavailable\";\n retryable: boolean;\n }>;\n\nexport type EditableArtifactLiveAppliedClientFrame = Readonly<{\n type: \"applied\";\n protocolVersion: number;\n artifactId: EditableArtifactId;\n streamEpoch: string;\n sequence: number;\n stateHash: EditableArtifactStateHash;\n}>;\n\nexport type EditableArtifactLiveMutationClientFrame = Readonly<{\n protocolVersion: number;\n artifactId: EditableArtifactId;\n streamEpoch: string;\n requestHash: EditableArtifactRequestHash;\n intentBytes: Uint8Array;\n}>;\n\nexport type EditableArtifactLiveClientFrame = EditableArtifactLiveAppliedClientFrame;\n\nexport type EditableArtifactLiveCloseReason =\n | \"closed\"\n | \"ticket_expired\"\n | \"ticket_replayed\"\n | \"protocol_mismatch\"\n | \"permission_changed\"\n | \"invalid_frame\"\n | \"oversized_frame\"\n | \"stale_epoch\"\n | \"invalid_ack\"\n | \"retention_gap\"\n | \"durable_gap\"\n | \"slow_client\"\n | \"transport_error\";\n\nexport type EditableArtifactLiveClose = Readonly<{\n reason: EditableArtifactLiveCloseReason;\n retryable: boolean;\n requiresSnapshot: boolean;\n}>;\n\nexport type EditableArtifactLiveMutationReceipt = Readonly<{\n clientTransactionId: EditableArtifactClientTransactionId;\n requestHash: EditableArtifactRequestHash;\n transaction: EditableArtifactLiveCommittedTransaction;\n}>;\n","import type { EditableArtifactAuthorizationPort } from \"../domain/editable-artifacts/ports\";\nimport {\n assertIsoTimestamp,\n editableArtifactId,\n editableArtifactScope,\n validateEditableArtifactActor,\n type EditableArtifactActor,\n type EditableArtifactId,\n type EditableArtifactModality,\n type EditableArtifactScope,\n} from \"../domain/editable-artifacts/types\";\nimport { EditableArtifactLiveError } from \"./errors\";\nimport type {\n EditableArtifactLiveClockPort,\n EditableArtifactLiveTicketStorePort,\n EditableArtifactLiveTokenPort,\n} from \"./ports\";\nimport {\n EDITABLE_ARTIFACT_LIVE_PROTOCOL_VERSION,\n type EditableArtifactLiveTicket,\n type EditableArtifactLiveTicketRecord,\n} from \"./types\";\n\nconst DEFAULT_TTL_MS = 30_000;\nconst MAX_TTL_MS = 60_000;\nconst MAX_TOKEN_BYTES = 4_096;\n\nexport type EditableArtifactLiveTicketAuthorityDependencies = Readonly<{\n authorization: EditableArtifactAuthorizationPort;\n tickets: EditableArtifactLiveTicketStorePort;\n tokens: EditableArtifactLiveTokenPort;\n clock: EditableArtifactLiveClockPort;\n ttlMs?: number;\n protocolVersion?: number;\n}>;\n\nexport class EditableArtifactLiveTicketAuthority {\n private readonly ttlMs: number;\n private readonly protocolVersion: number;\n\n constructor(private readonly dependencies: EditableArtifactLiveTicketAuthorityDependencies) {\n this.ttlMs = dependencies.ttlMs ?? DEFAULT_TTL_MS;\n if (!Number.isSafeInteger(this.ttlMs) || this.ttlMs < 1_000 || this.ttlMs > MAX_TTL_MS) {\n throw new TypeError(`ticket ttl must be 1000-${MAX_TTL_MS} milliseconds`);\n }\n this.protocolVersion = dependencies.protocolVersion ?? EDITABLE_ARTIFACT_LIVE_PROTOCOL_VERSION;\n if (!Number.isSafeInteger(this.protocolVersion) || this.protocolVersion < 1) {\n throw new TypeError(\"protocol version must be a positive safe integer\");\n }\n }\n\n async mint(\n input: Readonly<{\n scope: EditableArtifactScope;\n artifactId: EditableArtifactId;\n modality: EditableArtifactModality;\n actor: EditableArtifactActor;\n allowEdit: boolean;\n }>,\n ): Promise<EditableArtifactLiveTicket> {\n const scope = editableArtifactScope(input.scope);\n const artifactId = editableArtifactId(input.artifactId);\n const modality = assertModality(input.modality);\n validateEditableArtifactActor(input.actor);\n if (typeof input.allowEdit !== \"boolean\") {\n throw new TypeError(\"ticket allowEdit must be boolean\");\n }\n const actor = Object.freeze({ ...input.actor }) as EditableArtifactActor;\n const decision = await this.dependencies.authorization.authorize({\n scope,\n artifactId,\n actor,\n permission: \"read\",\n });\n if (!decision.allowed) {\n throw new EditableArtifactLiveError(\n \"permission_changed\",\n \"Editable artifact read permission denied\",\n );\n }\n const token = this.dependencies.tokens.randomOpaqueToken();\n assertToken(token);\n const tokenDigest = await this.dependencies.tokens.digestOpaqueToken(token);\n assertDigest(tokenDigest);\n const issuedAtDate = this.dependencies.clock.now();\n if (!Number.isFinite(issuedAtDate.getTime()))\n throw new TypeError(\"clock returned an invalid date\");\n const issuedAt = issuedAtDate.toISOString();\n const expiresAt = new Date(issuedAtDate.getTime() + this.ttlMs).toISOString();\n const record: EditableArtifactLiveTicketRecord = Object.freeze({\n tokenDigest,\n scope,\n artifactId,\n modality,\n actor,\n allowEdit: input.allowEdit,\n protocolVersion: this.protocolVersion,\n issuedAt,\n expiresAt,\n });\n await this.dependencies.tickets.put(record);\n return Object.freeze({\n artifactId,\n modality,\n replicaId: actor.replicaId,\n token,\n expiresAt,\n protocolVersion: this.protocolVersion,\n });\n }\n\n async consume(\n input: Readonly<{\n token: string;\n artifactId: EditableArtifactId;\n protocolVersion: number;\n }>,\n ): Promise<EditableArtifactLiveTicketRecord> {\n assertToken(input.token);\n const artifactId = editableArtifactId(input.artifactId);\n const digest = await this.dependencies.tokens.digestOpaqueToken(input.token);\n assertDigest(digest);\n const record = await this.dependencies.tickets.consume(digest);\n if (!record) {\n throw new EditableArtifactLiveError(\n \"ticket_replayed\",\n \"Live ticket is invalid or was already consumed\",\n );\n }\n validateTicketRecord(record);\n if (Date.parse(record.expiresAt) <= this.dependencies.clock.now().getTime()) {\n throw new EditableArtifactLiveError(\"ticket_expired\", \"Live ticket has expired\", {\n retryable: true,\n });\n }\n if (record.artifactId !== artifactId) {\n throw new EditableArtifactLiveError(\"invalid_ticket\", \"Live ticket scope does not match\");\n }\n if (\n record.protocolVersion !== input.protocolVersion ||\n input.protocolVersion !== this.protocolVersion\n ) {\n throw new EditableArtifactLiveError(\n \"protocol_mismatch\",\n \"Editable artifact live protocol is unsupported\",\n );\n }\n return Object.freeze({\n ...record,\n scope: editableArtifactScope(record.scope),\n actor: Object.freeze({ ...record.actor }) as EditableArtifactActor,\n });\n }\n}\n\n/** Single-process test/dev store. Production must inject a shared atomic CAS store. */\nexport class InMemoryEditableArtifactLiveTicketStore implements EditableArtifactLiveTicketStorePort {\n private readonly records = new Map<string, EditableArtifactLiveTicketRecord>();\n\n async put(record: EditableArtifactLiveTicketRecord): Promise<void> {\n if (this.records.has(record.tokenDigest)) throw new Error(\"Live ticket digest collision\");\n this.records.set(record.tokenDigest, record);\n }\n\n async consume(tokenDigest: string): Promise<EditableArtifactLiveTicketRecord | null> {\n const record = this.records.get(tokenDigest) ?? null;\n if (record) this.records.delete(tokenDigest);\n return record;\n }\n}\n\nexport class WebCryptoEditableArtifactLiveTokens implements EditableArtifactLiveTokenPort {\n randomOpaqueToken(): string {\n const bytes = crypto.getRandomValues(new Uint8Array(32));\n let binary = \"\";\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return btoa(binary).replaceAll(\"+\", \"-\").replaceAll(\"/\", \"_\").replace(/=+$/u, \"\");\n }\n\n async digestOpaqueToken(token: string): Promise<string> {\n const digest = new Uint8Array(\n await crypto.subtle.digest(\"SHA-256\", new TextEncoder().encode(token)),\n );\n return `sha256:${[...digest].map((byte) => byte.toString(16).padStart(2, \"0\")).join(\"\")}`;\n }\n}\n\nfunction validateTicketRecord(record: EditableArtifactLiveTicketRecord): void {\n assertDigest(record.tokenDigest);\n editableArtifactScope(record.scope);\n editableArtifactId(record.artifactId);\n assertModality(record.modality);\n validateEditableArtifactActor(record.actor);\n if (typeof record.allowEdit !== \"boolean\") {\n throw new TypeError(\"ticket allowEdit is invalid\");\n }\n assertIsoTimestamp(record.issuedAt, \"ticket issuedAt\");\n assertIsoTimestamp(record.expiresAt, \"ticket expiresAt\");\n}\n\nfunction assertModality(value: EditableArtifactModality): EditableArtifactModality {\n if (value !== \"document\" && value !== \"spreadsheet\" && value !== \"presentation\") {\n throw new TypeError(\"ticket modality is invalid\");\n }\n return value;\n}\n\nfunction assertToken(token: string): void {\n const bytes = new TextEncoder().encode(token).byteLength;\n if (bytes < 32 || bytes > MAX_TOKEN_BYTES || !/^[A-Za-z0-9._~-]+$/u.test(token)) {\n throw new EditableArtifactLiveError(\"invalid_ticket\", \"Live ticket is malformed\");\n }\n}\n\nfunction assertDigest(value: string): void {\n if (!/^sha256:[0-9a-f]{64}$/u.test(value)) throw new TypeError(\"ticket digest is malformed\");\n}\n","import {\n EDITABLE_ARTIFACT_LIVE_WIRE_VERSION,\n decodeEditableArtifactLiveClientWireFrame as decodeContractClientFrame,\n decodeEditableArtifactLiveServerWireFrame,\n encodeEditableArtifactLiveAppliedWireFrame as encodeContractAppliedFrame,\n encodeEditableArtifactLiveMutationWireFrame as encodeContractMutationFrame,\n encodeEditableArtifactLiveOpenWireFrame as encodeContractOpenFrame,\n encodeEditableArtifactLiveServerWireFrame as encodeContractServerFrame,\n inspectEditableArtifactLiveWireEnvelope,\n type EditableArtifactLiveAppliedWireFrame as ContractAppliedWireFrame,\n type EditableArtifactLiveMutationWireFrame as ContractMutationWireFrame,\n type EditableArtifactLiveOpenWireFrame as ContractOpenWireFrame,\n type EditableArtifactLiveServerFrame as ContractServerFrame,\n} from \"@opengeni/contracts/editable-artifact-live\";\nimport type {\n EditableArtifactId,\n EditableArtifactRequestHash,\n EditableArtifactStateHash,\n} from \"../domain/editable-artifacts/types\";\nimport type { EditableArtifactLiveResume, EditableArtifactLiveServerFrame } from \"./types\";\n\nexport {\n EDITABLE_ARTIFACT_LIVE_WIRE_VERSION,\n decodeEditableArtifactLiveServerWireFrame,\n inspectEditableArtifactLiveWireEnvelope,\n};\n\n/** Branded core view over the contracts-owned wire type. Runtime validation is contracts-only. */\nexport type EditableArtifactLiveOpenWireFrame = Readonly<{\n type: \"open\";\n protocolVersion: number;\n artifactId: EditableArtifactId;\n token: string;\n resume: EditableArtifactLiveResume;\n}>;\nexport type EditableArtifactLiveAppliedWireFrame = Readonly<{\n type: \"applied\";\n protocolVersion: number;\n artifactId: EditableArtifactId;\n streamEpoch: string;\n sequence: number;\n stateHash: EditableArtifactStateHash;\n}>;\nexport type EditableArtifactLiveMutationWireFrame = Readonly<{\n type: \"mutation\";\n protocolVersion: number;\n artifactId: EditableArtifactId;\n streamEpoch: string;\n requestHash: EditableArtifactRequestHash;\n intentBytes: Uint8Array;\n}>;\nexport type EditableArtifactLiveClientWireFrame =\n | EditableArtifactLiveOpenWireFrame\n | EditableArtifactLiveAppliedWireFrame\n | EditableArtifactLiveMutationWireFrame;\n\nexport function decodeEditableArtifactLiveClientWireFrame(\n bytes: Uint8Array,\n): EditableArtifactLiveClientWireFrame {\n return decodeContractClientFrame(bytes) as unknown as EditableArtifactLiveClientWireFrame;\n}\n\nexport function encodeEditableArtifactLiveOpenWireFrame(\n frame: EditableArtifactLiveOpenWireFrame,\n): Uint8Array {\n return encodeContractOpenFrame(frame as unknown as ContractOpenWireFrame);\n}\n\nexport function encodeEditableArtifactLiveAppliedWireFrame(\n frame: EditableArtifactLiveAppliedWireFrame,\n): Uint8Array {\n return encodeContractAppliedFrame(frame as unknown as ContractAppliedWireFrame);\n}\n\nexport function encodeEditableArtifactLiveMutationWireFrame(\n frame: EditableArtifactLiveMutationWireFrame,\n): Uint8Array {\n return encodeContractMutationFrame(frame as unknown as ContractMutationWireFrame);\n}\n\nexport function encodeEditableArtifactLiveServerWireFrame(\n frame: EditableArtifactLiveServerFrame,\n): Uint8Array {\n if (frame.type === \"transaction\" && frame.transaction.modality === \"spreadsheet\") {\n const { operationProtocolVersion, modality: _modality, ...transaction } = frame.transaction;\n return encodeContractServerFrame({\n ...frame,\n transaction: {\n ...transaction,\n protocolVersion: operationProtocolVersion,\n },\n } as unknown as ContractServerFrame);\n }\n return encodeContractServerFrame(frame as unknown as ContractServerFrame);\n}\n"],"mappings":"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","names":["EDITABLE_ARTIFACT_KERNEL_VERSION_MAX_BYTES","textEncoder","normalizeOptions","EDITABLE_ARTIFACT_KERNEL_VERSION_MAX_BYTES"]}
@@ -1,72 +0,0 @@
1
- import { type Database, type EnqueueMemorySlackPublicationResult } from "@opengeni/db";
2
- /**
3
- * Narrow post-persistence port for the immutable durable-learning v1 attempt/receipt contract.
4
- * The router owns validation, authority, routing, and persistence. This adapter
5
- * consumes only the fields required to create a bounded notification projection.
6
- */
7
- export type DurableLearningSlackOutcome = {
8
- attempt: {
9
- id: string;
10
- accountId: string;
11
- workspaceId: string;
12
- inputHash: string;
13
- actor: {
14
- kind: "human" | "agent" | "service";
15
- subjectId: string;
16
- };
17
- initiatingHumanSubjectId: string | null;
18
- sessionId: string | null;
19
- request: {
20
- operation: "write";
21
- subject: {
22
- kind: string;
23
- summary: string | null;
24
- };
25
- evidence: Array<{
26
- kind: string;
27
- }>;
28
- } | {
29
- operation: "rollback";
30
- targetAttemptId: string;
31
- };
32
- };
33
- receipt: {
34
- attemptId: string;
35
- inputHash: string;
36
- outcome: "applied" | "proposed" | "evidence_recorded" | "noop" | "clarification_required" | "rejected" | "rolled_back" | "failed";
37
- decision: {
38
- code: string;
39
- destination: string | null;
40
- scope: {
41
- kind: string;
42
- } | null;
43
- authority: string | null;
44
- };
45
- resource: {
46
- surface: string;
47
- id: string;
48
- version: string | null;
49
- status: string;
50
- } | null;
51
- createdAt: string;
52
- };
53
- };
54
- export type DurableLearningSlackPublicationResult = {
55
- kind: "contract_mismatch" | "not_workspace_scoped" | "connector_evidence_untrusted" | "summary_required" | "policy_quiet";
56
- enqueue: null;
57
- } | {
58
- kind: "enqueued";
59
- enqueue: EnqueueMemorySlackPublicationResult;
60
- };
61
- export type DurableLearningSlackProjection = {
62
- summary: string;
63
- outcome: DurableLearningSlackOutcome["receipt"]["outcome"];
64
- decisionCode: string;
65
- destination: string | null;
66
- authority: string | null;
67
- resource: DurableLearningSlackOutcome["receipt"]["resource"];
68
- occurredAt: string;
69
- };
70
- export declare function publishDurableLearningOutcomeToSlack(db: Database, outcome: DurableLearningSlackOutcome): Promise<DurableLearningSlackPublicationResult>;
71
- export declare function durableLearningImportance(outcome: DurableLearningSlackOutcome): "major" | "normal" | "minor";
72
- export declare function durableLearningSlackProjection(outcome: DurableLearningSlackOutcome): DurableLearningSlackProjection | null;