@earendil-works/pi-durable 1.0.4 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +2 -0
  3. package/dist/harness/agent.d.ts.map +1 -1
  4. package/dist/harness/agent.js +3 -0
  5. package/dist/harness/agent.js.map +1 -1
  6. package/dist/harness/compaction.js +1 -1
  7. package/dist/harness/compaction.js.map +1 -1
  8. package/dist/harness/context.d.ts +29 -1
  9. package/dist/harness/context.d.ts.map +1 -1
  10. package/dist/harness/context.js +125 -24
  11. package/dist/harness/context.js.map +1 -1
  12. package/dist/harness/generation.d.ts.map +1 -1
  13. package/dist/harness/generation.js +3 -3
  14. package/dist/harness/generation.js.map +1 -1
  15. package/dist/harness/harness.d.ts.map +1 -1
  16. package/dist/harness/harness.js +4 -3
  17. package/dist/harness/harness.js.map +1 -1
  18. package/dist/harness/scheduler.d.ts.map +1 -1
  19. package/dist/harness/scheduler.js +98 -5
  20. package/dist/harness/scheduler.js.map +1 -1
  21. package/dist/harness/tool.d.ts +1 -1
  22. package/dist/harness/tool.d.ts.map +1 -1
  23. package/dist/harness/tool.js +15 -5
  24. package/dist/harness/tool.js.map +1 -1
  25. package/dist/harness/types.d.ts +18 -2
  26. package/dist/harness/types.d.ts.map +1 -1
  27. package/dist/harness/types.js.map +1 -1
  28. package/dist/index.d.ts +1 -1
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js.map +1 -1
  31. package/dist/session/session.d.ts +5 -3
  32. package/dist/session/session.d.ts.map +1 -1
  33. package/dist/session/session.js +5 -4
  34. package/dist/session/session.js.map +1 -1
  35. package/dist/session/transaction.d.ts +2 -0
  36. package/dist/session/transaction.d.ts.map +1 -1
  37. package/dist/session/transaction.js +18 -1
  38. package/dist/session/transaction.js.map +1 -1
  39. package/dist/storage/jsonl/storage.d.ts +4 -0
  40. package/dist/storage/jsonl/storage.d.ts.map +1 -1
  41. package/dist/storage/memory.d.ts +2 -0
  42. package/dist/storage/memory.d.ts.map +1 -1
  43. package/dist/storage/memory.js +72 -18
  44. package/dist/storage/memory.js.map +1 -1
  45. package/dist/storage/scan.d.ts +18 -0
  46. package/dist/storage/scan.d.ts.map +1 -0
  47. package/dist/storage/scan.js +28 -0
  48. package/dist/storage/scan.js.map +1 -0
  49. package/dist/storage/sqlite/cloudflare.d.ts +46 -0
  50. package/dist/storage/sqlite/cloudflare.d.ts.map +1 -0
  51. package/dist/storage/sqlite/cloudflare.js +106 -0
  52. package/dist/storage/sqlite/cloudflare.js.map +1 -0
  53. package/dist/storage/sqlite/storage.d.ts +2 -0
  54. package/dist/storage/sqlite/storage.d.ts.map +1 -1
  55. package/dist/storage/sqlite/storage.js +68 -16
  56. package/dist/storage/sqlite/storage.js.map +1 -1
  57. package/dist/testing/storage-conformance.d.ts.map +1 -1
  58. package/dist/testing/storage-conformance.js +58 -0
  59. package/dist/testing/storage-conformance.js.map +1 -1
  60. package/dist/types.d.ts +30 -7
  61. package/dist/types.d.ts.map +1 -1
  62. package/dist/types.js.map +1 -1
  63. package/package.json +10 -4
@@ -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/** 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\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(value, 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#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,EAAqD,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACvG,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;AAyC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAOvD;;;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,wBAAwB,CAAC,CAAC;IACnE,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;AAyG3E;;;;;GAKG;AACH,MAAM,OAAO,WAAW;IACd,KAAK,CAAkB;IACvB,QAAQ,CAAU;IAClB,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,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,CAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAC,cAAc,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CACjF,CAAC;IACH,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,OAAoB;QAEpB,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;YAC7B,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,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,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,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,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;IACnD,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,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;IACF,CAAC;IAED,sFAAsF;IACtF,OAAO;QACN,IAAI,CAAC,aAAa,EAAE,CAAC;IACtB,CAAC;IAED,sGAAsG;IACtG,KAAK,CAAC,GAAQ;QACb,MAAM,YAAY,GAA2B,EAAE,CAAC;QAChD,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,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;YAC3C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,IAAI,SAAS;oBAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC3D,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,gBAAgB,EAAE,CAAC;gBAC3E,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;YAC7E,CAAC;iBAAM,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,eAAe,EAAE,CAAC;gBACnD,YAAY,CAAC,IAAI,CAAC;oBACjB,IAAI,EAAE,eAAe;oBACrB,MAAM;oBACN,cAAc,EAAE,cAAe;oBAC/B,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;iBAC3B,CAAC,CAAC;YACJ,CAAC;iBAAM,IAAI,MAAM,KAAK,SAAS,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACjF,YAAY,CAAC,IAAI,CAAC;oBACjB,IAAI,EAAE,UAAU;oBAChB,MAAM;oBACN,cAAc;oBACd,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK;oBAC5B,GAAG;iBACH,CAAC,CAAC;YACJ,CAAC;QACF,CAAC;QACD,OAAO,YAAY,CAAC;IACrB,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,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,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,EAAE,CAAC;wBACjC,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;4BAAE,SAAS;wBACtC,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;wBACnE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBACzB,CAAC;oBACD,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,UAAU,EAAE,cAAc,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;oBAC7E,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,CAAC,CAAC;YAC1D,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;;;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 { 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\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"]}
@@ -44,6 +44,8 @@ export declare class JsonlStorage implements Storage {
44
44
  readonly owner?: TaskId;
45
45
  readonly background: boolean;
46
46
  readonly abortRequested: boolean;
47
+ readonly startedAt?: number;
48
+ readonly endedAt?: number;
47
49
  } & ({
48
50
  readonly state: {
49
51
  readonly status: "pending";
@@ -82,6 +84,8 @@ export declare class JsonlStorage implements Storage {
82
84
  readonly owner?: TaskId;
83
85
  readonly background: boolean;
84
86
  readonly abortRequested: boolean;
87
+ readonly startedAt?: number;
88
+ readonly endedAt?: number;
85
89
  } & ({
86
90
  readonly state: {
87
91
  readonly status: "pending";
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/storage/jsonl/storage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/storage/jsonl/storage.ts"],"names":[],"mappings":"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"}
@@ -50,6 +50,8 @@ export declare class MemoryStorage implements Storage {
50
50
  close(_context: Context): Promise<void>;
51
51
  private materializeDocument;
52
52
  private visibleEntries;
53
+ /** Visible entries oldest first: the fork chain's segments from the root conversation forward. */
54
+ private visibleEntriesAscending;
53
55
  private checkGlobalIds;
54
56
  private prepareDocumentActions;
55
57
  private checkDocumentActions;
@@ -1 +1 @@
1
- {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/storage/memory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/storage/memory.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { applyImmutableBatches } from "@earendil-works/chord/delta";
2
2
  import { StorageRejected } from "../errors.js";
3
3
  import { idFromNumber, seqFromNumber } from "../ids.js";
4
+ import { nextCursor, scanStart } from "./scan.js";
4
5
  function* documentDeltaBatches(id, version, revisions, start) {
5
6
  for (let index = start; index < revisions.length; index++) {
6
7
  const revision = revisions[index];
@@ -115,12 +116,25 @@ const isAliveAt = (record, at) => {
115
116
  };
116
117
  const isCurrentOnly = (record) => record.scope.kind !== "conversation" || record.history === "latest";
117
118
  const tableContaining = (state, id) => state.recordTypes.get(id);
118
- const page = (values, limit) => {
119
+ const page = (values, limit, order = "ascending") => {
119
120
  const items = values.slice(0, limit);
120
121
  if (values.length <= limit)
121
122
  return { items: clone(items) };
122
- return { items: clone(items), next: { after: items.at(-1).id } };
123
+ return { items: clone(items), next: nextCursor(items.at(-1).id, order) };
123
124
  };
125
+ /** Indexes of sorted `ids` in scan order, after the cursor's ID when there is one. */
126
+ function* scanIndexes(ids, start) {
127
+ if (start.order === "ascending") {
128
+ const first = start.after === undefined ? 0 : upperBound(ids, start.after);
129
+ for (let index = first; index < ids.length; index++)
130
+ yield index;
131
+ }
132
+ else {
133
+ const end = start.after === undefined ? ids.length : lowerBound(ids, start.after);
134
+ for (let index = end - 1; index >= 0; index--)
135
+ yield index;
136
+ }
137
+ }
124
138
  /**
125
139
  * Detached in-memory reference implementation of `Storage`.
126
140
  *
@@ -333,17 +347,18 @@ export class MemoryStorage {
333
347
  : query.ownerConversationId !== undefined
334
348
  ? (this.state.conversationIdsByOwnerConversation.get(query.ownerConversationId) ?? [])
335
349
  : this.state.conversationIds;
336
- const after = cursorId(cursor);
337
- const start = after === undefined ? 0 : upperBound(ids, after);
350
+ const start = scanStart(query.order, cursor, "ascending");
338
351
  const values = [];
339
- for (let index = start; index < ids.length && values.length <= limit; index++) {
352
+ for (const index of scanIndexes(ids, start)) {
353
+ if (values.length > limit)
354
+ break;
340
355
  const value = this.state.conversations.get(ids[index]);
341
356
  if (query.ownerConversationId !== undefined && value.owner?.conversationId !== query.ownerConversationId) {
342
357
  continue;
343
358
  }
344
359
  values.push(value);
345
360
  }
346
- return page(values, limit);
361
+ return page(values, limit, start.order);
347
362
  }
348
363
  async entry(idOrConversationId, idOrContext, context) {
349
364
  this.assertOpen();
@@ -386,15 +401,24 @@ export class MemoryStorage {
386
401
  }
387
402
  async scanEntries(query, limit, cursor, _context) {
388
403
  this.assertOpen();
389
- const after = cursorId(cursor);
390
- const maxEntryId = after === undefined ? query.maxEntryId : Math.min(query.maxEntryId ?? Number.POSITIVE_INFINITY, after - 1);
404
+ const { order, after } = scanStart(query.order, cursor, "descending");
405
+ // The cursor narrows the bound on the side the scan moves away from.
406
+ let minEntryId = query.minEntryId;
407
+ let maxEntryId = query.maxEntryId;
408
+ if (after !== undefined && order === "descending")
409
+ maxEntryId = Math.min(maxEntryId ?? after, after - 1);
410
+ if (after !== undefined && order === "ascending")
411
+ minEntryId = Math.max(minEntryId ?? after, after + 1);
391
412
  const visible = [];
392
- for (const entry of this.visibleEntries(query.conversationId, query.minEntryId, maxEntryId)) {
413
+ const entries = order === "descending"
414
+ ? this.visibleEntries(query.conversationId, minEntryId, maxEntryId)
415
+ : this.visibleEntriesAscending(query.conversationId, minEntryId, maxEntryId);
416
+ for (const entry of entries) {
393
417
  visible.push(entry);
394
418
  if (visible.length > limit)
395
419
  break;
396
420
  }
397
- return page(visible, limit);
421
+ return page(visible, limit, order);
398
422
  }
399
423
  async task(id, _context) {
400
424
  this.assertOpen();
@@ -403,11 +427,12 @@ export class MemoryStorage {
403
427
  }
404
428
  async scanTasks(query, limit, cursor, _context) {
405
429
  this.assertOpen();
406
- const after = cursorId(cursor);
430
+ const start = scanStart(query.order, cursor, "ascending");
407
431
  const ids = query.status === undefined ? this.state.taskIds : this.state.taskIdsByStatus[query.status];
408
- const start = after === undefined ? 0 : upperBound(ids, after);
409
432
  const values = [];
410
- for (let index = start; index < ids.length && values.length <= limit; index++) {
433
+ for (const index of scanIndexes(ids, start)) {
434
+ if (values.length > limit)
435
+ break;
411
436
  const value = this.state.tasks.get(ids[index]);
412
437
  if (query.conversationId !== undefined && value.conversationId !== query.conversationId)
413
438
  continue;
@@ -419,7 +444,7 @@ export class MemoryStorage {
419
444
  continue;
420
445
  values.push(value);
421
446
  }
422
- return page(values, limit);
447
+ return page(values, limit, start.order);
423
448
  }
424
449
  async submission(id, _context) {
425
450
  this.assertOpen();
@@ -428,17 +453,18 @@ export class MemoryStorage {
428
453
  }
429
454
  async scanSubmissions(query, limit, cursor, _context) {
430
455
  this.assertOpen();
431
- const after = cursorId(cursor);
456
+ const start = scanStart(query.order, cursor, "ascending");
432
457
  const ids = query.status === undefined ? this.state.submissionIds : this.state.submissionIdsByStatus[query.status];
433
- const start = after === undefined ? 0 : upperBound(ids, after);
434
458
  const values = [];
435
- for (let index = start; index < ids.length && values.length <= limit; index++) {
459
+ for (const index of scanIndexes(ids, start)) {
460
+ if (values.length > limit)
461
+ break;
436
462
  const value = this.state.submissions.get(ids[index]);
437
463
  if (query.conversationId !== undefined && value.conversationId !== query.conversationId)
438
464
  continue;
439
465
  values.push(value);
440
466
  }
441
- return page(values, limit);
467
+ return page(values, limit, start.order);
442
468
  }
443
469
  async submissionByRequest(conversationId, requestId, _context) {
444
470
  this.assertOpen();
@@ -532,6 +558,34 @@ export class MemoryStorage {
532
558
  currentId = conversation.parent.conversationId;
533
559
  }
534
560
  }
561
+ /** Visible entries oldest first: the fork chain's segments from the root conversation forward. */
562
+ *visibleEntriesAscending(conversationId, minEntryId = Number.NEGATIVE_INFINITY, maxEntryId = Number.POSITIVE_INFINITY) {
563
+ if (!this.state.conversations.has(conversationId)) {
564
+ throw new Error(`Unknown conversation: ${conversationId}`);
565
+ }
566
+ const segments = [];
567
+ let currentId = conversationId;
568
+ let upperEntryId = maxEntryId;
569
+ while (true) {
570
+ segments.push({ conversationId: currentId, upper: upperEntryId });
571
+ const conversation = this.state.conversations.get(currentId);
572
+ if (conversation.parent === undefined)
573
+ break;
574
+ upperEntryId = Math.min(upperEntryId, conversation.parent.at);
575
+ if (upperEntryId < minEntryId)
576
+ break;
577
+ currentId = conversation.parent.conversationId;
578
+ }
579
+ for (const segment of segments.reverse()) {
580
+ const ids = this.state.entryIds.get(segment.conversationId) ?? [];
581
+ for (let index = lowerBound(ids, minEntryId); index < ids.length; index++) {
582
+ const id = ids[index];
583
+ if (id > segment.upper)
584
+ break;
585
+ yield this.state.entries.get(id);
586
+ }
587
+ }
588
+ }
535
589
  checkGlobalIds(writes) {
536
590
  const claimed = new Map();
537
591
  for (const write of writes) {