@earendil-works/pi-durable 1.3.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +227 -0
- package/README.md +287 -82
- package/dist/codemode/codemode.d.ts +4 -4
- package/dist/codemode/codemode.d.ts.map +1 -1
- package/dist/codemode/codemode.js +21 -16
- package/dist/codemode/codemode.js.map +1 -1
- package/dist/codemode/models.d.ts.map +1 -1
- package/dist/codemode/models.js +6 -4
- package/dist/codemode/models.js.map +1 -1
- package/dist/documents.d.ts +1 -1
- package/dist/documents.d.ts.map +1 -1
- package/dist/documents.js.map +1 -1
- package/dist/env/index.d.ts +12 -10
- package/dist/env/index.d.ts.map +1 -1
- package/dist/env/index.js.map +1 -1
- package/dist/env/node-watch.d.ts +3 -3
- package/dist/env/node-watch.d.ts.map +1 -1
- package/dist/env/node-watch.js +18 -16
- package/dist/env/node-watch.js.map +1 -1
- package/dist/env/node.d.ts +2 -2
- package/dist/env/node.d.ts.map +1 -1
- package/dist/env/node.js +12 -4
- package/dist/env/node.js.map +1 -1
- package/dist/errors.d.ts +18 -2
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +26 -3
- package/dist/errors.js.map +1 -1
- package/dist/harness/agent.d.ts +13 -2
- package/dist/harness/agent.d.ts.map +1 -1
- package/dist/harness/agent.js +48 -6
- package/dist/harness/agent.js.map +1 -1
- package/dist/harness/compaction.d.ts +3 -1
- package/dist/harness/compaction.d.ts.map +1 -1
- package/dist/harness/compaction.js +38 -6
- package/dist/harness/compaction.js.map +1 -1
- package/dist/harness/context.d.ts +23 -7
- package/dist/harness/context.d.ts.map +1 -1
- package/dist/harness/context.js +71 -25
- package/dist/harness/context.js.map +1 -1
- package/dist/harness/define.d.ts +7 -3
- package/dist/harness/define.d.ts.map +1 -1
- package/dist/harness/define.js +4 -0
- package/dist/harness/define.js.map +1 -1
- package/dist/harness/generation.d.ts +38 -5
- package/dist/harness/generation.d.ts.map +1 -1
- package/dist/harness/generation.js +497 -108
- package/dist/harness/generation.js.map +1 -1
- package/dist/harness/harness.d.ts +7 -2
- package/dist/harness/harness.d.ts.map +1 -1
- package/dist/harness/harness.js +147 -57
- package/dist/harness/harness.js.map +1 -1
- package/dist/harness/inbox.d.ts +7 -3
- package/dist/harness/inbox.d.ts.map +1 -1
- package/dist/harness/inbox.js +7 -4
- package/dist/harness/inbox.js.map +1 -1
- package/dist/harness/json.d.ts +20 -4
- package/dist/harness/json.d.ts.map +1 -1
- package/dist/harness/json.js +23 -5
- package/dist/harness/json.js.map +1 -1
- package/dist/harness/live.d.ts +122 -16
- package/dist/harness/live.d.ts.map +1 -1
- package/dist/harness/live.js +93 -12
- package/dist/harness/live.js.map +1 -1
- package/dist/harness/partial-changes.d.ts +54 -0
- package/dist/harness/partial-changes.d.ts.map +1 -0
- package/dist/harness/partial-changes.js +162 -0
- package/dist/harness/partial-changes.js.map +1 -0
- package/dist/harness/prompt.d.ts +1 -1
- package/dist/harness/prompt.d.ts.map +1 -1
- package/dist/harness/prompt.js +1 -1
- package/dist/harness/prompt.js.map +1 -1
- package/dist/harness/registry-reader.d.ts +11 -0
- package/dist/harness/registry-reader.d.ts.map +1 -0
- package/dist/harness/registry-reader.js +25 -0
- package/dist/harness/registry-reader.js.map +1 -0
- package/dist/harness/scheduler.d.ts +86 -14
- package/dist/harness/scheduler.d.ts.map +1 -1
- package/dist/harness/scheduler.js +1459 -369
- package/dist/harness/scheduler.js.map +1 -1
- package/dist/harness/submissions.d.ts +23 -11
- package/dist/harness/submissions.d.ts.map +1 -1
- package/dist/harness/submissions.js +104 -36
- package/dist/harness/submissions.js.map +1 -1
- package/dist/harness/task-graph.d.ts +28 -8
- package/dist/harness/task-graph.d.ts.map +1 -1
- package/dist/harness/task-graph.js +85 -36
- package/dist/harness/task-graph.js.map +1 -1
- package/dist/harness/telemetry.d.ts +307 -0
- package/dist/harness/telemetry.d.ts.map +1 -0
- package/dist/harness/telemetry.js +136 -0
- package/dist/harness/telemetry.js.map +1 -0
- package/dist/harness/tool.d.ts +2 -0
- package/dist/harness/tool.d.ts.map +1 -1
- package/dist/harness/tool.js +223 -61
- package/dist/harness/tool.js.map +1 -1
- package/dist/harness/transcript.d.ts +72 -0
- package/dist/harness/transcript.d.ts.map +1 -0
- package/dist/harness/transcript.js +264 -0
- package/dist/harness/transcript.js.map +1 -0
- package/dist/harness/types.d.ts +302 -48
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/harness/util.d.ts +7 -1
- package/dist/harness/util.d.ts.map +1 -1
- package/dist/harness/util.js +13 -0
- package/dist/harness/util.js.map +1 -1
- package/dist/harness/view.d.ts +43 -22
- package/dist/harness/view.d.ts.map +1 -1
- package/dist/harness/view.js +130 -71
- package/dist/harness/view.js.map +1 -1
- package/dist/index.d.ts +13 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -5
- package/dist/index.js.map +1 -1
- package/dist/search.d.ts +19 -3
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +107 -44
- package/dist/search.js.map +1 -1
- package/dist/session/cached-storage.d.ts +71 -0
- package/dist/session/cached-storage.d.ts.map +1 -0
- package/dist/session/cached-storage.js +269 -0
- package/dist/session/cached-storage.js.map +1 -0
- package/dist/session/conversation-tails.d.ts +33 -0
- package/dist/session/conversation-tails.d.ts.map +1 -0
- package/dist/session/conversation-tails.js +101 -0
- package/dist/session/conversation-tails.js.map +1 -0
- package/dist/session/keys.d.ts +68 -0
- package/dist/session/keys.d.ts.map +1 -0
- package/dist/session/keys.js +161 -0
- package/dist/session/keys.js.map +1 -0
- package/dist/session/session.d.ts +181 -29
- package/dist/session/session.d.ts.map +1 -1
- package/dist/session/session.js +1073 -183
- package/dist/session/session.js.map +1 -1
- package/dist/session/transaction.d.ts +86 -4
- package/dist/session/transaction.d.ts.map +1 -1
- package/dist/session/transaction.js +250 -38
- package/dist/session/transaction.js.map +1 -1
- package/dist/session/writer.d.ts +74 -0
- package/dist/session/writer.d.ts.map +1 -0
- package/dist/session/writer.js +294 -0
- package/dist/session/writer.js.map +1 -0
- package/dist/storage/indexeddb.d.ts +68 -0
- package/dist/storage/indexeddb.d.ts.map +1 -0
- package/dist/storage/indexeddb.js +881 -0
- package/dist/storage/indexeddb.js.map +1 -0
- package/dist/storage/jsonl/storage.d.ts +30 -2
- package/dist/storage/jsonl/storage.d.ts.map +1 -1
- package/dist/storage/jsonl/storage.js +88 -24
- package/dist/storage/jsonl/storage.js.map +1 -1
- package/dist/storage/memory.d.ts +7 -2
- package/dist/storage/memory.d.ts.map +1 -1
- package/dist/storage/memory.js +29 -3
- package/dist/storage/memory.js.map +1 -1
- package/dist/storage/sqlite/cloudflare.d.ts +2 -51
- package/dist/storage/sqlite/cloudflare.d.ts.map +1 -1
- package/dist/storage/sqlite/cloudflare.js +2 -133
- package/dist/storage/sqlite/cloudflare.js.map +1 -1
- package/dist/storage/sqlite/database.d.ts +1 -36
- package/dist/storage/sqlite/database.d.ts.map +1 -1
- package/dist/storage/sqlite/database.js.map +1 -1
- package/dist/storage/sqlite/index.d.ts +1 -1
- package/dist/storage/sqlite/index.d.ts.map +1 -1
- package/dist/storage/sqlite/index.js.map +1 -1
- package/dist/storage/sqlite/migrations.d.ts +2 -5
- package/dist/storage/sqlite/migrations.d.ts.map +1 -1
- package/dist/storage/sqlite/migrations.js +28 -28
- package/dist/storage/sqlite/migrations.js.map +1 -1
- package/dist/storage/sqlite/node.d.ts +2 -37
- package/dist/storage/sqlite/node.d.ts.map +1 -1
- package/dist/storage/sqlite/node.js +3 -174
- package/dist/storage/sqlite/node.js.map +1 -1
- package/dist/storage/sqlite/schema.d.ts +1 -3
- package/dist/storage/sqlite/schema.d.ts.map +1 -1
- package/dist/storage/sqlite/schema.js +2 -9
- package/dist/storage/sqlite/schema.js.map +1 -1
- package/dist/storage/sqlite/storage.d.ts +15 -3
- package/dist/storage/sqlite/storage.d.ts.map +1 -1
- package/dist/storage/sqlite/storage.js +110 -36
- package/dist/storage/sqlite/storage.js.map +1 -1
- package/dist/storage/store/commit.d.ts +33 -0
- package/dist/storage/store/commit.d.ts.map +1 -0
- package/dist/storage/store/commit.js +286 -0
- package/dist/storage/store/commit.js.map +1 -0
- package/dist/storage/store/documents.d.ts +43 -0
- package/dist/storage/store/documents.d.ts.map +1 -0
- package/dist/storage/store/documents.js +102 -0
- package/dist/storage/store/documents.js.map +1 -0
- package/dist/storage/store/index.d.ts +2 -0
- package/dist/storage/store/index.d.ts.map +1 -0
- package/dist/storage/store/index.js +2 -0
- package/dist/storage/store/index.js.map +1 -0
- package/dist/storage/store/queries.d.ts +49 -0
- package/dist/storage/store/queries.d.ts.map +1 -0
- package/dist/storage/store/queries.js +93 -0
- package/dist/storage/store/queries.js.map +1 -0
- package/dist/storage/store/storage.d.ts +59 -0
- package/dist/storage/store/storage.d.ts.map +1 -0
- package/dist/storage/store/storage.js +438 -0
- package/dist/storage/store/storage.js.map +1 -0
- package/dist/storage/store/tables.d.ts +54 -0
- package/dist/storage/store/tables.d.ts.map +1 -0
- package/dist/storage/store/tables.js +108 -0
- package/dist/storage/store/tables.js.map +1 -0
- package/dist/testing/commit-writes.d.ts +5 -0
- package/dist/testing/commit-writes.d.ts.map +1 -0
- package/dist/testing/commit-writes.js +12 -0
- package/dist/testing/commit-writes.js.map +1 -0
- package/dist/testing/env-conformance.js +7 -7
- package/dist/testing/env-conformance.js.map +1 -1
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +1 -0
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/storage-benchmark.d.ts.map +1 -1
- package/dist/testing/storage-benchmark.js +18 -17
- package/dist/testing/storage-benchmark.js.map +1 -1
- package/dist/testing/storage-conformance.d.ts.map +1 -1
- package/dist/testing/storage-conformance.js +369 -67
- package/dist/testing/storage-conformance.js.map +1 -1
- package/dist/timers.d.ts +21 -0
- package/dist/timers.d.ts.map +1 -0
- package/dist/timers.js +72 -0
- package/dist/timers.js.map +1 -0
- package/dist/tool-search/tool-search.d.ts +6 -12
- package/dist/tool-search/tool-search.d.ts.map +1 -1
- package/dist/tool-search/tool-search.js +7 -7
- package/dist/tool-search/tool-search.js.map +1 -1
- package/dist/tools/bash.d.ts +12 -12
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +16 -15
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/edit.d.ts +7 -7
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +9 -9
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/index.d.ts +32 -32
- package/dist/tools/read.d.ts +6 -6
- package/dist/tools/read.d.ts.map +1 -1
- package/dist/tools/read.js +19 -8
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/write.d.ts +4 -4
- package/dist/tools/write.d.ts.map +1 -1
- package/dist/tools/write.js +5 -5
- package/dist/tools/write.js.map +1 -1
- package/dist/types.d.ts +331 -64
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +27 -10
- package/dist/harness/events.d.ts +0 -186
- package/dist/harness/events.d.ts.map +0 -1
- package/dist/harness/events.js +0 -373
- package/dist/harness/events.js.map +0 -1
- package/dist/session/observation.d.ts +0 -42
- package/dist/session/observation.d.ts.map +0 -1
- package/dist/session/observation.js +0 -281
- package/dist/session/observation.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../src/session/transaction.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Context, copyJson, type Draft, type JsonValue } from \"@earendil-works/chord\";\nimport { type Change, type Op, type Prepared, type Tracker, track } from \"@earendil-works/chord/delta\";\nimport {\n\ttype AnyDocDefinition,\n\ttype AnyDocToken,\n\taddressId,\n\tcheckRecordScope,\n\tcheckRecordVersion,\n\tdocumentCreate,\n\tmaterializeDocumentValue,\n\ttype ResolvedAddress,\n\tresolveAddress,\n} from \"../documents.ts\";\nimport { ReadAfterWrite } from \"../errors.ts\";\nimport type {\n\tConversationDocFamilyToken,\n\tConversationDocToken,\n\tConversationId,\n\tConversationOwnership,\n\tConversationQuery,\n\tConversationRecord,\n\tCursor,\n\tDocumentAddress,\n\tDocumentCommitChange,\n\tDocumentCopySource,\n\tDocumentCreate,\n\tDocumentId,\n\tDocumentRecord,\n\tEntry,\n\tEntryDraft,\n\tEntryId,\n\tEntryQuery,\n\tEntryRecord,\n\tJsonObject,\n\tSeq,\n\tSessionDocFamilyToken,\n\tSessionDocToken,\n\tStorage,\n\tStorageWrite,\n\tSubmissionCreate,\n\tSubmissionId,\n\tSubmissionRecord,\n\tSubmissionSettlement,\n\tTask,\n\tTaskDocFamilyToken,\n\tTaskDocToken,\n\tTaskId,\n\tTaskOptions,\n\tTaskQuery,\n\tTaskRecord,\n\tTx,\n\tTypedEntry,\n\tTypedEntryDraft,\n} from \"../types.ts\";\nimport { ROOT_CONVERSATION_ID } from \"../types.ts\";\nimport { prepareForkDocumentCopies } from \"./forks.ts\";\n\ntype AnyTaskRecord = TaskRecord<JsonValue, JsonValue, JsonValue>;\n\n/** A staged submission change: a settlement, or the placement of a queued submission at its entry. */\ntype SubmissionChange = SubmissionSettlement | { readonly status: \"placed\"; readonly entry: EntryId };\n\n/**\n * Complete record after applying one change. Placement turns a queued input `placed` and a queued write `done`; only a\n * placed input can be answered. A settled record stays.\n */\nfunction applySubmissionChange(current: SubmissionRecord, change: SubmissionChange): SubmissionRecord {\n\tif (current.status === \"done\" || current.status === \"unanswered\") return current;\n\tif (change.status === \"placed\") {\n\t\tif (current.status !== \"queued\") throw new Error(`Submission ${current.id} is not queued`);\n\t\tconst status = current.type === \"input\" ? \"placed\" : \"done\";\n\t\treturn { ...current, status, entry: change.entry } as SubmissionRecord;\n\t}\n\tif (change.status === \"done\" && current.status !== \"placed\") {\n\t\tthrow new Error(`Submission ${current.id} is not a placed input`);\n\t}\n\t// Queued and placed records carry no answer, reason, or detail; an unanswered input keeps its entry.\n\treturn { ...current, ...change } as SubmissionRecord;\n}\n\nconst INTERNAL_SCAN_PAGE_SIZE = 256;\nconst EMPTY_OPERATIONS: readonly Op[] = [];\nconst TABLE_JSON_COPY_OPTIONS = { omitUndefinedProperties: true } as const;\n\n/** One committed document incarnation owned by the Session tracker cache. */\nexport type LoadedDocument = {\n\treadonly addressId: string;\n\treadonly record: DocumentRecord;\n\t/** Persisted definition version; older while the tracked value is migrated only in memory. */\n\tstoredVersion: number;\n\t/** Definition version whose shape the tracked value has; access with another version reloads from Storage. */\n\treadonly valueVersion: number;\n\t/** Stored deltas after the newest base; advanced by adoption so the next predicate call needs no read. */\n\tdeltasSinceBase: number;\n\treadonly tracker: Tracker<JsonObject>;\n};\n\n/** Session services used by a transaction while it holds the mutation line. */\nexport interface TransactionHost {\n\treadonly storage: Storage;\n\t/** Wall clock for task lifecycle times. */\n\tnow(): number;\n\t/** Return the cached current incarnation without loading. */\n\tcached(addressId: string): LoadedDocument | undefined;\n\t/** Return the cached current incarnation, cold-loading and migrating it when necessary. */\n\tload(\n\t\tdefinition: AnyDocDefinition,\n\t\taddressId: string,\n\t\taddress: DocumentAddress,\n\t\tcontext: Context,\n\t): Promise<LoadedDocument | undefined>;\n\t/** Install a newly committed incarnation. */\n\tinstall(document: LoadedDocument): void;\n\t/** Remove a retired incarnation if it is still the cached occupant of its address. */\n\tevict(addressId: string, recordId: DocumentId): void;\n\t/** Stage writes that belong to every newly created or forked conversation, in its creating transaction. */\n\tconversationCreated(tx: Transaction, record: ConversationRecord): Promise<void>;\n}\n\n/** Committed and candidate state for one task touched by this transaction. */\ntype TransactionTask = {\n\tcommittedRead?: Promise<AnyTaskRecord | undefined>;\n\twrite?: { readonly kind: \"create\" | \"replace\"; readonly record: AnyTaskRecord };\n\tpublicationConversationId?: ConversationId;\n};\n\n/** Defaults a commit binds to: `tx.createTask()` conversation and the task attributed to appended entries. */\nexport type TransactionScope = {\n\treadonly conversationId?: ConversationId;\n\t/** Task whose runtime commit this is; stamped as `byTaskId` on appended entries. */\n\treadonly taskId?: TaskId;\n};\n\n/** Storage/cache provenance of one staged document incarnation. */\ntype DocumentTarget =\n\t| { readonly kind: \"loaded\"; readonly document: LoadedDocument }\n\t| {\n\t\t\treadonly kind: \"created\";\n\t\t\treadonly record: DocumentCreate;\n\t\t\treadonly version: number;\n\t\t\treadonly tracker: Tracker<JsonObject>;\n\t }\n\t| {\n\t\t\treadonly kind: \"fork-copy\";\n\t\t\treadonly record: DocumentCreate;\n\t\t\treadonly source: DocumentCopySource;\n\t }\n\t| { readonly kind: \"retire-only\"; readonly record: DocumentRecord };\n\n/** One document incarnation acquired, created, or retired by this transaction. */\ntype DocumentEntry = {\n\treadonly addressId: string;\n\treadonly address: DocumentAddress;\n\t/** Absent for definition-free fork copies and retirement entries discovered by a terminal-task scan. */\n\tdefinition?: AnyDocDefinition;\n\t/** Memoized public acquisition; absent for metadata-only retirement. */\n\tdraftPromise?: Promise<Draft<JsonObject>>;\n\t/** Set after acquisition or retirement lookup finds the affected incarnation. */\n\ttarget?: DocumentTarget;\n\tchange?: Change<JsonObject>;\n\tprepared?: Prepared<JsonObject>;\n\tretireOnCommit: boolean;\n};\n\n/**\n * What one staged incarnation writes and publishes, decided once before Storage admission so adoption only applies it.\n * `record` is a `DocumentRecord` for an incarnation that is already committed and a `DocumentCreate` for a new one.\n */\ntype DocumentPlan = {\n\treadonly addressId: string;\n\treadonly record: DocumentCreate | DocumentRecord;\n\tretire: boolean;\n\t/** Creation, copy, or change content; absent when only retirement is written. */\n\tcontent?: Extract<StorageWrite, { readonly type: \"document.create\" | \"document.copy\" | \"document.change\" }>;\n\t/** Prepared change of a tracked incarnation; absent for fork copies and retirement-only entries. */\n\treadonly change?: {\n\t\treadonly tracker: Tracker<JsonObject>;\n\t\treadonly prepared: Prepared<JsonObject>;\n\t\treadonly version: number;\n\t\t/** The cached incarnation this change updates; absent when it creates one. */\n\t\treadonly loaded?: LoadedDocument;\n\t\treadonly definition?: AnyDocDefinition;\n\t};\n\t/** Resolved before Storage admission so adoption performs no reads. */\n\tconversationId?: ConversationId;\n};\n\n/**\n * Transaction for one Session commit callback.\n *\n * Every asynchronous operation is tracked so callback settlement can reject and drain unfinished work. Session calls\n * one settlement method, then either discards prepared changes or adopts them once after Storage succeeds.\n */\nexport class Transaction implements Tx {\n\treadonly #host: TransactionHost;\n\treadonly #context: Context;\n\treadonly #scope: TransactionScope;\n\treadonly #pendingOperations = new Set<Promise<unknown>>();\n\t#sealed = false;\n\t#hasTableWrite = false;\n\n\t/** Atomic batch; conversation and entry writes stage eagerly, while task and document writes assemble later. */\n\treadonly #writes: StorageWrite[] = [];\n\treadonly #createdConversationIds = new Set<ConversationId>();\n\treadonly #forkSourceConversationIds = new Set<ConversationId>();\n\treadonly #forkSourceDocumentIds = new Set<DocumentId>();\n\t/** One entry per task touched by a public read, candidate write, or document-owner lookup. */\n\treadonly #tasksById = new Map<TaskId, TransactionTask>();\n\t/** Submissions created by this transaction, by ID. */\n\treadonly #submissions = new Map<SubmissionId, SubmissionRecord>();\n\t/** Submission settlements and placements in staging order; resolved against the latest candidate record during assembly. */\n\treadonly #submissionChanges: { readonly id: SubmissionId; readonly change: SubmissionChange }[] = [];\n\n\t/** Write and publication plans of every staged incarnation, built during assembly. */\n\treadonly #plans: DocumentPlan[] = [];\n\t/** Every document acquisition or retirement marker in staging order. */\n\treadonly #documents: DocumentEntry[] = [];\n\t/** Latest transaction-local incarnation or retirement marker at each logical address. */\n\treadonly #latestDocumentByAddress = new Map<string, DocumentEntry>();\n\n\tconstructor(host: TransactionHost, context: Context, scope: TransactionScope = {}) {\n\t\tthis.#host = host;\n\t\tthis.#context = context;\n\t\tthis.#scope = scope;\n\t}\n\n\t// ─── Table reads ────────────────────────────────────────────────────────\n\n\tconversation(id: ConversationId): Promise<ConversationRecord | undefined> {\n\t\treturn this.#read(\"conversation\", () => this.#host.storage.conversation(id, this.#context));\n\t}\n\n\tentry(id: EntryId): Promise<EntryRecord | undefined>;\n\tentry<D extends JsonValue>(token: Entry<D>, id: EntryId): Promise<TypedEntry<D> | undefined>;\n\tentry(first: EntryId | { readonly kind: string }, second?: EntryId): Promise<EntryRecord | undefined> {\n\t\tconst kind = typeof first === \"number\" ? undefined : first.kind;\n\t\tconst id = typeof first === \"number\" ? first : second!;\n\t\treturn this.#read(\"entry\", async () => {\n\t\t\tconst entry = (await this.#host.storage.entry(id, this.#context))?.entry;\n\t\t\treturn kind === undefined || entry?.kind === kind ? entry : undefined;\n\t\t});\n\t}\n\n\ttask(id: TaskId): Promise<AnyTaskRecord | undefined> {\n\t\treturn this.#read(\"task\", () => this.#committedTask(id));\n\t}\n\n\tscanConversations(query: ConversationQuery, limit: number, cursor?: Cursor) {\n\t\treturn this.#read(\"scanConversations\", () =>\n\t\t\tthis.#host.storage.scanConversations(query, limit, cursor, this.#context),\n\t\t);\n\t}\n\n\tscanEntries(query: EntryQuery, limit: number, cursor?: Cursor) {\n\t\treturn this.#read(\"scanEntries\", () => this.#host.storage.scanEntries(query, limit, cursor, this.#context));\n\t}\n\n\tlatestHeadMarker(conversationId: ConversationId) {\n\t\treturn this.#read(\"latestHeadMarker\", () =>\n\t\t\tthis.#host.storage.findLatestHeadMarker(conversationId, undefined, this.#context),\n\t\t);\n\t}\n\n\tscanTasks(query: TaskQuery, limit: number, cursor?: Cursor) {\n\t\treturn this.#read(\"scanTasks\", () => this.#host.storage.scanTasks(query, limit, cursor, this.#context));\n\t}\n\n\t/** Internal: committed submission record. */\n\tsubmission(id: SubmissionId): Promise<SubmissionRecord | undefined> {\n\t\treturn this.#read(\"submission\", () => this.#host.storage.submission(id, this.#context));\n\t}\n\n\t/** Committed submission with a conversation-scoped request ID. */\n\tsubmissionByRequest(conversationId: ConversationId, requestId: string): Promise<SubmissionRecord | undefined> {\n\t\treturn this.#read(\"submissionByRequest\", () =>\n\t\t\tthis.#host.storage.submissionByRequest(conversationId, requestId, this.#context),\n\t\t);\n\t}\n\n\t// ─── Table writes ───────────────────────────────────────────────────────\n\n\tcreateConversation(options: { readonly ownership: ConversationOwnership }): Promise<ConversationRecord> {\n\t\treturn this.#write(() => this.#stageConversation(undefined, options.ownership));\n\t}\n\n\t/** Internal final-form bootstrap path for the reserved root identity. */\n\tcreateRootConversation(): Promise<ConversationRecord> {\n\t\treturn this.#write(() => this.#stageConversation(undefined, { kind: \"ownerless\" }, ROOT_CONVERSATION_ID));\n\t}\n\n\tforkConversation(\n\t\tparentConversationId: ConversationId,\n\t\tat: EntryId,\n\t\toptions: { readonly ownership: ConversationOwnership },\n\t): Promise<ConversationRecord> {\n\t\treturn this.#write(() =>\n\t\t\tthis.#stageConversation({ conversationId: parentConversationId, at }, options.ownership),\n\t\t);\n\t}\n\n\tasync #stageConversation(\n\t\tparent: NonNullable<ConversationRecord[\"parent\"]> | undefined,\n\t\townership: ConversationOwnership,\n\t\treservedId?: ConversationId,\n\t): Promise<ConversationRecord> {\n\t\tconst ownerTaskId = ownership.kind === \"task\" ? ownership.taskId : undefined;\n\t\tconst id = reservedId ?? (await this.#host.storage.mintId<ConversationId>());\n\t\tthis.#assertOpen();\n\t\tlet owner: ConversationRecord[\"owner\"];\n\t\tif (ownerTaskId !== undefined) {\n\t\t\tconst task = await this.#currentTask(ownerTaskId);\n\t\t\tthis.#assertOpen();\n\t\t\tif (task === undefined) throw new Error(`Conversation owner task ${ownerTaskId} does not exist`);\n\t\t\towner = { conversationId: task.conversationId, taskId: ownerTaskId };\n\t\t}\n\t\tconst record: ConversationRecord = {\n\t\t\tid,\n\t\t\t...(parent === undefined ? {} : { parent }),\n\t\t\t...(owner === undefined ? {} : { owner }),\n\t\t};\n\t\tconst copies =\n\t\t\tparent === undefined\n\t\t\t\t? []\n\t\t\t\t: await prepareForkDocumentCopies(this.#host.storage, parent.conversationId, parent.at, id, this.#context);\n\t\tthis.#assertOpen();\n\t\tfor (const copy of copies) {\n\t\t\tthis.#forkSourceDocumentIds.add(copy.source.id);\n\t\t\tconst entry: DocumentEntry = {\n\t\t\t\taddressId: addressId(copy.record),\n\t\t\t\taddress: copy.record,\n\t\t\t\ttarget: { kind: \"fork-copy\", ...copy },\n\t\t\t\tretireOnCommit: false,\n\t\t\t};\n\t\t\tthis.#documents.push(entry);\n\t\t\tthis.#latestDocumentByAddress.set(entry.addressId, entry);\n\t\t}\n\t\tif (parent !== undefined) this.#forkSourceConversationIds.add(parent.conversationId);\n\t\tthis.#createdConversationIds.add(id);\n\t\tthis.#writes.push({ type: \"conversation\", value: record });\n\t\tawait this.#host.conversationCreated(this, record);\n\t\tthis.#assertOpen();\n\t\treturn record;\n\t}\n\n\tappendEntry(conversationId: ConversationId, value: EntryDraft): Promise<EntryRecord>;\n\tappendEntry<D extends JsonValue>(\n\t\ttoken: Entry<D>,\n\t\tconversationId: ConversationId,\n\t\tvalue: TypedEntryDraft<NoInfer<D>>,\n\t): Promise<TypedEntry<D>>;\n\tappendEntry(\n\t\tfirst: ConversationId | { readonly kind: string },\n\t\tsecond: ConversationId | EntryDraft,\n\t\tthird?: object,\n\t): Promise<EntryRecord> {\n\t\tif (typeof first === \"number\") return this.#appendEntry(first, second as EntryDraft);\n\t\treturn this.#appendEntry(second as ConversationId, { ...third, kind: first.kind } as EntryDraft);\n\t}\n\n\t#appendEntry(conversationId: ConversationId, value: EntryDraft): Promise<EntryRecord> {\n\t\treturn this.#write(async () => {\n\t\t\tawait this.#requireConversation(conversationId);\n\t\t\tthis.#assertOpen();\n\t\t\tconst id = await this.#host.storage.mintId<EntryId>();\n\t\t\tthis.#assertOpen();\n\t\t\tconst { head, ...rest } = value;\n\t\t\t// Undefined `head` and `byTaskId` are omitted by the copy.\n\t\t\tconst record = copyJson(\n\t\t\t\t{\n\t\t\t\t\t...rest,\n\t\t\t\t\tid,\n\t\t\t\t\tconversationId,\n\t\t\t\t\thead: head === \"self\" ? id : head,\n\t\t\t\t\tbyTaskId: this.#scope.taskId,\n\t\t\t\t},\n\t\t\t\tTABLE_JSON_COPY_OPTIONS,\n\t\t\t) as unknown as EntryRecord;\n\t\t\tthis.#writes.push({ type: \"entry\", value: record });\n\t\t\treturn record;\n\t\t});\n\t}\n\n\tcreateTask<I, S extends { phase: string }, R, H extends object>(\n\t\ttask: Task<I, S, R, H>,\n\t\tinput: I,\n\t\toptions: TaskOptions,\n\t): Promise<TaskId<R>> {\n\t\treturn this.#write(async () => {\n\t\t\tconst ownership = options.ownership;\n\t\t\tlet owner: AnyTaskRecord | undefined;\n\t\t\tif (ownership.kind === \"task\") {\n\t\t\t\t// Validated again against the owner's final candidate during assembly.\n\t\t\t\towner = await this.#currentTask(ownership.taskId);\n\t\t\t\tthis.#assertOpen();\n\t\t\t\tif (owner === undefined) throw new Error(`Task owner ${ownership.taskId} does not exist`);\n\t\t\t\tif (options.background === true) throw new TypeError(\"A child task cannot be background\");\n\t\t\t\tif (options.conversationId !== undefined && options.conversationId !== owner.conversationId) {\n\t\t\t\t\tthrow new Error(`A child task lives in its owner's conversation ${owner.conversationId}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst conversationId = owner?.conversationId ?? options.conversationId ?? this.#scope.conversationId;\n\t\t\tif (conversationId === undefined) throw new TypeError(\"Tx.createTask() requires options.conversationId\");\n\t\t\tawait this.#requireConversation(conversationId);\n\t\t\tthis.#assertOpen();\n\t\t\tconst definition = task.definition;\n\t\t\tconst checkpoint = definition.initial(input);\n\t\t\tconst id = await this.#host.storage.mintId<TaskId<R>>();\n\t\t\tthis.#assertOpen();\n\t\t\tconst record = copyJson(\n\t\t\t\t{\n\t\t\t\t\tid,\n\t\t\t\t\tconversationId,\n\t\t\t\t\tkind: definition.name,\n\t\t\t\t\tversion: definition.version,\n\t\t\t\t\tinput,\n\t\t\t\t\t...(owner === undefined ? {} : { owner: owner.id }),\n\t\t\t\t\tbackground: options.background ?? false,\n\t\t\t\t\tabortRequested: false,\n\t\t\t\t\t...(options.abandonOnRestart === true ? { abandonOnRestart: true } : {}),\n\t\t\t\t\tstate: { status: \"pending\", checkpoint },\n\t\t\t\t},\n\t\t\t\tTABLE_JSON_COPY_OPTIONS,\n\t\t\t) as unknown as AnyTaskRecord;\n\t\t\tthis.#tasksById.set(id, { write: { kind: \"create\", record } });\n\t\t\treturn id;\n\t\t});\n\t}\n\n\t/** Create a raw submission record with a fresh ID; no admission rules apply. */\n\tcreateSubmission(create: SubmissionCreate): Promise<SubmissionRecord> {\n\t\treturn this.#write(async () => {\n\t\t\tawait this.#requireConversation(create.conversationId);\n\t\t\tthis.#assertOpen();\n\t\t\tconst id = await this.#host.storage.mintId<SubmissionId>();\n\t\t\tthis.#assertOpen();\n\t\t\tconst record = copyJson({ ...create, id }, TABLE_JSON_COPY_OPTIONS) as unknown as SubmissionRecord;\n\t\t\tthis.#submissions.set(id, record);\n\t\t\treturn record;\n\t\t});\n\t}\n\n\t/**\n\t * Settle a submission. Resolved during assembly against the transaction's latest candidate record, falling back to\n\t * committed state, so it is not a caller table read and works after the first table write.\n\t */\n\tsettleSubmission(id: SubmissionId, settlement: SubmissionSettlement): void {\n\t\tthis.#assertOpen();\n\t\tthis.#hasTableWrite = true;\n\t\tthis.#submissionChanges.push({ id, change: copyJson(settlement) as SubmissionSettlement });\n\t}\n\n\t/** Place a queued submission at `entry`; resolved during assembly like `settleSubmission()`. */\n\tplaceSubmission(id: SubmissionId, entry: EntryId): void {\n\t\tthis.#assertOpen();\n\t\tthis.#hasTableWrite = true;\n\t\tthis.#submissionChanges.push({ id, change: { status: \"placed\", entry } });\n\t}\n\n\t/** Internal: replace one task record completely. Tasks change their own state through their runtime. */\n\tsetTask(value: AnyTaskRecord): void {\n\t\tthis.#assertOpen();\n\t\tthis.#hasTableWrite = true;\n\t\tconst task = this.#taskEntry(value.id);\n\t\tconst candidate = task.write?.record;\n\t\tif (candidate?.state.status === \"terminal\") {\n\t\t\tthrow new Error(`Task ${value.id} already has a terminal candidate`);\n\t\t}\n\t\tif (candidate !== undefined && candidate.conversationId !== value.conversationId) {\n\t\t\tthrow new Error(`Task ${value.id} cannot change conversations`);\n\t\t}\n\t\ttask.write = {\n\t\t\tkind: task.write?.kind === \"create\" ? \"create\" : \"replace\",\n\t\t\trecord: copyJson(this.#stampTimes(value, candidate), TABLE_JSON_COPY_OPTIONS) as unknown as AnyTaskRecord,\n\t\t};\n\t}\n\n\t/** Internal: candidate records of the tasks this transaction created or replaced so far. */\n\tstagedTasks(): AnyTaskRecord[] {\n\t\tconst records: AnyTaskRecord[] = [];\n\t\tfor (const task of this.#tasksById.values()) if (task.write !== undefined) records.push(task.write.record);\n\t\treturn records;\n\t}\n\n\t/** Internal: conversations this transaction created or forked so far. */\n\tstagedConversations(): ConversationRecord[] {\n\t\tconst records: ConversationRecord[] = [];\n\t\tfor (const write of this.#writes) if (write.type === \"conversation\") records.push(write.value);\n\t\treturn records;\n\t}\n\n\t// ─── Documents ──────────────────────────────────────────────────────────\n\tdoc<T extends JsonObject>(token: SessionDocToken<T>): Promise<Draft<T>>;\n\tdoc<T extends JsonObject>(token: ConversationDocToken<T>, conversationId: ConversationId): Promise<Draft<T>>;\n\tdoc<T extends JsonObject>(token: TaskDocToken<T>, taskId: TaskId): Promise<Draft<T>>;\n\tdoc<T extends JsonObject, I extends JsonValue>(\n\t\ttoken: SessionDocFamilyToken<T, I>,\n\t\tkey: string,\n\t\tseed: I,\n\t): Promise<Draft<T>>;\n\tdoc<T extends JsonObject, I extends JsonValue>(\n\t\ttoken: ConversationDocFamilyToken<T, I>,\n\t\tconversationId: ConversationId,\n\t\tkey: string,\n\t\tseed: I,\n\t): Promise<Draft<T>>;\n\tdoc<T extends JsonObject, I extends JsonValue>(\n\t\ttoken: TaskDocFamilyToken<T, I>,\n\t\ttaskId: TaskId,\n\t\tkey: string,\n\t\tseed: I,\n\t): Promise<Draft<T>>;\n\tdoc(token: AnyDocToken, ...args: readonly unknown[]): Promise<Draft<JsonObject>> {\n\t\ttry {\n\t\t\tthis.#assertOpen();\n\t\t\tconst definition = token.definition;\n\t\t\tconst resolved = resolveAddress(definition, args);\n\t\t\tthis.#assertTaskDocumentsOpen(resolved);\n\t\t\tconst latest = this.#latestDocumentByAddress.get(resolved.id);\n\t\t\tif (latest !== undefined && !latest.retireOnCommit) {\n\t\t\t\tif (latest.draftPromise !== undefined) return latest.draftPromise;\n\t\t\t\tif (latest.target?.kind === \"fork-copy\") {\n\t\t\t\t\tlatest.draftPromise = this.#track(this.#acquireForkCopy(latest, definition, latest.target));\n\t\t\t\t\treturn latest.draftPromise;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst seed = definition.family === true ? copyJson(args[resolved.nextArgument]) : undefined;\n\t\t\tconst docEntry: DocumentEntry = {\n\t\t\t\taddressId: resolved.id,\n\t\t\t\taddress: resolved.address,\n\t\t\t\tdefinition,\n\t\t\t\tretireOnCommit: false,\n\t\t\t};\n\t\t\tthis.#documents.push(docEntry);\n\t\t\tthis.#latestDocumentByAddress.set(docEntry.addressId, docEntry);\n\t\t\t// Capture retirement before awaiting so a pending old acquisition and its replacement stay distinct.\n\t\t\tdocEntry.draftPromise = this.#track(this.#acquire(docEntry, seed, latest?.retireOnCommit === true));\n\t\t\treturn docEntry.draftPromise;\n\t\t} catch (error) {\n\t\t\treturn Promise.reject(error);\n\t\t}\n\t}\n\n\tretireDoc<T extends JsonObject>(token: SessionDocToken<T>): Promise<void>;\n\tretireDoc<T extends JsonObject>(token: ConversationDocToken<T>, conversationId: ConversationId): Promise<void>;\n\tretireDoc<T extends JsonObject>(token: TaskDocToken<T>, taskId: TaskId): Promise<void>;\n\tretireDoc<T extends JsonObject, I extends JsonValue>(token: SessionDocFamilyToken<T, I>, key: string): Promise<void>;\n\tretireDoc<T extends JsonObject, I extends JsonValue>(\n\t\ttoken: ConversationDocFamilyToken<T, I>,\n\t\tconversationId: ConversationId,\n\t\tkey: string,\n\t): Promise<void>;\n\tretireDoc<T extends JsonObject, I extends JsonValue>(\n\t\ttoken: TaskDocFamilyToken<T, I>,\n\t\ttaskId: TaskId,\n\t\tkey: string,\n\t): Promise<void>;\n\tretireDoc(token: AnyDocToken, ...args: readonly unknown[]): Promise<void> {\n\t\ttry {\n\t\t\tthis.#assertOpen();\n\t\t\tconst definition = token.definition;\n\t\t\tconst resolved = resolveAddress(definition, args);\n\t\t\tconst latest = this.#latestDocumentByAddress.get(resolved.id);\n\t\t\tif (latest?.retireOnCommit) return Promise.resolve();\n\t\t\tif (latest?.target?.kind === \"fork-copy\") {\n\t\t\t\tcheckRecordScope(definition, latest.target.record);\n\t\t\t\tlatest.retireOnCommit = true;\n\t\t\t\treturn Promise.resolve();\n\t\t\t}\n\t\t\tif (latest?.draftPromise !== undefined) {\n\t\t\t\t// Retirement of an acquired draft persists its final content before retirement.\n\t\t\t\tlatest.retireOnCommit = true;\n\t\t\t\treturn this.#track(latest.draftPromise.then(() => undefined));\n\t\t\t}\n\t\t\tconst entry: DocumentEntry = {\n\t\t\t\taddressId: resolved.id,\n\t\t\t\taddress: resolved.address,\n\t\t\t\tdefinition,\n\t\t\t\tretireOnCommit: true,\n\t\t\t};\n\t\t\tthis.#documents.push(entry);\n\t\t\tthis.#latestDocumentByAddress.set(entry.addressId, entry);\n\t\t\treturn this.#track(this.#findRetirement(entry));\n\t\t} catch (error) {\n\t\t\treturn Promise.reject(error);\n\t\t}\n\t}\n\n\tasync #acquire(entry: DocumentEntry, seed: JsonValue | undefined, skipLoad: boolean): Promise<Draft<JsonObject>> {\n\t\tconst definition = entry.definition!;\n\t\tconst loaded = skipLoad\n\t\t\t? undefined\n\t\t\t: await this.#host.load(definition, entry.addressId, entry.address, this.#context);\n\t\tthis.#assertOpen();\n\t\tif (loaded !== undefined) {\n\t\t\tcheckRecordScope(definition, loaded.record);\n\t\t\tcheckRecordVersion(definition, loaded.record, loaded.storedVersion);\n\t\t\tentry.target = { kind: \"loaded\", document: loaded };\n\t\t\tentry.change = loaded.tracker.beginChange();\n\t\t\treturn entry.change.state;\n\t\t}\n\t\tconst scope = entry.address.scope;\n\t\tif (scope.kind === \"conversation\") await this.#requireConversation(scope.conversationId);\n\t\tif (scope.kind === \"task\") {\n\t\t\tconst task = await this.#currentTask(scope.taskId);\n\t\t\tif (task === undefined) throw new Error(`Task ${scope.taskId} does not exist`);\n\t\t\tif (task.state.status === \"terminal\") throw new Error(`Task ${scope.taskId} is terminal`);\n\t\t}\n\t\tthis.#assertOpen();\n\t\tconst value = copyJson(\n\t\t\tdefinition.family === true ? definition.initial(seed) : definition.initial(),\n\t\t) as JsonObject;\n\t\tconst id = await this.#host.storage.mintId<DocumentId>();\n\t\tthis.#assertOpen();\n\t\tconst tracker = track(value);\n\t\tentry.target = {\n\t\t\tkind: \"created\",\n\t\t\trecord: documentCreate(definition, entry.address, id),\n\t\t\tversion: definition.version,\n\t\t\ttracker,\n\t\t};\n\t\tentry.change = tracker.beginChange();\n\t\treturn entry.change.state;\n\t}\n\n\tasync #acquireForkCopy(\n\t\tentry: DocumentEntry,\n\t\tdefinition: AnyDocDefinition,\n\t\ttarget: Extract<DocumentTarget, { readonly kind: \"fork-copy\" }>,\n\t): Promise<Draft<JsonObject>> {\n\t\tconst stored = await this.#host.storage.document(target.source.id, target.source.at, this.#context);\n\t\tthis.#assertOpen();\n\t\tif (stored === undefined) {\n\t\t\tthrow new Error(`Fork source document ${target.source.id} cannot be read`);\n\t\t}\n\t\tif (\n\t\t\tstored.record.scope.kind !== \"conversation\" ||\n\t\t\tstored.record.kind !== target.record.kind ||\n\t\t\tstored.record.key !== target.record.key ||\n\t\t\tstored.record.history !== target.record.history ||\n\t\t\tstored.record.fork !== target.record.fork\n\t\t) {\n\t\t\tthrow new Error(`Fork source document ${target.source.id} does not match the copied record`);\n\t\t}\n\t\tconst value = materializeDocumentValue(definition, target.record, stored.version, stored.value);\n\t\tconst tracker = track(value);\n\t\tentry.definition = definition;\n\t\tentry.target = { kind: \"created\", record: target.record, version: definition.version, tracker };\n\t\tentry.change = tracker.beginChange();\n\t\treturn entry.change.state;\n\t}\n\n\tasync #findRetirement(entry: DocumentEntry): Promise<void> {\n\t\tconst record =\n\t\t\tthis.#host.cached(entry.addressId)?.record ??\n\t\t\t(await this.#host.storage.findDocument(entry.address, \"current\", this.#context));\n\t\tthis.#assertOpen();\n\t\tif (record === undefined) return;\n\t\tcheckRecordScope(entry.definition!, record);\n\t\tentry.target = { kind: \"retire-only\", record };\n\t}\n\n\t// ─── Settlement ─────────────────────────────────────────────────────────\n\n\t/** Seal after callback failure: abort every change and observe every pending operation. */\n\tasync settleFailure(): Promise<void> {\n\t\tthis.#sealed = true;\n\t\tthis.#abortChanges();\n\t\tawait Promise.allSettled(this.#pendingOperations);\n\t}\n\n\t/**\n\t * Seal after callback success, prepare every open change, and assemble the atomic batch.\n\t * Any failure aborts every change before Storage admission.\n\t */\n\tasync settleSuccess(): Promise<readonly StorageWrite[]> {\n\t\tthis.#sealed = true;\n\t\tif (this.#pendingOperations.size > 0) {\n\t\t\tthis.#abortChanges();\n\t\t\tawait Promise.allSettled(this.#pendingOperations);\n\t\t\tthrow new Error(\"Session commit callback settled before its pending Tx operations\");\n\t\t}\n\t\ttry {\n\t\t\t// Synchronously prepare every open change; this revokes every draft.\n\t\t\tfor (const document of this.#documents) {\n\t\t\t\tif (document.change !== undefined) document.prepared = document.change.prepare();\n\t\t\t}\n\t\t\treturn await this.#assemble();\n\t\t} catch (error) {\n\t\t\tthis.#abortChanges();\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/** Abort every prepared change after Storage failure or when no write is required. */\n\tdiscard(): void {\n\t\tthis.#abortChanges();\n\t}\n\n\t/** Adopt every prepared change by pointer swap after Storage success and describe the publication. */\n\tadopt(seq: Seq): DocumentCommitChange[] {\n\t\tconst publications: DocumentCommitChange[] = [];\n\t\tfor (const plan of this.#plans) {\n\t\t\tconst committed = \"createdAt\" in plan.record;\n\t\t\tlet record: DocumentRecord = committed ? (plan.record as DocumentRecord) : { ...plan.record, createdAt: seq };\n\t\t\tif (plan.retire) record = { ...record, retiredAt: seq };\n\t\t\tconst change = plan.change;\n\t\t\tif (change !== undefined) {\n\t\t\t\tconst { tracker, prepared, loaded, version } = change;\n\t\t\t\t// A new incarnation is adopted unless it retires in the same commit; a loaded one only when it changed.\n\t\t\t\tif (loaded === undefined ? !plan.retire : prepared.ops.length > 0) tracker.adopt(prepared);\n\t\t\t\telse prepared.abort();\n\t\t\t\tif (loaded !== undefined) {\n\t\t\t\t\tif (loaded.storedVersion < version) loaded.storedVersion = version;\n\t\t\t\t\tif (plan.content?.type === \"document.change\") {\n\t\t\t\t\t\tif (plan.content.content.kind === \"base\") loaded.deltasSinceBase = 0;\n\t\t\t\t\t\telse loaded.deltasSinceBase++;\n\t\t\t\t\t}\n\t\t\t\t} else if (!plan.retire) {\n\t\t\t\t\tthis.#host.install({\n\t\t\t\t\t\taddressId: plan.addressId,\n\t\t\t\t\t\trecord,\n\t\t\t\t\t\tstoredVersion: version,\n\t\t\t\t\t\tvalueVersion: version,\n\t\t\t\t\t\tdeltasSinceBase: 0,\n\t\t\t\t\t\ttracker,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst conversationId = plan.conversationId;\n\t\t\tif (plan.retire) {\n\t\t\t\tif (committed) this.#host.evict(plan.addressId, record.id);\n\t\t\t\tconst retired = { version: undefined, value: null, ops: EMPTY_OPERATIONS };\n\t\t\t\tpublications.push({ type: \"document\", record, conversationId, ...retired });\n\t\t\t} else if (plan.content?.type === \"document.copy\") {\n\t\t\t\tpublications.push({\n\t\t\t\t\ttype: \"document.copy\",\n\t\t\t\t\trecord,\n\t\t\t\t\tconversationId: conversationId!,\n\t\t\t\t\tsource: plan.content.source,\n\t\t\t\t});\n\t\t\t} else if (change !== undefined && publishes(plan)) {\n\t\t\t\tconst ops = change.loaded === undefined ? EMPTY_OPERATIONS : change.prepared.ops;\n\t\t\t\tpublications.push({\n\t\t\t\t\ttype: \"document\",\n\t\t\t\t\trecord,\n\t\t\t\t\tconversationId,\n\t\t\t\t\tversion: change.version,\n\t\t\t\t\tvalue: change.prepared.value,\n\t\t\t\t\tops,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn publications;\n\t}\n\n\tasync #assemble(): Promise<StorageWrite[]> {\n\t\tconst storage = this.#host.storage;\n\t\tconst plans = this.#plans;\n\t\tfor (const document of this.#documents) {\n\t\t\tconst plan = planDocument(document);\n\t\t\tif (plan !== undefined) plans.push(plan);\n\t\t}\n\t\tthis.#rejectForkSourceWrites(plans);\n\t\tawait this.#validateOwners();\n\t\tfor (const [id, task] of this.#tasksById) {\n\t\t\tif (task.write?.kind !== \"replace\") continue;\n\t\t\tconst committed = await this.#committedTask(id);\n\t\t\tif (committed === undefined) throw new Error(`Task ${id} does not exist`);\n\t\t\tif (committed.state.status === \"terminal\") throw new Error(`Task ${id} is already terminal`);\n\t\t\tif (committed.conversationId !== task.write.record.conversationId) {\n\t\t\t\tthrow new Error(`Task ${id} cannot change conversations`);\n\t\t\t}\n\t\t}\n\n\t\t// Terminal settlement retires every task document, including ones created by this transaction.\n\t\tconst terminalTaskIds = new Set<TaskId>();\n\t\tfor (const task of this.#tasksById.values()) {\n\t\t\tif (task.write?.record.state.status === \"terminal\") terminalTaskIds.add(task.write.record.id);\n\t\t}\n\t\tif (terminalTaskIds.size > 0) {\n\t\t\tconst retiring = new Set<DocumentId>();\n\t\t\tfor (const plan of plans) {\n\t\t\t\tconst scope = plan.record.scope;\n\t\t\t\tif (scope.kind !== \"task\" || !terminalTaskIds.has(scope.taskId)) continue;\n\t\t\t\tplan.retire = true;\n\t\t\t\tretiring.add(plan.record.id);\n\t\t\t}\n\t\t\tfor (const taskId of terminalTaskIds) {\n\t\t\t\tif (this.#tasksById.get(taskId)?.write?.kind === \"create\") continue;\n\t\t\t\tlet cursor: Cursor | undefined;\n\t\t\t\tdo {\n\t\t\t\t\tconst page = await storage.scanDocuments(\n\t\t\t\t\t\t{ scope: { kind: \"task\", taskId }, at: \"current\" },\n\t\t\t\t\t\tINTERNAL_SCAN_PAGE_SIZE,\n\t\t\t\t\t\tcursor,\n\t\t\t\t\t\tthis.#context,\n\t\t\t\t\t);\n\t\t\t\t\tfor (const record of page.items) {\n\t\t\t\t\t\tif (retiring.has(record.id)) continue;\n\t\t\t\t\t\tplans.push({ addressId: addressId(record), record, retire: true });\n\t\t\t\t\t\tretiring.add(record.id);\n\t\t\t\t\t}\n\t\t\t\t\tcursor = page.next;\n\t\t\t\t} while (cursor !== undefined);\n\t\t\t}\n\t\t}\n\n\t\t// Resolve publication ownership before Storage admission so adoption remains synchronous.\n\t\tfor (const plan of plans) {\n\t\t\tif (!publishes(plan)) continue;\n\t\t\tconst scope = plan.record.scope;\n\t\t\tif (scope.kind === \"conversation\") plan.conversationId = scope.conversationId;\n\t\t\tif (scope.kind !== \"task\") continue;\n\t\t\tconst task = this.#taskEntry(scope.taskId);\n\t\t\tif (task.publicationConversationId === undefined) {\n\t\t\t\tconst current = await this.#currentTask(scope.taskId);\n\t\t\t\tif (current !== undefined) task.publicationConversationId = current.conversationId;\n\t\t\t}\n\t\t\tplan.conversationId = task.publicationConversationId;\n\t\t}\n\n\t\tfor (const { id, change } of this.#submissionChanges) {\n\t\t\tconst current = this.#submissions.get(id) ?? (await storage.submission(id, this.#context));\n\t\t\tif (current === undefined) throw new Error(`Submission ${id} does not exist`);\n\t\t\tconst next = applySubmissionChange(current, change);\n\t\t\tif (next !== current) this.#submissions.set(id, next);\n\t\t}\n\n\t\tconst writes = this.#writes;\n\t\tfor (const value of this.#submissions.values()) writes.push({ type: \"submission\", value });\n\t\tfor (const task of this.#tasksById.values()) {\n\t\t\tif (task.write !== undefined) writes.push({ type: \"task\", value: task.write.record });\n\t\t}\n\t\tfor (const plan of plans) {\n\t\t\tconst change = plan.change;\n\t\t\t// Checkpoint predicates run last, after every validation.\n\t\t\tif (plan.content?.type === \"document.change\" && plan.content.content.kind === \"delta\" && change?.loaded) {\n\t\t\t\tconst { prepared, version } = change;\n\t\t\t\tconst info = { deltasSinceBase: change.loaded.deltasSinceBase };\n\t\t\t\tif (change.definition?.checkpointWhen?.(prepared.value, prepared.ops, info)) {\n\t\t\t\t\tplan.content = { ...plan.content, content: { version, kind: \"base\", value: prepared.value } };\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (plan.content !== undefined) writes.push(plan.content);\n\t\t\tif (plan.retire) writes.push({ type: \"document.retire\", id: plan.record.id });\n\t\t}\n\t\treturn writes;\n\t}\n\n\t// ─── Helpers ────────────────────────────────────────────────────────────\n\n\t/**\n\t * New owned work needs a live owner, judged on the owner's final candidate: not `completing`, terminal, or\n\t * abort-marked. A task therefore cannot create owned work in the commit that finishes it (spec §5.5).\n\t */\n\tasync #validateOwners(): Promise<void> {\n\t\tconst owners: { readonly what: string; readonly taskId: TaskId }[] = [];\n\t\tfor (const write of this.#writes) {\n\t\t\tif (write.type !== \"conversation\" || write.value.owner === undefined) continue;\n\t\t\towners.push({ what: \"Conversation owner task\", taskId: write.value.owner.taskId });\n\t\t}\n\t\tfor (const task of this.#tasksById.values()) {\n\t\t\tconst record = task.write?.kind === \"create\" ? task.write.record : undefined;\n\t\t\tif (record?.owner !== undefined) owners.push({ what: \"Task owner\", taskId: record.owner });\n\t\t}\n\t\tfor (const { what, taskId } of owners) {\n\t\t\tconst task = await this.#currentTask(taskId);\n\t\t\tif (task === undefined) throw new Error(`${what} ${taskId} does not exist`);\n\t\t\tif (task.state.status === \"terminal\" || task.state.status === \"completing\") {\n\t\t\t\tthrow new Error(`${what} ${taskId} is ${task.state.status}`);\n\t\t\t}\n\t\t\tif (task.abortRequested) throw new Error(`${what} ${taskId} is abort-marked`);\n\t\t}\n\t}\n\n\t#rejectForkSourceWrites(plans: readonly DocumentPlan[]): void {\n\t\tfor (const plan of plans) {\n\t\t\tif (plan.content === undefined && !plan.retire) continue;\n\t\t\tconst record = plan.record;\n\t\t\tif (this.#forkSourceDocumentIds.has(record.id)) {\n\t\t\t\tthrow new Error(`Cannot change fork source document ${record.id} in the fork transaction`);\n\t\t\t}\n\t\t\tconst scope = plan.record.scope;\n\t\t\tif (\n\t\t\t\tscope.kind === \"conversation\" &&\n\t\t\t\tthis.#forkSourceConversationIds.has(scope.conversationId) &&\n\t\t\t\trecord.scope.kind === \"conversation\" &&\n\t\t\t\trecord.fork === \"current\"\n\t\t\t) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Cannot fork conversation ${scope.conversationId} while changing its current-policy documents`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t#abortChanges(): void {\n\t\tfor (const document of this.#documents) document.change?.abort();\n\t}\n\n\t#assertOpen(): void {\n\t\tif (this.#sealed) throw new Error(\"Transaction has settled\");\n\t}\n\n\t#assertTaskDocumentsOpen(resolved: ResolvedAddress): void {\n\t\tconst scope = resolved.address.scope;\n\t\tif (scope.kind === \"task\" && this.#tasksById.get(scope.taskId)?.write?.record.state.status === \"terminal\") {\n\t\t\tthrow new Error(`Task ${scope.taskId} is terminal`);\n\t\t}\n\t}\n\n\t/** Register an operation so callback settlement can reject and drain it. */\n\t#track<T>(operation: Promise<T>): Promise<T> {\n\t\tthis.#pendingOperations.add(operation);\n\t\tconst settle = (): void => {\n\t\t\tthis.#pendingOperations.delete(operation);\n\t\t};\n\t\toperation.then(settle, settle);\n\t\treturn operation;\n\t}\n\n\t#read<T>(method: string, read: () => Promise<T>): Promise<T> {\n\t\ttry {\n\t\t\tthis.#assertOpen();\n\t\t\tif (this.#hasTableWrite) throw new ReadAfterWrite(method);\n\t\t\treturn this.#track(read());\n\t\t} catch (error) {\n\t\t\treturn Promise.reject(error);\n\t\t}\n\t}\n\n\t#write<T>(write: () => Promise<T>): Promise<T> {\n\t\ttry {\n\t\t\tthis.#assertOpen();\n\t\t\tthis.#hasTableWrite = true;\n\t\t\treturn this.#track(write());\n\t\t} catch (error) {\n\t\t\treturn Promise.reject(error);\n\t\t}\n\t}\n\n\tasync #requireConversation(id: ConversationId): Promise<void> {\n\t\tif (this.#createdConversationIds.has(id)) return;\n\t\tif ((await this.#host.storage.conversation(id, this.#context)) === undefined) {\n\t\t\tthrow new Error(`Conversation ${id} does not exist`);\n\t\t}\n\t}\n\n\t/**\n\t * Lifecycle times: `startedAt` on the first change to `running`, `endedAt` on the change to `terminal`. Once set,\n\t * they carry over from the replaced record; records written before they existed lack them.\n\t */\n\t#stampTimes(value: AnyTaskRecord, candidate: AnyTaskRecord | undefined): AnyTaskRecord {\n\t\tconst status = value.state.status;\n\t\tconst now = (stamps: boolean) => (stamps ? this.#host.now() : undefined);\n\t\tconst startedAt = candidate?.startedAt ?? value.startedAt ?? now(status === \"running\");\n\t\tconst endedAt = candidate?.endedAt ?? value.endedAt ?? now(status === \"terminal\");\n\t\tif (startedAt === value.startedAt && endedAt === value.endedAt) return value;\n\t\treturn {\n\t\t\t...value,\n\t\t\t...(startedAt === undefined ? {} : { startedAt }),\n\t\t\t...(endedAt === undefined ? {} : { endedAt }),\n\t\t};\n\t}\n\n\t#taskEntry(id: TaskId): TransactionTask {\n\t\tlet task = this.#tasksById.get(id);\n\t\tif (task === undefined) {\n\t\t\ttask = {};\n\t\t\tthis.#tasksById.set(id, task);\n\t\t}\n\t\treturn task;\n\t}\n\n\t/** Latest candidate task record, falling back to committed state; not a caller table read. */\n\tasync #currentTask(id: TaskId): Promise<AnyTaskRecord | undefined> {\n\t\treturn this.#tasksById.get(id)?.write?.record ?? (await this.#committedTask(id));\n\t}\n\n\t#committedTask(id: TaskId): Promise<AnyTaskRecord | undefined> {\n\t\tconst task = this.#taskEntry(id);\n\t\ttask.committedRead ??= this.#host.storage.task(id, this.#context);\n\t\treturn task.committedRead;\n\t}\n}\n\n/** Plan of one staged document: its record, content write, and prepared change. Retirement is decided later. */\nfunction planDocument(document: DocumentEntry): DocumentPlan | undefined {\n\tconst target = document.target;\n\tif (target === undefined) return undefined;\n\tconst plan = { addressId: document.addressId, retire: document.retireOnCommit };\n\tswitch (target.kind) {\n\t\tcase \"created\": {\n\t\t\tconst prepared = document.prepared!;\n\t\t\tconst { record, version, tracker } = target;\n\t\t\tconst content = { version, kind: \"base\", value: prepared.value } as const;\n\t\t\treturn {\n\t\t\t\t...plan,\n\t\t\t\trecord,\n\t\t\t\tcontent: { type: \"document.create\", record, content },\n\t\t\t\tchange: { tracker, prepared, version },\n\t\t\t};\n\t\t}\n\t\tcase \"fork-copy\":\n\t\t\treturn {\n\t\t\t\t...plan,\n\t\t\t\trecord: target.record,\n\t\t\t\tcontent: { type: \"document.copy\", record: target.record, source: target.source },\n\t\t\t};\n\t\tcase \"retire-only\":\n\t\t\treturn { ...plan, record: target.record };\n\t\tcase \"loaded\": {\n\t\t\tconst loaded = target.document;\n\t\t\tconst definition = document.definition!;\n\t\t\tconst prepared = document.prepared!;\n\t\t\tconst version = definition.version;\n\t\t\tconst id = loaded.record.id;\n\t\t\t// A version change stores a base even without operations; otherwise only a change stores a delta.\n\t\t\tconst content =\n\t\t\t\tloaded.storedVersion < version\n\t\t\t\t\t? ({ type: \"document.change\", id, content: { version, kind: \"base\", value: prepared.value } } as const)\n\t\t\t\t\t: prepared.ops.length > 0\n\t\t\t\t\t\t? ({ type: \"document.change\", id, content: { version, kind: \"delta\", ops: prepared.ops } } as const)\n\t\t\t\t\t\t: undefined;\n\t\t\tconst change = {\n\t\t\t\ttracker: loaded.tracker,\n\t\t\t\tprepared,\n\t\t\t\tversion,\n\t\t\t\tloaded,\n\t\t\t\tdefinition,\n\t\t\t};\n\t\t\treturn { ...plan, record: loaded.record, change, ...(content === undefined ? {} : { content }) };\n\t\t}\n\t}\n}\n\n/**\n * Whether adoption publishes the plan: every creation, copy, and retirement, and a loaded incarnation that writes\n * content, which includes a migration-only base so observers of the older shape receive the new value.\n */\nfunction publishes(plan: DocumentPlan): boolean {\n\treturn plan.retire || plan.change?.loaded === undefined || plan.content !== undefined;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../src/session/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,QAAQ,EAA8B,MAAM,uBAAuB,CAAC;AAC3F,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAsE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAExH,OAAO,EAGN,SAAS,EACT,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,wBAAwB,EAExB,cAAc,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AA0C9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAO7E;;;GAGG;AACH,SAAS,qBAAqB,CAAC,OAAyB,EAAE,MAAwB;IACjF,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,YAAY;QAAE,OAAO,OAAO,CAAC;IACjF,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAChC,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,cAAc,OAAO,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAC3F,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;QAC5D,OAAO,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAsB,CAAC;IACxE,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,cAAc,OAAO,CAAC,EAAE,oCAAoC,CAAC,CAAC;IAC/E,CAAC;IACD,qGAAqG;IACrG,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,MAAM,EAAsB,CAAC;AACtD,CAAC;AAED,MAAM,uBAAuB,GAAG,GAAG,CAAC;AACpC,MAAM,gBAAgB,GAAkB,EAAE,CAAC;AAC3C,MAAM,uBAAuB,GAAG,EAAE,uBAAuB,EAAE,IAAI,EAAW,CAAC;AAkJ3E;;;;;GAKG;AACH,MAAM,OAAO,WAAW;IACd,KAAK,CAAkB;IAChC,QAAQ,CAAU;IACT,MAAM,CAAmB;IACzB,kBAAkB,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC1D,OAAO,GAAG,KAAK,CAAC;IAChB,cAAc,GAAG,KAAK,CAAC;IAEvB,gHAAgH;IACvG,OAAO,GAAmB,EAAE,CAAC;IAC7B,uBAAuB,GAAG,IAAI,GAAG,EAAkB,CAAC;IACpD,0BAA0B,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvD,sBAAsB,GAAG,IAAI,GAAG,EAAc,CAAC;IACxD,8FAA8F;IACrF,UAAU,GAAG,IAAI,GAAG,EAA2B,CAAC;IACzD,sDAAsD;IAC7C,YAAY,GAAG,IAAI,GAAG,EAAkC,CAAC;IAClE,4HAA4H;IACnH,kBAAkB,GAAuE,EAAE,CAAC;IAErG,sFAAsF;IAC7E,MAAM,GAAmB,EAAE,CAAC;IACrC,wEAAwE;IAC/D,UAAU,GAAoB,EAAE,CAAC;IAC1C,yFAAyF;IAChF,wBAAwB,GAAG,IAAI,GAAG,EAAyB,CAAC;IAErE,YAAY,IAAqB,EAAE,OAAgB,EAAE,KAAK,GAAqB,EAAE;QAChF,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,uEAAuE;IACvE,IAAI,OAAO;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED,kGAAkG;IAClG,IAAI,aAAa;QAChB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,OAAO,CAAC,EAAM,EAAE,IAAqB;QAC3C,OAAO,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC;IACzC,CAAC;IAED,2EAA2E;IAE3E,YAAY,CAAC,EAAkB;QAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7F,CAAC;IAID,KAAK,CAAC,KAA0C,EAAE,MAAgB;QACjE,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QAChE,MAAM,EAAE,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAO,CAAC;QACvD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;YACrC,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC;YACzE,OAAO,IAAI,KAAK,SAAS,IAAI,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QACvE,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,EAAU;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,iBAAiB,CAAC,KAAwB,EAAE,KAAa,EAAE,MAAe;QACzE,OAAO,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CACzE,CAAC;IACH,CAAC;IAED,WAAW,CAAC,KAAiB,EAAE,KAAa,EAAE,MAAe;QAC5D,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7G,CAAC;IAED,gBAAgB,CAAC,cAA8B;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IACzG,CAAC;IAED,aAAa,CAAC,cAA8B;QAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnG,CAAC;IAED,SAAS,CAAC,KAAgB,EAAE,KAAa,EAAE,MAAe;QACzD,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IACzG,CAAC;IAED,6CAA6C;IAC7C,UAAU,CAAC,EAAgB;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IACzF,CAAC;IAED,kEAAkE;IAClE,mBAAmB,CAAC,cAA8B,EAAE,SAAiB;QACpE,OAAO,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAC7C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,cAAc,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAChF,CAAC;IACH,CAAC;IAED,2EAA2E;IAE3E,kBAAkB,CAAC,OAAsD;QACxE,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IACjF,CAAC;IAED,yEAAyE;IACzE,sBAAsB;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAC3G,CAAC;IAED,gBAAgB,CACf,oBAAoC,EACpC,EAAW,EACX,OAAsD;QAEtD,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CACvB,IAAI,CAAC,kBAAkB,CAAC,EAAE,cAAc,EAAE,oBAAoB,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,SAAS,CAAC,CACxF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB,CACvB,MAA6D,EAC7D,SAAgC,EAChC,UAA2B;QAE3B,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7E,MAAM,EAAE,GAAG,UAAU,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAkB,CAAC,CAAC;QAC7E,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,KAAkC,CAAC;QACvC,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YAClD,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,IAAI,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,WAAW,iBAAiB,CAAC,CAAC;YACjG,KAAK,GAAG,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;QACtE,CAAC;QACD,MAAM,MAAM,GAAuB;YAClC,EAAE;YACF,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;YAC3C,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;SACzC,CAAC;QACF,MAAM,MAAM,GACX,MAAM,KAAK,SAAS;YACnB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,MAAM,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7G,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAChD,MAAM,KAAK,GAAkB;gBAC5B,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;gBACjC,OAAO,EAAE,IAAI,CAAC,MAAM;gBACpB,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,IAAI,EAAE;gBACtC,cAAc,EAAE,KAAK;aACrB,CAAC;YACF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5B,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QACrF,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3D,MAAM,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACnD,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,OAAO,MAAM,CAAC;IACf,CAAC;IAQD,WAAW,CACV,KAAiD,EACjD,MAAmC,EACnC,KAAc;QAEd,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,MAAoB,CAAC,CAAC;QACrF,OAAO,IAAI,CAAC,YAAY,CAAC,MAAwB,EAAE,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAgB,CAAC,CAAC;IAClG,CAAC;IAED,YAAY,CAAC,cAA8B,EAAE,KAAiB;QAC7D,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;YAC7B,MAAM,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;YAChD,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAW,CAAC;YACtD,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;YAChC,2DAA2D;YAC3D,MAAM,MAAM,GAAG,QAAQ,CACtB;gBACC,GAAG,IAAI;gBACP,EAAE;gBACF,cAAc;gBACd,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;gBACjC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;aAC5B,EACD,uBAAuB,CACG,CAAC;YAC5B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACpD,OAAO,MAAM,CAAC;QACf,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,UAAU,CACT,IAAsB,EACtB,KAAQ,EACR,OAA4B;QAE5B,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;YAC7B,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;gBACzC,IAAI,KAA2B,CAAC;gBAChC,IAAI,KAAqC,CAAC;gBAC1C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;oBACnE,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAE,CAAC;oBACzC,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;oBACzG,IAAI,KAAK,KAAK,CAAC;wBAAE,KAAK,GAAG,UAAU,EAAE,KAAK,IAAI,MAAM,CAAC;yBAChD,IAAI,UAAU,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;wBAC1C,KAAK,KAAK,EAAE,CAAC;wBACb,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;oBAC9B,CAAC;gBACF,CAAC;gBACD,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;YACxC,CAAC;YACD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;YACpC,IAAI,KAAgC,CAAC;YACrC,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC/B,uEAAuE;gBACvE,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBAClD,IAAI,CAAC,WAAW,EAAE,CAAC;gBACnB,IAAI,KAAK,KAAK,SAAS;oBAAE,MAAM,IAAI,KAAK,CAAC,cAAc,SAAS,CAAC,MAAM,iBAAiB,CAAC,CAAC;gBAC1F,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI;oBAAE,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;gBAC1F,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS,IAAI,OAAO,CAAC,cAAc,KAAK,KAAK,CAAC,cAAc,EAAE,CAAC;oBAC7F,MAAM,IAAI,KAAK,CAAC,kDAAkD,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;gBAC3F,CAAC;YACF,CAAC;YACD,MAAM,cAAc,GAAG,KAAK,EAAE,cAAc,IAAI,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;YACrG,IAAI,cAAc,KAAK,SAAS;gBAAE,MAAM,IAAI,SAAS,CAAC,iDAAiD,CAAC,CAAC;YACzG,MAAM,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;YAChD,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;YACnC,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC7C,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAa,CAAC;YACxD,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,MAAM,MAAM,GAAG,QAAQ,CACtB;gBACC,EAAE;gBACF,cAAc;gBACd,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,OAAO,EAAE,UAAU,CAAC,OAAO;gBAC3B,KAAK;gBACL,KAAK,EACJ,OAAO,CAAC,KAAK,KAAK,MAAM;oBACvB,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAC3F,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;gBACnD,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,KAAK;gBACvC,cAAc,EAAE,KAAK;gBACrB,GAAG,CAAC,OAAO,CAAC,gBAAgB,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxE,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE;aACxC,EACD,uBAAuB,CACK,CAAC;YAC9B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;YAC/D,OAAO,EAAE,CAAC;QACX,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,gFAAgF;IAChF,gBAAgB,CAAC,MAAwB;QACxC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;YAC7B,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YACvD,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAgB,CAAC;YAC3D,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE,EAAE,uBAAuB,CAAgC,CAAC;YACnG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAClC,OAAO,MAAM,CAAC;QACf,CAAC,CAAC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,gBAAgB,CAAC,EAAgB,EAAE,UAAgC;QAClE,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAyB,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,gGAAgG;IAChG,eAAe,CAAC,EAAgB,EAAE,KAAc;QAC/C,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,wGAAwG;IACxG,OAAO,CAAC,KAAoB;QAC3B,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC;QACrC,IAAI,SAAS,EAAE,KAAK,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,EAAE,mCAAmC,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,cAAc,KAAK,KAAK,CAAC,cAAc,EAAE,CAAC;YAClF,MAAM,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,EAAE,8BAA8B,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,CAAC,KAAK,GAAG;YACZ,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;YAC1D,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,uBAAuB,CAA6B;SACzG,CAAC;IACH,CAAC;IAED,4FAA4F;IAC5F,WAAW;QACV,MAAM,OAAO,GAAoB,EAAE,CAAC;QACpC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;YAAE,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;gBAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3G,OAAO,OAAO,CAAC;IAChB,CAAC;IAED,2DAA2D;IAC3D,cAAc;QACb,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU;YAAE,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,KAAK,QAAQ;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1F,OAAO,GAAG,CAAC;IACZ,CAAC;IAED,yEAAyE;IACzE,mBAAmB;QAClB,MAAM,OAAO,GAAyB,EAAE,CAAC;QACzC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;gBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/F,OAAO,OAAO,CAAC;IAChB,CAAC;IAuBD,GAAG,CAAC,KAAkB,EAAE,GAAG,IAAwB;QAClD,IAAI,CAAC;YACJ,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;YACpC,MAAM,QAAQ,GAAG,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAClD,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC9D,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;gBACpD,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS;oBAAE,OAAO,MAAM,CAAC,YAAY,CAAC;gBAClE,IAAI,MAAM,CAAC,MAAM,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;oBACzC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;oBAC5F,OAAO,MAAM,CAAC,YAAY,CAAC;gBAC5B,CAAC;YACF,CAAC;YACD,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC5F,MAAM,QAAQ,GAAkB;gBAC/B,SAAS,EAAE,QAAQ,CAAC,EAAE;gBACtB,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,UAAU;gBACV,cAAc,EAAE,KAAK;aACrB,CAAC;YACF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/B,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAChE,qGAAqG;YACrG,QAAQ,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC,CAAC,CAAC;YACpG,OAAO,QAAQ,CAAC,YAAY,CAAC;QAC9B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACF,CAAC;IAgBD,SAAS,CAAC,KAAkB,EAAE,GAAG,IAAwB;QACxD,IAAI,CAAC;YACJ,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;YACpC,MAAM,QAAQ,GAAG,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC9D,IAAI,MAAM,EAAE,cAAc;gBAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;YACrD,IAAI,MAAM,EAAE,MAAM,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC1C,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBACnD,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;gBAC7B,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;YAC1B,CAAC;YACD,IAAI,MAAM,EAAE,YAAY,KAAK,SAAS,EAAE,CAAC;gBACxC,gFAAgF;gBAChF,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;gBAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;YAC/D,CAAC;YACD,MAAM,KAAK,GAAkB;gBAC5B,SAAS,EAAE,QAAQ,CAAC,EAAE;gBACtB,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,UAAU;gBACV,cAAc,EAAE,IAAI;aACpB,CAAC;YACF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5B,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAC1D,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACF,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAoB,EAAE,IAA2B,EAAE,QAAiB;QAClF,MAAM,UAAU,GAAG,KAAK,CAAC,UAAW,CAAC;QACrC,MAAM,MAAM,GAAG,QAAQ;YACtB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpF,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC1B,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAC5C,kBAAkB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;YACpE,KAAK,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;YACpD,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAC5C,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;QAC3B,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAClC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;YAAE,MAAM,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACzF,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACnD,IAAI,IAAI,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,MAAM,iBAAiB,CAAC,CAAC;YAC/E,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,UAAU;gBAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,MAAM,cAAc,CAAC,CAAC;QAC3F,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,QAAQ,CACrB,UAAU,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,CAC9D,CAAC;QAChB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAc,CAAC;QACzD,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7B,KAAK,CAAC,MAAM,GAAG;YACd,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YACrD,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,OAAO;SACP,CAAC;QACF,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACrC,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,gBAAgB,CACrB,KAAoB,EACpB,UAA4B,EAC5B,MAA+D;QAE/D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpG,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC,CAAC;QAC5E,CAAC;QACD,IACC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc;YAC3C,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI;YACzC,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,MAAM,CAAC,GAAG;YACvC,MAAM,CAAC,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO;YAC/C,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EACxC,CAAC;YACF,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,CAAC,MAAM,CAAC,EAAE,mCAAmC,CAAC,CAAC;QAC9F,CAAC;QACD,MAAM,KAAK,GAAG,wBAAwB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAChG,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7B,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;QAC9B,KAAK,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;QAChG,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACrC,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,KAAoB;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAC5D,IAAI,IAAI,KAAK,SAAS;YAAE,MAAM,IAAI,CAAC;QACnC,MAAM,MAAM,GACX,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM;YAC1C,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClF,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO;QACjC,gBAAgB,CAAC,KAAK,CAAC,UAAW,EAAE,MAAM,CAAC,CAAC;QAC5C,KAAK,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;IAChD,CAAC;IAED,2EAA2E;IAE3E,2FAA2F;IAC3F,KAAK,CAAC,aAAa;QAClB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,GAAG,kBAAkB,CAAC;IACpC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa;QAClB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAClD,IAAI,CAAC,QAAQ,GAAG,kBAAkB,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;QACrF,CAAC;QACD,IAAI,CAAC;YACJ,qEAAqE;YACrE,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACxC,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS;oBAAE,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAClF,CAAC;YACD,OAAO,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,MAAM,KAAK,CAAC;QACb,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,QAAQ,GAAG,kBAAkB,CAAC;QACpC,CAAC;IACF,CAAC;IAED,sFAAsF;IACtF,OAAO;QACN,IAAI,CAAC,aAAa,EAAE,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACH,QAAQ;QACP,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,iBAAiB,CAAC;YAAE,OAAO,SAAS,CAAC;QACrF,MAAM,IAAI,GAAG,EAAE,CAAC;QAChB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;YACjC,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,SAAS;YACpD,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,EAAE,MAAM,KAAK,SAAS,IAAI,OAAO,EAAE,IAAI,KAAK,iBAAiB;gBAAE,OAAO,SAAS,CAAC;YACzG,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;YAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAC7B,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACtG,OAAO,SAAS,CAAC;YAClB,CAAC;YACD,qCAAqC;YACrC,IAAI,MAAM,CAAC,aAAa,KAAK,OAAO;gBAAE,OAAO,SAAS,CAAC;YACvD,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;OAGG;IACH,SAAS;QACR,MAAM,YAAY,GAA2B,EAAE,CAAC;QAChD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,oFAAoF;YACpF,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,MAAO,CAAC;YAC5D,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/B,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACjB,SAAS;YACV,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACxB,MAAM,MAAM,GAAG,MAAO,CAAC,MAAM,CAAC;YAC9B,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;YAC3C,YAAY,CAAC,IAAI,CAAC;gBACjB,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,QAAQ;gBACd,MAAM;gBACN,cAAc;gBACd,OAAO;gBACP,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,GAAG,EAAE,QAAQ,CAAC,GAAG;aACjB,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,YAAY,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACH,QAAQ,CAAyB,IAAuC;QACvE,MAAM,KAAK,GAAQ,EAAE,CAAC;QACtB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,uCAAuC;YACvC,IAAI,CAAC,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC;gBAAE,SAAS;YAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAClC,IAAI,IAAI,KAAK,SAAS;gBAAE,SAAS;YACjC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;YAChF,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3B,MAAM,KAAK,GAAG,MAAM,EAAE,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;YAClE,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI,gBAAgB,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC1G,kEAAkE;YAClE,MAAM,OAAO,GAAG,GAAG,EAAE,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YAC5E,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,EAAW,CAAC;YAChF,IAAI,GAAG,KAAK,SAAS;gBAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;;gBAClE,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;YACzC,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,KAAK,SAAS,EAAE,CAAC;YAC/E,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,kGAAkG;YAClG,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc;gBAAE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC;QACvG,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,SAAS;QACR,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC9B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,SAAS;YACzD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YACvE,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,uFAAuF;IACvF,uBAAuB,CAAC,KAAkE;QACzF,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAChC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,iBAAiB,IAAI,SAAS,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAChF,CAAC;QACF,IAAI,EAAE,GAAG,CAAC;YAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;YAChC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;IAED,sGAAsG;IACtG,KAAK,CAAC,GAAQ;QACb,MAAM,YAAY,GAA2B,EAAE,CAAC;QAChD,oGAAoG;QACpG,IAAI,MAA0C,CAAC;QAC/C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,SAAS,GAAG,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC;YAC7C,IAAI,MAAM,GAAmB,SAAS,CAAC,CAAC,CAAE,IAAI,CAAC,MAAyB,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;YAC9G,IAAI,IAAI,CAAC,MAAM;gBAAE,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;YACxD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC1B,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;gBACtD,wGAAwG;gBACxG,IAAI,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;;oBACtF,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACtB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBAC1B,IAAI,MAAM,CAAC,aAAa,GAAG,OAAO;wBAAE,MAAM,CAAC,aAAa,GAAG,OAAO,CAAC;oBACnE,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,iBAAiB,EAAE,CAAC;wBAC9C,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM;4BAAE,MAAM,CAAC,eAAe,GAAG,CAAC,CAAC;;4BAChE,MAAM,CAAC,eAAe,EAAE,CAAC;oBAC/B,CAAC;gBACF,CAAC;qBAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACzB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;wBAClB,SAAS,EAAE,IAAI,CAAC,SAAS;wBACzB,MAAM;wBACN,aAAa,EAAE,OAAO;wBACtB,YAAY,EAAE,OAAO;wBACrB,eAAe,EAAE,CAAC;wBAClB,OAAO;qBACP,CAAC,CAAC;gBACJ,CAAC;YACF,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS;gBAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;YAC1E,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC3C,IAAI,WAAW,KAAK,SAAS;gBAAE,SAAS;YACxC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACvB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACxB,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC/B,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC1B,SAAS;YACV,CAAC;YACD,MAAM,KAAK,CAAC,GAAG,YAAY,CAAC,CAAC;YAC7B,IAAI,IAAI,CAAC,QAAQ;gBAAE,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAClD,2GAA2G;YAC3G,MAAM,CAAC,IAAI,CACV,WAAW,CAAC,IAAI,KAAK,UAAU,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ;gBAC/D,CAAC,CAAC,EAAE,GAAG,WAAW,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;gBACnC,CAAC,CAAC,WAAW,CACd,CAAC;QACH,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,IAAI,YAAY,EAAE,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,SAAS;QACd,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;YACpC,IAAI,IAAI,KAAK,SAAS;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC1C,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,KAAK,SAAS;gBAAE,SAAS;YAC7C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YAChD,IAAI,SAAS,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;YAC1E,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,KAAK,UAAU;gBAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC;YAC7F,IAAI,SAAS,CAAC,cAAc,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;gBACnE,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,8BAA8B,CAAC,CAAC;YAC3D,CAAC;QACF,CAAC;QAED,+FAA+F;QAC/F,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;QAC1C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,UAAU;gBAAE,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC/F,CAAC;QACD,IAAI,eAAe,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAc,CAAC;YACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;gBAChC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;oBAAE,SAAS;gBAC1E,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;gBACnB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC9B,CAAC;YACD,MAAM,MAAM,GAAG,CAAC,MAAsB,EAAQ,EAAE;gBAC/C,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;oBAAE,OAAO;gBACpC,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBACnE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACzB,CAAC,CAAC;YACF,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;gBACtC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,KAAK,QAAQ;oBAAE,SAAS;gBACpE,yFAAyF;gBACzF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;gBAClE,IAAI,IAAI,KAAK,SAAS;oBAAE,MAAM,IAAI,CAAC;gBACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;gBAC/C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACzB,KAAK,MAAM,MAAM,IAAI,KAAK;wBAAE,MAAM,CAAC,MAAM,CAAC,CAAC;oBAC3C,SAAS;gBACV,CAAC;gBACD,IAAI,MAA0B,CAAC;gBAC/B,GAAG,CAAC;oBACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,aAAa,CACvC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAClD,uBAAuB,EACvB,MAAM,EACN,IAAI,CAAC,QAAQ,CACb,CAAC;oBACF,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,KAAK;wBAAE,MAAM,CAAC,MAAM,CAAC,CAAC;oBAChD,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC;gBACpB,CAAC,QAAQ,MAAM,KAAK,SAAS,EAAE;YAChC,CAAC;QACF,CAAC;QAED,0FAA0F;QAC1F,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YAChC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;gBAAE,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;YAC9E,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;gBAAE,SAAS;YACpC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC3C,IAAI,IAAI,CAAC,yBAAyB,KAAK,SAAS,EAAE,CAAC;gBAClD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACtD,IAAI,OAAO,KAAK,SAAS;oBAAE,IAAI,CAAC,yBAAyB,GAAG,OAAO,CAAC,cAAc,CAAC;YACpF,CAAC;YACD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,yBAAyB,CAAC;QACtD,CAAC;QAED,KAAK,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACtD,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC3F,IAAI,OAAO,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;YAC9E,MAAM,IAAI,GAAG,qBAAqB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACpD,IAAI,IAAI,KAAK,OAAO;gBAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3F,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACvF,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3B,0DAA0D;YAC1D,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,iBAAiB,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;gBACzG,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;gBACrC,MAAM,IAAI,GAAG,EAAE,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;gBAChE,IAAI,MAAM,CAAC,UAAW,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;oBAC3E,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC;gBAC/F,CAAC;YACF,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;gBAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1D,IAAI,IAAI,CAAC,MAAM;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,MAAM,CAAC;IACf,CAAC;IAED,2EAA2E;IAE3E;;;OAGG;IACH,KAAK,CAAC,eAAe;QACpB,MAAM,MAAM,GAAyD,EAAE,CAAC;QACxE,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS;gBAAE,SAAS;YAC/E,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACpF,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YAC7E,IAAI,MAAM,EAAE,KAAK,KAAK,SAAS;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC5F,CAAC;QACD,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAC7C,IAAI,IAAI,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,IAAI,MAAM,iBAAiB,CAAC,CAAC;YAC5E,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;gBAC5E,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,IAAI,MAAM,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9D,CAAC;YACD,IAAI,IAAI,CAAC,cAAc;gBAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,IAAI,MAAM,kBAAkB,CAAC,CAAC;QAC/E,CAAC;IACF,CAAC;IAED,uBAAuB,CAAC,KAA8B;QACrD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,SAAS;YACzD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3B,IAAI,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;gBAChD,MAAM,IAAI,KAAK,CAAC,sCAAsC,MAAM,CAAC,EAAE,0BAA0B,CAAC,CAAC;YAC5F,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YAChC,IACC,KAAK,CAAC,IAAI,KAAK,cAAc;gBAC7B,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC;gBACzD,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc;gBACpC,MAAM,CAAC,IAAI,KAAK,SAAS,EACxB,CAAC;gBACF,MAAM,IAAI,KAAK,CACd,4BAA4B,KAAK,CAAC,cAAc,8CAA8C,CAC9F,CAAC;YACH,CAAC;QACF,CAAC;IACF,CAAC;IAED,aAAa;QACZ,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU;YAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;IAClE,CAAC;IAED,WAAW;QACV,IAAI,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC9D,CAAC;IAED,wBAAwB,CAAC,QAAyB;QACjD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;QACrC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC3G,MAAM,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,MAAM,cAAc,CAAC,CAAC;QACrD,CAAC;IACF,CAAC;IAED,4EAA4E;IAC5E,MAAM,CAAI,SAAqB;QAC9B,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,GAAS,EAAE;YACzB,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC3C,CAAC,CAAC;QACF,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/B,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,KAAK,CAAI,MAAc,EAAE,IAAsB;QAC9C,IAAI,CAAC;YACJ,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,IAAI,CAAC,cAAc;gBAAE,MAAM,IAAI,cAAc,CAAC,MAAM,MAAM,IAAI,CAAC,CAAC;YACpE,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACF,CAAC;IAED,MAAM,CAAI,KAAuB;QAChC,IAAI,CAAC;YACJ,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACF,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,EAAkB;QAC5C,IAAI,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO;QACjD,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YAC9E,MAAM,IAAI,KAAK,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,CAAC;QACtD,CAAC;IACF,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,KAAoB,EAAE,SAAoC;QACrE,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;QAClC,MAAM,GAAG,GAAG,CAAC,MAAe,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACzE,MAAM,SAAS,GAAG,SAAS,EAAE,SAAS,IAAI,KAAK,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QACvF,MAAM,OAAO,GAAG,SAAS,EAAE,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,GAAG,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;QAClF,IAAI,SAAS,KAAK,KAAK,CAAC,SAAS,IAAI,OAAO,KAAK,KAAK,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAC7E,OAAO;YACN,GAAG,KAAK;YACR,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;YACjD,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;SAC7C,CAAC;IACH,CAAC;IAED,UAAU,CAAC,EAAU;QACpB,IAAI,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,GAAG,EAAE,CAAC;YACV,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,8FAA8F;IAC9F,KAAK,CAAC,YAAY,CAAC,EAAU;QAC5B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC;IAClF,CAAC;IAED,cAAc,CAAC,EAAU;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC,aAAa,CAAC;IAC3B,CAAC;CACD;AAED,gHAAgH;AAChH,SAAS,YAAY,CAAC,QAAuB;IAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC/B,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3C,MAAM,IAAI,GAAG,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,cAAc,EAAE,CAAC;IAChF,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,SAAS,EAAE,CAAC;YAChB,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAS,CAAC;YACpC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;YAC5C,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAW,CAAC;YAC1E,OAAO;gBACN,GAAG,IAAI;gBACP,MAAM;gBACN,OAAO,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,OAAO,EAAE;gBACrD,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE;aACtC,CAAC;QACH,CAAC;QACD,KAAK,WAAW;YACf,OAAO;gBACN,GAAG,IAAI;gBACP,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,OAAO,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;aAChF,CAAC;QACH,KAAK,aAAa;YACjB,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;QAC3C,KAAK,QAAQ,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC;YAC/B,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAW,CAAC;YACxC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAS,CAAC;YACpC,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;YACnC,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,kGAAkG;YAClG,MAAM,OAAO,GACZ,MAAM,CAAC,aAAa,GAAG,OAAO;gBAC7B,CAAC,CAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,EAAY;gBACvG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC;oBACxB,CAAC,CAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,EAAY;oBACpG,CAAC,CAAC,SAAS,CAAC;YACf,MAAM,MAAM,GAAG;gBACd,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,QAAQ;gBACR,OAAO;gBACP,MAAM;gBACN,UAAU;aACV,CAAC;YACF,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QAClG,CAAC;IACF,CAAC;AACF,CAAC;AAED,wGAAwG;AACxG,SAAS,QAAQ,CAAC,IAAkB,EAAE,MAAsB;IAC3D,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;IAC3C,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IACrF,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,eAAe,EAAE,CAAC;QAC5C,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,cAAe,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;IACxG,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/D,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;IACjF,OAAO;QACN,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,QAAQ;QACd,MAAM;QACN,cAAc;QACd,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK;QAC5B,GAAG;KACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CACxB,IAAkB,EAClB,GAAkB,EAClB,KAAiB,EACjB,OAAe;IAEf,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAClC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;IACxG,IAAI,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;IACpF,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;AAChF,CAAC;AAED;;;GAGG;AACH,SAAS,SAAS,CAAC,IAAkB;IACpC,OAAO,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC;AACvF,CAAC","sourcesContent":["import { type Context, copyJson, type Draft, type JsonValue } from \"@earendil-works/chord\";\nimport { BACKGROUND_CONTEXT } from \"@earendil-works/chord/context\";\nimport { type Change, type Op, type PendingOps, type Prepared, type Tracker, track } from \"@earendil-works/chord/delta\";\nimport type { TelemetryCarrier } from \"@earendil-works/pi-telemetry\";\nimport {\n\ttype AnyDocDefinition,\n\ttype AnyDocToken,\n\taddressId,\n\tcheckRecordScope,\n\tcheckRecordVersion,\n\tdocumentCreate,\n\tmaterializeDocumentValue,\n\ttype ResolvedAddress,\n\tresolveAddress,\n} from \"../documents.ts\";\nimport { ReadAfterWrite } from \"../errors.ts\";\nimport type {\n\tConversationDocFamilyToken,\n\tConversationDocToken,\n\tConversationId,\n\tConversationOwnership,\n\tConversationQuery,\n\tConversationRecord,\n\tCursor,\n\tDocumentAddress,\n\tDocumentCommitChange,\n\tDocumentContent,\n\tDocumentCopySource,\n\tDocumentCreate,\n\tDocumentId,\n\tDocumentRecord,\n\tEntry,\n\tEntryDraft,\n\tEntryId,\n\tEntryQuery,\n\tEntryRecord,\n\tJsonObject,\n\tSeq,\n\tSessionDocFamilyToken,\n\tSessionDocToken,\n\tStorage,\n\tStorageWrite,\n\tSubmissionCreate,\n\tSubmissionId,\n\tSubmissionRecord,\n\tSubmissionSettlement,\n\tTask,\n\tTaskDocFamilyToken,\n\tTaskDocToken,\n\tTaskId,\n\tTaskOptions,\n\tTaskQuery,\n\tTaskRecord,\n\tTx,\n\tTypedEntry,\n\tTypedEntryDraft,\n} from \"../types.ts\";\nimport { ROOT_CONVERSATION_ID } from \"../types.ts\";\nimport { prepareForkDocumentCopies } from \"./forks.ts\";\nimport { documentKey, incarnationKey, scopeKey, tableKeys } from \"./keys.ts\";\n\ntype AnyTaskRecord = TaskRecord<JsonValue, JsonValue, JsonValue>;\n\n/** A staged submission change: a settlement, or the placement of a queued submission at its entry. */\ntype SubmissionChange = SubmissionSettlement | { readonly status: \"placed\"; readonly entry: EntryId };\n\n/**\n * Complete record after applying one change. Placement turns a queued input `placed` and a queued write `done`; a\n * continue is never queued, so never placed. Only a placed input or continue can be answered. A settled record stays.\n */\nfunction applySubmissionChange(current: SubmissionRecord, change: SubmissionChange): SubmissionRecord {\n\tif (current.status === \"done\" || current.status === \"unanswered\") return current;\n\tif (change.status === \"placed\") {\n\t\tif (current.status !== \"queued\") throw new Error(`Submission ${current.id} is not queued`);\n\t\tconst status = current.type === \"input\" ? \"placed\" : \"done\";\n\t\treturn { ...current, status, entry: change.entry } as SubmissionRecord;\n\t}\n\tif (change.status === \"done\" && current.status !== \"placed\") {\n\t\tthrow new Error(`Submission ${current.id} is not a placed input or continue`);\n\t}\n\t// Queued and placed records carry no answer, reason, or detail; an unanswered input keeps its entry.\n\treturn { ...current, ...change } as SubmissionRecord;\n}\n\nconst INTERNAL_SCAN_PAGE_SIZE = 256;\nconst EMPTY_OPERATIONS: readonly Op[] = [];\nconst TABLE_JSON_COPY_OPTIONS = { omitUndefinedProperties: true } as const;\n\n/** One committed document incarnation owned by the Session tracker cache. */\nexport type LoadedDocument = {\n\treadonly addressId: string;\n\treadonly record: DocumentRecord;\n\t/** Persisted definition version; older while the tracked value is migrated only in memory. */\n\tstoredVersion: number;\n\t/** Definition version whose shape the tracked value has; access with another version reloads from Storage. */\n\treadonly valueVersion: number;\n\t/** Stored deltas after the newest base; advanced by adoption so the next predicate call needs no read. */\n\tdeltasSinceBase: number;\n\treadonly tracker: Tracker<JsonObject>;\n};\n\n/**\n * The changes of a cached incarnation that deferred commits adopted in memory and the Session has not stored yet\n * (`CommitPersistence`), folded. The Session owns it; a commit that stores them takes them.\n */\nexport type HeldDocument = {\n\treadonly loaded: LoadedDocument;\n\treadonly pending: PendingOps;\n\t/** Set when a held commit selected a base (`checkpointWhen`): their store writes the whole value. */\n\tbase: boolean;\n};\n\n/** What adoption publishes: to the Session's own observers, and the stored changes to `observeCommits()`. */\nexport type AdoptedDocuments = {\n\t/** This commit's own changes, as memory adopted them. */\n\treadonly observed: readonly DocumentCommitChange[];\n\t/** What Storage got: `observed`, unless the commit also stored held changes, which precede its own. */\n\treadonly stored: readonly DocumentCommitChange[];\n};\n\n/** Session services used by a transaction while it holds the mutation line. */\nexport interface TransactionHost {\n\t/** Reads wait while their key has an unpublished writer (`GatedStorage`). */\n\treadonly storage: Storage;\n\t/** Wait while `key` has an unpublished writer; `undefined` when it has none. */\n\ttouch(key: string): Promise<void> | undefined;\n\t/** Wall clock for task lifecycle times. */\n\tnow(): number;\n\t/** Return the cached current incarnation without loading. */\n\tcached(addressId: string): LoadedDocument | undefined;\n\t/** Return the cached current incarnation, cold-loading and migrating it when necessary. */\n\tload(\n\t\tdefinition: AnyDocDefinition,\n\t\taddressId: string,\n\t\taddress: DocumentAddress,\n\t\tcontext: Context,\n\t): Promise<LoadedDocument | undefined>;\n\t/** Install a newly committed incarnation. */\n\tinstall(document: LoadedDocument): void;\n\t/** Remove a retired incarnation if it is still the cached occupant of its address. */\n\tevict(addressId: string, recordId: DocumentId): void;\n\t/** Stage writes that belong to every newly created or forked conversation, in its creating transaction. */\n\tconversationCreated(tx: Transaction, record: ConversationRecord): Promise<void>;\n\t/** The newest entry ID visible from a conversation, known from the Session's commits. */\n\tlatestEntryId(conversationId: ConversationId, context: Context): Promise<EntryId | undefined>;\n\t/**\n\t * The current documents of a live task when the Session knows all of them (it created the task), else `undefined`.\n\t */\n\ttaskDocuments(taskId: TaskId): Iterable<DocumentRecord> | undefined;\n\t/** The newest visible head marker of a conversation, known from the Session's commits. */\n\tlatestHeadMarker(\n\t\tconversationId: ConversationId,\n\t\tcontext: Context,\n\t): Promise<(EntryRecord & { readonly head: EntryId }) | undefined>;\n}\n\n/** Committed and candidate state for one task touched by this transaction. */\ntype TransactionTask = {\n\tcommittedRead?: Promise<AnyTaskRecord | undefined>;\n\twrite?: { readonly kind: \"create\" | \"replace\"; readonly record: AnyTaskRecord };\n\tpublicationConversationId?: ConversationId;\n};\n\n/** Internal run creation resolves submission carriers against staged records before reading storage. */\nexport type TaskCreationOptions = TaskOptions & { readonly submissionIds?: readonly SubmissionId[] };\n\n/** Defaults a commit binds to: `tx.createTask()` conversation and the task attributed to appended entries. */\nexport type TransactionScope = {\n\treadonly conversationId?: ConversationId;\n\t/** Task whose runtime commit this is; stamped as `byTaskId` on appended entries. */\n\treadonly taskId?: TaskId;\n};\n\n/** Storage/cache provenance of one staged document incarnation. */\ntype DocumentTarget =\n\t| { readonly kind: \"loaded\"; readonly document: LoadedDocument }\n\t| {\n\t\t\treadonly kind: \"created\";\n\t\t\treadonly record: DocumentCreate;\n\t\t\treadonly version: number;\n\t\t\treadonly tracker: Tracker<JsonObject>;\n\t }\n\t| {\n\t\t\treadonly kind: \"fork-copy\";\n\t\t\treadonly record: DocumentCreate;\n\t\t\treadonly source: DocumentCopySource;\n\t }\n\t| { readonly kind: \"retire-only\"; readonly record: DocumentRecord };\n\n/** One document incarnation acquired, created, or retired by this transaction. */\ntype DocumentEntry = {\n\treadonly addressId: string;\n\treadonly address: DocumentAddress;\n\t/** Absent for definition-free fork copies and retirement entries discovered by a terminal-task scan. */\n\tdefinition?: AnyDocDefinition;\n\t/** Memoized public acquisition; absent for metadata-only retirement. */\n\tdraftPromise?: Promise<Draft<JsonObject>>;\n\t/** Set after acquisition or retirement lookup finds the affected incarnation. */\n\ttarget?: DocumentTarget;\n\tchange?: Change<JsonObject>;\n\tprepared?: Prepared<JsonObject>;\n\tretireOnCommit: boolean;\n};\n\n/**\n * What one staged incarnation writes and publishes, decided once before Storage admission so adoption only applies it.\n * `record` is a `DocumentRecord` for an incarnation that is already committed and a `DocumentCreate` for a new one.\n */\ntype DocumentPlan = {\n\treadonly addressId: string;\n\treadonly record: DocumentCreate | DocumentRecord;\n\tretire: boolean;\n\t/** Creation, copy, or change content; absent when only retirement is written. */\n\tcontent?: Extract<StorageWrite, { readonly type: \"document.create\" | \"document.copy\" | \"document.change\" }>;\n\t/** Prepared change of a tracked incarnation; absent for fork copies and retirement-only entries. */\n\treadonly change?: {\n\t\treadonly tracker: Tracker<JsonObject>;\n\t\treadonly prepared: Prepared<JsonObject>;\n\t\treadonly version: number;\n\t\t/** The cached incarnation this change updates; absent when it creates one. */\n\t\treadonly loaded?: LoadedDocument;\n\t\treadonly definition?: AnyDocDefinition;\n\t};\n\t/** Resolved before Storage admission so adoption performs no reads. */\n\tconversationId?: ConversationId;\n\t/**\n\t * Set when this commit also stores held changes of the incarnation (`takeHeld()`): the operations its stored change\n\t * publishes, held first, and whether it has a change of its own to show the Session's observers.\n\t */\n\theld?: { readonly ops: readonly Op[]; readonly observed: boolean };\n};\n\n/**\n * Transaction for one Session commit callback.\n *\n * Every asynchronous operation is tracked so callback settlement can reject and drain unfinished work. Session calls\n * one settlement method, then either discards prepared changes or adopts them once after Storage succeeds.\n */\nexport class Transaction implements Tx {\n\treadonly #host: TransactionHost;\n\t#context: Context;\n\treadonly #scope: TransactionScope;\n\treadonly #pendingOperations = new Set<Promise<unknown>>();\n\t#sealed = false;\n\t#hasTableWrite = false;\n\n\t/** Atomic batch; conversation and entry writes stage eagerly, while task and document writes assemble later. */\n\treadonly #writes: StorageWrite[] = [];\n\treadonly #createdConversationIds = new Set<ConversationId>();\n\treadonly #forkSourceConversationIds = new Set<ConversationId>();\n\treadonly #forkSourceDocumentIds = new Set<DocumentId>();\n\t/** One entry per task touched by a public read, candidate write, or document-owner lookup. */\n\treadonly #tasksById = new Map<TaskId, TransactionTask>();\n\t/** Submissions created by this transaction, by ID. */\n\treadonly #submissions = new Map<SubmissionId, SubmissionRecord>();\n\t/** Submission settlements and placements in staging order; resolved against the latest candidate record during assembly. */\n\treadonly #submissionChanges: { readonly id: SubmissionId; readonly change: SubmissionChange }[] = [];\n\n\t/** Write and publication plans of every staged incarnation, built during assembly. */\n\treadonly #plans: DocumentPlan[] = [];\n\t/** Every document acquisition or retirement marker in staging order. */\n\treadonly #documents: DocumentEntry[] = [];\n\t/** Latest transaction-local incarnation or retirement marker at each logical address. */\n\treadonly #latestDocumentByAddress = new Map<string, DocumentEntry>();\n\n\tconstructor(host: TransactionHost, context: Context, scope: TransactionScope = {}) {\n\t\tthis.#host = host;\n\t\tthis.#context = context;\n\t\tthis.#scope = scope;\n\t}\n\n\t/** Internal: the context of the commit this transaction belongs to. */\n\tget context(): Context {\n\t\treturn this.#context;\n\t}\n\n\t/** Internal: whether a table write was staged, after which table reads throw `ReadAfterWrite`. */\n\tget hasTableWrite(): boolean {\n\t\treturn this.#hasTableWrite;\n\t}\n\n\t/**\n\t * Internal: whether `tx` is a transaction of a commit of the Session behind `host`. A brand check, so a proxy or\n\t * another wrapper of a transaction is not one.\n\t */\n\tstatic ownedBy(tx: Tx, host: TransactionHost): tx is Transaction {\n\t\treturn #host in tx && tx.#host === host;\n\t}\n\n\t// ─── Table reads ────────────────────────────────────────────────────────\n\n\tconversation(id: ConversationId): Promise<ConversationRecord | undefined> {\n\t\treturn this.#read(\"conversation\", () => this.#host.storage.conversation(id, this.#context));\n\t}\n\n\tentry(id: EntryId): Promise<EntryRecord | undefined>;\n\tentry<D extends JsonValue>(token: Entry<D>, id: EntryId): Promise<TypedEntry<D> | undefined>;\n\tentry(first: EntryId | { readonly kind: string }, second?: EntryId): Promise<EntryRecord | undefined> {\n\t\tconst kind = typeof first === \"number\" ? undefined : first.kind;\n\t\tconst id = typeof first === \"number\" ? first : second!;\n\t\treturn this.#read(\"entry\", async () => {\n\t\t\tconst entry = (await this.#host.storage.entry(id, this.#context))?.entry;\n\t\t\treturn kind === undefined || entry?.kind === kind ? entry : undefined;\n\t\t});\n\t}\n\n\ttask(id: TaskId): Promise<AnyTaskRecord | undefined> {\n\t\treturn this.#read(\"task\", () => this.#committedTask(id));\n\t}\n\n\tscanConversations(query: ConversationQuery, limit: number, cursor?: Cursor) {\n\t\treturn this.#read(\"scanConversations\", () =>\n\t\t\tthis.#host.storage.scanConversations(query, limit, cursor, this.#context),\n\t\t);\n\t}\n\n\tscanEntries(query: EntryQuery, limit: number, cursor?: Cursor) {\n\t\treturn this.#read(\"scanEntries\", () => this.#host.storage.scanEntries(query, limit, cursor, this.#context));\n\t}\n\n\tlatestHeadMarker(conversationId: ConversationId) {\n\t\treturn this.#read(\"latestHeadMarker\", () => this.#host.latestHeadMarker(conversationId, this.#context));\n\t}\n\n\tlatestEntryId(conversationId: ConversationId): Promise<EntryId | undefined> {\n\t\treturn this.#read(\"latestEntryId\", () => this.#host.latestEntryId(conversationId, this.#context));\n\t}\n\n\tscanTasks(query: TaskQuery, limit: number, cursor?: Cursor) {\n\t\treturn this.#read(\"scanTasks\", () => this.#host.storage.scanTasks(query, limit, cursor, this.#context));\n\t}\n\n\t/** Internal: committed submission record. */\n\tsubmission(id: SubmissionId): Promise<SubmissionRecord | undefined> {\n\t\treturn this.#read(\"submission\", () => this.#host.storage.submission(id, this.#context));\n\t}\n\n\t/** Committed submission with a conversation-scoped request ID. */\n\tsubmissionByRequest(conversationId: ConversationId, requestId: string): Promise<SubmissionRecord | undefined> {\n\t\treturn this.#read(\"submissionByRequest\", () =>\n\t\t\tthis.#host.storage.submissionByRequest(conversationId, requestId, this.#context),\n\t\t);\n\t}\n\n\t// ─── Table writes ───────────────────────────────────────────────────────\n\n\tcreateConversation(options: { readonly ownership: ConversationOwnership }): Promise<ConversationRecord> {\n\t\treturn this.#write(() => this.#stageConversation(undefined, options.ownership));\n\t}\n\n\t/** Internal final-form bootstrap path for the reserved root identity. */\n\tcreateRootConversation(): Promise<ConversationRecord> {\n\t\treturn this.#write(() => this.#stageConversation(undefined, { kind: \"ownerless\" }, ROOT_CONVERSATION_ID));\n\t}\n\n\tforkConversation(\n\t\tparentConversationId: ConversationId,\n\t\tat: EntryId,\n\t\toptions: { readonly ownership: ConversationOwnership },\n\t): Promise<ConversationRecord> {\n\t\treturn this.#write(() =>\n\t\t\tthis.#stageConversation({ conversationId: parentConversationId, at }, options.ownership),\n\t\t);\n\t}\n\n\tasync #stageConversation(\n\t\tparent: NonNullable<ConversationRecord[\"parent\"]> | undefined,\n\t\townership: ConversationOwnership,\n\t\treservedId?: ConversationId,\n\t): Promise<ConversationRecord> {\n\t\tconst ownerTaskId = ownership.kind === \"task\" ? ownership.taskId : undefined;\n\t\tconst id = reservedId ?? (await this.#host.storage.mintId<ConversationId>());\n\t\tthis.#assertOpen();\n\t\tlet owner: ConversationRecord[\"owner\"];\n\t\tif (ownerTaskId !== undefined) {\n\t\t\tconst task = await this.#currentTask(ownerTaskId);\n\t\t\tthis.#assertOpen();\n\t\t\tif (task === undefined) throw new Error(`Conversation owner task ${ownerTaskId} does not exist`);\n\t\t\towner = { conversationId: task.conversationId, taskId: ownerTaskId };\n\t\t}\n\t\tconst record: ConversationRecord = {\n\t\t\tid,\n\t\t\t...(parent === undefined ? {} : { parent }),\n\t\t\t...(owner === undefined ? {} : { owner }),\n\t\t};\n\t\tconst copies =\n\t\t\tparent === undefined\n\t\t\t\t? []\n\t\t\t\t: await prepareForkDocumentCopies(this.#host.storage, parent.conversationId, parent.at, id, this.#context);\n\t\tthis.#assertOpen();\n\t\tfor (const copy of copies) {\n\t\t\tthis.#forkSourceDocumentIds.add(copy.source.id);\n\t\t\tconst entry: DocumentEntry = {\n\t\t\t\taddressId: addressId(copy.record),\n\t\t\t\taddress: copy.record,\n\t\t\t\ttarget: { kind: \"fork-copy\", ...copy },\n\t\t\t\tretireOnCommit: false,\n\t\t\t};\n\t\t\tthis.#documents.push(entry);\n\t\t\tthis.#latestDocumentByAddress.set(entry.addressId, entry);\n\t\t}\n\t\tif (parent !== undefined) this.#forkSourceConversationIds.add(parent.conversationId);\n\t\tthis.#createdConversationIds.add(id);\n\t\tthis.#writes.push({ type: \"conversation\", value: record });\n\t\tawait this.#host.conversationCreated(this, record);\n\t\tthis.#assertOpen();\n\t\treturn record;\n\t}\n\n\tappendEntry(conversationId: ConversationId, value: EntryDraft): Promise<EntryRecord>;\n\tappendEntry<D extends JsonValue>(\n\t\ttoken: Entry<D>,\n\t\tconversationId: ConversationId,\n\t\tvalue: TypedEntryDraft<NoInfer<D>>,\n\t): Promise<TypedEntry<D>>;\n\tappendEntry(\n\t\tfirst: ConversationId | { readonly kind: string },\n\t\tsecond: ConversationId | EntryDraft,\n\t\tthird?: object,\n\t): Promise<EntryRecord> {\n\t\tif (typeof first === \"number\") return this.#appendEntry(first, second as EntryDraft);\n\t\treturn this.#appendEntry(second as ConversationId, { ...third, kind: first.kind } as EntryDraft);\n\t}\n\n\t#appendEntry(conversationId: ConversationId, value: EntryDraft): Promise<EntryRecord> {\n\t\treturn this.#write(async () => {\n\t\t\tawait this.#requireConversation(conversationId);\n\t\t\tthis.#assertOpen();\n\t\t\tconst id = await this.#host.storage.mintId<EntryId>();\n\t\t\tthis.#assertOpen();\n\t\t\tconst { head, ...rest } = value;\n\t\t\t// Undefined `head` and `byTaskId` are omitted by the copy.\n\t\t\tconst record = copyJson(\n\t\t\t\t{\n\t\t\t\t\t...rest,\n\t\t\t\t\tid,\n\t\t\t\t\tconversationId,\n\t\t\t\t\thead: head === \"self\" ? id : head,\n\t\t\t\t\tbyTaskId: this.#scope.taskId,\n\t\t\t\t},\n\t\t\t\tTABLE_JSON_COPY_OPTIONS,\n\t\t\t) as unknown as EntryRecord;\n\t\t\tthis.#writes.push({ type: \"entry\", value: record });\n\t\t\treturn record;\n\t\t});\n\t}\n\n\tcreateTask<I, S extends { phase: string }, R, H extends object>(\n\t\ttask: Task<I, S, R, H>,\n\t\tinput: I,\n\t\toptions: TaskCreationOptions,\n\t): Promise<TaskId<R>> {\n\t\treturn this.#write(async () => {\n\t\t\tif (options.submissionIds !== undefined) {\n\t\t\t\tlet trace: TaskOptions[\"trace\"];\n\t\t\t\tlet links: TelemetryCarrier[] | undefined;\n\t\t\t\tfor (let index = 0; index < options.submissionIds.length; index++) {\n\t\t\t\t\tconst id = options.submissionIds[index]!;\n\t\t\t\t\tconst submission = this.#submissions.get(id) ?? (await this.#host.storage.submission(id, this.#context));\n\t\t\t\t\tif (index === 0) trace = submission?.trace ?? \"root\";\n\t\t\t\t\telse if (submission?.trace !== undefined) {\n\t\t\t\t\t\tlinks ??= [];\n\t\t\t\t\t\tlinks.push(submission.trace);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\toptions = { ...options, trace, links };\n\t\t\t}\n\t\t\tconst ownership = options.ownership;\n\t\t\tlet owner: AnyTaskRecord | undefined;\n\t\t\tif (ownership.kind === \"task\") {\n\t\t\t\t// Validated again against the owner's final candidate during assembly.\n\t\t\t\towner = await this.#currentTask(ownership.taskId);\n\t\t\t\tthis.#assertOpen();\n\t\t\t\tif (owner === undefined) throw new Error(`Task owner ${ownership.taskId} does not exist`);\n\t\t\t\tif (options.background === true) throw new TypeError(\"A child task cannot be background\");\n\t\t\t\tif (options.conversationId !== undefined && options.conversationId !== owner.conversationId) {\n\t\t\t\t\tthrow new Error(`A child task lives in its owner's conversation ${owner.conversationId}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst conversationId = owner?.conversationId ?? options.conversationId ?? this.#scope.conversationId;\n\t\t\tif (conversationId === undefined) throw new TypeError(\"Tx.createTask() requires options.conversationId\");\n\t\t\tawait this.#requireConversation(conversationId);\n\t\t\tthis.#assertOpen();\n\t\t\tconst definition = task.definition;\n\t\t\tconst checkpoint = definition.initial(input);\n\t\t\tconst id = await this.#host.storage.mintId<TaskId<R>>();\n\t\t\tthis.#assertOpen();\n\t\t\tconst record = copyJson(\n\t\t\t\t{\n\t\t\t\t\tid,\n\t\t\t\t\tconversationId,\n\t\t\t\t\tkind: definition.name,\n\t\t\t\t\tversion: definition.version,\n\t\t\t\t\tinput,\n\t\t\t\t\ttrace:\n\t\t\t\t\t\toptions.trace === \"root\"\n\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t: (options.trace ?? this.#context.telemetry.propagation?.inject(this.#context.telemetry)),\n\t\t\t\t\tlinks: options.links,\n\t\t\t\t\t...(owner === undefined ? {} : { owner: owner.id }),\n\t\t\t\t\tbackground: options.background ?? false,\n\t\t\t\t\tabortRequested: false,\n\t\t\t\t\t...(options.abandonOnRestart === true ? { abandonOnRestart: true } : {}),\n\t\t\t\t\tstate: { status: \"pending\", checkpoint },\n\t\t\t\t},\n\t\t\t\tTABLE_JSON_COPY_OPTIONS,\n\t\t\t) as unknown as AnyTaskRecord;\n\t\t\tthis.#tasksById.set(id, { write: { kind: \"create\", record } });\n\t\t\treturn id;\n\t\t});\n\t}\n\n\t/** Create a raw submission record with a fresh ID; no admission rules apply. */\n\tcreateSubmission(create: SubmissionCreate): Promise<SubmissionRecord> {\n\t\treturn this.#write(async () => {\n\t\t\tawait this.#requireConversation(create.conversationId);\n\t\t\tthis.#assertOpen();\n\t\t\tconst id = await this.#host.storage.mintId<SubmissionId>();\n\t\t\tthis.#assertOpen();\n\t\t\tconst record = copyJson({ ...create, id }, TABLE_JSON_COPY_OPTIONS) as unknown as SubmissionRecord;\n\t\t\tthis.#submissions.set(id, record);\n\t\t\treturn record;\n\t\t});\n\t}\n\n\t/**\n\t * Settle a submission. Resolved during assembly against the transaction's latest candidate record, falling back to\n\t * committed state, so it is not a caller table read and works after the first table write.\n\t */\n\tsettleSubmission(id: SubmissionId, settlement: SubmissionSettlement): void {\n\t\tthis.#assertOpen();\n\t\tthis.#hasTableWrite = true;\n\t\tthis.#submissionChanges.push({ id, change: copyJson(settlement) as SubmissionSettlement });\n\t}\n\n\t/** Place a queued submission at `entry`; resolved during assembly like `settleSubmission()`. */\n\tplaceSubmission(id: SubmissionId, entry: EntryId): void {\n\t\tthis.#assertOpen();\n\t\tthis.#hasTableWrite = true;\n\t\tthis.#submissionChanges.push({ id, change: { status: \"placed\", entry } });\n\t}\n\n\t/** Internal: replace one task record completely. Tasks change their own state through their runtime. */\n\tsetTask(value: AnyTaskRecord): void {\n\t\tthis.#assertOpen();\n\t\tthis.#hasTableWrite = true;\n\t\tconst task = this.#taskEntry(value.id);\n\t\tconst candidate = task.write?.record;\n\t\tif (candidate?.state.status === \"terminal\") {\n\t\t\tthrow new Error(`Task ${value.id} already has a terminal candidate`);\n\t\t}\n\t\tif (candidate !== undefined && candidate.conversationId !== value.conversationId) {\n\t\t\tthrow new Error(`Task ${value.id} cannot change conversations`);\n\t\t}\n\t\ttask.write = {\n\t\t\tkind: task.write?.kind === \"create\" ? \"create\" : \"replace\",\n\t\t\trecord: copyJson(this.#stampTimes(value, candidate), TABLE_JSON_COPY_OPTIONS) as unknown as AnyTaskRecord,\n\t\t};\n\t}\n\n\t/** Internal: candidate records of the tasks this transaction created or replaced so far. */\n\tstagedTasks(): AnyTaskRecord[] {\n\t\tconst records: AnyTaskRecord[] = [];\n\t\tfor (const task of this.#tasksById.values()) if (task.write !== undefined) records.push(task.write.record);\n\t\treturn records;\n\t}\n\n\t/** Internal: IDs of the tasks this transaction creates. */\n\tcreatedTaskIds(): TaskId[] {\n\t\tconst ids: TaskId[] = [];\n\t\tfor (const [id, task] of this.#tasksById) if (task.write?.kind === \"create\") ids.push(id);\n\t\treturn ids;\n\t}\n\n\t/** Internal: conversations this transaction created or forked so far. */\n\tstagedConversations(): ConversationRecord[] {\n\t\tconst records: ConversationRecord[] = [];\n\t\tfor (const write of this.#writes) if (write.type === \"conversation\") records.push(write.value);\n\t\treturn records;\n\t}\n\n\t// ─── Documents ──────────────────────────────────────────────────────────\n\tdoc<T extends JsonObject>(token: SessionDocToken<T>): Promise<Draft<T>>;\n\tdoc<T extends JsonObject>(token: ConversationDocToken<T>, conversationId: ConversationId): Promise<Draft<T>>;\n\tdoc<T extends JsonObject>(token: TaskDocToken<T>, taskId: TaskId): Promise<Draft<T>>;\n\tdoc<T extends JsonObject, I extends JsonValue>(\n\t\ttoken: SessionDocFamilyToken<T, I>,\n\t\tkey: string,\n\t\tseed: I,\n\t): Promise<Draft<T>>;\n\tdoc<T extends JsonObject, I extends JsonValue>(\n\t\ttoken: ConversationDocFamilyToken<T, I>,\n\t\tconversationId: ConversationId,\n\t\tkey: string,\n\t\tseed: I,\n\t): Promise<Draft<T>>;\n\tdoc<T extends JsonObject, I extends JsonValue>(\n\t\ttoken: TaskDocFamilyToken<T, I>,\n\t\ttaskId: TaskId,\n\t\tkey: string,\n\t\tseed: I,\n\t): Promise<Draft<T>>;\n\tdoc(token: AnyDocToken, ...args: readonly unknown[]): Promise<Draft<JsonObject>> {\n\t\ttry {\n\t\t\tthis.#assertOpen();\n\t\t\tconst definition = token.definition;\n\t\t\tconst resolved = resolveAddress(definition, args);\n\t\t\tthis.#assertTaskDocumentsOpen(resolved);\n\t\t\tconst latest = this.#latestDocumentByAddress.get(resolved.id);\n\t\t\tif (latest !== undefined && !latest.retireOnCommit) {\n\t\t\t\tif (latest.draftPromise !== undefined) return latest.draftPromise;\n\t\t\t\tif (latest.target?.kind === \"fork-copy\") {\n\t\t\t\t\tlatest.draftPromise = this.#track(this.#acquireForkCopy(latest, definition, latest.target));\n\t\t\t\t\treturn latest.draftPromise;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst seed = definition.family === true ? copyJson(args[resolved.nextArgument]) : undefined;\n\t\t\tconst docEntry: DocumentEntry = {\n\t\t\t\taddressId: resolved.id,\n\t\t\t\taddress: resolved.address,\n\t\t\t\tdefinition,\n\t\t\t\tretireOnCommit: false,\n\t\t\t};\n\t\t\tthis.#documents.push(docEntry);\n\t\t\tthis.#latestDocumentByAddress.set(docEntry.addressId, docEntry);\n\t\t\t// Capture retirement before awaiting so a pending old acquisition and its replacement stay distinct.\n\t\t\tdocEntry.draftPromise = this.#track(this.#acquire(docEntry, seed, latest?.retireOnCommit === true));\n\t\t\treturn docEntry.draftPromise;\n\t\t} catch (error) {\n\t\t\treturn Promise.reject(error);\n\t\t}\n\t}\n\n\tretireDoc<T extends JsonObject>(token: SessionDocToken<T>): Promise<void>;\n\tretireDoc<T extends JsonObject>(token: ConversationDocToken<T>, conversationId: ConversationId): Promise<void>;\n\tretireDoc<T extends JsonObject>(token: TaskDocToken<T>, taskId: TaskId): Promise<void>;\n\tretireDoc<T extends JsonObject, I extends JsonValue>(token: SessionDocFamilyToken<T, I>, key: string): Promise<void>;\n\tretireDoc<T extends JsonObject, I extends JsonValue>(\n\t\ttoken: ConversationDocFamilyToken<T, I>,\n\t\tconversationId: ConversationId,\n\t\tkey: string,\n\t): Promise<void>;\n\tretireDoc<T extends JsonObject, I extends JsonValue>(\n\t\ttoken: TaskDocFamilyToken<T, I>,\n\t\ttaskId: TaskId,\n\t\tkey: string,\n\t): Promise<void>;\n\tretireDoc(token: AnyDocToken, ...args: readonly unknown[]): Promise<void> {\n\t\ttry {\n\t\t\tthis.#assertOpen();\n\t\t\tconst definition = token.definition;\n\t\t\tconst resolved = resolveAddress(definition, args);\n\t\t\tconst latest = this.#latestDocumentByAddress.get(resolved.id);\n\t\t\tif (latest?.retireOnCommit) return Promise.resolve();\n\t\t\tif (latest?.target?.kind === \"fork-copy\") {\n\t\t\t\tcheckRecordScope(definition, latest.target.record);\n\t\t\t\tlatest.retireOnCommit = true;\n\t\t\t\treturn Promise.resolve();\n\t\t\t}\n\t\t\tif (latest?.draftPromise !== undefined) {\n\t\t\t\t// Retirement of an acquired draft persists its final content before retirement.\n\t\t\t\tlatest.retireOnCommit = true;\n\t\t\t\treturn this.#track(latest.draftPromise.then(() => undefined));\n\t\t\t}\n\t\t\tconst entry: DocumentEntry = {\n\t\t\t\taddressId: resolved.id,\n\t\t\t\taddress: resolved.address,\n\t\t\t\tdefinition,\n\t\t\t\tretireOnCommit: true,\n\t\t\t};\n\t\t\tthis.#documents.push(entry);\n\t\t\tthis.#latestDocumentByAddress.set(entry.addressId, entry);\n\t\t\treturn this.#track(this.#findRetirement(entry));\n\t\t} catch (error) {\n\t\t\treturn Promise.reject(error);\n\t\t}\n\t}\n\n\tasync #acquire(entry: DocumentEntry, seed: JsonValue | undefined, skipLoad: boolean): Promise<Draft<JsonObject>> {\n\t\tconst definition = entry.definition!;\n\t\tconst loaded = skipLoad\n\t\t\t? undefined\n\t\t\t: await this.#host.load(definition, entry.addressId, entry.address, this.#context);\n\t\tthis.#assertOpen();\n\t\tif (loaded !== undefined) {\n\t\t\tcheckRecordScope(definition, loaded.record);\n\t\t\tcheckRecordVersion(definition, loaded.record, loaded.storedVersion);\n\t\t\tentry.target = { kind: \"loaded\", document: loaded };\n\t\t\tentry.change = loaded.tracker.beginChange();\n\t\t\treturn entry.change.state;\n\t\t}\n\t\tconst scope = entry.address.scope;\n\t\tif (scope.kind === \"conversation\") await this.#requireConversation(scope.conversationId);\n\t\tif (scope.kind === \"task\") {\n\t\t\tconst task = await this.#currentTask(scope.taskId);\n\t\t\tif (task === undefined) throw new Error(`Task ${scope.taskId} does not exist`);\n\t\t\tif (task.state.status === \"terminal\") throw new Error(`Task ${scope.taskId} is terminal`);\n\t\t}\n\t\tthis.#assertOpen();\n\t\tconst value = copyJson(\n\t\t\tdefinition.family === true ? definition.initial(seed) : definition.initial(),\n\t\t) as JsonObject;\n\t\tconst id = await this.#host.storage.mintId<DocumentId>();\n\t\tthis.#assertOpen();\n\t\tconst tracker = track(value);\n\t\tentry.target = {\n\t\t\tkind: \"created\",\n\t\t\trecord: documentCreate(definition, entry.address, id),\n\t\t\tversion: definition.version,\n\t\t\ttracker,\n\t\t};\n\t\tentry.change = tracker.beginChange();\n\t\treturn entry.change.state;\n\t}\n\n\tasync #acquireForkCopy(\n\t\tentry: DocumentEntry,\n\t\tdefinition: AnyDocDefinition,\n\t\ttarget: Extract<DocumentTarget, { readonly kind: \"fork-copy\" }>,\n\t): Promise<Draft<JsonObject>> {\n\t\tconst stored = await this.#host.storage.document(target.source.id, target.source.at, this.#context);\n\t\tthis.#assertOpen();\n\t\tif (stored === undefined) {\n\t\t\tthrow new Error(`Fork source document ${target.source.id} cannot be read`);\n\t\t}\n\t\tif (\n\t\t\tstored.record.scope.kind !== \"conversation\" ||\n\t\t\tstored.record.kind !== target.record.kind ||\n\t\t\tstored.record.key !== target.record.key ||\n\t\t\tstored.record.history !== target.record.history ||\n\t\t\tstored.record.fork !== target.record.fork\n\t\t) {\n\t\t\tthrow new Error(`Fork source document ${target.source.id} does not match the copied record`);\n\t\t}\n\t\tconst value = materializeDocumentValue(definition, target.record, stored.version, stored.value);\n\t\tconst tracker = track(value);\n\t\tentry.definition = definition;\n\t\tentry.target = { kind: \"created\", record: target.record, version: definition.version, tracker };\n\t\tentry.change = tracker.beginChange();\n\t\treturn entry.change.state;\n\t}\n\n\tasync #findRetirement(entry: DocumentEntry): Promise<void> {\n\t\tconst gate = this.#host.touch(documentKey(entry.addressId));\n\t\tif (gate !== undefined) await gate;\n\t\tconst record =\n\t\t\tthis.#host.cached(entry.addressId)?.record ??\n\t\t\t(await this.#host.storage.findDocument(entry.address, \"current\", this.#context));\n\t\tthis.#assertOpen();\n\t\tif (record === undefined) return;\n\t\tcheckRecordScope(entry.definition!, record);\n\t\tentry.target = { kind: \"retire-only\", record };\n\t}\n\n\t// ─── Settlement ─────────────────────────────────────────────────────────\n\n\t/** Seal after callback failure: abort every change and observe every pending operation. */\n\tasync settleFailure(): Promise<void> {\n\t\tthis.#sealed = true;\n\t\tthis.#abortChanges();\n\t\tawait Promise.allSettled(this.#pendingOperations);\n\t\tthis.#context = BACKGROUND_CONTEXT;\n\t}\n\n\t/**\n\t * Seal after callback success, prepare every open change, and assemble the atomic batch.\n\t * Any failure aborts every change before Storage admission.\n\t */\n\tasync settleSuccess(): Promise<readonly StorageWrite[]> {\n\t\tthis.#sealed = true;\n\t\tif (this.#pendingOperations.size > 0) {\n\t\t\tthis.#abortChanges();\n\t\t\tawait Promise.allSettled(this.#pendingOperations);\n\t\t\tthis.#context = BACKGROUND_CONTEXT;\n\t\t\tthrow new Error(\"Session commit callback settled before its pending Tx operations\");\n\t\t}\n\t\ttry {\n\t\t\t// Synchronously prepare every open change; this revokes every draft.\n\t\t\tfor (const document of this.#documents) {\n\t\t\t\tif (document.change !== undefined) document.prepared = document.change.prepare();\n\t\t\t}\n\t\t\treturn await this.#assemble();\n\t\t} catch (error) {\n\t\t\tthis.#abortChanges();\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tthis.#context = BACKGROUND_CONTEXT;\n\t\t}\n\t}\n\n\t/** Abort every prepared change after Storage failure or when no write is required. */\n\tdiscard(): void {\n\t\tthis.#abortChanges();\n\t}\n\n\t/**\n\t * Internal: what a deferred commit holds in memory instead of storing (`CommitPersistence`), each changed incarnation\n\t * with its operations and whether they selected a base; `undefined` when the commit must be stored. It may be held\n\t * only when every write changes an existing `latest`, `initial`-fork conversation document at its stored version.\n\t */\n\tholdable(): { readonly loaded: LoadedDocument; readonly ops: readonly Op[]; readonly base: boolean }[] | undefined {\n\t\tif (this.#writes.some((write) => write.type !== \"document.change\")) return undefined;\n\t\tconst held = [];\n\t\tfor (const plan of this.#plans) {\n\t\t\tconst { content, change } = plan;\n\t\t\tif (content === undefined && !plan.retire) continue;\n\t\t\tif (plan.retire || change?.loaded === undefined || content?.type !== \"document.change\") return undefined;\n\t\t\tconst { loaded, prepared, version } = change;\n\t\t\tconst record = loaded.record;\n\t\t\tif (record.scope.kind !== \"conversation\" || record.history !== \"latest\" || record.fork !== \"initial\") {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\t// A migration stores a base at once.\n\t\t\tif (loaded.storedVersion !== version) return undefined;\n\t\t\theld.push({ loaded, ops: prepared.ops, base: content.content.kind === \"base\" });\n\t\t}\n\t\treturn held;\n\t}\n\n\t/**\n\t * Internal: adopt a held commit (`holdable()`) in memory only. Trackers advance by pointer swap; stored versions and\n\t * delta counts stay, as nothing was stored. Returns its publication for the Session's own observers.\n\t */\n\tadoptHeld(): DocumentCommitChange[] {\n\t\tconst publications: DocumentCommitChange[] = [];\n\t\tfor (const plan of this.#plans) {\n\t\t\t// Every plan of a held commit changes or reads a loaded incarnation (`holdable()`).\n\t\t\tconst { tracker, prepared, version, loaded } = plan.change!;\n\t\t\tif (prepared.ops.length === 0) {\n\t\t\t\tprepared.abort();\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ttracker.adopt(prepared);\n\t\t\tconst record = loaded!.record;\n\t\t\tconst conversationId = plan.conversationId;\n\t\t\tpublications.push({\n\t\t\t\ttype: \"document\",\n\t\t\t\tkind: \"change\",\n\t\t\t\trecord,\n\t\t\t\tconversationId,\n\t\t\t\tversion,\n\t\t\t\tvalue: prepared.value,\n\t\t\t\tops: prepared.ops,\n\t\t\t});\n\t\t}\n\t\treturn publications;\n\t}\n\n\t/**\n\t * Internal: store the held changes of every incarnation this commit reads or writes in front of its own, so a stored\n\t * document never misses an operation its later ones build on. Called right before Storage admission, after every\n\t * fallible step, because it empties the holds: a failure earlier keeps them. Returns the holds it took.\n\t */\n\ttakeHeld<H extends HeldDocument>(held: (id: DocumentId) => H | undefined): H[] {\n\t\tconst taken: H[] = [];\n\t\tfor (const plan of this.#plans) {\n\t\t\t// A new incarnation holds nothing yet.\n\t\t\tif (!(\"createdAt\" in plan.record)) continue;\n\t\t\tconst hold = held(plan.record.id);\n\t\t\tif (hold === undefined) continue;\n\t\t\ttaken.push(hold);\n\t\t\tconst own = plan.content?.type === \"document.change\" ? plan.content : undefined;\n\t\t\tconst change = plan.change;\n\t\t\tconst value = change?.prepared.value ?? hold.loaded.tracker.value;\n\t\t\tconst stored = storeHeld(hold, change?.prepared.ops ?? EMPTY_OPERATIONS, value, hold.loaded.valueVersion);\n\t\t\t// A base this commit selected or must write covers what was held.\n\t\t\tconst content = own?.content.kind === \"base\" ? own.content : stored.content;\n\t\t\tconst write = { type: \"document.change\", id: plan.record.id, content } as const;\n\t\t\tif (own !== undefined) this.#writes[this.#writes.indexOf(own)] = write;\n\t\t\telse this.#insertBeforeRetirement(write);\n\t\t\tif (!plan.retire) plan.held = { ops: stored.ops, observed: own !== undefined };\n\t\t\tplan.content = write;\n\t\t\t// Held documents are conversation documents; one this commit only read has no owner resolved yet.\n\t\t\tif (plan.record.scope.kind === \"conversation\") plan.conversationId = plan.record.scope.conversationId;\n\t\t}\n\t\treturn taken;\n\t}\n\n\t/**\n\t * Internal: the keys this commit writes, once settled (and after `takeHeld()`), for the Session's unpublished write\n\t * set: its table records, and the address and incarnation of every document it creates, changes, or retires, with\n\t * the scope of every incarnation it creates or retires.\n\t */\n\twriteKeys(): string[] {\n\t\tconst keys: string[] = [];\n\t\ttableKeys(this.#writes, keys);\n\t\tfor (const plan of this.#plans) {\n\t\t\tif (plan.content === undefined && !plan.retire) continue;\n\t\t\tkeys.push(documentKey(plan.addressId), incarnationKey(plan.record.id));\n\t\t\tif (plan.retire || !(\"createdAt\" in plan.record)) keys.push(scopeKey(plan.record.scope));\n\t\t}\n\t\treturn keys;\n\t}\n\n\t/** Stage a content write for an incarnation, before its retirement when it retires. */\n\t#insertBeforeRetirement(write: Extract<StorageWrite, { readonly type: \"document.change\" }>): void {\n\t\tconst at = this.#writes.findIndex(\n\t\t\t(candidate) => candidate.type === \"document.retire\" && candidate.id === write.id,\n\t\t);\n\t\tif (at < 0) this.#writes.push(write);\n\t\telse this.#writes.splice(at, 0, write);\n\t}\n\n\t/** Adopt every prepared change by pointer swap after Storage success and describe the publication. */\n\tadopt(seq: Seq): AdoptedDocuments {\n\t\tconst publications: DocumentCommitChange[] = [];\n\t\t// Only when the commit stored held changes: then what Storage got differs from what memory adopted.\n\t\tlet stored: DocumentCommitChange[] | undefined;\n\t\tfor (const plan of this.#plans) {\n\t\t\tconst committed = \"createdAt\" in plan.record;\n\t\t\tlet record: DocumentRecord = committed ? (plan.record as DocumentRecord) : { ...plan.record, createdAt: seq };\n\t\t\tif (plan.retire) record = { ...record, retiredAt: seq };\n\t\t\tconst change = plan.change;\n\t\t\tif (change !== undefined) {\n\t\t\t\tconst { tracker, prepared, loaded, version } = change;\n\t\t\t\t// A new incarnation is adopted unless it retires in the same commit; a loaded one only when it changed.\n\t\t\t\tif (loaded === undefined ? !plan.retire : prepared.ops.length > 0) tracker.adopt(prepared);\n\t\t\t\telse prepared.abort();\n\t\t\t\tif (loaded !== undefined) {\n\t\t\t\t\tif (loaded.storedVersion < version) loaded.storedVersion = version;\n\t\t\t\t\tif (plan.content?.type === \"document.change\") {\n\t\t\t\t\t\tif (plan.content.content.kind === \"base\") loaded.deltasSinceBase = 0;\n\t\t\t\t\t\telse loaded.deltasSinceBase++;\n\t\t\t\t\t}\n\t\t\t\t} else if (!plan.retire) {\n\t\t\t\t\tthis.#host.install({\n\t\t\t\t\t\taddressId: plan.addressId,\n\t\t\t\t\t\trecord,\n\t\t\t\t\t\tstoredVersion: version,\n\t\t\t\t\t\tvalueVersion: version,\n\t\t\t\t\t\tdeltasSinceBase: 0,\n\t\t\t\t\t\ttracker,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (plan.retire && committed) this.#host.evict(plan.addressId, record.id);\n\t\t\tconst publication = describe(plan, record);\n\t\t\tif (publication === undefined) continue;\n\t\t\tconst held = plan.held;\n\t\t\tif (held === undefined) {\n\t\t\t\tpublications.push(publication);\n\t\t\t\tstored?.push(publication);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tstored ??= [...publications];\n\t\t\tif (held.observed) publications.push(publication);\n\t\t\t// Only a document change of a loaded incarnation carries held operations; a retirement is published alone.\n\t\t\tstored.push(\n\t\t\t\tpublication.type === \"document\" && publication.kind === \"change\"\n\t\t\t\t\t? { ...publication, ops: held.ops }\n\t\t\t\t\t: publication,\n\t\t\t);\n\t\t}\n\t\treturn { observed: publications, stored: stored ?? publications };\n\t}\n\n\tasync #assemble(): Promise<StorageWrite[]> {\n\t\tconst storage = this.#host.storage;\n\t\tconst plans = this.#plans;\n\t\tfor (const document of this.#documents) {\n\t\t\tconst plan = planDocument(document);\n\t\t\tif (plan !== undefined) plans.push(plan);\n\t\t}\n\t\tthis.#rejectForkSourceWrites(plans);\n\t\tawait this.#validateOwners();\n\t\tfor (const [id, task] of this.#tasksById) {\n\t\t\tif (task.write?.kind !== \"replace\") continue;\n\t\t\tconst committed = await this.#committedTask(id);\n\t\t\tif (committed === undefined) throw new Error(`Task ${id} does not exist`);\n\t\t\tif (committed.state.status === \"terminal\") throw new Error(`Task ${id} is already terminal`);\n\t\t\tif (committed.conversationId !== task.write.record.conversationId) {\n\t\t\t\tthrow new Error(`Task ${id} cannot change conversations`);\n\t\t\t}\n\t\t}\n\n\t\t// Terminal settlement retires every task document, including ones created by this transaction.\n\t\tconst terminalTaskIds = new Set<TaskId>();\n\t\tfor (const task of this.#tasksById.values()) {\n\t\t\tif (task.write?.record.state.status === \"terminal\") terminalTaskIds.add(task.write.record.id);\n\t\t}\n\t\tif (terminalTaskIds.size > 0) {\n\t\t\tconst retiring = new Set<DocumentId>();\n\t\t\tfor (const plan of plans) {\n\t\t\t\tconst scope = plan.record.scope;\n\t\t\t\tif (scope.kind !== \"task\" || !terminalTaskIds.has(scope.taskId)) continue;\n\t\t\t\tplan.retire = true;\n\t\t\t\tretiring.add(plan.record.id);\n\t\t\t}\n\t\t\tconst retire = (record: DocumentRecord): void => {\n\t\t\t\tif (retiring.has(record.id)) return;\n\t\t\t\tplans.push({ addressId: addressId(record), record, retire: true });\n\t\t\t\tretiring.add(record.id);\n\t\t\t};\n\t\t\tfor (const taskId of terminalTaskIds) {\n\t\t\t\tif (this.#tasksById.get(taskId)?.write?.kind === \"create\") continue;\n\t\t\t\t// The Session knows the documents of the tasks it created; any other task's are scanned.\n\t\t\t\tconst gate = this.#host.touch(scopeKey({ kind: \"task\", taskId }));\n\t\t\t\tif (gate !== undefined) await gate;\n\t\t\t\tconst known = this.#host.taskDocuments(taskId);\n\t\t\t\tif (known !== undefined) {\n\t\t\t\t\tfor (const record of known) retire(record);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tlet cursor: Cursor | undefined;\n\t\t\t\tdo {\n\t\t\t\t\tconst page = await storage.scanDocuments(\n\t\t\t\t\t\t{ scope: { kind: \"task\", taskId }, at: \"current\" },\n\t\t\t\t\t\tINTERNAL_SCAN_PAGE_SIZE,\n\t\t\t\t\t\tcursor,\n\t\t\t\t\t\tthis.#context,\n\t\t\t\t\t);\n\t\t\t\t\tfor (const record of page.items) retire(record);\n\t\t\t\t\tcursor = page.next;\n\t\t\t\t} while (cursor !== undefined);\n\t\t\t}\n\t\t}\n\n\t\t// Resolve publication ownership before Storage admission so adoption remains synchronous.\n\t\tfor (const plan of plans) {\n\t\t\tif (!publishes(plan)) continue;\n\t\t\tconst scope = plan.record.scope;\n\t\t\tif (scope.kind === \"conversation\") plan.conversationId = scope.conversationId;\n\t\t\tif (scope.kind !== \"task\") continue;\n\t\t\tconst task = this.#taskEntry(scope.taskId);\n\t\t\tif (task.publicationConversationId === undefined) {\n\t\t\t\tconst current = await this.#currentTask(scope.taskId);\n\t\t\t\tif (current !== undefined) task.publicationConversationId = current.conversationId;\n\t\t\t}\n\t\t\tplan.conversationId = task.publicationConversationId;\n\t\t}\n\n\t\tfor (const { id, change } of this.#submissionChanges) {\n\t\t\tconst current = this.#submissions.get(id) ?? (await storage.submission(id, this.#context));\n\t\t\tif (current === undefined) throw new Error(`Submission ${id} does not exist`);\n\t\t\tconst next = applySubmissionChange(current, change);\n\t\t\tif (next !== current) this.#submissions.set(id, next);\n\t\t}\n\n\t\tconst writes = this.#writes;\n\t\tfor (const value of this.#submissions.values()) writes.push({ type: \"submission\", value });\n\t\tfor (const task of this.#tasksById.values()) {\n\t\t\tif (task.write !== undefined) writes.push({ type: \"task\", value: task.write.record });\n\t\t}\n\t\tfor (const plan of plans) {\n\t\t\tconst change = plan.change;\n\t\t\t// Checkpoint predicates run last, after every validation.\n\t\t\tif (plan.content?.type === \"document.change\" && plan.content.content.kind === \"delta\" && change?.loaded) {\n\t\t\t\tconst { prepared, version } = change;\n\t\t\t\tconst info = { deltasSinceBase: change.loaded.deltasSinceBase };\n\t\t\t\tif (change.definition!.checkpointWhen(prepared.value, prepared.ops, info)) {\n\t\t\t\t\tplan.content = { ...plan.content, content: { version, kind: \"base\", value: prepared.value } };\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (plan.content !== undefined) writes.push(plan.content);\n\t\t\tif (plan.retire) writes.push({ type: \"document.retire\", id: plan.record.id });\n\t\t}\n\t\treturn writes;\n\t}\n\n\t// ─── Helpers ────────────────────────────────────────────────────────────\n\n\t/**\n\t * New owned work needs a live owner, judged on the owner's final candidate: not `completing`, terminal, or\n\t * abort-marked. A task therefore cannot create owned work in the commit that finishes it (spec §5.5).\n\t */\n\tasync #validateOwners(): Promise<void> {\n\t\tconst owners: { readonly what: string; readonly taskId: TaskId }[] = [];\n\t\tfor (const write of this.#writes) {\n\t\t\tif (write.type !== \"conversation\" || write.value.owner === undefined) continue;\n\t\t\towners.push({ what: \"Conversation owner task\", taskId: write.value.owner.taskId });\n\t\t}\n\t\tfor (const task of this.#tasksById.values()) {\n\t\t\tconst record = task.write?.kind === \"create\" ? task.write.record : undefined;\n\t\t\tif (record?.owner !== undefined) owners.push({ what: \"Task owner\", taskId: record.owner });\n\t\t}\n\t\tfor (const { what, taskId } of owners) {\n\t\t\tconst task = await this.#currentTask(taskId);\n\t\t\tif (task === undefined) throw new Error(`${what} ${taskId} does not exist`);\n\t\t\tif (task.state.status === \"terminal\" || task.state.status === \"completing\") {\n\t\t\t\tthrow new Error(`${what} ${taskId} is ${task.state.status}`);\n\t\t\t}\n\t\t\tif (task.abortRequested) throw new Error(`${what} ${taskId} is abort-marked`);\n\t\t}\n\t}\n\n\t#rejectForkSourceWrites(plans: readonly DocumentPlan[]): void {\n\t\tfor (const plan of plans) {\n\t\t\tif (plan.content === undefined && !plan.retire) continue;\n\t\t\tconst record = plan.record;\n\t\t\tif (this.#forkSourceDocumentIds.has(record.id)) {\n\t\t\t\tthrow new Error(`Cannot change fork source document ${record.id} in the fork transaction`);\n\t\t\t}\n\t\t\tconst scope = plan.record.scope;\n\t\t\tif (\n\t\t\t\tscope.kind === \"conversation\" &&\n\t\t\t\tthis.#forkSourceConversationIds.has(scope.conversationId) &&\n\t\t\t\trecord.scope.kind === \"conversation\" &&\n\t\t\t\trecord.fork === \"current\"\n\t\t\t) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Cannot fork conversation ${scope.conversationId} while changing its current-policy documents`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t#abortChanges(): void {\n\t\tfor (const document of this.#documents) document.change?.abort();\n\t}\n\n\t#assertOpen(): void {\n\t\tif (this.#sealed) throw new Error(\"Transaction has settled\");\n\t}\n\n\t#assertTaskDocumentsOpen(resolved: ResolvedAddress): void {\n\t\tconst scope = resolved.address.scope;\n\t\tif (scope.kind === \"task\" && this.#tasksById.get(scope.taskId)?.write?.record.state.status === \"terminal\") {\n\t\t\tthrow new Error(`Task ${scope.taskId} is terminal`);\n\t\t}\n\t}\n\n\t/** Register an operation so callback settlement can reject and drain it. */\n\t#track<T>(operation: Promise<T>): Promise<T> {\n\t\tthis.#pendingOperations.add(operation);\n\t\tconst settle = (): void => {\n\t\t\tthis.#pendingOperations.delete(operation);\n\t\t};\n\t\toperation.then(settle, settle);\n\t\treturn operation;\n\t}\n\n\t#read<T>(method: string, read: () => Promise<T>): Promise<T> {\n\t\ttry {\n\t\t\tthis.#assertOpen();\n\t\t\tif (this.#hasTableWrite) throw new ReadAfterWrite(`Tx.${method}()`);\n\t\t\treturn this.#track(read());\n\t\t} catch (error) {\n\t\t\treturn Promise.reject(error);\n\t\t}\n\t}\n\n\t#write<T>(write: () => Promise<T>): Promise<T> {\n\t\ttry {\n\t\t\tthis.#assertOpen();\n\t\t\tthis.#hasTableWrite = true;\n\t\t\treturn this.#track(write());\n\t\t} catch (error) {\n\t\t\treturn Promise.reject(error);\n\t\t}\n\t}\n\n\tasync #requireConversation(id: ConversationId): Promise<void> {\n\t\tif (this.#createdConversationIds.has(id)) return;\n\t\tif ((await this.#host.storage.conversation(id, this.#context)) === undefined) {\n\t\t\tthrow new Error(`Conversation ${id} does not exist`);\n\t\t}\n\t}\n\n\t/**\n\t * Lifecycle times: `startedAt` on the first change to `running`, `endedAt` on the change to `terminal`. Once set,\n\t * they carry over from the replaced record; records written before they existed lack them.\n\t */\n\t#stampTimes(value: AnyTaskRecord, candidate: AnyTaskRecord | undefined): AnyTaskRecord {\n\t\tconst status = value.state.status;\n\t\tconst now = (stamps: boolean) => (stamps ? this.#host.now() : undefined);\n\t\tconst startedAt = candidate?.startedAt ?? value.startedAt ?? now(status === \"running\");\n\t\tconst endedAt = candidate?.endedAt ?? value.endedAt ?? now(status === \"terminal\");\n\t\tif (startedAt === value.startedAt && endedAt === value.endedAt) return value;\n\t\treturn {\n\t\t\t...value,\n\t\t\t...(startedAt === undefined ? {} : { startedAt }),\n\t\t\t...(endedAt === undefined ? {} : { endedAt }),\n\t\t};\n\t}\n\n\t#taskEntry(id: TaskId): TransactionTask {\n\t\tlet task = this.#tasksById.get(id);\n\t\tif (task === undefined) {\n\t\t\ttask = {};\n\t\t\tthis.#tasksById.set(id, task);\n\t\t}\n\t\treturn task;\n\t}\n\n\t/** Latest candidate task record, falling back to committed state; not a caller table read. */\n\tasync #currentTask(id: TaskId): Promise<AnyTaskRecord | undefined> {\n\t\treturn this.#tasksById.get(id)?.write?.record ?? (await this.#committedTask(id));\n\t}\n\n\t#committedTask(id: TaskId): Promise<AnyTaskRecord | undefined> {\n\t\tconst task = this.#taskEntry(id);\n\t\ttask.committedRead ??= this.#host.storage.task(id, this.#context);\n\t\treturn task.committedRead;\n\t}\n}\n\n/** Plan of one staged document: its record, content write, and prepared change. Retirement is decided later. */\nfunction planDocument(document: DocumentEntry): DocumentPlan | undefined {\n\tconst target = document.target;\n\tif (target === undefined) return undefined;\n\tconst plan = { addressId: document.addressId, retire: document.retireOnCommit };\n\tswitch (target.kind) {\n\t\tcase \"created\": {\n\t\t\tconst prepared = document.prepared!;\n\t\t\tconst { record, version, tracker } = target;\n\t\t\tconst content = { version, kind: \"base\", value: prepared.value } as const;\n\t\t\treturn {\n\t\t\t\t...plan,\n\t\t\t\trecord,\n\t\t\t\tcontent: { type: \"document.create\", record, content },\n\t\t\t\tchange: { tracker, prepared, version },\n\t\t\t};\n\t\t}\n\t\tcase \"fork-copy\":\n\t\t\treturn {\n\t\t\t\t...plan,\n\t\t\t\trecord: target.record,\n\t\t\t\tcontent: { type: \"document.copy\", record: target.record, source: target.source },\n\t\t\t};\n\t\tcase \"retire-only\":\n\t\t\treturn { ...plan, record: target.record };\n\t\tcase \"loaded\": {\n\t\t\tconst loaded = target.document;\n\t\t\tconst definition = document.definition!;\n\t\t\tconst prepared = document.prepared!;\n\t\t\tconst version = definition.version;\n\t\t\tconst id = loaded.record.id;\n\t\t\t// A version change stores a base even without operations; otherwise only a change stores a delta.\n\t\t\tconst content =\n\t\t\t\tloaded.storedVersion < version\n\t\t\t\t\t? ({ type: \"document.change\", id, content: { version, kind: \"base\", value: prepared.value } } as const)\n\t\t\t\t\t: prepared.ops.length > 0\n\t\t\t\t\t\t? ({ type: \"document.change\", id, content: { version, kind: \"delta\", ops: prepared.ops } } as const)\n\t\t\t\t\t\t: undefined;\n\t\t\tconst change = {\n\t\t\t\ttracker: loaded.tracker,\n\t\t\t\tprepared,\n\t\t\t\tversion,\n\t\t\t\tloaded,\n\t\t\t\tdefinition,\n\t\t\t};\n\t\t\treturn { ...plan, record: loaded.record, change, ...(content === undefined ? {} : { content }) };\n\t\t}\n\t}\n}\n\n/** The publication of one adopted plan, if it publishes (`publishes()`), with `record` as committed. */\nfunction describe(plan: DocumentPlan, record: DocumentRecord): DocumentCommitChange | undefined {\n\tconst conversationId = plan.conversationId;\n\tif (plan.retire) return { type: \"document\", kind: \"retire\", record, conversationId };\n\tif (plan.content?.type === \"document.copy\") {\n\t\treturn { type: \"document.copy\", record, conversationId: conversationId!, source: plan.content.source };\n\t}\n\tconst change = plan.change;\n\tif (change === undefined || !publishes(plan)) return undefined;\n\tconst ops = change.loaded === undefined ? EMPTY_OPERATIONS : change.prepared.ops;\n\treturn {\n\t\ttype: \"document\",\n\t\tkind: \"change\",\n\t\trecord,\n\t\tconversationId,\n\t\tversion: change.version,\n\t\tvalue: change.prepared.value,\n\t\tops,\n\t};\n}\n\n/**\n * Take a hold's changes after `ops`, a commit's own on top of them, as one stored content for an incarnation now at\n * `value`, and the operations a reader of the stored state applies to reach it: the folded ones, or a root replacement\n * after the queue overflowed, which stores a base, as does a hold whose commits selected one.\n */\nexport function storeHeld(\n\thold: HeldDocument,\n\tops: readonly Op[],\n\tvalue: JsonObject,\n\tversion: number,\n): { readonly content: DocumentContent; readonly ops: readonly Op[] } {\n\thold.pending.push(ops);\n\tconst taken = hold.pending.take();\n\tif (taken.kind === \"replace\") return { content: { version, kind: \"base\", value }, ops: [[\"r\", value]] };\n\tif (hold.base) return { content: { version, kind: \"base\", value }, ops: taken.ops };\n\treturn { content: { version, kind: \"delta\", ops: taken.ops }, ops: taken.ops };\n}\n\n/**\n * Whether adoption publishes the plan: every creation, copy, and retirement, and a loaded incarnation that writes\n * content, which includes a migration-only base so observers of the older shape receive the new value.\n */\nfunction publishes(plan: DocumentPlan): boolean {\n\treturn plan.retire || plan.change?.loaded === undefined || plan.content !== undefined;\n}\n"]}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { Context } from "@earendil-works/chord";
|
|
2
|
+
import type { CommitResult, Seq, StorageWrite } from "../types.ts";
|
|
3
|
+
/** A part's own failure at publication: memory could not adopt it, or one of the Session's own observers threw. */
|
|
4
|
+
export type PublishFailure = {
|
|
5
|
+
readonly kind: "adoption" | "listener";
|
|
6
|
+
readonly error: unknown;
|
|
7
|
+
};
|
|
8
|
+
/** One logical commit the line admitted: stored (`writes`, never empty), or held in memory only (no `writes`). */
|
|
9
|
+
export type PartSpec = {
|
|
10
|
+
/** Line index of the job that admitted it: a failure it causes makes only later jobs' outcomes `SessionFailed`. */
|
|
11
|
+
readonly index: number;
|
|
12
|
+
readonly writes: readonly StorageWrite[] | undefined;
|
|
13
|
+
/** Keys it writes: a read of one waits for its publication. */
|
|
14
|
+
readonly keys: readonly string[];
|
|
15
|
+
readonly context: Context;
|
|
16
|
+
/** Publish it in memory, in line order, once it is durable (with its seq) or, held, once the parts before it are. */
|
|
17
|
+
readonly publish: (seq: Seq | undefined) => PublishFailure | undefined;
|
|
18
|
+
/** It will never be published: abort what it prepared. */
|
|
19
|
+
readonly discard: () => void;
|
|
20
|
+
};
|
|
21
|
+
/** An admitted part and its outcome. */
|
|
22
|
+
export type Part = PartSpec & {
|
|
23
|
+
/**
|
|
24
|
+
* Resolves once it is published; rejects once it never will be, and also after publication when its storage call
|
|
25
|
+
* rejected or the Session failed meanwhile. Always handled, so a part nobody awaits rejects silently.
|
|
26
|
+
*/
|
|
27
|
+
readonly outcome: Promise<void>;
|
|
28
|
+
};
|
|
29
|
+
/** What the writer needs of its Session. */
|
|
30
|
+
export type WriterHost = {
|
|
31
|
+
commit(batches: readonly (readonly StorageWrite[])[], receive: (index: number, seq: Seq) => void, context: Context): Promise<CommitResult>;
|
|
32
|
+
/** Apply a stored batch to the Session's read caches, right before it is published. */
|
|
33
|
+
stored(writes: readonly StorageWrite[]): void;
|
|
34
|
+
/**
|
|
35
|
+
* Run one part's publication inside the Storage's own scope (`Storage.publishing`); `undefined` when it ran at once,
|
|
36
|
+
* else settles once it ran.
|
|
37
|
+
*/
|
|
38
|
+
publishing(publish: () => void, context: Context): Promise<void> | undefined;
|
|
39
|
+
/** The Session's failure, if it failed. */
|
|
40
|
+
failure(): {
|
|
41
|
+
readonly error: unknown;
|
|
42
|
+
} | undefined;
|
|
43
|
+
/**
|
|
44
|
+
* Fail the Session; `at` is the line index of the first job whose outcome the failure is, and `own` the jobs after it
|
|
45
|
+
* whose outcome is still their own error (the other parts of a call that rejected), not `SessionFailed`.
|
|
46
|
+
*/
|
|
47
|
+
fail(error: unknown, at: number, own: readonly number[]): void;
|
|
48
|
+
/** Report an own observer's throw that cannot fail the Session, as it fails with a storage error. */
|
|
49
|
+
report(error: unknown, context: Context): void;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* The writer of one Session. The line admits each commit as a part once its callback and settlement succeeded; the
|
|
53
|
+
* writer sends every part admitted while no call is in flight as one `commit()` call, off the line, and publishes
|
|
54
|
+
* the parts of a call one by one, in line order, with a macrotask between two, so the continuations of the waits one
|
|
55
|
+
* resolves start before the next is published. Held commits are parts without writes, published when the parts before
|
|
56
|
+
* them are.
|
|
57
|
+
*
|
|
58
|
+
* Each part registers the keys it writes; until it is published, it is the newest unpublished writer of each, and a
|
|
59
|
+
* job that touches one waits for its gate. A key leaves when its newest writer is published, so the map holds one entry
|
|
60
|
+
* per key with an unpublished writer.
|
|
61
|
+
*/
|
|
62
|
+
export declare class Writer {
|
|
63
|
+
#private;
|
|
64
|
+
constructor(host: WriterHost);
|
|
65
|
+
/** Admit a part: register its keys, queue it, and send it at once unless a call is in flight. */
|
|
66
|
+
admit(spec: PartSpec): Part;
|
|
67
|
+
/** The gate of the newest unpublished writer of `key`, or `undefined` when it has none. */
|
|
68
|
+
gate(key: string): Promise<void> | undefined;
|
|
69
|
+
/** Opens once every part admitted so far is published or never will be. */
|
|
70
|
+
drained(): Promise<void> | undefined;
|
|
71
|
+
/** Keys with an unpublished writer, for tests that bound memory. */
|
|
72
|
+
get unpublished(): number;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../src/session/writer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAGrD,OAAO,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEnE,mHAAmH;AACnH,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAEjG,kHAAkH;AAClH,MAAM,MAAM,QAAQ,GAAG;IACtB,mHAAmH;IACnH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,SAAS,CAAC;IACrD,+DAA+D;IAC/D,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,qHAAqH;IACrH,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,GAAG,SAAS,KAAK,cAAc,GAAG,SAAS,CAAC;IACvE,0DAA0D;IAC1D,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC7B,CAAC;AAEF,wCAAwC;AACxC,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG;IAC7B;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC,CAAC;AAeF,4CAA4C;AAC5C,MAAM,MAAM,UAAU,GAAG;IACxB,MAAM,CACL,OAAO,EAAE,SAAS,CAAC,SAAS,YAAY,EAAE,CAAC,EAAE,EAC7C,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,EAC1C,OAAO,EAAE,OAAO,GACd,OAAO,CAAC,YAAY,CAAC,CAAC;IACzB,uFAAuF;IACvF,MAAM,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,IAAI,CAAC;IAC9C;;;OAGG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;IAC7E,2CAA2C;IAC3C,OAAO,IAAI;QAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,CAAC;IACnD;;;OAGG;IACH,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAC/D,qGAAqG;IACrG,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CAC/C,CAAC;AAEF;;;;;;;;;;GAUG;AACH,qBAAa,MAAM;;IAUlB,YAAY,IAAI,EAAE,UAAU,EAE3B;IAED,iGAAiG;IACjG,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAwB1B;IAED,2FAA2F;IAC3F,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAE3C;IAED,2EAA2E;IAC3E,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAEnC;IAED,oEAAoE;IACpE,IAAI,WAAW,IAAI,MAAM,CAExB;CAiND"}
|